@aster-rpc/aster 0.1.2

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 (233) hide show
  1. package/dist/capabilities.d.ts +26 -0
  2. package/dist/capabilities.d.ts.map +1 -0
  3. package/dist/capabilities.js +29 -0
  4. package/dist/capabilities.js.map +1 -0
  5. package/dist/client.d.ts +65 -0
  6. package/dist/client.d.ts.map +1 -0
  7. package/dist/client.js +108 -0
  8. package/dist/client.js.map +1 -0
  9. package/dist/codec.d.ts +156 -0
  10. package/dist/codec.d.ts.map +1 -0
  11. package/dist/codec.js +477 -0
  12. package/dist/codec.js.map +1 -0
  13. package/dist/config.d.ts +102 -0
  14. package/dist/config.d.ts.map +1 -0
  15. package/dist/config.js +454 -0
  16. package/dist/config.js.map +1 -0
  17. package/dist/contract/identity.d.ts +115 -0
  18. package/dist/contract/identity.d.ts.map +1 -0
  19. package/dist/contract/identity.js +188 -0
  20. package/dist/contract/identity.js.map +1 -0
  21. package/dist/contract/manifest.d.ts +77 -0
  22. package/dist/contract/manifest.d.ts.map +1 -0
  23. package/dist/contract/manifest.js +127 -0
  24. package/dist/contract/manifest.js.map +1 -0
  25. package/dist/contract/publication.d.ts +71 -0
  26. package/dist/contract/publication.d.ts.map +1 -0
  27. package/dist/contract/publication.js +85 -0
  28. package/dist/contract/publication.js.map +1 -0
  29. package/dist/decorators.d.ts +139 -0
  30. package/dist/decorators.d.ts.map +1 -0
  31. package/dist/decorators.js +175 -0
  32. package/dist/decorators.js.map +1 -0
  33. package/dist/dynamic.d.ts +61 -0
  34. package/dist/dynamic.d.ts.map +1 -0
  35. package/dist/dynamic.js +147 -0
  36. package/dist/dynamic.js.map +1 -0
  37. package/dist/framing.d.ts +74 -0
  38. package/dist/framing.d.ts.map +1 -0
  39. package/dist/framing.js +162 -0
  40. package/dist/framing.js.map +1 -0
  41. package/dist/health.d.ts +127 -0
  42. package/dist/health.d.ts.map +1 -0
  43. package/dist/health.js +236 -0
  44. package/dist/health.js.map +1 -0
  45. package/dist/index.d.ts +67 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +101 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/interceptors/audit.d.ts +25 -0
  50. package/dist/interceptors/audit.d.ts.map +1 -0
  51. package/dist/interceptors/audit.js +46 -0
  52. package/dist/interceptors/audit.js.map +1 -0
  53. package/dist/interceptors/auth.d.ts +13 -0
  54. package/dist/interceptors/auth.d.ts.map +1 -0
  55. package/dist/interceptors/auth.js +34 -0
  56. package/dist/interceptors/auth.js.map +1 -0
  57. package/dist/interceptors/base.d.ts +74 -0
  58. package/dist/interceptors/base.d.ts.map +1 -0
  59. package/dist/interceptors/base.js +103 -0
  60. package/dist/interceptors/base.js.map +1 -0
  61. package/dist/interceptors/capability.d.ts +16 -0
  62. package/dist/interceptors/capability.d.ts.map +1 -0
  63. package/dist/interceptors/capability.js +63 -0
  64. package/dist/interceptors/capability.js.map +1 -0
  65. package/dist/interceptors/circuit-breaker.d.ts +40 -0
  66. package/dist/interceptors/circuit-breaker.d.ts.map +1 -0
  67. package/dist/interceptors/circuit-breaker.js +91 -0
  68. package/dist/interceptors/circuit-breaker.js.map +1 -0
  69. package/dist/interceptors/compression.d.ts +11 -0
  70. package/dist/interceptors/compression.d.ts.map +1 -0
  71. package/dist/interceptors/compression.js +12 -0
  72. package/dist/interceptors/compression.js.map +1 -0
  73. package/dist/interceptors/deadline.d.ts +12 -0
  74. package/dist/interceptors/deadline.d.ts.map +1 -0
  75. package/dist/interceptors/deadline.js +28 -0
  76. package/dist/interceptors/deadline.js.map +1 -0
  77. package/dist/interceptors/metrics.d.ts +43 -0
  78. package/dist/interceptors/metrics.d.ts.map +1 -0
  79. package/dist/interceptors/metrics.js +132 -0
  80. package/dist/interceptors/metrics.js.map +1 -0
  81. package/dist/interceptors/rate-limit.d.ts +24 -0
  82. package/dist/interceptors/rate-limit.d.ts.map +1 -0
  83. package/dist/interceptors/rate-limit.js +84 -0
  84. package/dist/interceptors/rate-limit.js.map +1 -0
  85. package/dist/interceptors/retry.d.ts +25 -0
  86. package/dist/interceptors/retry.d.ts.map +1 -0
  87. package/dist/interceptors/retry.js +55 -0
  88. package/dist/interceptors/retry.js.map +1 -0
  89. package/dist/limits.d.ts +77 -0
  90. package/dist/limits.d.ts.map +1 -0
  91. package/dist/limits.js +137 -0
  92. package/dist/limits.js.map +1 -0
  93. package/dist/logging.d.ts +40 -0
  94. package/dist/logging.d.ts.map +1 -0
  95. package/dist/logging.js +92 -0
  96. package/dist/logging.js.map +1 -0
  97. package/dist/metadata.d.ts +14 -0
  98. package/dist/metadata.d.ts.map +1 -0
  99. package/dist/metadata.js +68 -0
  100. package/dist/metadata.js.map +1 -0
  101. package/dist/metrics.d.ts +40 -0
  102. package/dist/metrics.d.ts.map +1 -0
  103. package/dist/metrics.js +92 -0
  104. package/dist/metrics.js.map +1 -0
  105. package/dist/peer-store.d.ts +53 -0
  106. package/dist/peer-store.d.ts.map +1 -0
  107. package/dist/peer-store.js +105 -0
  108. package/dist/peer-store.js.map +1 -0
  109. package/dist/protocol.d.ts +44 -0
  110. package/dist/protocol.d.ts.map +1 -0
  111. package/dist/protocol.js +59 -0
  112. package/dist/protocol.js.map +1 -0
  113. package/dist/registration.d.ts +81 -0
  114. package/dist/registration.d.ts.map +1 -0
  115. package/dist/registration.js +161 -0
  116. package/dist/registration.js.map +1 -0
  117. package/dist/registry/acl.d.ts +57 -0
  118. package/dist/registry/acl.d.ts.map +1 -0
  119. package/dist/registry/acl.js +104 -0
  120. package/dist/registry/acl.js.map +1 -0
  121. package/dist/registry/client.d.ts +70 -0
  122. package/dist/registry/client.d.ts.map +1 -0
  123. package/dist/registry/client.js +115 -0
  124. package/dist/registry/client.js.map +1 -0
  125. package/dist/registry/gossip.d.ts +43 -0
  126. package/dist/registry/gossip.d.ts.map +1 -0
  127. package/dist/registry/gossip.js +102 -0
  128. package/dist/registry/gossip.js.map +1 -0
  129. package/dist/registry/keys.d.ts +25 -0
  130. package/dist/registry/keys.d.ts.map +1 -0
  131. package/dist/registry/keys.js +47 -0
  132. package/dist/registry/keys.js.map +1 -0
  133. package/dist/registry/models.d.ts +80 -0
  134. package/dist/registry/models.d.ts.map +1 -0
  135. package/dist/registry/models.js +35 -0
  136. package/dist/registry/models.js.map +1 -0
  137. package/dist/registry/publisher.d.ts +65 -0
  138. package/dist/registry/publisher.d.ts.map +1 -0
  139. package/dist/registry/publisher.js +164 -0
  140. package/dist/registry/publisher.js.map +1 -0
  141. package/dist/runtime.d.ts +267 -0
  142. package/dist/runtime.d.ts.map +1 -0
  143. package/dist/runtime.js +1366 -0
  144. package/dist/runtime.js.map +1 -0
  145. package/dist/server.d.ts +100 -0
  146. package/dist/server.d.ts.map +1 -0
  147. package/dist/server.js +511 -0
  148. package/dist/server.js.map +1 -0
  149. package/dist/service.d.ts +72 -0
  150. package/dist/service.d.ts.map +1 -0
  151. package/dist/service.js +98 -0
  152. package/dist/service.js.map +1 -0
  153. package/dist/session.d.ts +64 -0
  154. package/dist/session.d.ts.map +1 -0
  155. package/dist/session.js +350 -0
  156. package/dist/session.js.map +1 -0
  157. package/dist/status.d.ts +113 -0
  158. package/dist/status.d.ts.map +1 -0
  159. package/dist/status.js +206 -0
  160. package/dist/status.js.map +1 -0
  161. package/dist/transport/base.d.ts +46 -0
  162. package/dist/transport/base.d.ts.map +1 -0
  163. package/dist/transport/base.js +10 -0
  164. package/dist/transport/base.js.map +1 -0
  165. package/dist/transport/iroh.d.ts +45 -0
  166. package/dist/transport/iroh.d.ts.map +1 -0
  167. package/dist/transport/iroh.js +225 -0
  168. package/dist/transport/iroh.js.map +1 -0
  169. package/dist/transport/local.d.ts +48 -0
  170. package/dist/transport/local.d.ts.map +1 -0
  171. package/dist/transport/local.js +139 -0
  172. package/dist/transport/local.js.map +1 -0
  173. package/dist/trust/admission.d.ts +60 -0
  174. package/dist/trust/admission.d.ts.map +1 -0
  175. package/dist/trust/admission.js +149 -0
  176. package/dist/trust/admission.js.map +1 -0
  177. package/dist/trust/bootstrap.d.ts +109 -0
  178. package/dist/trust/bootstrap.d.ts.map +1 -0
  179. package/dist/trust/bootstrap.js +311 -0
  180. package/dist/trust/bootstrap.js.map +1 -0
  181. package/dist/trust/clock.d.ts +93 -0
  182. package/dist/trust/clock.d.ts.map +1 -0
  183. package/dist/trust/clock.js +154 -0
  184. package/dist/trust/clock.js.map +1 -0
  185. package/dist/trust/consumer.d.ts +139 -0
  186. package/dist/trust/consumer.d.ts.map +1 -0
  187. package/dist/trust/consumer.js +323 -0
  188. package/dist/trust/consumer.js.map +1 -0
  189. package/dist/trust/credentials.d.ts +98 -0
  190. package/dist/trust/credentials.d.ts.map +1 -0
  191. package/dist/trust/credentials.js +250 -0
  192. package/dist/trust/credentials.js.map +1 -0
  193. package/dist/trust/delegated.d.ts +118 -0
  194. package/dist/trust/delegated.d.ts.map +1 -0
  195. package/dist/trust/delegated.js +292 -0
  196. package/dist/trust/delegated.js.map +1 -0
  197. package/dist/trust/gossip.d.ts +146 -0
  198. package/dist/trust/gossip.d.ts.map +1 -0
  199. package/dist/trust/gossip.js +334 -0
  200. package/dist/trust/gossip.js.map +1 -0
  201. package/dist/trust/hooks.d.ts +84 -0
  202. package/dist/trust/hooks.d.ts.map +1 -0
  203. package/dist/trust/hooks.js +125 -0
  204. package/dist/trust/hooks.js.map +1 -0
  205. package/dist/trust/iid.d.ts +65 -0
  206. package/dist/trust/iid.d.ts.map +1 -0
  207. package/dist/trust/iid.js +104 -0
  208. package/dist/trust/iid.js.map +1 -0
  209. package/dist/trust/mesh.d.ts +43 -0
  210. package/dist/trust/mesh.d.ts.map +1 -0
  211. package/dist/trust/mesh.js +105 -0
  212. package/dist/trust/mesh.js.map +1 -0
  213. package/dist/trust/nonce.d.ts +39 -0
  214. package/dist/trust/nonce.d.ts.map +1 -0
  215. package/dist/trust/nonce.js +46 -0
  216. package/dist/trust/nonce.js.map +1 -0
  217. package/dist/trust/producer.d.ts +80 -0
  218. package/dist/trust/producer.d.ts.map +1 -0
  219. package/dist/trust/producer.js +151 -0
  220. package/dist/trust/producer.js.map +1 -0
  221. package/dist/trust/rcan.d.ts +29 -0
  222. package/dist/trust/rcan.d.ts.map +1 -0
  223. package/dist/trust/rcan.js +57 -0
  224. package/dist/trust/rcan.js.map +1 -0
  225. package/dist/types.d.ts +57 -0
  226. package/dist/types.d.ts.map +1 -0
  227. package/dist/types.js +50 -0
  228. package/dist/types.js.map +1 -0
  229. package/dist/xlang.d.ts +26 -0
  230. package/dist/xlang.d.ts.map +1 -0
  231. package/dist/xlang.js +55 -0
  232. package/dist/xlang.js.map +1 -0
  233. package/package.json +59 -0
package/dist/server.js ADDED
@@ -0,0 +1,511 @@
1
+ /**
2
+ * Aster RPC server — QUIC accept loop + stream dispatch.
3
+ *
4
+ * Spec reference: S8.1 (Server API), S8.2 (Server accept loop)
5
+ *
6
+ * Accepts connections on an IrohNode, reads StreamHeaders, dispatches
7
+ * to registered service handlers, and writes responses + trailers.
8
+ *
9
+ * This module handles real QUIC streams (via NAPI-RS native addon).
10
+ * For in-process testing, use LocalTransport instead.
11
+ */
12
+ import { JsonCodec } from './codec.js';
13
+ import { writeFrame, readFrame, HEADER, TRAILER, COMPRESSED, CANCEL, } from './framing.js';
14
+ import { SessionServer } from './session.js';
15
+ import { RpcStatus } from './protocol.js';
16
+ import { StatusCode, RpcError } from './status.js';
17
+ import { RpcPattern } from './types.js';
18
+ import { buildCallContext, applyRequestInterceptors, applyResponseInterceptors, } from './interceptors/base.js';
19
+ import { withRequestContext, createLogger } from './logging.js';
20
+ import { validateMetadata, MAX_HANDLER_TIMEOUT_S, MAX_CLIENT_STREAM_ITEMS } from './limits.js';
21
+ import { DeadlineInterceptor } from './interceptors/deadline.js';
22
+ /**
23
+ * Aster RPC server over real QUIC streams.
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * const server = new RpcServer({
28
+ * registry,
29
+ * codec: new JsonCodec(),
30
+ * });
31
+ * await server.serve(node);
32
+ * ```
33
+ */
34
+ export class RpcServer {
35
+ registry;
36
+ codec;
37
+ interceptors;
38
+ logger;
39
+ peerStore;
40
+ _serving = false;
41
+ _connections = new Set();
42
+ /** Mark the server as serving (enables handleConnection loops). */
43
+ setServing(value = true) { this._serving = value; }
44
+ constructor(opts) {
45
+ this.registry = opts.registry;
46
+ this.codec = opts.codec ?? new JsonCodec();
47
+ this.interceptors = opts.interceptors ?? [new DeadlineInterceptor()];
48
+ this.logger = opts.logger ?? createLogger();
49
+ this.peerStore = opts.peerStore;
50
+ }
51
+ /** Start accepting connections. Runs until close() is called. */
52
+ async serve(node) {
53
+ this._serving = true;
54
+ this.logger.info('server starting', { node_id: node.nodeId() });
55
+ while (this._serving) {
56
+ try {
57
+ const conn = await node.acceptAster();
58
+ this._connections.add(conn);
59
+ this.handleConnection(conn).catch(e => {
60
+ this.logger.error('connection error', { error: String(e) });
61
+ }).finally(() => {
62
+ this._connections.delete(conn);
63
+ });
64
+ }
65
+ catch (e) {
66
+ if (!this._serving)
67
+ break;
68
+ this.logger.error('accept error', { error: String(e) });
69
+ }
70
+ }
71
+ }
72
+ /** Handle a single connection (accept streams in a loop). */
73
+ async handleConnection(conn) {
74
+ const peerId = conn.remoteNodeId();
75
+ this.logger.debug('connection opened', { peer: peerId });
76
+ try {
77
+ while (this._serving) {
78
+ try {
79
+ const bi = await conn.acceptBi();
80
+ const send = bi.takeSend();
81
+ const recv = bi.takeRecv();
82
+ this.handleStream(conn, send, recv).catch(e => {
83
+ this.logger.error('stream error', { error: String(e), peer: peerId });
84
+ });
85
+ }
86
+ catch (e) {
87
+ const msg = String(e);
88
+ if (msg.includes('normal close') || msg.includes('code 0'))
89
+ break;
90
+ if (!this._serving)
91
+ break;
92
+ throw e;
93
+ }
94
+ }
95
+ }
96
+ finally {
97
+ this.logger.debug('connection closed', { peer: peerId });
98
+ }
99
+ }
100
+ /** Handle a single RPC stream. */
101
+ async handleStream(conn, send, recv) {
102
+ try {
103
+ // Read StreamHeader (first frame, HEADER flag)
104
+ const frame = await readFrame(recv, 0);
105
+ if (!frame)
106
+ return;
107
+ const [payload, flags] = frame;
108
+ if (!(flags & HEADER)) {
109
+ await this.writeErrorTrailer(send, StatusCode.INTERNAL, 'first frame must have HEADER flag');
110
+ return;
111
+ }
112
+ // Sniff the first byte: '{' (0x7B) means JSON, anything else is binary
113
+ // (Fory XLANG). The TypeScript binding only speaks JSON because Fory JS
114
+ // is not yet XLANG-compliant — refuse binary requests with a clear,
115
+ // JSON-encoded error trailer the peer can decode either way.
116
+ if (!payload || payload[0] !== 0x7b /* '{' */) {
117
+ await this.writeErrorTrailer(send, StatusCode.INVALID_ARGUMENT, 'this server only supports JSON serialization (mode 3); resend the StreamHeader as JSON');
118
+ return;
119
+ }
120
+ const header = this.codec.decode(payload);
121
+ if (!header.service) {
122
+ await this.writeErrorTrailer(send, StatusCode.INVALID_ARGUMENT, 'missing service name');
123
+ return;
124
+ }
125
+ // Look up service
126
+ const svcInfo = this.registry.lookup(header.service, header.version);
127
+ if (!svcInfo) {
128
+ await this.writeErrorTrailer(send, StatusCode.NOT_FOUND, `service '${header.service}' v${header.version} not found`);
129
+ return;
130
+ }
131
+ // ── Session discriminator check ─────────────────────────────────
132
+ const isSessionStream = (header.method === '');
133
+ const isSessionService = (svcInfo.scoped === 'session');
134
+ if (isSessionStream !== isSessionService) {
135
+ let peerId = '';
136
+ try {
137
+ peerId = conn.remoteNodeId();
138
+ }
139
+ catch { /* ignore */ }
140
+ let msg;
141
+ if (isSessionService) {
142
+ msg = `'${header.service}' is session-scoped: open a session stream (method='') instead of calling method '${header.method}' directly`;
143
+ }
144
+ else {
145
+ msg = `'${header.service}' is shared: send a method name instead of opening a session stream (method='')`;
146
+ }
147
+ this.logger.warn(`scope mismatch: ${msg}; peer=${peerId}`);
148
+ await this.writeErrorTrailer(send, StatusCode.FAILED_PRECONDITION, msg);
149
+ return;
150
+ }
151
+ if (isSessionStream) {
152
+ let peerId;
153
+ try {
154
+ peerId = conn.remoteNodeId();
155
+ }
156
+ catch { /* ignore */ }
157
+ let attributes;
158
+ if (peerId && this.peerStore) {
159
+ const m = this.peerStore.getAttributes(peerId);
160
+ if (m.size > 0)
161
+ attributes = Object.fromEntries(m);
162
+ }
163
+ const sessionServer = new SessionServer(this.codec, this.interceptors);
164
+ await sessionServer.handleSession(recv, send, svcInfo, header, peerId, attributes);
165
+ try {
166
+ await send.finish();
167
+ }
168
+ catch { /* best effort */ }
169
+ return;
170
+ }
171
+ // ── End session discriminator ──────────────────────────────────
172
+ // Look up method (shared services only — session dispatch is above)
173
+ const methodInfo = svcInfo.methods.get(header.method);
174
+ if (!methodInfo) {
175
+ await this.writeErrorTrailer(send, StatusCode.UNIMPLEMENTED, `method '${header.service}.${header.method}' not found`);
176
+ return;
177
+ }
178
+ // Validate metadata
179
+ if (header.metadataKeys.length > 0) {
180
+ try {
181
+ validateMetadata(header.metadataKeys, header.metadataValues);
182
+ }
183
+ catch {
184
+ await this.writeErrorTrailer(send, StatusCode.RESOURCE_EXHAUSTED, 'metadata exceeds limits');
185
+ return;
186
+ }
187
+ }
188
+ // Build call context
189
+ let peerId;
190
+ try {
191
+ peerId = conn.remoteNodeId();
192
+ }
193
+ catch { /* ignore */ }
194
+ // Pull admission attributes from the peer store so authorization
195
+ // interceptors (CapabilityInterceptor) see the caller's roles.
196
+ let attributes;
197
+ if (peerId && this.peerStore) {
198
+ const m = this.peerStore.getAttributes(peerId);
199
+ if (m.size > 0) {
200
+ attributes = Object.fromEntries(m);
201
+ }
202
+ }
203
+ const callCtx = buildCallContext({
204
+ service: header.service,
205
+ method: header.method,
206
+ metadata: this.buildMetadata(header),
207
+ deadlineEpochMs: header.deadlineEpochMs,
208
+ peer: peerId,
209
+ pattern: methodInfo.pattern,
210
+ idempotent: methodInfo.idempotent,
211
+ callId: header.callId || undefined,
212
+ attributes,
213
+ });
214
+ // Dispatch by pattern
215
+ await withRequestContext({ service: header.service, method: header.method, requestId: callCtx.callId, peer: peerId }, () => this.dispatchRpc(svcInfo, methodInfo, callCtx, send, recv));
216
+ }
217
+ catch (e) {
218
+ if (e instanceof RpcError) {
219
+ await this.writeErrorTrailer(send, e.code, e.message);
220
+ }
221
+ else {
222
+ this.logger.error('stream handler error', { error: String(e) });
223
+ await this.writeErrorTrailer(send, StatusCode.INTERNAL, String(e));
224
+ }
225
+ }
226
+ }
227
+ /** Dispatch an RPC based on pattern. */
228
+ async dispatchRpc(svcInfo, methodInfo, callCtx, send, recv) {
229
+ const handler = methodInfo.handler;
230
+ if (!handler) {
231
+ await this.writeErrorTrailer(send, StatusCode.INTERNAL, 'no handler');
232
+ return;
233
+ }
234
+ // Run authorization-style interceptors BEFORE pattern dispatch.
235
+ // CallContext-only interceptors (CapabilityInterceptor, deadline, metrics,
236
+ // rate-limit) execute here and can reject the stream before any frames
237
+ // are read. This guarantees auth checks fire on every pattern, including
238
+ // bidi streams that might never produce a request frame.
239
+ try {
240
+ await applyRequestInterceptors(this.interceptors, callCtx, null);
241
+ }
242
+ catch (e) {
243
+ if (e instanceof RpcError) {
244
+ await this.writeErrorTrailer(send, e.code, e.message);
245
+ return;
246
+ }
247
+ throw e;
248
+ }
249
+ switch (methodInfo.pattern) {
250
+ case RpcPattern.UNARY:
251
+ await this.handleUnary(svcInfo, methodInfo, handler, callCtx, send, recv);
252
+ break;
253
+ case RpcPattern.SERVER_STREAM:
254
+ await this.handleServerStream(svcInfo, methodInfo, handler, callCtx, send, recv);
255
+ break;
256
+ case RpcPattern.CLIENT_STREAM:
257
+ await this.handleClientStream(svcInfo, methodInfo, handler, callCtx, send, recv);
258
+ break;
259
+ case RpcPattern.BIDI_STREAM:
260
+ await this.handleBidiStream(svcInfo, methodInfo, handler, callCtx, send, recv);
261
+ break;
262
+ default:
263
+ await this.writeErrorTrailer(send, StatusCode.INTERNAL, `unknown pattern: ${methodInfo.pattern}`);
264
+ }
265
+ }
266
+ async handleUnary(svcInfo, methodInfo, handler, callCtx, send, recv) {
267
+ // Read request
268
+ const reqFrame = await readFrame(recv, 0);
269
+ if (!reqFrame) {
270
+ await this.writeErrorTrailer(send, StatusCode.UNAVAILABLE, 'stream ended before request');
271
+ return;
272
+ }
273
+ const [reqPayload, reqFlags] = reqFrame;
274
+ const compressed = !!(reqFlags & COMPRESSED);
275
+ // Pass the request type as the codec hint so JsonCodec can do
276
+ // strict shape validation. Wrong/extra/missing fields raise
277
+ // CONTRACT_VIOLATION before the handler runs.
278
+ const reqType = methodInfo.requestType;
279
+ let request = compressed
280
+ ? this.codec.decodeCompressed(reqPayload, true, reqType)
281
+ : this.codec.decode(reqPayload, reqType);
282
+ // Interceptors
283
+ request = await applyRequestInterceptors(this.interceptors, callCtx, request);
284
+ // Invoke handler with deadline enforcement
285
+ let response;
286
+ try {
287
+ response = await this.runWithDeadline(callCtx, () => handler.call(svcInfo.instance, request));
288
+ }
289
+ catch (e) {
290
+ if (e instanceof RpcError && e.code === StatusCode.DEADLINE_EXCEEDED) {
291
+ await this.writeErrorTrailer(send, StatusCode.DEADLINE_EXCEEDED, 'deadline exceeded');
292
+ return;
293
+ }
294
+ throw e;
295
+ }
296
+ response = await applyResponseInterceptors(this.interceptors, callCtx, response);
297
+ // Write response + trailer
298
+ const [respPayload, respCompressed] = this.codec.encodeCompressed(response);
299
+ await writeFrame(send, respPayload, respCompressed ? COMPRESSED : 0);
300
+ await this.writeOkTrailer(send);
301
+ await send.finish();
302
+ }
303
+ async handleServerStream(svcInfo, methodInfo, handler, callCtx, send, recv) {
304
+ const reqFrame = await readFrame(recv, 0);
305
+ if (!reqFrame) {
306
+ await this.writeErrorTrailer(send, StatusCode.UNAVAILABLE, 'stream ended');
307
+ return;
308
+ }
309
+ const [reqPayload, reqFlags] = reqFrame;
310
+ const compressed = !!(reqFlags & COMPRESSED);
311
+ const reqType = methodInfo.requestType;
312
+ let request = compressed
313
+ ? this.codec.decodeCompressed(reqPayload, true, reqType)
314
+ : this.codec.decode(reqPayload, reqType);
315
+ request = await applyRequestInterceptors(this.interceptors, callCtx, request);
316
+ const gen = handler.call(svcInfo.instance, request);
317
+ const deadlineMs = Date.now() + this.handlerTimeoutMs(callCtx);
318
+ for await (let response of gen) {
319
+ if (Date.now() > deadlineMs) {
320
+ await this.writeErrorTrailer(send, StatusCode.DEADLINE_EXCEEDED, 'deadline exceeded');
321
+ return;
322
+ }
323
+ response = await applyResponseInterceptors(this.interceptors, callCtx, response);
324
+ const [respPayload, respCompressed] = this.codec.encodeCompressed(response);
325
+ await writeFrame(send, respPayload, respCompressed ? COMPRESSED : 0);
326
+ }
327
+ await this.writeOkTrailer(send);
328
+ await send.finish();
329
+ }
330
+ async handleClientStream(svcInfo, methodInfo, handler, callCtx, send, recv) {
331
+ // Collect requests until stream ends
332
+ const requests = [];
333
+ const reqType = methodInfo.requestType;
334
+ while (true) {
335
+ const frame = await readFrame(recv, 0);
336
+ if (!frame)
337
+ break;
338
+ const [payload, flags] = frame;
339
+ if (flags & TRAILER) {
340
+ try {
341
+ const eoi = this.codec.decode(payload);
342
+ if (eoi.code !== StatusCode.OK) {
343
+ await this.writeErrorTrailer(send, StatusCode.INTERNAL, `client sent non-OK EoI trailer (code=${eoi.code})`);
344
+ return;
345
+ }
346
+ }
347
+ catch { /* best-effort validation */ }
348
+ break;
349
+ }
350
+ if (flags & CANCEL)
351
+ continue;
352
+ if (requests.length >= MAX_CLIENT_STREAM_ITEMS) {
353
+ await this.writeErrorTrailer(send, StatusCode.RESOURCE_EXHAUSTED, `client stream exceeded ${MAX_CLIENT_STREAM_ITEMS} items`);
354
+ return;
355
+ }
356
+ const compressed = !!(flags & COMPRESSED);
357
+ let request = compressed
358
+ ? this.codec.decodeCompressed(payload, true, reqType)
359
+ : this.codec.decode(payload, reqType);
360
+ request = await applyRequestInterceptors(this.interceptors, callCtx, request);
361
+ requests.push(request);
362
+ }
363
+ // Provide as async iterable
364
+ async function* requestIter() { for (const r of requests)
365
+ yield r; }
366
+ let response;
367
+ try {
368
+ response = await this.runWithDeadline(callCtx, () => handler.call(svcInfo.instance, requestIter()));
369
+ }
370
+ catch (e) {
371
+ if (e instanceof RpcError && e.code === StatusCode.DEADLINE_EXCEEDED) {
372
+ await this.writeErrorTrailer(send, StatusCode.DEADLINE_EXCEEDED, 'deadline exceeded');
373
+ return;
374
+ }
375
+ throw e;
376
+ }
377
+ response = await applyResponseInterceptors(this.interceptors, callCtx, response);
378
+ const [respPayload, respCompressed] = this.codec.encodeCompressed(response);
379
+ await writeFrame(send, respPayload, respCompressed ? COMPRESSED : 0);
380
+ await this.writeOkTrailer(send);
381
+ await send.finish();
382
+ }
383
+ async handleBidiStream(svcInfo, methodInfo, handler, callCtx, send, recv) {
384
+ // Auth interceptors already ran in dispatchRpc() before this method.
385
+ // No need to run them again here.
386
+ // Create request iterable from incoming frames with error capture.
387
+ // Wrap the error in an object so TS doesn't narrow it to `never`
388
+ // after the for-await loop (TS can't track closure mutations to a
389
+ // local variable, but it can track property access through one).
390
+ const self = this;
391
+ const errBox = { value: null };
392
+ const reqType = methodInfo.requestType;
393
+ async function* requestIter() {
394
+ try {
395
+ while (true) {
396
+ const frame = await readFrame(recv, 0);
397
+ if (!frame)
398
+ break;
399
+ const [payload, flags] = frame;
400
+ if (flags & TRAILER)
401
+ break;
402
+ if (flags & CANCEL)
403
+ continue;
404
+ const compressed = !!(flags & COMPRESSED);
405
+ const request = compressed
406
+ ? self.codec.decodeCompressed(payload, true, reqType)
407
+ : self.codec.decode(payload, reqType);
408
+ yield request;
409
+ }
410
+ }
411
+ catch (e) {
412
+ errBox.value = e instanceof Error ? e : new Error(String(e));
413
+ }
414
+ }
415
+ const gen = handler.call(svcInfo.instance, requestIter());
416
+ const deadlineMs = Date.now() + this.handlerTimeoutMs(callCtx);
417
+ for await (const response of gen) {
418
+ if (Date.now() > deadlineMs) {
419
+ await this.writeErrorTrailer(send, StatusCode.DEADLINE_EXCEEDED, 'deadline exceeded');
420
+ return;
421
+ }
422
+ const [respPayload, respCompressed] = this.codec.encodeCompressed(response);
423
+ await writeFrame(send, respPayload, respCompressed ? COMPRESSED : 0);
424
+ }
425
+ if (errBox.value !== null) {
426
+ await this.writeErrorTrailer(send, StatusCode.INTERNAL, `bidi stream reader error: ${errBox.value.message}`);
427
+ return;
428
+ }
429
+ await this.writeOkTrailer(send);
430
+ await send.finish();
431
+ }
432
+ // -- Helpers ----------------------------------------------------------------
433
+ handlerTimeoutMs(callCtx) {
434
+ const maxMs = MAX_HANDLER_TIMEOUT_S * 1000;
435
+ const deadline = callCtx.deadline;
436
+ if (deadline == null || deadline <= 0)
437
+ return maxMs;
438
+ const remaining = deadline * 1000 - Date.now();
439
+ return Math.max(0, Math.min(remaining, maxMs));
440
+ }
441
+ /** Run a handler with deadline enforcement, clearing the timer when done. */
442
+ async runWithDeadline(callCtx, fn) {
443
+ const timeout = this.handlerTimeoutMs(callCtx);
444
+ let timer;
445
+ try {
446
+ return await Promise.race([
447
+ fn(),
448
+ new Promise((_, reject) => {
449
+ timer = setTimeout(() => reject(new RpcError(StatusCode.DEADLINE_EXCEEDED, 'deadline exceeded')), timeout);
450
+ }),
451
+ ]);
452
+ }
453
+ finally {
454
+ if (timer !== undefined)
455
+ clearTimeout(timer);
456
+ }
457
+ }
458
+ buildMetadata(header) {
459
+ const metadata = {};
460
+ for (let i = 0; i < header.metadataKeys.length; i++) {
461
+ metadata[header.metadataKeys[i]] = header.metadataValues[i] ?? '';
462
+ }
463
+ return metadata;
464
+ }
465
+ async writeOkTrailer(send) {
466
+ const status = new RpcStatus({ code: StatusCode.OK });
467
+ await writeFrame(send, this.codec.encode(status), TRAILER);
468
+ }
469
+ async writeErrorTrailer(send, code, message) {
470
+ const status = new RpcStatus({ code, message });
471
+ try {
472
+ await writeFrame(send, this.codec.encode(status), TRAILER);
473
+ await send.finish();
474
+ }
475
+ catch {
476
+ // Best effort — stream may already be closed
477
+ }
478
+ }
479
+ /** Stop accepting new connections. */
480
+ close() {
481
+ this._serving = false;
482
+ for (const conn of this._connections) {
483
+ try {
484
+ conn.close(0, 'server shutdown');
485
+ }
486
+ catch { /* ignore */ }
487
+ }
488
+ this._connections.clear();
489
+ }
490
+ /** The service registry used by this server. */
491
+ get serviceRegistry() {
492
+ return this.registry;
493
+ }
494
+ /**
495
+ * Wait until the server is stopped (i.e., close() is called).
496
+ * Returns a promise that resolves when serving ends.
497
+ */
498
+ async waitUntilStopped() {
499
+ return new Promise(resolve => {
500
+ const check = () => {
501
+ if (!this._serving) {
502
+ resolve();
503
+ return;
504
+ }
505
+ setTimeout(check, 50);
506
+ };
507
+ check();
508
+ });
509
+ }
510
+ }
511
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Service metadata types and registry.
3
+ *
4
+ * These types describe the structure of an Aster RPC service at runtime.
5
+ * They are populated by the decorators in decorators.ts.
6
+ */
7
+ import type { RpcPattern, SerializationMode } from './types.js';
8
+ import type { Metadata } from './metadata.js';
9
+ /** Capability requirement for method-level access control. */
10
+ export interface CapabilityRequirement {
11
+ kind: 'role' | 'any_of' | 'all_of';
12
+ roles: string[];
13
+ }
14
+ /** Method metadata describing a single RPC method. */
15
+ export interface MethodInfo {
16
+ name: string;
17
+ pattern: RpcPattern;
18
+ requestType: unknown;
19
+ responseType: unknown;
20
+ timeout: number | undefined;
21
+ idempotent: boolean;
22
+ serialization: SerializationMode | undefined;
23
+ requires: CapabilityRequirement | undefined;
24
+ handler: ((...args: any[]) => any) | undefined;
25
+ metadata: Metadata | undefined;
26
+ }
27
+ /** Service metadata describing an RPC service. */
28
+ export interface ServiceInfo {
29
+ name: string;
30
+ version: number;
31
+ scoped: 'shared' | 'session';
32
+ methods: Map<string, MethodInfo>;
33
+ serializationModes: SerializationMode[];
34
+ requires: CapabilityRequirement | undefined;
35
+ metadata: Metadata | undefined;
36
+ /** The actual service instance (set when registered with a Server). */
37
+ instance: unknown;
38
+ }
39
+ /** Attribute key used to store ServiceInfo on decorated classes. */
40
+ export declare const SERVICE_INFO_KEY: unique symbol;
41
+ /** Attribute key used to store MethodInfo on decorated methods. */
42
+ export declare const METHOD_INFO_KEY: unique symbol;
43
+ /** Get ServiceInfo from a decorated class or instance. */
44
+ export declare function getServiceInfo(target: unknown): ServiceInfo | undefined;
45
+ /**
46
+ * Registry for looking up registered services and dispatching RPC calls.
47
+ */
48
+ export declare class ServiceRegistry {
49
+ private _services;
50
+ private _servicesByName;
51
+ /** Register a service instance. */
52
+ register(serviceInstance: object): ServiceInfo;
53
+ /** Look up a service by name and optional version. */
54
+ lookup(serviceName: string, version?: number): ServiceInfo | undefined;
55
+ /** Look up a specific method in a service. */
56
+ lookupMethod(serviceName: string, methodName: string, version?: number): [ServiceInfo, MethodInfo] | undefined;
57
+ /** All registered services. */
58
+ services(): IterableIterator<ServiceInfo>;
59
+ /** Number of registered services. */
60
+ get size(): number;
61
+ /** Get all registered services as an array. */
62
+ getAllServices(): ServiceInfo[];
63
+ }
64
+ /** Look up a method on a service info object. */
65
+ export declare function getMethod(serviceInfo: ServiceInfo, methodName: string): MethodInfo | undefined;
66
+ /** Check if a service has a method. */
67
+ export declare function hasMethod(serviceInfo: ServiceInfo, methodName: string): boolean;
68
+ /** Get the process-wide default registry (creates one if not set). */
69
+ export declare function getDefaultRegistry(): ServiceRegistry;
70
+ /** Set the process-wide default registry. */
71
+ export declare function setDefaultRegistry(registry: ServiceRegistry): void;
72
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,8DAA8D;AAC9D,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACnC,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,sDAAsD;AACtD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,UAAU,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAC7C,QAAQ,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC5C,OAAO,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC;IAC/C,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAC;CAChC;AAED,kDAAkD;AAClD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC7B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACjC,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;IACxC,QAAQ,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC5C,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC/B,uEAAuE;IACvE,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,oEAAoE;AACpE,eAAO,MAAM,gBAAgB,eAAmC,CAAC;AAEjE,mEAAmE;AACnE,eAAO,MAAM,eAAe,eAAkC,CAAC;AAE/D,0DAA0D;AAC1D,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,CASvE;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,eAAe,CAAkC;IAEzD,mCAAmC;IACnC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,WAAW;IAwB9C,sDAAsD;IACtD,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAOtE,8CAA8C;IAC9C,YAAY,CACV,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,CAAC,WAAW,EAAE,UAAU,CAAC,GAAG,SAAS;IAQxC,+BAA+B;IAC/B,QAAQ,IAAI,gBAAgB,CAAC,WAAW,CAAC;IAIzC,qCAAqC;IACrC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,+CAA+C;IAC/C,cAAc,IAAI,WAAW,EAAE;CAGhC;AAED,iDAAiD;AACjD,wBAAgB,SAAS,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAE9F;AAED,uCAAuC;AACvC,wBAAgB,SAAS,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAE/E;AAMD,sEAAsE;AACtE,wBAAgB,kBAAkB,IAAI,eAAe,CAGpD;AAED,6CAA6C;AAC7C,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAElE"}