@zdavison/nestjs-rpc-toolkit 0.0.12 → 0.0.14
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.
- package/dist/bin/bootstrap.d.ts +19 -0
- package/dist/bin/bootstrap.d.ts.map +1 -0
- package/dist/bin/bootstrap.js +275 -0
- package/dist/bin/bootstrap.js.map +1 -0
- package/dist/bin/init.js +0 -0
- package/dist/decorators/rpc-controller.decorator.d.ts.map +1 -1
- package/dist/decorators/rpc-controller.decorator.js +21 -0
- package/dist/decorators/rpc-controller.decorator.js.map +1 -1
- package/dist/decorators/rpc-method.decorator.d.ts +2 -2
- package/dist/decorators/rpc-method.decorator.d.ts.map +1 -1
- package/dist/decorators/rpc-method.decorator.js +50 -26
- package/dist/decorators/rpc-method.decorator.js.map +1 -1
- package/dist/generators/rpc-types-generator.d.ts +3 -0
- package/dist/generators/rpc-types-generator.d.ts.map +1 -1
- package/dist/generators/rpc-types-generator.js +230 -20
- package/dist/generators/rpc-types-generator.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/rpc/rpc-client.d.ts.map +1 -1
- package/dist/rpc/rpc-client.js +3 -1
- package/dist/rpc/rpc-client.js.map +1 -1
- package/dist/rpc/rpc-registry.d.ts.map +1 -1
- package/dist/rpc/rpc-registry.js +11 -1
- package/dist/rpc/rpc-registry.js.map +1 -1
- package/dist/transport/in-process.client.d.ts +2 -0
- package/dist/transport/in-process.client.d.ts.map +1 -1
- package/dist/transport/in-process.client.js +5 -0
- package/dist/transport/in-process.client.js.map +1 -1
- package/dist/transport/in-process.transport.d.ts.map +1 -1
- package/dist/transport/in-process.transport.js +8 -1
- package/dist/transport/in-process.transport.js.map +1 -1
- package/dist/types/serializable.d.ts +35 -4
- package/dist/types/serializable.d.ts.map +1 -1
- package/package.json +13 -11
- package/README.md +0 -263
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.InProcessClientProxy = void 0;
|
|
4
4
|
const microservices_1 = require("@nestjs/microservices");
|
|
5
5
|
const in_process_transport_1 = require("./in-process.transport");
|
|
6
|
+
const rxjs_1 = require("rxjs");
|
|
6
7
|
class InProcessClientProxy extends microservices_1.ClientProxy {
|
|
7
8
|
constructor() {
|
|
8
9
|
super(...arguments);
|
|
@@ -30,6 +31,10 @@ class InProcessClientProxy extends microservices_1.ClientProxy {
|
|
|
30
31
|
});
|
|
31
32
|
return () => { }; // Return cleanup function (no-op for in-memory)
|
|
32
33
|
}
|
|
34
|
+
// Override send() to return a proper Observable
|
|
35
|
+
send(pattern, data) {
|
|
36
|
+
return (0, rxjs_1.defer)(() => (0, rxjs_1.from)(this.transport.sendMessage(pattern, data)));
|
|
37
|
+
}
|
|
33
38
|
}
|
|
34
39
|
exports.InProcessClientProxy = InProcessClientProxy;
|
|
35
40
|
//# sourceMappingURL=in-process.client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"in-process.client.js","sourceRoot":"","sources":["../../src/transport/in-process.client.ts"],"names":[],"mappings":";;;AAAA,yDAA6E;AAC7E,iEAAoE;
|
|
1
|
+
{"version":3,"file":"in-process.client.js","sourceRoot":"","sources":["../../src/transport/in-process.client.ts"],"names":[],"mappings":";;;AAAA,yDAA6E;AAC7E,iEAAoE;AACpE,+BAA+C;AAE/C,MAAa,oBAAqB,SAAQ,2BAAW;IAArD;;QACU,cAAS,GAAG,iDAA0B,CAAC,WAAW,EAAE,CAAC;IAkC/D,CAAC;IAhCC,KAAK,CAAC,OAAO;QACX,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK;QACH,2CAA2C;IAC7C,CAAC;IAES,KAAK,CAAC,aAAa,CAAC,MAAkB;QAC9C,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;QACjC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAiB,EAAE,IAAI,CAAC,CAAC;QAClD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAES,OAAO,CAAC,MAAkB,EAAE,QAAuC;QAC3E,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;QAEjC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,OAAiB,EAAE,IAAI,CAAC;aAChD,IAAI,CAAC,MAAM,CAAC,EAAE;YACb,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QACjC,CAAC,CAAC;aACD,KAAK,CAAC,KAAK,CAAC,EAAE;YACb,QAAQ,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEL,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,gDAAgD;IACnE,CAAC;IAED,gDAAgD;IAChD,IAAI,CAA8B,OAAY,EAAE,IAAY;QAC1D,OAAO,IAAA,YAAK,EAAC,GAAG,EAAE,CAAC,IAAA,WAAI,EAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,OAAiB,EAAE,IAAI,CAAC,CAAC,CAAwB,CAAC;IACvG,CAAC;CACF;AAnCD,oDAmCC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"in-process.transport.d.ts","sourceRoot":"","sources":["../../src/transport/in-process.transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEpG,qBAAa,0BAA2B,SAAQ,MAAO,YAAW,uBAAuB;IACvF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA6B;IAEpD,MAAM,CAAC,WAAW,IAAI,0BAA0B;IAOhD,MAAM,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAIlC,KAAK,IAAI,IAAI;IAIP,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"in-process.transport.d.ts","sourceRoot":"","sources":["../../src/transport/in-process.transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEpG,qBAAa,0BAA2B,SAAQ,MAAO,YAAW,uBAAuB;IACvF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA6B;IAEpD,MAAM,CAAC,WAAW,IAAI,0BAA0B;IAOhD,MAAM,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAIlC,KAAK,IAAI,IAAI;IAIP,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,GAAG,CAAC;IAkBT,WAAW,CACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,GAAG,CAAC;IAYT,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAO3D,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI;CAK5C"}
|
|
@@ -20,7 +20,14 @@ class InProcessTransportStrategy extends microservices_1.Server {
|
|
|
20
20
|
if (!handler) {
|
|
21
21
|
throw new Error(`No handler registered for pattern: ${pattern}`);
|
|
22
22
|
}
|
|
23
|
-
|
|
23
|
+
const result = await handler(packet.data, context);
|
|
24
|
+
// If the handler returns an Observable (error case), we need to convert it to a rejection
|
|
25
|
+
if (result && typeof result === 'object' && '_subscribe' in result) {
|
|
26
|
+
// This is an Observable - convert to promise and await it
|
|
27
|
+
const { firstValueFrom } = require('rxjs');
|
|
28
|
+
return await firstValueFrom(result);
|
|
29
|
+
}
|
|
30
|
+
return result;
|
|
24
31
|
}
|
|
25
32
|
async handleEvent(pattern, packet, context) {
|
|
26
33
|
const handler = this.getHandlerByPattern(pattern);
|
|
@@ -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,
|
|
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
|
-
|
|
6
|
-
|
|
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
|
-
*
|
|
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
|
|
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;
|
|
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.
|
|
3
|
+
"version": "0.0.14",
|
|
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,24 @@
|
|
|
9
9
|
"access": "public"
|
|
10
10
|
},
|
|
11
11
|
"bin": {
|
|
12
|
-
"bootstrap": "dist/bin/
|
|
12
|
+
"bootstrap": "dist/bin/bootstrap.js"
|
|
13
|
+
},
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc",
|
|
16
|
+
"clean": "rm -rf dist",
|
|
17
|
+
"dev": "tsc --watch"
|
|
13
18
|
},
|
|
14
19
|
"dependencies": {
|
|
15
20
|
"@nestjs/common": "^10.0.0",
|
|
16
21
|
"@nestjs/microservices": "^10.0.0",
|
|
22
|
+
"glob": "^10.0.0",
|
|
17
23
|
"rxjs": "^7.8.0",
|
|
18
24
|
"ts-morph": "^20.0.0",
|
|
19
|
-
"
|
|
25
|
+
"type-fest": "^5.0.1"
|
|
20
26
|
},
|
|
21
27
|
"devDependencies": {
|
|
22
|
-
"
|
|
23
|
-
"
|
|
28
|
+
"@types/node": "^20.0.0",
|
|
29
|
+
"typescript": "^5.0.0"
|
|
24
30
|
},
|
|
25
31
|
"files": [
|
|
26
32
|
"dist/**/*"
|
|
@@ -30,11 +36,7 @@
|
|
|
30
36
|
},
|
|
31
37
|
"peerDependencies": {
|
|
32
38
|
"@nestjs/common": "^9.0.0 || ^10.0.0",
|
|
33
|
-
"@nestjs/microservices": "^9.0.0 || ^10.0.0"
|
|
34
|
-
|
|
35
|
-
"scripts": {
|
|
36
|
-
"build": "tsc",
|
|
37
|
-
"clean": "rm -rf dist",
|
|
38
|
-
"dev": "tsc --watch"
|
|
39
|
+
"@nestjs/microservices": "^9.0.0 || ^10.0.0",
|
|
40
|
+
"reflect-metadata": "^0.1.13 || ^0.2.0"
|
|
39
41
|
}
|
|
40
42
|
}
|
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
|
-
[](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** 🚀
|