@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
@@ -0,0 +1,98 @@
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
+ /** Attribute key used to store ServiceInfo on decorated classes. */
8
+ export const SERVICE_INFO_KEY = Symbol.for('aster.service_info');
9
+ /** Attribute key used to store MethodInfo on decorated methods. */
10
+ export const METHOD_INFO_KEY = Symbol.for('aster.method_info');
11
+ /** Get ServiceInfo from a decorated class or instance. */
12
+ export function getServiceInfo(target) {
13
+ if (target === null || target === undefined)
14
+ return undefined;
15
+ // Check on the class itself
16
+ const info = target[SERVICE_INFO_KEY];
17
+ if (info)
18
+ return info;
19
+ // Check on the constructor (if target is an instance)
20
+ const ctor = target.constructor;
21
+ if (ctor)
22
+ return ctor[SERVICE_INFO_KEY];
23
+ return undefined;
24
+ }
25
+ /**
26
+ * Registry for looking up registered services and dispatching RPC calls.
27
+ */
28
+ export class ServiceRegistry {
29
+ _services = new Map(); // key: "name/version"
30
+ _servicesByName = new Map(); // key: name (latest)
31
+ /** Register a service instance. */
32
+ register(serviceInstance) {
33
+ const info = getServiceInfo(serviceInstance);
34
+ if (!info) {
35
+ throw new TypeError(`${serviceInstance.constructor.name} is not decorated with @Service. ` +
36
+ `Use @Service({ name: ..., version: ... }) before registering.`);
37
+ }
38
+ const key = `${info.name}/${info.version}`;
39
+ if (this._services.has(key)) {
40
+ throw new Error(`Service ${info.name} v${info.version} is already registered.`);
41
+ }
42
+ // Attach the instance
43
+ info.instance = serviceInstance;
44
+ this._services.set(key, info);
45
+ this._servicesByName.set(info.name, info);
46
+ return info;
47
+ }
48
+ /** Look up a service by name and optional version. */
49
+ lookup(serviceName, version) {
50
+ if (version !== undefined) {
51
+ return this._services.get(`${serviceName}/${version}`);
52
+ }
53
+ return this._servicesByName.get(serviceName);
54
+ }
55
+ /** Look up a specific method in a service. */
56
+ lookupMethod(serviceName, methodName, version) {
57
+ const svc = this.lookup(serviceName, version);
58
+ if (!svc)
59
+ return undefined;
60
+ const method = svc.methods.get(methodName);
61
+ if (!method)
62
+ return undefined;
63
+ return [svc, method];
64
+ }
65
+ /** All registered services. */
66
+ services() {
67
+ return this._services.values();
68
+ }
69
+ /** Number of registered services. */
70
+ get size() {
71
+ return this._services.size;
72
+ }
73
+ /** Get all registered services as an array. */
74
+ getAllServices() {
75
+ return [...this._services.values()];
76
+ }
77
+ }
78
+ /** Look up a method on a service info object. */
79
+ export function getMethod(serviceInfo, methodName) {
80
+ return serviceInfo.methods.get(methodName);
81
+ }
82
+ /** Check if a service has a method. */
83
+ export function hasMethod(serviceInfo, methodName) {
84
+ return serviceInfo.methods.has(methodName);
85
+ }
86
+ // ── Default registry singleton ────────────────────────────────────────────────
87
+ let _defaultRegistry;
88
+ /** Get the process-wide default registry (creates one if not set). */
89
+ export function getDefaultRegistry() {
90
+ if (!_defaultRegistry)
91
+ _defaultRegistry = new ServiceRegistry();
92
+ return _defaultRegistry;
93
+ }
94
+ /** Set the process-wide default registry. */
95
+ export function setDefaultRegistry(registry) {
96
+ _defaultRegistry = registry;
97
+ }
98
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Session-scoped services -- multiplexed calls on a single QUIC stream.
3
+ *
4
+ * Spec reference: Aster-session-scoped-services.md
5
+ *
6
+ * Instead of opening a new stream per RPC, session-scoped services
7
+ * keep a single bidirectional stream open. Each call is demarcated
8
+ * by CALL/CANCEL frames:
9
+ *
10
+ * Stream: [StreamHeader] [CALL + CallHeader] [request] [response] [TRAILER] ...
11
+ *
12
+ * The StreamHeader has an empty method ("") to indicate session mode.
13
+ * Each CALL frame carries a CallHeader with the method name and call ID.
14
+ */
15
+ import type { Codec } from './codec.js';
16
+ import { StreamHeader } from './protocol.js';
17
+ import type { ServiceInfo } from './service.js';
18
+ import { type Interceptor } from './interceptors/base.js';
19
+ /**
20
+ * Server-side session handler.
21
+ *
22
+ * Reads CALL frames from a single stream, dispatches to the appropriate
23
+ * method handler on a per-session service instance, and writes responses.
24
+ */
25
+ export declare class SessionServer {
26
+ private codec;
27
+ private interceptors;
28
+ constructor(codec?: Codec, interceptors?: Interceptor[]);
29
+ /**
30
+ * Handle a session stream. Creates a fresh service instance, then reads
31
+ * CALL frames in a loop, dispatching each to the appropriate method
32
+ * handler until the stream ends.
33
+ */
34
+ handleSession(recv: {
35
+ readExact(n: number): Promise<Uint8Array>;
36
+ }, send: {
37
+ writeAll(data: Uint8Array): Promise<void>;
38
+ }, serviceInfo: ServiceInfo, _streamHeader: StreamHeader, peer?: string, attributes?: Record<string, string>): Promise<void>;
39
+ private getDeadlineMs;
40
+ private withDeadline;
41
+ private handleUnary;
42
+ private handleServerStream;
43
+ private handleClientStream;
44
+ private handleBidiStream;
45
+ private writeOkTrailer;
46
+ private drainRequestFrame;
47
+ }
48
+ /**
49
+ * Client-side session stub -- tracks an active session-scoped RPC stream.
50
+ */
51
+ export declare class SessionStub {
52
+ private readonly transport;
53
+ readonly sessionId: string;
54
+ private _cancelled;
55
+ constructor(transport: {
56
+ close?(): Promise<void>;
57
+ }, sessionId: string);
58
+ cancel(): Promise<void>;
59
+ get cancelled(): boolean;
60
+ }
61
+ export declare function createSession(transport: {
62
+ close?(): Promise<void>;
63
+ }, sessionId?: string): Promise<SessionStub>;
64
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAUxC,OAAO,EAAyB,YAAY,EAAE,MAAM,eAAe,CAAC;AAEpE,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,cAAc,CAAC;AAE5D,OAAO,EACL,KAAK,WAAW,EAIjB,MAAM,wBAAwB,CAAC;AAGhC;;;;;GAKG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,YAAY,CAAgB;gBAExB,KAAK,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,EAAE,WAAW,EAAE;IAKvD;;;;OAIG;IACG,aAAa,CACjB,IAAI,EAAE;QAAE,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;KAAE,EACnD,IAAI,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,EACnD,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,YAAY,EAC3B,IAAI,CAAC,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAClC,OAAO,CAAC,IAAI,CAAC;IAqHhB,OAAO,CAAC,aAAa;YASP,YAAY;YAyBZ,WAAW;YAwBX,kBAAkB;YA6BlB,kBAAkB;YAwDlB,gBAAgB;YA+ChB,cAAc;YAKd,iBAAiB;CAQhC;AAID;;GAEG;AACH,qBAAa,WAAW;IAIpB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM;IAJ5B,OAAO,CAAC,UAAU,CAAS;gBAGR,SAAS,EAAE;QAAE,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,EAC9C,SAAS,EAAE,MAAM;IAGtB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAK7B,IAAI,SAAS,IAAI,OAAO,CAEvB;CACF;AAID,wBAAsB,aAAa,CACjC,SAAS,EAAE;IAAE,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,EACtC,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,CAAC,CAGtB"}
@@ -0,0 +1,350 @@
1
+ /**
2
+ * Session-scoped services -- multiplexed calls on a single QUIC stream.
3
+ *
4
+ * Spec reference: Aster-session-scoped-services.md
5
+ *
6
+ * Instead of opening a new stream per RPC, session-scoped services
7
+ * keep a single bidirectional stream open. Each call is demarcated
8
+ * by CALL/CANCEL frames:
9
+ *
10
+ * Stream: [StreamHeader] [CALL + CallHeader] [request] [response] [TRAILER] ...
11
+ *
12
+ * The StreamHeader has an empty method ("") to indicate session mode.
13
+ * Each CALL frame carries a CallHeader with the method name and call ID.
14
+ */
15
+ import { JsonCodec } from './codec.js';
16
+ import { writeFrame, readFrame, TRAILER, CALL, CANCEL, COMPRESSED, } from './framing.js';
17
+ import { RpcStatus } from './protocol.js';
18
+ import { StatusCode, RpcError } from './status.js';
19
+ import { RpcPattern } from './types.js';
20
+ import { buildCallContext, applyRequestInterceptors, applyResponseInterceptors, } from './interceptors/base.js';
21
+ import { MAX_HANDLER_TIMEOUT_S, MAX_CLIENT_STREAM_ITEMS, validateMetadata, LimitExceeded } from './limits.js';
22
+ /**
23
+ * Server-side session handler.
24
+ *
25
+ * Reads CALL frames from a single stream, dispatches to the appropriate
26
+ * method handler on a per-session service instance, and writes responses.
27
+ */
28
+ export class SessionServer {
29
+ codec;
30
+ interceptors;
31
+ constructor(codec, interceptors) {
32
+ this.codec = codec ?? new JsonCodec();
33
+ this.interceptors = interceptors ?? [];
34
+ }
35
+ /**
36
+ * Handle a session stream. Creates a fresh service instance, then reads
37
+ * CALL frames in a loop, dispatching each to the appropriate method
38
+ * handler until the stream ends.
39
+ */
40
+ async handleSession(recv, send, serviceInfo, _streamHeader, peer, attributes) {
41
+ // Create a fresh service instance per session so each client gets
42
+ // its own state (matches Python SessionServer behaviour).
43
+ let instance;
44
+ try {
45
+ const ctor = serviceInfo.instance.constructor;
46
+ instance = new ctor();
47
+ }
48
+ catch {
49
+ instance = serviceInfo.instance;
50
+ }
51
+ // Read CALL frames in a loop
52
+ while (true) {
53
+ const frame = await readFrame(recv, 0);
54
+ if (!frame)
55
+ break; // stream ended
56
+ const [payload, flags] = frame;
57
+ if (flags & CANCEL) {
58
+ const status = new RpcStatus({ code: StatusCode.CANCELLED, message: 'cancelled' });
59
+ await writeFrame(send, this.codec.encode(status), TRAILER);
60
+ continue;
61
+ }
62
+ if (!(flags & CALL)) {
63
+ const status = new RpcStatus({ code: StatusCode.INTERNAL, message: 'expected CALL frame in session stream' });
64
+ await writeFrame(send, this.codec.encode(status), TRAILER);
65
+ break;
66
+ }
67
+ // Decode CallHeader
68
+ const callHeader = this.codec.decode(payload);
69
+ // Validate per-call metadata (G3/G11)
70
+ try {
71
+ validateMetadata(callHeader.metadataKeys ?? [], callHeader.metadataValues ?? []);
72
+ }
73
+ catch (e) {
74
+ if (e instanceof LimitExceeded) {
75
+ const status = new RpcStatus({ code: StatusCode.RESOURCE_EXHAUSTED, message: e.message });
76
+ await writeFrame(send, this.codec.encode(status), TRAILER);
77
+ continue;
78
+ }
79
+ throw e;
80
+ }
81
+ const methodInfo = serviceInfo.methods.get(callHeader.method);
82
+ if (!methodInfo) {
83
+ const status = new RpcStatus({
84
+ code: StatusCode.NOT_FOUND,
85
+ message: `method ${callHeader.method} not found`,
86
+ });
87
+ await writeFrame(send, this.codec.encode(status), TRAILER);
88
+ continue;
89
+ }
90
+ // Build per-call context with peer attributes for auth interceptors
91
+ const callCtx = buildCallContext({
92
+ service: serviceInfo.name,
93
+ method: callHeader.method,
94
+ callId: callHeader.callId || undefined,
95
+ peer,
96
+ pattern: methodInfo.pattern,
97
+ idempotent: methodInfo.idempotent,
98
+ attributes,
99
+ deadlineEpochMs: callHeader.deadlineEpochMs || 0,
100
+ });
101
+ // Run auth interceptors before reading the request
102
+ try {
103
+ await applyRequestInterceptors(this.interceptors, callCtx, null);
104
+ }
105
+ catch (e) {
106
+ if (e instanceof RpcError) {
107
+ const status = new RpcStatus({ code: e.code, message: e.message });
108
+ await writeFrame(send, this.codec.encode(status), TRAILER);
109
+ // Drain the request frame(s) so the stream stays in sync
110
+ await this.drainRequestFrame(recv);
111
+ continue;
112
+ }
113
+ throw e;
114
+ }
115
+ // Dispatch based on pattern
116
+ try {
117
+ switch (methodInfo.pattern) {
118
+ case RpcPattern.UNARY:
119
+ await this.handleUnary(instance, methodInfo, callCtx, send, recv);
120
+ break;
121
+ case RpcPattern.SERVER_STREAM:
122
+ await this.handleServerStream(instance, methodInfo, callCtx, send, recv);
123
+ break;
124
+ case RpcPattern.CLIENT_STREAM:
125
+ await this.handleClientStream(instance, methodInfo, callCtx, send, recv);
126
+ break;
127
+ case RpcPattern.BIDI_STREAM:
128
+ await this.handleBidiStream(instance, methodInfo, callCtx, send, recv);
129
+ break;
130
+ default: {
131
+ const status = new RpcStatus({
132
+ code: StatusCode.UNIMPLEMENTED,
133
+ message: `unsupported pattern: ${methodInfo.pattern}`,
134
+ });
135
+ await writeFrame(send, this.codec.encode(status), TRAILER);
136
+ }
137
+ }
138
+ }
139
+ catch (e) {
140
+ const err = e instanceof RpcError ? e : new RpcError(StatusCode.INTERNAL, String(e));
141
+ const status = new RpcStatus({ code: err.code, message: err.message });
142
+ try {
143
+ await writeFrame(send, this.codec.encode(status), TRAILER);
144
+ }
145
+ catch { /* stream may be gone */ }
146
+ }
147
+ }
148
+ }
149
+ // -- Helpers ----------------------------------------------------------------
150
+ getDeadlineMs(callCtx) {
151
+ const maxMs = MAX_HANDLER_TIMEOUT_S * 1000;
152
+ const deadline = callCtx?.deadline;
153
+ if (deadline == null || deadline <= 0)
154
+ return Date.now() + maxMs;
155
+ const clientMs = deadline * 1000;
156
+ const serverMax = Date.now() + maxMs;
157
+ return Math.min(clientMs, serverMax);
158
+ }
159
+ async withDeadline(callCtx, fn) {
160
+ const deadlineMs = this.getDeadlineMs(callCtx);
161
+ const remaining = deadlineMs - Date.now();
162
+ if (remaining <= 0)
163
+ throw new RpcError(StatusCode.DEADLINE_EXCEEDED, 'deadline exceeded');
164
+ let timer;
165
+ try {
166
+ return await Promise.race([
167
+ fn(),
168
+ new Promise((_, reject) => {
169
+ timer = setTimeout(() => reject(new RpcError(StatusCode.DEADLINE_EXCEEDED, 'deadline exceeded')), remaining);
170
+ }),
171
+ ]);
172
+ }
173
+ finally {
174
+ if (timer !== undefined)
175
+ clearTimeout(timer);
176
+ }
177
+ }
178
+ // -- Pattern handlers -------------------------------------------------------
179
+ async handleUnary(instance, methodInfo, callCtx, send, recv) {
180
+ const reqFrame = await readFrame(recv, 0);
181
+ if (!reqFrame)
182
+ return;
183
+ const [reqPayload, reqFlags] = reqFrame;
184
+ const compressed = !!(reqFlags & COMPRESSED);
185
+ let request = compressed
186
+ ? this.codec.decodeCompressed(reqPayload, true)
187
+ : this.codec.decode(reqPayload);
188
+ request = await applyRequestInterceptors(this.interceptors, callCtx, request);
189
+ let response = await this.withDeadline(callCtx, () => methodInfo.handler.call(instance, request));
190
+ response = await applyResponseInterceptors(this.interceptors, callCtx, response);
191
+ const [respPayload, respCompressed] = this.codec.encodeCompressed(response);
192
+ await writeFrame(send, respPayload, respCompressed ? COMPRESSED : 0);
193
+ }
194
+ async handleServerStream(instance, methodInfo, callCtx, send, recv) {
195
+ const reqFrame = await readFrame(recv, 0);
196
+ if (!reqFrame)
197
+ return;
198
+ const [reqPayload, reqFlags] = reqFrame;
199
+ const compressed = !!(reqFlags & COMPRESSED);
200
+ let request = compressed
201
+ ? this.codec.decodeCompressed(reqPayload, true)
202
+ : this.codec.decode(reqPayload);
203
+ request = await applyRequestInterceptors(this.interceptors, callCtx, request);
204
+ const gen = methodInfo.handler.call(instance, request);
205
+ const deadlineMs = this.getDeadlineMs(callCtx);
206
+ for await (let response of gen) {
207
+ if (deadlineMs != null && Date.now() > deadlineMs) {
208
+ throw new RpcError(StatusCode.DEADLINE_EXCEEDED, 'deadline exceeded');
209
+ }
210
+ response = await applyResponseInterceptors(this.interceptors, callCtx, response);
211
+ const [respPayload, respCompressed] = this.codec.encodeCompressed(response);
212
+ await writeFrame(send, respPayload, respCompressed ? COMPRESSED : 0);
213
+ }
214
+ await this.writeOkTrailer(send);
215
+ }
216
+ async handleClientStream(instance, methodInfo, callCtx, send, recv) {
217
+ const requests = [];
218
+ while (true) {
219
+ const frame = await readFrame(recv, 0);
220
+ if (!frame)
221
+ break;
222
+ const [p, f] = frame;
223
+ if (f & TRAILER) {
224
+ // Validate EoI: must be status=OK (G4)
225
+ try {
226
+ const eoi = this.codec.decode(p);
227
+ if (eoi.code !== StatusCode.OK) {
228
+ const status = new RpcStatus({
229
+ code: StatusCode.INTERNAL,
230
+ message: `client sent non-OK EoI trailer (code=${eoi.code})`,
231
+ });
232
+ await writeFrame(send, this.codec.encode(status), TRAILER);
233
+ return;
234
+ }
235
+ }
236
+ catch {
237
+ const status = new RpcStatus({ code: StatusCode.INTERNAL, message: 'malformed EoI trailer' });
238
+ await writeFrame(send, this.codec.encode(status), TRAILER);
239
+ return;
240
+ }
241
+ break;
242
+ }
243
+ if (f & CANCEL)
244
+ continue;
245
+ if (requests.length >= MAX_CLIENT_STREAM_ITEMS) {
246
+ const status = new RpcStatus({
247
+ code: StatusCode.RESOURCE_EXHAUSTED,
248
+ message: `client stream exceeded ${MAX_CLIENT_STREAM_ITEMS} items`,
249
+ });
250
+ await writeFrame(send, this.codec.encode(status), TRAILER);
251
+ return;
252
+ }
253
+ const compressed = !!(f & COMPRESSED);
254
+ const req = compressed
255
+ ? this.codec.decodeCompressed(p, true)
256
+ : this.codec.decode(p);
257
+ requests.push(await applyRequestInterceptors(this.interceptors, callCtx, req));
258
+ }
259
+ async function* requestIter() { for (const r of requests)
260
+ yield r; }
261
+ let response = await this.withDeadline(callCtx, () => methodInfo.handler.call(instance, requestIter()));
262
+ response = await applyResponseInterceptors(this.interceptors, callCtx, response);
263
+ const [respPayload, respCompressed] = this.codec.encodeCompressed(response);
264
+ await writeFrame(send, respPayload, respCompressed ? COMPRESSED : 0);
265
+ await this.writeOkTrailer(send);
266
+ }
267
+ async handleBidiStream(instance, methodInfo, callCtx, send, recv) {
268
+ const self = this;
269
+ // Wrap the error in an object so TS doesn't narrow it to `never`
270
+ // after the for-await loop (closure mutations to a local var aren't
271
+ // visible to the flow analyzer; property access through one is).
272
+ const errBox = { value: null };
273
+ async function* requestIter() {
274
+ try {
275
+ while (true) {
276
+ const frame = await readFrame(recv, 0);
277
+ if (!frame)
278
+ break;
279
+ const [p, f] = frame;
280
+ if (f & TRAILER)
281
+ break;
282
+ if (f & CANCEL)
283
+ continue;
284
+ const compressed = !!(f & COMPRESSED);
285
+ const req = compressed
286
+ ? self.codec.decodeCompressed(p, true)
287
+ : self.codec.decode(p);
288
+ yield req;
289
+ }
290
+ }
291
+ catch (e) {
292
+ errBox.value = e instanceof Error ? e : new Error(String(e));
293
+ }
294
+ }
295
+ const gen = methodInfo.handler.call(instance, requestIter());
296
+ const deadlineMs = this.getDeadlineMs(callCtx);
297
+ for await (const response of gen) {
298
+ if (Date.now() > deadlineMs) {
299
+ throw new RpcError(StatusCode.DEADLINE_EXCEEDED, 'deadline exceeded');
300
+ }
301
+ const [respPayload, respCompressed] = this.codec.encodeCompressed(response);
302
+ await writeFrame(send, respPayload, respCompressed ? COMPRESSED : 0);
303
+ }
304
+ if (errBox.value !== null) {
305
+ throw new RpcError(StatusCode.INTERNAL, `bidi stream reader error: ${errBox.value.message}`);
306
+ }
307
+ await this.writeOkTrailer(send);
308
+ }
309
+ // -- Helpers ----------------------------------------------------------------
310
+ async writeOkTrailer(send) {
311
+ const status = new RpcStatus({ code: StatusCode.OK });
312
+ await writeFrame(send, this.codec.encode(status), TRAILER);
313
+ }
314
+ async drainRequestFrame(recv) {
315
+ try {
316
+ const frame = await readFrame(recv, 0);
317
+ // Just discard -- we needed to consume it so the next CALL frame
318
+ // is properly aligned on the stream.
319
+ void frame;
320
+ }
321
+ catch { /* ignore */ }
322
+ }
323
+ }
324
+ // ── Session stub (client-side) ───────────────────────────────────────────────
325
+ /**
326
+ * Client-side session stub -- tracks an active session-scoped RPC stream.
327
+ */
328
+ export class SessionStub {
329
+ transport;
330
+ sessionId;
331
+ _cancelled = false;
332
+ constructor(transport, sessionId) {
333
+ this.transport = transport;
334
+ this.sessionId = sessionId;
335
+ }
336
+ async cancel() {
337
+ this._cancelled = true;
338
+ if (this.transport.close)
339
+ await this.transport.close();
340
+ }
341
+ get cancelled() {
342
+ return this._cancelled;
343
+ }
344
+ }
345
+ // ── Factory functions ────────────────────────────────────────────────────────
346
+ export async function createSession(transport, sessionId) {
347
+ const id = sessionId ?? crypto.randomUUID?.() ?? `session-${Date.now()}`;
348
+ return new SessionStub(transport, id);
349
+ }
350
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Aster RPC status codes and error hierarchy.
3
+ *
4
+ * Spec reference: S6.5 (status codes).
5
+ *
6
+ * Codes 0-16 mirror gRPC's google.rpc.Code semantically. Codes 100+
7
+ * are Aster-native and have no gRPC equivalent. The 17-99 range is
8
+ * reserved as a buffer in case gRPC ever extends its enum.
9
+ *
10
+ * A common gripe with gRPC's status codes is that there are too few
11
+ * to express the variety of failures real services actually hit.
12
+ * The 100+ space gives Aster room to mint more precise codes over
13
+ * time, signalling clearly that they are intentionally separate
14
+ * from the gRPC vocabulary.
15
+ */
16
+ export declare const StatusCode: {
17
+ readonly OK: 0;
18
+ readonly CANCELLED: 1;
19
+ readonly UNKNOWN: 2;
20
+ readonly INVALID_ARGUMENT: 3;
21
+ readonly DEADLINE_EXCEEDED: 4;
22
+ readonly NOT_FOUND: 5;
23
+ readonly ALREADY_EXISTS: 6;
24
+ readonly PERMISSION_DENIED: 7;
25
+ readonly RESOURCE_EXHAUSTED: 8;
26
+ readonly FAILED_PRECONDITION: 9;
27
+ readonly ABORTED: 10;
28
+ readonly OUT_OF_RANGE: 11;
29
+ readonly UNIMPLEMENTED: 12;
30
+ readonly INTERNAL: 13;
31
+ readonly UNAVAILABLE: 14;
32
+ readonly DATA_LOSS: 15;
33
+ readonly UNAUTHENTICATED: 16;
34
+ /**
35
+ * The wire payload doesn't match the published contract: e.g. the
36
+ * JSON dict has fields the receiver's @WireType class doesn't
37
+ * declare, or vice versa. Distinct from INVALID_ARGUMENT because
38
+ * the violation is about data SHAPE, not value, and shape
39
+ * violations can occur at any nesting depth (a top-level
40
+ * INVALID_ARGUMENT label doesn't apply when the bad field is two
41
+ * objects deep). The producer owns the contract; consumers must
42
+ * use the field names defined by the producer's manifest.
43
+ */
44
+ readonly CONTRACT_VIOLATION: 101;
45
+ };
46
+ export type StatusCode = (typeof StatusCode)[keyof typeof StatusCode];
47
+ export declare function statusName(code: StatusCode): string;
48
+ /** Base error class for Aster RPC errors. */
49
+ export declare class RpcError extends Error {
50
+ readonly code: StatusCode;
51
+ readonly details: Record<string, string>;
52
+ constructor(code: StatusCode, message?: string, details?: Record<string, string>);
53
+ /** Create the most specific RpcError subclass for a status code. */
54
+ static fromStatus(code: StatusCode, message?: string, details?: Record<string, string>): RpcError;
55
+ }
56
+ export declare class CancelledError extends RpcError {
57
+ constructor(message?: string, details?: Record<string, string>);
58
+ }
59
+ export declare class UnknownRpcError extends RpcError {
60
+ constructor(message?: string, details?: Record<string, string>);
61
+ }
62
+ export declare class InvalidArgumentError extends RpcError {
63
+ constructor(message?: string, details?: Record<string, string>);
64
+ }
65
+ export declare class DeadlineExceededError extends RpcError {
66
+ constructor(message?: string, details?: Record<string, string>);
67
+ }
68
+ export declare class NotFoundError extends RpcError {
69
+ constructor(message?: string, details?: Record<string, string>);
70
+ }
71
+ export declare class AlreadyExistsError extends RpcError {
72
+ constructor(message?: string, details?: Record<string, string>);
73
+ }
74
+ export declare class PermissionDeniedError extends RpcError {
75
+ constructor(message?: string, details?: Record<string, string>);
76
+ }
77
+ export declare class ResourceExhaustedError extends RpcError {
78
+ constructor(message?: string, details?: Record<string, string>);
79
+ }
80
+ export declare class FailedPreconditionError extends RpcError {
81
+ constructor(message?: string, details?: Record<string, string>);
82
+ }
83
+ export declare class AbortedError extends RpcError {
84
+ constructor(message?: string, details?: Record<string, string>);
85
+ }
86
+ export declare class OutOfRangeError extends RpcError {
87
+ constructor(message?: string, details?: Record<string, string>);
88
+ }
89
+ export declare class UnimplementedError extends RpcError {
90
+ constructor(message?: string, details?: Record<string, string>);
91
+ }
92
+ export declare class InternalError extends RpcError {
93
+ constructor(message?: string, details?: Record<string, string>);
94
+ }
95
+ export declare class UnavailableError extends RpcError {
96
+ constructor(message?: string, details?: Record<string, string>);
97
+ }
98
+ export declare class DataLossError extends RpcError {
99
+ constructor(message?: string, details?: Record<string, string>);
100
+ }
101
+ export declare class UnauthenticatedError extends RpcError {
102
+ constructor(message?: string, details?: Record<string, string>);
103
+ }
104
+ /**
105
+ * Raised when the wire payload doesn't match the published contract.
106
+ *
107
+ * Carries the offending field names in `details.unexpected_fields`
108
+ * (comma-separated, repr-sanitized).
109
+ */
110
+ export declare class ContractViolationError extends RpcError {
111
+ constructor(message?: string, details?: Record<string, string>);
112
+ }
113
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"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"}