@labostack/typebridge 0.1.0

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 (158) hide show
  1. package/README.md +62 -0
  2. package/dist/adapters/decorators.d.ts +11 -0
  3. package/dist/adapters/decorators.d.ts.map +1 -0
  4. package/dist/adapters/decorators.js +20 -0
  5. package/dist/adapters/decorators.js.map +1 -0
  6. package/dist/adapters/deepkit-adapter.d.ts +11 -0
  7. package/dist/adapters/deepkit-adapter.d.ts.map +1 -0
  8. package/dist/adapters/deepkit-adapter.js +39 -0
  9. package/dist/adapters/deepkit-adapter.js.map +1 -0
  10. package/dist/adapters/generic-adapter.d.ts +12 -0
  11. package/dist/adapters/generic-adapter.d.ts.map +1 -0
  12. package/dist/adapters/generic-adapter.js +28 -0
  13. package/dist/adapters/generic-adapter.js.map +1 -0
  14. package/dist/adapters/index.d.ts +5 -0
  15. package/dist/adapters/index.d.ts.map +1 -0
  16. package/dist/adapters/index.js +5 -0
  17. package/dist/adapters/index.js.map +1 -0
  18. package/dist/adapters/nest-adapter.d.ts +14 -0
  19. package/dist/adapters/nest-adapter.d.ts.map +1 -0
  20. package/dist/adapters/nest-adapter.js +33 -0
  21. package/dist/adapters/nest-adapter.js.map +1 -0
  22. package/dist/adapters/tsed-adapter.d.ts +10 -0
  23. package/dist/adapters/tsed-adapter.d.ts.map +1 -0
  24. package/dist/adapters/tsed-adapter.js +31 -0
  25. package/dist/adapters/tsed-adapter.js.map +1 -0
  26. package/dist/autobarrel/index.d.ts +2 -0
  27. package/dist/autobarrel/index.d.ts.map +1 -0
  28. package/dist/autobarrel/index.js +2 -0
  29. package/dist/autobarrel/index.js.map +1 -0
  30. package/dist/autobarrel/scanner.d.ts +14 -0
  31. package/dist/autobarrel/scanner.d.ts.map +1 -0
  32. package/dist/autobarrel/scanner.js +93 -0
  33. package/dist/autobarrel/scanner.js.map +1 -0
  34. package/dist/bridge.d.ts +54 -0
  35. package/dist/bridge.d.ts.map +1 -0
  36. package/dist/bridge.js +151 -0
  37. package/dist/bridge.js.map +1 -0
  38. package/dist/discovery/dns.d.ts +10 -0
  39. package/dist/discovery/dns.d.ts.map +1 -0
  40. package/dist/discovery/dns.js +19 -0
  41. package/dist/discovery/dns.js.map +1 -0
  42. package/dist/discovery/index.d.ts +4 -0
  43. package/dist/discovery/index.d.ts.map +1 -0
  44. package/dist/discovery/index.js +4 -0
  45. package/dist/discovery/index.js.map +1 -0
  46. package/dist/discovery/mdns.d.ts +18 -0
  47. package/dist/discovery/mdns.d.ts.map +1 -0
  48. package/dist/discovery/mdns.js +49 -0
  49. package/dist/discovery/mdns.js.map +1 -0
  50. package/dist/discovery/resolver.d.ts +16 -0
  51. package/dist/discovery/resolver.d.ts.map +1 -0
  52. package/dist/discovery/resolver.js +36 -0
  53. package/dist/discovery/resolver.js.map +1 -0
  54. package/dist/index.d.ts +21 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +19 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/mesh/index.d.ts +2 -0
  59. package/dist/mesh/index.d.ts.map +1 -0
  60. package/dist/mesh/index.js +2 -0
  61. package/dist/mesh/index.js.map +1 -0
  62. package/dist/mesh/mesh-manager.d.ts +55 -0
  63. package/dist/mesh/mesh-manager.d.ts.map +1 -0
  64. package/dist/mesh/mesh-manager.js +179 -0
  65. package/dist/mesh/mesh-manager.js.map +1 -0
  66. package/dist/proxy/client-proxy.d.ts +20 -0
  67. package/dist/proxy/client-proxy.d.ts.map +1 -0
  68. package/dist/proxy/client-proxy.js +69 -0
  69. package/dist/proxy/client-proxy.js.map +1 -0
  70. package/dist/proxy/index.d.ts +2 -0
  71. package/dist/proxy/index.d.ts.map +1 -0
  72. package/dist/proxy/index.js +2 -0
  73. package/dist/proxy/index.js.map +1 -0
  74. package/dist/reflection/extractor.d.ts +13 -0
  75. package/dist/reflection/extractor.d.ts.map +1 -0
  76. package/dist/reflection/extractor.js +62 -0
  77. package/dist/reflection/extractor.js.map +1 -0
  78. package/dist/reflection/index.d.ts +2 -0
  79. package/dist/reflection/index.d.ts.map +1 -0
  80. package/dist/reflection/index.js +2 -0
  81. package/dist/reflection/index.js.map +1 -0
  82. package/dist/registry/index.d.ts +3 -0
  83. package/dist/registry/index.d.ts.map +1 -0
  84. package/dist/registry/index.js +2 -0
  85. package/dist/registry/index.js.map +1 -0
  86. package/dist/registry/method-registry.d.ts +56 -0
  87. package/dist/registry/method-registry.d.ts.map +1 -0
  88. package/dist/registry/method-registry.js +84 -0
  89. package/dist/registry/method-registry.js.map +1 -0
  90. package/dist/serialization/error-ext.d.ts +38 -0
  91. package/dist/serialization/error-ext.d.ts.map +1 -0
  92. package/dist/serialization/error-ext.js +76 -0
  93. package/dist/serialization/error-ext.js.map +1 -0
  94. package/dist/serialization/index.d.ts +4 -0
  95. package/dist/serialization/index.d.ts.map +1 -0
  96. package/dist/serialization/index.js +3 -0
  97. package/dist/serialization/index.js.map +1 -0
  98. package/dist/serialization/msgpack.d.ts +30 -0
  99. package/dist/serialization/msgpack.d.ts.map +1 -0
  100. package/dist/serialization/msgpack.js +76 -0
  101. package/dist/serialization/msgpack.js.map +1 -0
  102. package/dist/serialization/serializer.d.ts +15 -0
  103. package/dist/serialization/serializer.d.ts.map +1 -0
  104. package/dist/serialization/serializer.js +2 -0
  105. package/dist/serialization/serializer.js.map +1 -0
  106. package/dist/transport/client.d.ts +38 -0
  107. package/dist/transport/client.d.ts.map +1 -0
  108. package/dist/transport/client.js +57 -0
  109. package/dist/transport/client.js.map +1 -0
  110. package/dist/transport/connection.d.ts +57 -0
  111. package/dist/transport/connection.d.ts.map +1 -0
  112. package/dist/transport/connection.js +212 -0
  113. package/dist/transport/connection.js.map +1 -0
  114. package/dist/transport/constants.d.ts +2 -0
  115. package/dist/transport/constants.d.ts.map +1 -0
  116. package/dist/transport/constants.js +2 -0
  117. package/dist/transport/constants.js.map +1 -0
  118. package/dist/transport/framing.d.ts +54 -0
  119. package/dist/transport/framing.d.ts.map +1 -0
  120. package/dist/transport/framing.js +107 -0
  121. package/dist/transport/framing.js.map +1 -0
  122. package/dist/transport/index.d.ts +7 -0
  123. package/dist/transport/index.d.ts.map +1 -0
  124. package/dist/transport/index.js +7 -0
  125. package/dist/transport/index.js.map +1 -0
  126. package/dist/transport/peer-manager.d.ts +67 -0
  127. package/dist/transport/peer-manager.d.ts.map +1 -0
  128. package/dist/transport/peer-manager.js +172 -0
  129. package/dist/transport/peer-manager.js.map +1 -0
  130. package/dist/transport/server.d.ts +37 -0
  131. package/dist/transport/server.d.ts.map +1 -0
  132. package/dist/transport/server.js +88 -0
  133. package/dist/transport/server.js.map +1 -0
  134. package/dist/types/adapter.d.ts +33 -0
  135. package/dist/types/adapter.d.ts.map +1 -0
  136. package/dist/types/adapter.js +2 -0
  137. package/dist/types/adapter.js.map +1 -0
  138. package/dist/types/descriptor.d.ts +35 -0
  139. package/dist/types/descriptor.d.ts.map +1 -0
  140. package/dist/types/descriptor.js +2 -0
  141. package/dist/types/descriptor.js.map +1 -0
  142. package/dist/types/index.d.ts +8 -0
  143. package/dist/types/index.d.ts.map +1 -0
  144. package/dist/types/index.js +3 -0
  145. package/dist/types/index.js.map +1 -0
  146. package/dist/types/options.d.ts +55 -0
  147. package/dist/types/options.d.ts.map +1 -0
  148. package/dist/types/options.js +6 -0
  149. package/dist/types/options.js.map +1 -0
  150. package/dist/types/protocol.d.ts +94 -0
  151. package/dist/types/protocol.d.ts.map +1 -0
  152. package/dist/types/protocol.js +43 -0
  153. package/dist/types/protocol.js.map +1 -0
  154. package/dist/types/type-descriptor.d.ts +64 -0
  155. package/dist/types/type-descriptor.d.ts.map +1 -0
  156. package/dist/types/type-descriptor.js +2 -0
  157. package/dist/types/type-descriptor.js.map +1 -0
  158. package/package.json +41 -0
package/dist/bridge.js ADDED
@@ -0,0 +1,151 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { MethodRegistry } from "./registry/method-registry.js";
4
+ import { TransportServer } from "./transport/server.js";
5
+ import { MeshManager } from "./mesh/mesh-manager.js";
6
+ import { announceViaMdns } from "./discovery/mdns.js";
7
+ import { createMeshProxy } from "./proxy/client-proxy.js";
8
+ import { scanControllers } from "./autobarrel/scanner.js";
9
+ /**
10
+ * TypeBridge — zero-ceremony RPC mesh for TypeScript microservices.
11
+ *
12
+ * One method: `TypeBridge.create()`. That's it.
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * import { TypeBridge } from "@labostack/typebridge";
17
+ * import { NestAdapter } from "@labostack/typebridge/adapters";
18
+ * import { UserController } from "./controllers";
19
+ *
20
+ * const api = await TypeBridge.create(NestAdapter, {
21
+ * controllers: { UserController },
22
+ * });
23
+ *
24
+ * // From another service — auto-discovered, auto-routed:
25
+ * // api.userController.findById("abc") — just works.
26
+ * ```
27
+ */
28
+ export class TypeBridge {
29
+ /**
30
+ * Declare remote peer types for full type inference.
31
+ *
32
+ * Returns a builder whose `.create()` merges remote controller types
33
+ * into the returned API. Zero runtime cost — pure type narrowing.
34
+ *
35
+ * @example
36
+ * ```typescript
37
+ * import type { api as UsersAPI } from "example-service-nest/node";
38
+ *
39
+ * const api = await TypeBridge
40
+ * .with<typeof UsersAPI>()
41
+ * .create(GenericAdapter, { controllers: { OrderController } });
42
+ *
43
+ * api.userController.findById("abc"); // ✅ typed (remote)
44
+ * api.orderController.create({...}); // ✅ typed (local)
45
+ * ```
46
+ */
47
+ static with() {
48
+ return {
49
+ create: TypeBridge.create,
50
+ };
51
+ }
52
+ static async create(adapter, options) {
53
+ const registry = new MethodRegistry();
54
+ const serviceName = options.name ?? await inferServiceName();
55
+ // ─── Resolve controllers (object or directory path) ──
56
+ const controllerMap = typeof options.controllers === "string"
57
+ ? await scanControllers(options.controllers, adapter)
58
+ : options.controllers;
59
+ // ─── Register controllers ─────────────────────────
60
+ for (const [key, value] of Object.entries(controllerMap)) {
61
+ const controllerName = key.charAt(0).toLowerCase() + key.slice(1);
62
+ if (!adapter.isController(value))
63
+ continue;
64
+ const methods = adapter.extractMethods(value);
65
+ let instance;
66
+ if (adapter.resolveInstance) {
67
+ instance = adapter.resolveInstance(value);
68
+ }
69
+ else if (typeof value === "function") {
70
+ try {
71
+ instance = new value();
72
+ }
73
+ catch {
74
+ instance = value;
75
+ }
76
+ }
77
+ else {
78
+ instance = value;
79
+ }
80
+ registry.register(controllerName, instance, methods);
81
+ }
82
+ // ─── Mesh manager (auto-discovery + routing) ──────
83
+ const mesh = new MeshManager(serviceName, registry);
84
+ // ─── Start transport server ───────────────────────
85
+ const transport = new TransportServer({
86
+ port: options.port ?? 0,
87
+ host: options.host ?? "0.0.0.0",
88
+ });
89
+ // Handle incoming handshakes — register the peer in the mesh
90
+ transport.on("handshake", (conn, data) => {
91
+ const peerName = data?.name ?? "unknown";
92
+ const peerCatalog = data?.catalog ?? {};
93
+ // Register peer's controllers in our mesh
94
+ mesh.registerIncomingPeer(peerName, conn, peerCatalog);
95
+ // Send our catalog back
96
+ conn.sendHandshakeAck({
97
+ name: serviceName,
98
+ version: 1,
99
+ catalog: registry.toCatalog(),
100
+ });
101
+ });
102
+ transport.on("connection-error", () => {
103
+ // Silently handle
104
+ });
105
+ await transport.listen();
106
+ // ─── mDNS: announce + browse ──────────────────────
107
+ let mdnsStop = null;
108
+ if (options.announce !== false) {
109
+ try {
110
+ const handle = announceViaMdns(serviceName, transport.port);
111
+ mdnsStop = handle.stop;
112
+ }
113
+ catch {
114
+ // mDNS not available
115
+ }
116
+ // Start browsing for other nodes
117
+ await mesh.startBrowsing();
118
+ }
119
+ // ─── Build the API proxy ──────────────────────────
120
+ const api = createMeshProxy(registry, mesh, {
121
+ port: transport.port,
122
+ name: serviceName,
123
+ __mesh: mesh,
124
+ async close() {
125
+ mdnsStop?.();
126
+ await mesh.close();
127
+ await transport.close();
128
+ },
129
+ });
130
+ return api;
131
+ }
132
+ }
133
+ /**
134
+ * Infer the service name from the nearest package.json.
135
+ */
136
+ async function inferServiceName() {
137
+ try {
138
+ const pkgPath = join(process.cwd(), "package.json");
139
+ const raw = await readFile(pkgPath, "utf-8");
140
+ const pkg = JSON.parse(raw);
141
+ if (pkg.name) {
142
+ return pkg.name.replace(/^@[^/]+\//, "");
143
+ }
144
+ }
145
+ catch {
146
+ // No package.json
147
+ }
148
+ const parts = process.cwd().split("/");
149
+ return parts[parts.length - 1] || "typebridge-service";
150
+ }
151
+ //# sourceMappingURL=bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Resolve a service name via standard DNS.
3
+ *
4
+ * Works out-of-the-box in:
5
+ * - Docker Compose (embedded DNS at 127.0.0.11)
6
+ * - Kubernetes (CoreDNS resolves service-name.namespace.svc.cluster.local)
7
+ * - Any environment where the hostname is configured in /etc/hosts or DNS
8
+ */
9
+ export declare function resolveViaDns(serviceName: string): Promise<string | null>;
10
+ //# sourceMappingURL=dns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dns.d.ts","sourceRoot":"","sources":["../../src/discovery/dns.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAO/E"}
@@ -0,0 +1,19 @@
1
+ import { lookup } from "node:dns/promises";
2
+ /**
3
+ * Resolve a service name via standard DNS.
4
+ *
5
+ * Works out-of-the-box in:
6
+ * - Docker Compose (embedded DNS at 127.0.0.11)
7
+ * - Kubernetes (CoreDNS resolves service-name.namespace.svc.cluster.local)
8
+ * - Any environment where the hostname is configured in /etc/hosts or DNS
9
+ */
10
+ export async function resolveViaDns(serviceName) {
11
+ try {
12
+ const result = await lookup(serviceName);
13
+ return result.address;
14
+ }
15
+ catch {
16
+ return null;
17
+ }
18
+ }
19
+ //# sourceMappingURL=dns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dns.js","sourceRoot":"","sources":["../../src/discovery/dns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,WAAmB;IACrD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QACzC,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { resolveViaDns } from "./dns.js";
2
+ export { announceViaMdns, resolveViaMdns } from "./mdns.js";
3
+ export { resolveService } from "./resolver.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/discovery/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { resolveViaDns } from "./dns.js";
2
+ export { announceViaMdns, resolveViaMdns } from "./mdns.js";
3
+ export { resolveService } from "./resolver.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/discovery/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Announce this service via mDNS/Bonjour for local dev discovery.
3
+ *
4
+ * NOTE: mDNS does NOT work inside Docker (multicast is filtered by default).
5
+ * This layer is specifically for bare-metal / local dev scenarios.
6
+ */
7
+ export declare function announceViaMdns(name: string, port: number): {
8
+ stop: () => void;
9
+ };
10
+ /**
11
+ * Resolve a service name via mDNS/Bonjour.
12
+ * Returns the host and port if found within the timeout.
13
+ */
14
+ export declare function resolveViaMdns(serviceName: string, timeoutMs?: number): Promise<{
15
+ host: string;
16
+ port: number;
17
+ } | null>;
18
+ //# sourceMappingURL=mdns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mdns.d.ts","sourceRoot":"","sources":["../../src/discovery/mdns.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX;IAAE,IAAI,EAAE,MAAM,IAAI,CAAA;CAAE,CAgBtB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,MAAa,GACvB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAsBhD"}
@@ -0,0 +1,49 @@
1
+ import Bonjour from "bonjour-service";
2
+ const SERVICE_TYPE = "typebridge";
3
+ /**
4
+ * Announce this service via mDNS/Bonjour for local dev discovery.
5
+ *
6
+ * NOTE: mDNS does NOT work inside Docker (multicast is filtered by default).
7
+ * This layer is specifically for bare-metal / local dev scenarios.
8
+ */
9
+ export function announceViaMdns(name, port) {
10
+ const bonjour = new Bonjour.default();
11
+ bonjour.publish({
12
+ name,
13
+ type: SERVICE_TYPE,
14
+ port,
15
+ protocol: "tcp",
16
+ });
17
+ return {
18
+ stop: () => {
19
+ bonjour.unpublishAll();
20
+ bonjour.destroy();
21
+ },
22
+ };
23
+ }
24
+ /**
25
+ * Resolve a service name via mDNS/Bonjour.
26
+ * Returns the host and port if found within the timeout.
27
+ */
28
+ export async function resolveViaMdns(serviceName, timeoutMs = 3000) {
29
+ const bonjour = new Bonjour.default();
30
+ return new Promise((resolve) => {
31
+ const timer = setTimeout(() => {
32
+ browser.stop();
33
+ bonjour.destroy();
34
+ resolve(null);
35
+ }, timeoutMs);
36
+ const browser = bonjour.find({ type: SERVICE_TYPE, protocol: "tcp" }, (service) => {
37
+ if (service.name === serviceName) {
38
+ clearTimeout(timer);
39
+ browser.stop();
40
+ bonjour.destroy();
41
+ resolve({
42
+ host: service.host,
43
+ port: service.port,
44
+ });
45
+ }
46
+ });
47
+ });
48
+ }
49
+ //# sourceMappingURL=mdns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mdns.js","sourceRoot":"","sources":["../../src/discovery/mdns.ts"],"names":[],"mappings":"AAAA,OAAO,OAAyB,MAAM,iBAAiB,CAAC;AAExD,MAAM,YAAY,GAAG,YAAY,CAAC;AAElC;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,IAAY;IAEZ,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAEtC,OAAO,CAAC,OAAO,CAAC;QACd,IAAI;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI;QACJ,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE,GAAG,EAAE;YACT,OAAO,CAAC,YAAY,EAAE,CAAC;YACvB,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,WAAmB,EACnB,YAAoB,IAAI;IAExB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAEtC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,OAAgB,EAAE,EAAE;YACzF,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACjC,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO,CAAC,IAAI,EAAE,CAAC;gBACf,OAAO,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO,CAAC;oBACN,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,IAAI,EAAE,OAAO,CAAC,IAAI;iBACnB,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Layered service resolver.
3
+ *
4
+ * Resolution order:
5
+ * 1. DNS hostname lookup (works in Docker Compose / Kubernetes)
6
+ * 2. mDNS/Bonjour lookup (works in local dev)
7
+ * 3. Throw if not found
8
+ */
9
+ export declare function resolveService(nameOrOptions: string | {
10
+ host: string;
11
+ port?: number;
12
+ }): Promise<{
13
+ host: string;
14
+ port: number;
15
+ }>;
16
+ //# sourceMappingURL=resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/discovery/resolver.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACtD,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CA6BzC"}
@@ -0,0 +1,36 @@
1
+ import { resolveViaDns } from "./dns.js";
2
+ import { resolveViaMdns } from "./mdns.js";
3
+ import { DEFAULT_PORT } from "../types/options.js";
4
+ /**
5
+ * Layered service resolver.
6
+ *
7
+ * Resolution order:
8
+ * 1. DNS hostname lookup (works in Docker Compose / Kubernetes)
9
+ * 2. mDNS/Bonjour lookup (works in local dev)
10
+ * 3. Throw if not found
11
+ */
12
+ export async function resolveService(nameOrOptions) {
13
+ // Explicit host:port — no discovery needed
14
+ if (typeof nameOrOptions === "object") {
15
+ return {
16
+ host: nameOrOptions.host,
17
+ port: nameOrOptions.port ?? DEFAULT_PORT,
18
+ };
19
+ }
20
+ const serviceName = nameOrOptions;
21
+ // Layer 1: DNS
22
+ const dnsResult = await resolveViaDns(serviceName);
23
+ if (dnsResult) {
24
+ return { host: dnsResult, port: DEFAULT_PORT };
25
+ }
26
+ // Layer 2: mDNS
27
+ const mdnsResult = await resolveViaMdns(serviceName, 3000);
28
+ if (mdnsResult) {
29
+ return mdnsResult;
30
+ }
31
+ // Not found
32
+ throw new Error(`Service "${serviceName}" not found. ` +
33
+ `Tried DNS and mDNS resolution. ` +
34
+ `Use explicit { host, port } to connect manually.`);
35
+ }
36
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/discovery/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,aAAuD;IAEvD,2CAA2C;IAC3C,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO;YACL,IAAI,EAAE,aAAa,CAAC,IAAI;YACxB,IAAI,EAAE,aAAa,CAAC,IAAI,IAAI,YAAY;SACzC,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,aAAa,CAAC;IAElC,eAAe;IACf,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;IACnD,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IACjD,CAAC;IAED,gBAAgB;IAChB,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAC3D,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,YAAY;IACZ,MAAM,IAAI,KAAK,CACb,YAAY,WAAW,eAAe;QACtC,iCAAiC;QACjC,kDAAkD,CACnD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @labostack/typebridge — Zero-ceremony RPC mesh for TypeScript
3
+ *
4
+ * Usage:
5
+ * import { TypeBridge, NestAdapter } from "@labostack/typebridge";
6
+ * const api = await TypeBridge.create(NestAdapter, { controllers });
7
+ * api.userController.findById("abc"); // local or remote — just works
8
+ */
9
+ export { TypeBridge } from "./bridge.js";
10
+ export type { TypeDescriptor, MethodDescriptor, ParameterDescriptor, FrameworkAdapter, NodeOptions, TypeBridgeAPI, ControllerInstances, HandshakePayload, HandshakeAckPayload, RequestPayload, ResponsePayload, ErrorPayload, } from "./types/index.js";
11
+ export { FRAME_MAGIC, PROTOCOL_VERSION, FRAME_HEADER_SIZE, MessageType, FrameFlags, } from "./types/index.js";
12
+ export { MethodRegistry } from "./registry/index.js";
13
+ export type { MethodCatalogEntry } from "./registry/index.js";
14
+ export { extractMethodsFromPrototype } from "./reflection/index.js";
15
+ export type { Serializer } from "./serialization/index.js";
16
+ export { MsgPackSerializer } from "./serialization/index.js";
17
+ export { TransportServer, TransportClient, Connection } from "./transport/index.js";
18
+ export { MeshManager } from "./mesh/index.js";
19
+ export { resolveService } from "./discovery/index.js";
20
+ export { scanControllers } from "./autobarrel/index.js";
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,YAAY,GACb,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,UAAU,GACX,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACpE,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @labostack/typebridge — Zero-ceremony RPC mesh for TypeScript
3
+ *
4
+ * Usage:
5
+ * import { TypeBridge, NestAdapter } from "@labostack/typebridge";
6
+ * const api = await TypeBridge.create(NestAdapter, { controllers });
7
+ * api.userController.findById("abc"); // local or remote — just works
8
+ */
9
+ export { TypeBridge } from "./bridge.js";
10
+ export { FRAME_MAGIC, PROTOCOL_VERSION, FRAME_HEADER_SIZE, MessageType, FrameFlags, } from "./types/index.js";
11
+ // ─── Internals (advanced usage) ──────────────────
12
+ export { MethodRegistry } from "./registry/index.js";
13
+ export { extractMethodsFromPrototype } from "./reflection/index.js";
14
+ export { MsgPackSerializer } from "./serialization/index.js";
15
+ export { TransportServer, TransportClient, Connection } from "./transport/index.js";
16
+ export { MeshManager } from "./mesh/index.js";
17
+ export { resolveService } from "./discovery/index.js";
18
+ export { scanControllers } from "./autobarrel/index.js";
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAkBzC,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,UAAU,GACX,MAAM,kBAAkB,CAAC;AAE1B,oDAAoD;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAEpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { MeshManager } from "./mesh-manager.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mesh/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { MeshManager } from "./mesh-manager.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mesh/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { EventEmitter } from "node:events";
2
+ import type { Connection } from "../transport/connection.js";
3
+ import type { MethodRegistry, MethodCatalogEntry } from "../registry/method-registry.js";
4
+ /**
5
+ * MeshManager — automatic peer discovery, connection, and controller routing.
6
+ *
7
+ * Each TypeBridge node has a MeshManager that:
8
+ * 1. Browses for other nodes via mDNS
9
+ * 2. Auto-connects and exchanges catalogs
10
+ * 3. Maintains a routing table: controllerName → Connection
11
+ * 4. Routes method calls to the right peer
12
+ */
13
+ export declare class MeshManager extends EventEmitter {
14
+ private readonly localName;
15
+ private readonly localRegistry;
16
+ /** peerName → Connection */
17
+ private peers;
18
+ /** controllerName → peerName */
19
+ private routes;
20
+ /** Clients we created (for cleanup) */
21
+ private clients;
22
+ /** mDNS browser stop handle */
23
+ private stopBrowsing;
24
+ constructor(localName: string, localRegistry: MethodRegistry);
25
+ /**
26
+ * Start browsing for other TypeBridge nodes via mDNS.
27
+ */
28
+ startBrowsing(): Promise<void>;
29
+ /**
30
+ * Connect to a discovered peer, exchange catalogs.
31
+ */
32
+ connectToPeer(name: string, host: string, port: number): Promise<void>;
33
+ /**
34
+ * Register an incoming peer (called from server-side handshake handler).
35
+ */
36
+ registerIncomingPeer(name: string, connection: Connection, catalog: Record<string, MethodCatalogEntry[]>): void;
37
+ /**
38
+ * Register a peer and its controllers in the routing table.
39
+ */
40
+ private registerPeer;
41
+ /**
42
+ * Get the connection for a controller.
43
+ * If the controller isn't found yet, waits for discovery (with timeout).
44
+ */
45
+ getConnection(controllerName: string, timeout?: number): Promise<Connection>;
46
+ /**
47
+ * Check if a controller is available on any peer.
48
+ */
49
+ hasController(controllerName: string): boolean;
50
+ /**
51
+ * Close all peer connections and stop browsing.
52
+ */
53
+ close(): Promise<void>;
54
+ }
55
+ //# sourceMappingURL=mesh-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh-manager.d.ts","sourceRoot":"","sources":["../../src/mesh/mesh-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEzF;;;;;;;;GAQG;AACH,qBAAa,WAAY,SAAQ,YAAY;IAWzC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAXhC,4BAA4B;IAC5B,OAAO,CAAC,KAAK,CAAiC;IAC9C,gCAAgC;IAChC,OAAO,CAAC,MAAM,CAA6B;IAC3C,uCAAuC;IACvC,OAAO,CAAC,OAAO,CAAyB;IACxC,+BAA+B;IAC/B,OAAO,CAAC,YAAY,CAA6B;gBAG9B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,cAAc;IAKhD;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IA+BpC;;OAEG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA4B5E;;OAEG;IACH,oBAAoB,CAClB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,GAC5C,IAAI;IAKP;;OAEG;IACH,OAAO,CAAC,YAAY;IAsCpB;;;OAGG;IACG,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;IAkClF;;OAEG;IACH,aAAa,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO;IAI9C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAS7B"}