@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,53 @@
1
+ /**
2
+ * aster/peer-store -- Per-peer admission attribute store.
3
+ *
4
+ * Bridges the gap between admission (where attributes are determined)
5
+ * and RPC dispatch (where attributes are needed for authorization).
6
+ *
7
+ * Expiry: each admission records the credential's `expiresAt` (epoch
8
+ * seconds). Lookups check expiry and lazily evict stale entries. A
9
+ * background reaper sweeps entries that are never looked up again.
10
+ *
11
+ * Config: ASTER_PEER_TTL_S env var (default 86400 = 24h) sets the
12
+ * server-side upper bound on how long a peer stays admitted.
13
+ */
14
+ /** Server-side upper bound on peer admission lifetime (seconds). */
15
+ export declare const PEER_TTL_S: number;
16
+ /** Record of a successful peer admission. */
17
+ export interface PeerAdmission {
18
+ endpointId: string;
19
+ handle: string;
20
+ attributes: Map<string, string>;
21
+ admittedAt: number;
22
+ expiresAt: number;
23
+ /** "consumer_admission" | "aster.admission" */
24
+ admissionPath: string;
25
+ }
26
+ /** Create a PeerAdmission with defaults for optional fields. */
27
+ export declare function createPeerAdmission(opts: Pick<PeerAdmission, 'endpointId'> & Partial<Omit<PeerAdmission, 'endpointId'>>): PeerAdmission;
28
+ /**
29
+ * In-memory store mapping peer endpointId to admission attributes.
30
+ *
31
+ * Entries are lazily evicted on access when expired. Call startReaper()
32
+ * to enable periodic sweeps of entries that are never accessed.
33
+ */
34
+ export declare class PeerAttributeStore {
35
+ private peers;
36
+ private reaperTimer;
37
+ /** Record a successful admission. */
38
+ admit(admission: PeerAdmission): void;
39
+ /** Look up admission record for a peer. Returns undefined if expired. */
40
+ get(endpointId: string): PeerAdmission | undefined;
41
+ /** Remove a peer on disconnect or revocation. */
42
+ remove(endpointId: string): void;
43
+ /** Get attributes map for a peer, or empty map if expired/not admitted. */
44
+ getAttributes(endpointId: string): Map<string, string>;
45
+ /** Remove all expired entries. Returns count removed. */
46
+ sweepExpired(): number;
47
+ get peerCount(): number;
48
+ /** Start background reaper (call once at server start). */
49
+ startReaper(): void;
50
+ /** Stop background reaper. */
51
+ stopReaper(): void;
52
+ }
53
+ //# sourceMappingURL=peer-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peer-store.d.ts","sourceRoot":"","sources":["../src/peer-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,oEAAoE;AACpE,eAAO,MAAM,UAAU,EAAE,MAKrB,CAAC;AAIL,6CAA6C;AAC7C,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,gEAAgE;AAChE,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,GACnF,aAAa,CASf;AASD;;;;;GAKG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,KAAK,CAAyC;IACtD,OAAO,CAAC,WAAW,CAA+C;IAElE,qCAAqC;IACrC,KAAK,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI;IAIrC,yEAAyE;IACzE,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAUlD,iDAAiD;IACjD,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIhC,2EAA2E;IAC3E,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAKtD,yDAAyD;IACzD,YAAY,IAAI,MAAM;IAWtB,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,2DAA2D;IAC3D,WAAW,IAAI,IAAI;IAQnB,8BAA8B;IAC9B,UAAU,IAAI,IAAI;CAMnB"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * aster/peer-store -- Per-peer admission attribute store.
3
+ *
4
+ * Bridges the gap between admission (where attributes are determined)
5
+ * and RPC dispatch (where attributes are needed for authorization).
6
+ *
7
+ * Expiry: each admission records the credential's `expiresAt` (epoch
8
+ * seconds). Lookups check expiry and lazily evict stale entries. A
9
+ * background reaper sweeps entries that are never looked up again.
10
+ *
11
+ * Config: ASTER_PEER_TTL_S env var (default 86400 = 24h) sets the
12
+ * server-side upper bound on how long a peer stays admitted.
13
+ */
14
+ /** Server-side upper bound on peer admission lifetime (seconds). */
15
+ export const PEER_TTL_S = (() => {
16
+ if (typeof process !== 'undefined' && process.env?.ASTER_PEER_TTL_S) {
17
+ return parseFloat(process.env.ASTER_PEER_TTL_S);
18
+ }
19
+ return 86400;
20
+ })();
21
+ const _REAPER_INTERVAL_MS = 300_000;
22
+ /** Create a PeerAdmission with defaults for optional fields. */
23
+ export function createPeerAdmission(opts) {
24
+ return {
25
+ endpointId: opts.endpointId,
26
+ handle: opts.handle ?? '',
27
+ attributes: opts.attributes ?? new Map(),
28
+ admittedAt: opts.admittedAt ?? Date.now() / 1000,
29
+ expiresAt: opts.expiresAt ?? 0,
30
+ admissionPath: opts.admissionPath ?? '',
31
+ };
32
+ }
33
+ function isExpired(admission) {
34
+ const now = Date.now() / 1000;
35
+ if (admission.expiresAt > 0 && now > admission.expiresAt)
36
+ return true;
37
+ if (now > admission.admittedAt + PEER_TTL_S)
38
+ return true;
39
+ return false;
40
+ }
41
+ /**
42
+ * In-memory store mapping peer endpointId to admission attributes.
43
+ *
44
+ * Entries are lazily evicted on access when expired. Call startReaper()
45
+ * to enable periodic sweeps of entries that are never accessed.
46
+ */
47
+ export class PeerAttributeStore {
48
+ peers = new Map();
49
+ reaperTimer = null;
50
+ /** Record a successful admission. */
51
+ admit(admission) {
52
+ this.peers.set(admission.endpointId, admission);
53
+ }
54
+ /** Look up admission record for a peer. Returns undefined if expired. */
55
+ get(endpointId) {
56
+ const admission = this.peers.get(endpointId);
57
+ if (!admission)
58
+ return undefined;
59
+ if (isExpired(admission)) {
60
+ this.peers.delete(endpointId);
61
+ return undefined;
62
+ }
63
+ return admission;
64
+ }
65
+ /** Remove a peer on disconnect or revocation. */
66
+ remove(endpointId) {
67
+ this.peers.delete(endpointId);
68
+ }
69
+ /** Get attributes map for a peer, or empty map if expired/not admitted. */
70
+ getAttributes(endpointId) {
71
+ const admission = this.get(endpointId);
72
+ return admission ? new Map(admission.attributes) : new Map();
73
+ }
74
+ /** Remove all expired entries. Returns count removed. */
75
+ sweepExpired() {
76
+ let count = 0;
77
+ for (const [eid, adm] of this.peers) {
78
+ if (isExpired(adm)) {
79
+ this.peers.delete(eid);
80
+ count++;
81
+ }
82
+ }
83
+ return count;
84
+ }
85
+ get peerCount() {
86
+ return this.peers.size;
87
+ }
88
+ /** Start background reaper (call once at server start). */
89
+ startReaper() {
90
+ if (this.reaperTimer != null)
91
+ return;
92
+ this.reaperTimer = setInterval(() => this.sweepExpired(), _REAPER_INTERVAL_MS);
93
+ if (typeof this.reaperTimer === 'object' && 'unref' in this.reaperTimer) {
94
+ this.reaperTimer.unref();
95
+ }
96
+ }
97
+ /** Stop background reaper. */
98
+ stopReaper() {
99
+ if (this.reaperTimer != null) {
100
+ clearInterval(this.reaperTimer);
101
+ this.reaperTimer = null;
102
+ }
103
+ }
104
+ }
105
+ //# sourceMappingURL=peer-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peer-store.js","sourceRoot":"","sources":["../src/peer-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Wire-protocol types.
3
+ *
4
+ * Spec reference: S6.2 (StreamHeader), S6.4 (RpcStatus/trailer)
5
+ *
6
+ * These types are always serialized with Fory XLANG, regardless of the
7
+ * service's negotiated serialization mode.
8
+ */
9
+ /** First frame on every QUIC stream (HEADER flag). */
10
+ export declare class StreamHeader {
11
+ /** Wire type tag for Fory XLANG registration. */
12
+ static readonly wireType = "_aster/StreamHeader";
13
+ service: string;
14
+ method: string;
15
+ version: number;
16
+ callId: string;
17
+ deadlineEpochMs: number;
18
+ serializationMode: number;
19
+ metadataKeys: string[];
20
+ metadataValues: string[];
21
+ constructor(init?: Partial<StreamHeader>);
22
+ }
23
+ /** Per-call header within a session stream (CALL flag). */
24
+ export declare class CallHeader {
25
+ static readonly wireType = "_aster/CallHeader";
26
+ method: string;
27
+ callId: string;
28
+ deadlineEpochMs: number;
29
+ metadataKeys: string[];
30
+ metadataValues: string[];
31
+ constructor(init?: Partial<CallHeader>);
32
+ }
33
+ /** Trailing status frame (TRAILER flag). */
34
+ export declare class RpcStatus {
35
+ static readonly wireType = "_aster/RpcStatus";
36
+ code: number;
37
+ message: string;
38
+ detailKeys: string[];
39
+ detailValues: string[];
40
+ constructor(init?: Partial<RpcStatus>);
41
+ /** Convert detail arrays to a key-value record. */
42
+ get details(): Record<string, string>;
43
+ }
44
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,sDAAsD;AACtD,qBAAa,YAAY;IACvB,iDAAiD;IACjD,MAAM,CAAC,QAAQ,CAAC,QAAQ,yBAAyB;IAEjD,OAAO,SAAM;IACb,MAAM,SAAM;IACZ,OAAO,SAAK;IACZ,MAAM,SAAM;IACZ,eAAe,SAAK;IACpB,iBAAiB,SAAK;IACtB,YAAY,EAAE,MAAM,EAAE,CAAM;IAC5B,cAAc,EAAE,MAAM,EAAE,CAAM;gBAElB,IAAI,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC;CAGzC;AAED,2DAA2D;AAC3D,qBAAa,UAAU;IACrB,MAAM,CAAC,QAAQ,CAAC,QAAQ,uBAAuB;IAE/C,MAAM,SAAM;IACZ,MAAM,SAAM;IACZ,eAAe,SAAK;IACpB,YAAY,EAAE,MAAM,EAAE,CAAM;IAC5B,cAAc,EAAE,MAAM,EAAE,CAAM;gBAElB,IAAI,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC;CAGvC;AAED,4CAA4C;AAC5C,qBAAa,SAAS;IACpB,MAAM,CAAC,QAAQ,CAAC,QAAQ,sBAAsB;IAE9C,IAAI,SAAK;IACT,OAAO,SAAM;IACb,UAAU,EAAE,MAAM,EAAE,CAAM;IAC1B,YAAY,EAAE,MAAM,EAAE,CAAM;gBAEhB,IAAI,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC;IAIrC,mDAAmD;IACnD,IAAI,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMpC;CACF"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Wire-protocol types.
3
+ *
4
+ * Spec reference: S6.2 (StreamHeader), S6.4 (RpcStatus/trailer)
5
+ *
6
+ * These types are always serialized with Fory XLANG, regardless of the
7
+ * service's negotiated serialization mode.
8
+ */
9
+ /** First frame on every QUIC stream (HEADER flag). */
10
+ export class StreamHeader {
11
+ /** Wire type tag for Fory XLANG registration. */
12
+ static wireType = '_aster/StreamHeader';
13
+ service = '';
14
+ method = '';
15
+ version = 0;
16
+ callId = '';
17
+ deadlineEpochMs = 0;
18
+ serializationMode = 0;
19
+ metadataKeys = [];
20
+ metadataValues = [];
21
+ constructor(init) {
22
+ if (init)
23
+ Object.assign(this, init);
24
+ }
25
+ }
26
+ /** Per-call header within a session stream (CALL flag). */
27
+ export class CallHeader {
28
+ static wireType = '_aster/CallHeader';
29
+ method = '';
30
+ callId = '';
31
+ deadlineEpochMs = 0;
32
+ metadataKeys = [];
33
+ metadataValues = [];
34
+ constructor(init) {
35
+ if (init)
36
+ Object.assign(this, init);
37
+ }
38
+ }
39
+ /** Trailing status frame (TRAILER flag). */
40
+ export class RpcStatus {
41
+ static wireType = '_aster/RpcStatus';
42
+ code = 0;
43
+ message = '';
44
+ detailKeys = [];
45
+ detailValues = [];
46
+ constructor(init) {
47
+ if (init)
48
+ Object.assign(this, init);
49
+ }
50
+ /** Convert detail arrays to a key-value record. */
51
+ get details() {
52
+ const result = {};
53
+ for (let i = 0; i < this.detailKeys.length; i++) {
54
+ result[this.detailKeys[i]] = this.detailValues[i] ?? '';
55
+ }
56
+ return result;
57
+ }
58
+ }
59
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,sDAAsD;AACtD,MAAM,OAAO,YAAY;IACvB,iDAAiD;IACjD,MAAM,CAAU,QAAQ,GAAG,qBAAqB,CAAC;IAEjD,OAAO,GAAG,EAAE,CAAC;IACb,MAAM,GAAG,EAAE,CAAC;IACZ,OAAO,GAAG,CAAC,CAAC;IACZ,MAAM,GAAG,EAAE,CAAC;IACZ,eAAe,GAAG,CAAC,CAAC;IACpB,iBAAiB,GAAG,CAAC,CAAC;IACtB,YAAY,GAAa,EAAE,CAAC;IAC5B,cAAc,GAAa,EAAE,CAAC;IAE9B,YAAY,IAA4B;QACtC,IAAI,IAAI;YAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;;AAGH,2DAA2D;AAC3D,MAAM,OAAO,UAAU;IACrB,MAAM,CAAU,QAAQ,GAAG,mBAAmB,CAAC;IAE/C,MAAM,GAAG,EAAE,CAAC;IACZ,MAAM,GAAG,EAAE,CAAC;IACZ,eAAe,GAAG,CAAC,CAAC;IACpB,YAAY,GAAa,EAAE,CAAC;IAC5B,cAAc,GAAa,EAAE,CAAC;IAE9B,YAAY,IAA0B;QACpC,IAAI,IAAI;YAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;;AAGH,4CAA4C;AAC5C,MAAM,OAAO,SAAS;IACpB,MAAM,CAAU,QAAQ,GAAG,kBAAkB,CAAC;IAE9C,IAAI,GAAG,CAAC,CAAC;IACT,OAAO,GAAG,EAAE,CAAC;IACb,UAAU,GAAa,EAAE,CAAC;IAC1B,YAAY,GAAa,EAAE,CAAC;IAE5B,YAAY,IAAyB;QACnC,IAAI,IAAI;YAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,mDAAmD;IACnD,IAAI,OAAO;QACT,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3D,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * @aster endpoint registration loop.
3
+ *
4
+ * Background task that registers producer endpoints with the @aster
5
+ * service so consumers can discover them. Mirrors the Python
6
+ * `_aster_registration_loop` / `_register_endpoints_with_aster` /
7
+ * `_resolve_aster_address` / `_load_producer_tokens` from runtime.py.
8
+ *
9
+ * Usage:
10
+ * const tokens = loadProducerTokens(identityData);
11
+ * const abort = startRegistrationLoop({ tokens, nodeInfo, logger });
12
+ * // later...
13
+ * abort.abort();
14
+ */
15
+ import type { AsterLogger } from './logging.js';
16
+ /** Token data for a single published service (from .aster-identity). */
17
+ export interface ProducerTokenEntry {
18
+ producer_token: string;
19
+ [key: string]: unknown;
20
+ }
21
+ /** Node addressing information passed to the registration RPC. */
22
+ export interface NodeInfo {
23
+ nodeId: string;
24
+ relay: string;
25
+ directAddrs: string[];
26
+ }
27
+ /** Options for `startRegistrationLoop`. */
28
+ export interface RegistrationLoopOptions {
29
+ /** Map of service name -> token data (from `loadProducerTokens`). */
30
+ tokens: Map<string, ProducerTokenEntry>;
31
+ /** This node's addressing info. */
32
+ nodeInfo: NodeInfo;
33
+ /** TTL in seconds for endpoint leases. Default: 300 (5 min). */
34
+ ttl?: number;
35
+ /** Logger instance. */
36
+ logger?: AsterLogger;
37
+ /** Optional identity peer entry for resolving @aster address. */
38
+ identityPeer?: Record<string, unknown>;
39
+ /**
40
+ * Factory that opens an IrohTransport to the given address.
41
+ * The caller provides this so the registration module stays decoupled
42
+ * from native addon loading.
43
+ */
44
+ connectTransport: (address: string) => Promise<RegistrationTransport>;
45
+ }
46
+ /** Minimal transport interface -- only unary is needed for registration. */
47
+ export interface RegistrationTransport {
48
+ unary(service: string, method: string, payload: unknown): Promise<unknown>;
49
+ close(): Promise<void>;
50
+ }
51
+ /**
52
+ * Extract producer service tokens from parsed identity data.
53
+ *
54
+ * In the .aster-identity TOML file, published services live under
55
+ * `[published_services.<ServiceName>]` sections. The identity loader
56
+ * returns the peer entry as a plain object; this function pulls out
57
+ * entries that have a `producer_token` field.
58
+ *
59
+ * @param identityData - The peer entry object from the identity loader.
60
+ * @returns Map of service name to token data.
61
+ */
62
+ export declare function loadProducerTokens(identityData: Record<string, unknown> | null | undefined): Map<string, ProducerTokenEntry>;
63
+ /**
64
+ * Resolve the @aster service address for endpoint registration.
65
+ *
66
+ * Checks (in order):
67
+ * 1. `ASTER_SERVICE_ADDRESS` environment variable
68
+ * 2. `aster_service` field in the identity peer entry
69
+ * 3. Returns `null` if neither is set (DNS TXT lookup is future work)
70
+ */
71
+ export declare function resolveAsterAddress(identityPeer?: Record<string, unknown> | null): string | null;
72
+ /**
73
+ * Start the background registration loop.
74
+ *
75
+ * Registers endpoints with @aster immediately (after a 2 s startup
76
+ * delay), then re-registers at 75% of TTL to keep leases alive.
77
+ *
78
+ * Returns an `AbortController` -- call `.abort()` to stop the loop.
79
+ */
80
+ export declare function startRegistrationLoop(opts: RegistrationLoopOptions): AbortController;
81
+ //# sourceMappingURL=registration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registration.d.ts","sourceRoot":"","sources":["../src/registration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAIhD,wEAAwE;AACxE,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,kEAAkE;AAClE,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,2CAA2C;AAC3C,MAAM,WAAW,uBAAuB;IACtC,qEAAqE;IACrE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACxC,mCAAmC;IACnC,QAAQ,EAAE,QAAQ,CAAC;IACnB,gEAAgE;IAChE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC;;;;OAIG;IACH,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACvE;AAED,4EAA4E;AAC5E,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GACvD,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAkBjC;AAID;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAC5C,MAAM,GAAG,IAAI,CAcf;AA2DD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,uBAAuB,GAC5B,eAAe,CA2BjB"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * @aster endpoint registration loop.
3
+ *
4
+ * Background task that registers producer endpoints with the @aster
5
+ * service so consumers can discover them. Mirrors the Python
6
+ * `_aster_registration_loop` / `_register_endpoints_with_aster` /
7
+ * `_resolve_aster_address` / `_load_producer_tokens` from runtime.py.
8
+ *
9
+ * Usage:
10
+ * const tokens = loadProducerTokens(identityData);
11
+ * const abort = startRegistrationLoop({ tokens, nodeInfo, logger });
12
+ * // later...
13
+ * abort.abort();
14
+ */
15
+ // ── loadProducerTokens ───────────────────────────────────────────────────────
16
+ /**
17
+ * Extract producer service tokens from parsed identity data.
18
+ *
19
+ * In the .aster-identity TOML file, published services live under
20
+ * `[published_services.<ServiceName>]` sections. The identity loader
21
+ * returns the peer entry as a plain object; this function pulls out
22
+ * entries that have a `producer_token` field.
23
+ *
24
+ * @param identityData - The peer entry object from the identity loader.
25
+ * @returns Map of service name to token data.
26
+ */
27
+ export function loadProducerTokens(identityData) {
28
+ const tokens = new Map();
29
+ if (!identityData)
30
+ return tokens;
31
+ const published = identityData.published_services;
32
+ if (!published || typeof published !== 'object')
33
+ return tokens;
34
+ for (const [svcName, tokenData] of Object.entries(published)) {
35
+ if (tokenData &&
36
+ typeof tokenData === 'object' &&
37
+ tokenData.producer_token) {
38
+ tokens.set(svcName, tokenData);
39
+ }
40
+ }
41
+ return tokens;
42
+ }
43
+ // ── resolveAsterAddress ──────────────────────────────────────────────────────
44
+ /**
45
+ * Resolve the @aster service address for endpoint registration.
46
+ *
47
+ * Checks (in order):
48
+ * 1. `ASTER_SERVICE_ADDRESS` environment variable
49
+ * 2. `aster_service` field in the identity peer entry
50
+ * 3. Returns `null` if neither is set (DNS TXT lookup is future work)
51
+ */
52
+ export function resolveAsterAddress(identityPeer) {
53
+ // Env var override
54
+ const envAddr = typeof process !== 'undefined'
55
+ ? process.env.ASTER_SERVICE_ADDRESS ?? ''
56
+ : '';
57
+ if (envAddr)
58
+ return envAddr;
59
+ // Identity file -- the peer entry may have aster_service config
60
+ if (identityPeer) {
61
+ const addr = identityPeer.aster_service;
62
+ if (typeof addr === 'string' && addr)
63
+ return addr;
64
+ }
65
+ return null;
66
+ }
67
+ // ── registerEndpoints (one-shot) ─────────────────────────────────────────────
68
+ /**
69
+ * One-shot registration of all published service endpoints with @aster.
70
+ *
71
+ * For each service with a producer token, calls
72
+ * `PublicationService.register_endpoint` on the @aster instance.
73
+ */
74
+ async function registerEndpoints(opts, ttl) {
75
+ if (opts.tokens.size === 0)
76
+ return;
77
+ const asterAddr = resolveAsterAddress(opts.identityPeer);
78
+ if (!asterAddr) {
79
+ opts.logger?.debug('No @aster address configured -- skipping registration');
80
+ return;
81
+ }
82
+ let transport = null;
83
+ try {
84
+ transport = await opts.connectTransport(asterAddr);
85
+ }
86
+ catch (e) {
87
+ opts.logger?.debug(`Could not connect to @aster: ${e}`);
88
+ return;
89
+ }
90
+ try {
91
+ for (const [svcName, tokenData] of opts.tokens) {
92
+ try {
93
+ const request = {
94
+ producer_token: JSON.stringify(tokenData),
95
+ node_id: opts.nodeInfo.nodeId,
96
+ relay: opts.nodeInfo.relay,
97
+ direct_addrs: opts.nodeInfo.directAddrs,
98
+ ttl,
99
+ };
100
+ await transport.unary('PublicationService', 'register_endpoint', request);
101
+ opts.logger?.info(`Registered endpoint with @aster: ${svcName} (${opts.nodeInfo.nodeId.slice(0, 12)})`);
102
+ }
103
+ catch (e) {
104
+ opts.logger?.warn(`Failed to register ${svcName} with @aster: ${e}`);
105
+ }
106
+ }
107
+ }
108
+ finally {
109
+ await transport.close();
110
+ }
111
+ }
112
+ // ── startRegistrationLoop ────────────────────────────────────────────────────
113
+ /**
114
+ * Start the background registration loop.
115
+ *
116
+ * Registers endpoints with @aster immediately (after a 2 s startup
117
+ * delay), then re-registers at 75% of TTL to keep leases alive.
118
+ *
119
+ * Returns an `AbortController` -- call `.abort()` to stop the loop.
120
+ */
121
+ export function startRegistrationLoop(opts) {
122
+ const abort = new AbortController();
123
+ const ttl = opts.ttl ?? 300;
124
+ const intervalMs = ttl * 0.75 * 1000;
125
+ const run = async () => {
126
+ // Wait for the server to be fully ready
127
+ await sleep(2000, abort.signal);
128
+ if (abort.signal.aborted)
129
+ return;
130
+ while (!abort.signal.aborted) {
131
+ try {
132
+ await registerEndpoints(opts, ttl);
133
+ }
134
+ catch (e) {
135
+ if (abort.signal.aborted)
136
+ return;
137
+ opts.logger?.info(`@aster registration failed: ${e}`);
138
+ }
139
+ // Wait before re-registering
140
+ await sleep(intervalMs, abort.signal);
141
+ }
142
+ };
143
+ // Fire and forget -- the caller controls lifetime via AbortController
144
+ run().catch(() => { });
145
+ return abort;
146
+ }
147
+ // ── Helpers ──────────────────────────────────────────────────────────────────
148
+ /** Sleep that respects abort signal. */
149
+ function sleep(ms, signal) {
150
+ if (signal.aborted)
151
+ return Promise.resolve();
152
+ return new Promise(resolve => {
153
+ const timer = setTimeout(resolve, ms);
154
+ const onAbort = () => {
155
+ clearTimeout(timer);
156
+ resolve();
157
+ };
158
+ signal.addEventListener('abort', onAbort, { once: true });
159
+ });
160
+ }
161
+ //# sourceMappingURL=registration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registration.js","sourceRoot":"","sources":["../src/registration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Registry ACL — access control list for registry doc entries.
3
+ *
4
+ * Mirrors bindings/python/aster/registry/acl.py.
5
+ *
6
+ * Starts in open mode (all authors trusted). When the first ACL
7
+ * entry is set, switches to restricted mode.
8
+ */
9
+ /** Doc handle interface for ACL operations. */
10
+ interface AclDoc {
11
+ setBytes(authorHex: string, key: string, value: Uint8Array): Promise<string>;
12
+ getExact(authorHex: string, key: string): Promise<Uint8Array | null>;
13
+ }
14
+ /**
15
+ * Registry ACL — filters doc entries by trusted authors.
16
+ */
17
+ export declare class RegistryACL {
18
+ private writers;
19
+ private readers;
20
+ private admins;
21
+ private _restricted;
22
+ /** Whether ACL is in restricted mode. */
23
+ get restricted(): boolean;
24
+ /** Check if an author is a trusted writer. */
25
+ isTrustedWriter(authorId: string): boolean;
26
+ /** Check if an author is a trusted reader. */
27
+ isTrustedReader(authorId: string): boolean;
28
+ /**
29
+ * Filter entries to only those from trusted authors.
30
+ *
31
+ * @param entries - Array of [authorId, value] pairs
32
+ * @returns Filtered entries
33
+ */
34
+ filterTrusted<T extends {
35
+ authorId: string;
36
+ }>(entries: T[]): T[];
37
+ /** Add a writer and switch to restricted mode. */
38
+ addWriter(authorId: string, doc?: AclDoc, adminAuthorId?: string): Promise<void>;
39
+ /** Add a reader. */
40
+ addReader(authorId: string): void;
41
+ /** Add an admin. */
42
+ addAdmin(authorId: string): void;
43
+ /** Remove a writer from the ACL. */
44
+ removeWriter(authorId: string): void;
45
+ /** Get all writers. */
46
+ getWriters(): string[];
47
+ /** Get all readers. */
48
+ getReaders(): string[];
49
+ /** Get all admins. */
50
+ getAdmins(): string[];
51
+ /**
52
+ * Reload ACL state from the registry doc.
53
+ */
54
+ reload(doc: AclDoc, authorId: string): Promise<void>;
55
+ }
56
+ export {};
57
+ //# sourceMappingURL=acl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acl.d.ts","sourceRoot":"","sources":["../../src/registry/acl.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,+CAA+C;AAC/C,UAAU,MAAM;IACd,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7E,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;CACtE;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,WAAW,CAAS;IAE5B,yCAAyC;IACzC,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,8CAA8C;IAC9C,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAK1C,8CAA8C;IAC9C,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAK1C;;;;;OAKG;IACH,aAAa,CAAC,CAAC,SAAS;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAKhE,kDAAkD;IAC5C,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWtF,oBAAoB;IACpB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKjC,oBAAoB;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKhC,oCAAoC;IACpC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIpC,uBAAuB;IACvB,UAAU,IAAI,MAAM,EAAE;IAItB,uBAAuB;IACvB,UAAU,IAAI,MAAM,EAAE;IAItB,sBAAsB;IACtB,SAAS,IAAI,MAAM,EAAE;IAIrB;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAsB3D"}