@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/codec.js ADDED
@@ -0,0 +1,477 @@
1
+ /**
2
+ * Codec abstraction — serialization + optional zstd compression.
3
+ *
4
+ * Spec reference: S5.1 (serialization), S5.2 (compression)
5
+ *
6
+ * Provides:
7
+ * - JsonCodec: JSON over UTF-8 bytes (testing, development)
8
+ * - ForyCodec: @apache-fory/core XLANG (production cross-language)
9
+ * - Zstd compression for payloads > threshold
10
+ */
11
+ import { MAX_DECOMPRESSED_SIZE } from './limits.js';
12
+ import { WIRE_TYPE_KEY } from './decorators.js';
13
+ import { ContractViolationError } from './status.js';
14
+ /** Default compression threshold in bytes (4 KiB). */
15
+ export const DEFAULT_COMPRESSION_THRESHOLD = 4096;
16
+ /** Re-export WIRE_TYPE_KEY as wireType for API compatibility. */
17
+ export { WIRE_TYPE_KEY as wireType };
18
+ /** Get the wire type tag from a @WireType-decorated class. */
19
+ export function getWireType(cls) {
20
+ return cls?.[WIRE_TYPE_KEY];
21
+ }
22
+ // -- Zstd helpers (use node:zlib which has zstd since Node 21.7) --------------
23
+ let _zstdAvailable;
24
+ let _zstdCompress;
25
+ let _zstdDecompress;
26
+ async function initZstd() {
27
+ if (_zstdAvailable !== undefined)
28
+ return _zstdAvailable;
29
+ try {
30
+ const zlib = await import('node:zlib');
31
+ if (typeof zlib.zstdCompressSync === 'function') {
32
+ _zstdCompress = (data) => new Uint8Array(zlib.zstdCompressSync(Buffer.from(data)));
33
+ _zstdDecompress = (data, maxSize) => {
34
+ const result = zlib.zstdDecompressSync(Buffer.from(data), { maxOutputLength: maxSize });
35
+ if (result.byteLength > maxSize) {
36
+ throw new Error(`decompressed size ${result.byteLength} exceeds limit ${maxSize}`);
37
+ }
38
+ return new Uint8Array(result);
39
+ };
40
+ _zstdAvailable = true;
41
+ }
42
+ else {
43
+ _zstdAvailable = false;
44
+ }
45
+ }
46
+ catch {
47
+ _zstdAvailable = false;
48
+ }
49
+ return _zstdAvailable;
50
+ }
51
+ // Try to init eagerly
52
+ initZstd().catch(() => { });
53
+ function zstdCompress(data) {
54
+ return _zstdCompress ? _zstdCompress(data) : null;
55
+ }
56
+ function zstdDecompress(data) {
57
+ if (!_zstdDecompress) {
58
+ throw new Error('zstd decompression not available (requires Node 21.7+)');
59
+ }
60
+ return _zstdDecompress(data, MAX_DECOMPRESSED_SIZE);
61
+ }
62
+ // -- JsonCodec ----------------------------------------------------------------
63
+ /**
64
+ * Simple JSON codec for cross-language interop and development.
65
+ *
66
+ * Strict mode: when ``decode`` is called with a ``hintType`` argument
67
+ * (a @WireType-decorated class constructor), the codec validates that
68
+ * every key in the decoded object matches a field declared on the
69
+ * class. Unknown keys raise ``ContractViolationError`` -- the producer
70
+ * owns the contract, and consumers must use the field names defined
71
+ * by the producer's manifest. Validation walks nested objects and
72
+ * arrays recursively, so a bad field at any depth fails loudly.
73
+ *
74
+ * If ``hintType`` is omitted (or is ``null``/``undefined``), decoding
75
+ * is permissive and returns the raw parsed value -- the codec doesn't
76
+ * know what shape to enforce. Callers that need strict validation
77
+ * must always pass the expected type.
78
+ */
79
+ export class JsonCodec {
80
+ encoder = new TextEncoder();
81
+ decoder = new TextDecoder();
82
+ threshold;
83
+ constructor(compressionThreshold = DEFAULT_COMPRESSION_THRESHOLD) {
84
+ this.threshold = compressionThreshold;
85
+ }
86
+ encode(obj) {
87
+ return this.encoder.encode(JSON.stringify(obj));
88
+ }
89
+ decode(payload, hintType) {
90
+ const parsed = JSON.parse(this.decoder.decode(payload));
91
+ if (hintType && typeof hintType === 'function') {
92
+ validateContractShape(parsed, hintType);
93
+ }
94
+ return parsed;
95
+ }
96
+ encodeCompressed(obj) {
97
+ const data = this.encode(obj);
98
+ if (data.byteLength > this.threshold && _zstdAvailable) {
99
+ const compressed = zstdCompress(data);
100
+ if (compressed && compressed.byteLength < data.byteLength) {
101
+ return [compressed, true];
102
+ }
103
+ }
104
+ return [data, false];
105
+ }
106
+ decodeCompressed(payload, compressed, hintType) {
107
+ if (compressed) {
108
+ const decompressed = zstdDecompress(payload);
109
+ return this.decode(decompressed, hintType);
110
+ }
111
+ return this.decode(payload, hintType);
112
+ }
113
+ }
114
+ const _shapeCache = new WeakMap();
115
+ function introspectClass(cls) {
116
+ const cached = _shapeCache.get(cls);
117
+ if (cached !== undefined)
118
+ return cached;
119
+ let template;
120
+ try {
121
+ template = new cls();
122
+ }
123
+ catch {
124
+ // Class isn't default-constructible -- record a sentinel so we
125
+ // never retry, and fall back to permissive decode forever.
126
+ _shapeCache.set(cls, null);
127
+ return null;
128
+ }
129
+ const fieldNames = new Set(Object.keys(template));
130
+ const nestedTypes = new Map();
131
+ const elementTypes = new Map();
132
+ for (const [key, defaultValue] of Object.entries(template)) {
133
+ if (defaultValue === null || defaultValue === undefined)
134
+ continue;
135
+ if (Array.isArray(defaultValue)) {
136
+ // For arrays, sample the first element if any. Empty arrays
137
+ // can't be introspected -- documented limitation.
138
+ const sample = defaultValue[0];
139
+ const elementCls = sample?.constructor;
140
+ if (elementCls &&
141
+ elementCls !== Object &&
142
+ typeof elementCls === 'function') {
143
+ elementTypes.set(key, elementCls);
144
+ }
145
+ continue;
146
+ }
147
+ if (typeof defaultValue !== 'object')
148
+ continue; // primitive (incl. enum members)
149
+ const nestedCls = defaultValue.constructor;
150
+ if (nestedCls &&
151
+ nestedCls !== Object &&
152
+ nestedCls !== Array &&
153
+ nestedCls !== Date &&
154
+ nestedCls !== Map &&
155
+ nestedCls !== Set &&
156
+ typeof nestedCls === 'function') {
157
+ nestedTypes.set(key, nestedCls);
158
+ }
159
+ }
160
+ const shape = { fieldNames, nestedTypes, elementTypes };
161
+ _shapeCache.set(cls, shape);
162
+ return shape;
163
+ }
164
+ /**
165
+ * Strict shape validation: walks ``value`` against ``cls`` and throws
166
+ * ``ContractViolationError`` if any object has keys not declared on
167
+ * the corresponding @WireType class. Recurses into nested objects and
168
+ * arrays so a bad field at any depth fails loudly with the dotted
169
+ * path to the violation.
170
+ *
171
+ * Limitations (documented; tests pin them):
172
+ *
173
+ * - Nested types behind a `null` / `undefined` default are not
174
+ * recursed into. Top-level validation always runs.
175
+ * - Empty array defaults can't be element-introspected. Top-level
176
+ * validation always runs.
177
+ * - Date / Map / Set / typed-array fields are treated as opaque
178
+ * primitives -- their values may be objects on the wire but the
179
+ * validator doesn't try to recurse.
180
+ * - Class generics are erased at runtime; the validator sees the
181
+ * default value of the generic field, not its declared type.
182
+ */
183
+ function validateContractShape(value, cls, path = '') {
184
+ if (value === null || value === undefined)
185
+ return;
186
+ if (typeof value !== 'object' || Array.isArray(value))
187
+ return;
188
+ const shape = introspectClass(cls);
189
+ if (shape === null)
190
+ return; // class isn't default-constructible
191
+ const { fieldNames, nestedTypes, elementTypes } = shape;
192
+ const dict = value;
193
+ const unexpected = [];
194
+ for (const key of Object.keys(dict)) {
195
+ if (!fieldNames.has(key))
196
+ unexpected.push(key);
197
+ }
198
+ if (unexpected.length > 0) {
199
+ const sanitized = sanitizeKeys(unexpected);
200
+ const location = path || cls.name || 'unknown';
201
+ const message = `contract violation at ${location}: unexpected JSON field(s) ` +
202
+ `${JSON.stringify(sanitized)} (expected: ${JSON.stringify([...fieldNames].sort())})`;
203
+ throw new ContractViolationError(message, {
204
+ unexpected_fields: sanitized.join(','),
205
+ location,
206
+ expected_class: cls.name || 'unknown',
207
+ });
208
+ }
209
+ // Recurse into nested @WireType objects + arrays using the cached
210
+ // shape map. This avoids re-instantiating the class on every
211
+ // decode (preserving constructor side effects) and is O(1) per
212
+ // field after the first decode.
213
+ for (const [key, child] of Object.entries(dict)) {
214
+ if (child === null || child === undefined)
215
+ continue;
216
+ const nestedPath = path ? `${path}.${key}` : `${cls.name || 'value'}.${key}`;
217
+ const nestedCls = nestedTypes.get(key);
218
+ if (nestedCls && typeof child === 'object' && !Array.isArray(child)) {
219
+ validateContractShape(child, nestedCls, nestedPath);
220
+ continue;
221
+ }
222
+ const elementCls = elementTypes.get(key);
223
+ if (elementCls && Array.isArray(child)) {
224
+ for (let i = 0; i < child.length; i++) {
225
+ const item = child[i];
226
+ if (item && typeof item === 'object' && !Array.isArray(item)) {
227
+ validateContractShape(item, elementCls, `${nestedPath}[${i}]`);
228
+ }
229
+ }
230
+ }
231
+ }
232
+ }
233
+ /**
234
+ * Repr-quote unexpected key names for safe logging.
235
+ *
236
+ * Prevents log injection: keys can contain control chars, ANSI
237
+ * escapes, newlines, or backslashes that would corrupt the error
238
+ * message or terminal. We replace control chars with their escape
239
+ * forms, cap each key's length, and cap the number of keys in the
240
+ * list so a malicious client can't blow up log storage with
241
+ * megabyte-long key names.
242
+ */
243
+ function sanitizeKeys(keys, maxCount = 5, maxLen = 80) {
244
+ const out = [];
245
+ for (const k of keys.slice(0, maxCount)) {
246
+ let s = String(k);
247
+ if (s.length > maxLen)
248
+ s = s.slice(0, maxLen) + '...(truncated)';
249
+ // Escape control chars + non-printable bytes via JSON.stringify
250
+ // (which produces a quoted string with backslash-escapes), then
251
+ // strip the surrounding quotes to keep the inline form readable.
252
+ const quoted = JSON.stringify(s);
253
+ out.push(quoted.slice(1, -1));
254
+ }
255
+ if (keys.length > maxCount) {
256
+ out.push(`...(+${keys.length - maxCount} more)`);
257
+ }
258
+ return out;
259
+ }
260
+ // -- Type graph walking -------------------------------------------------------
261
+ /**
262
+ * Walk the type graph starting from root types, discovering nested @WireType
263
+ * classes by inspecting default values of instances.
264
+ *
265
+ * Returns all discovered types in dependency order (leaves first), suitable
266
+ * for registration with Fory. This is the TS equivalent of Python's
267
+ * `_walk_type_graph()`.
268
+ *
269
+ * Limitations (compared to Python's dataclass introspection):
270
+ * - Only discovers nested types whose default values are instances of @WireType classes
271
+ * - Types in arrays, optionals, or maps that default to empty/null must be registered explicitly
272
+ *
273
+ * @param rootTypes - Classes decorated with @WireType
274
+ * @returns All types in dependency order (leaves first)
275
+ */
276
+ export function walkTypeGraph(rootTypes) {
277
+ const visited = new Set();
278
+ const ordered = [];
279
+ function visit(cls) {
280
+ if (visited.has(cls))
281
+ return;
282
+ visited.add(cls);
283
+ // Check this class has a wire type tag
284
+ const tag = cls[WIRE_TYPE_KEY];
285
+ if (!tag)
286
+ return;
287
+ // Instantiate to discover fields and their default values
288
+ try {
289
+ const instance = new cls();
290
+ for (const key of Object.keys(instance)) {
291
+ const value = instance[key];
292
+ if (value === null || value === undefined)
293
+ continue;
294
+ // Check if the value's constructor is a @WireType class
295
+ const ctor = value?.constructor;
296
+ if (ctor && ctor !== Object && ctor !== Array && ctor !== String &&
297
+ ctor !== Number && ctor !== Boolean && ctor[WIRE_TYPE_KEY]) {
298
+ visit(ctor);
299
+ }
300
+ // Check items in arrays for @WireType instances
301
+ if (Array.isArray(value)) {
302
+ for (const item of value) {
303
+ const itemCtor = item?.constructor;
304
+ if (itemCtor && itemCtor[WIRE_TYPE_KEY]) {
305
+ visit(itemCtor);
306
+ }
307
+ }
308
+ }
309
+ }
310
+ }
311
+ catch {
312
+ // If instantiation fails (e.g. required constructor args), skip walking fields
313
+ }
314
+ // Add after dependencies (leaves first)
315
+ ordered.push(cls);
316
+ }
317
+ for (const cls of rootTypes) {
318
+ visit(cls);
319
+ }
320
+ return ordered;
321
+ }
322
+ // -- ForyConfig ----------------------------------------------------------------
323
+ /**
324
+ * Configuration for the Fory serializer.
325
+ */
326
+ export class ForyConfig {
327
+ /** Compression threshold in bytes (default: 4096). */
328
+ compressionThreshold;
329
+ /** Whether to use cross-language mode (xlang). Default: true. */
330
+ xlang;
331
+ constructor(opts) {
332
+ this.compressionThreshold = opts?.compressionThreshold ?? DEFAULT_COMPRESSION_THRESHOLD;
333
+ this.xlang = opts?.xlang ?? true;
334
+ }
335
+ /** The resolved xlang mode (same as xlang field). */
336
+ get resolvedXlang() {
337
+ return this.xlang;
338
+ }
339
+ /** Convert to kwargs-style object for passing to Fory constructor. */
340
+ toKwargs() {
341
+ return {
342
+ xlang: this.xlang,
343
+ // Fory doesn't directly take compressionThreshold; pass via codec
344
+ };
345
+ }
346
+ }
347
+ /**
348
+ * Resolve a ForyConfig with defaults.
349
+ */
350
+ export function resolveForyConfig(config) {
351
+ const xlang = config?.xlang ?? true;
352
+ return {
353
+ compressionThreshold: config?.compressionThreshold ?? DEFAULT_COMPRESSION_THRESHOLD,
354
+ xlang,
355
+ resolvedXlang: xlang,
356
+ };
357
+ }
358
+ // -- ForyCodec ----------------------------------------------------------------
359
+ /**
360
+ * ForyCodec — cross-language serialization via @apache-fory/core.
361
+ *
362
+ * Wraps the Fory JS XLANG serializer for wire-compatible serialization
363
+ * with Python's pyfory.
364
+ *
365
+ * @example
366
+ * ```ts
367
+ * import Fory from '@apache-fory/core';
368
+ * const fory = new Fory({ compatible: true });
369
+ * const codec = new ForyCodec(fory);
370
+ * ```
371
+ */
372
+ export class ForyCodec {
373
+ fory;
374
+ threshold;
375
+ serializers = new Map();
376
+ constructor(foryInstance, compressionThreshold = DEFAULT_COMPRESSION_THRESHOLD) {
377
+ this.fory = foryInstance;
378
+ this.threshold = compressionThreshold;
379
+ }
380
+ /** Register a type for serialization. */
381
+ registerType(typeInfo) {
382
+ const { serialize, deserialize } = this.fory.registerSerializer(typeInfo);
383
+ const name = typeInfo?.options?.typeName ?? typeInfo?.tag ?? String(typeInfo);
384
+ this.serializers.set(name, { serialize, deserialize });
385
+ }
386
+ /**
387
+ * Walk the type graph from root types and register all discovered
388
+ * @WireType classes with Fory. Types are registered in dependency
389
+ * order (leaves first).
390
+ *
391
+ * @param rootTypes - Classes decorated with @WireType
392
+ * @param buildTypeInfo - Function that converts a class to a Fory typeInfo object.
393
+ * Receives (cls, wireTag) and should return the object to pass to registerType().
394
+ */
395
+ registerTypeGraph(rootTypes, buildTypeInfo) {
396
+ const types = walkTypeGraph(rootTypes);
397
+ for (const cls of types) {
398
+ const tag = cls[WIRE_TYPE_KEY];
399
+ if (tag && !this.serializers.has(tag)) {
400
+ const typeInfo = buildTypeInfo(cls, tag);
401
+ this.registerType(typeInfo);
402
+ }
403
+ }
404
+ }
405
+ encode(obj, _hintType) {
406
+ const result = this.fory.serialize(obj);
407
+ return new Uint8Array(result);
408
+ }
409
+ decode(payload, _hintType) {
410
+ return this.fory.deserialize(payload);
411
+ }
412
+ encodeCompressed(obj) {
413
+ const data = this.encode(obj);
414
+ if (data.byteLength > this.threshold && _zstdAvailable) {
415
+ const compressed = zstdCompress(data);
416
+ if (compressed && compressed.byteLength < data.byteLength) {
417
+ return [compressed, true];
418
+ }
419
+ }
420
+ return [data, false];
421
+ }
422
+ decodeCompressed(payload, compressed, hintType) {
423
+ if (compressed) {
424
+ const decompressed = zstdDecompress(payload);
425
+ return this.decode(decompressed, hintType);
426
+ }
427
+ return this.decode(payload, hintType);
428
+ }
429
+ /**
430
+ * Compress bytes using zstd (if available).
431
+ * Returns null if zstd is unavailable or compression didn't help.
432
+ */
433
+ compress(data) {
434
+ if (!_zstdAvailable)
435
+ return null;
436
+ return zstdCompress(data);
437
+ }
438
+ /**
439
+ * Decompress zstd-compressed bytes.
440
+ */
441
+ decompress(data) {
442
+ return zstdDecompress(data);
443
+ }
444
+ /**
445
+ * Encode a row schema for a list of field names (for row-oriented data).
446
+ * Returns a JSON-encoded schema descriptor.
447
+ */
448
+ encodeRowSchema(fields) {
449
+ return new TextEncoder().encode(JSON.stringify({ fields }));
450
+ }
451
+ /**
452
+ * Decode a row-oriented data payload using a previously decoded schema.
453
+ * Reconstructs objects from parallel arrays.
454
+ */
455
+ decodeRowData(schemaBytes, dataBytes) {
456
+ const schema = JSON.parse(new TextDecoder().decode(schemaBytes));
457
+ const rows = this.decode(dataBytes);
458
+ if (!Array.isArray(rows))
459
+ return [];
460
+ return rows.map((row) => {
461
+ if (!Array.isArray(row))
462
+ return row;
463
+ const obj = {};
464
+ for (let i = 0; i < schema.fields.length; i++) {
465
+ obj[schema.fields[i]] = row[i];
466
+ }
467
+ return obj;
468
+ });
469
+ }
470
+ /**
471
+ * Return the list of registered type names.
472
+ */
473
+ registeredTypes() {
474
+ return [...this.serializers.keys()];
475
+ }
476
+ }
477
+ //# sourceMappingURL=codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec.js","sourceRoot":"","sources":["../src/codec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * AsterConfig — configuration resolution.
3
+ *
4
+ * Three-layer resolution order:
5
+ * 1. Built-in defaults
6
+ * 2. Config file (aster.config.ts, aster.toml, .asterrc)
7
+ * 3. Environment variables (ASTER_* prefix, always win)
8
+ */
9
+ /** Aster configuration. */
10
+ export interface AsterConfig {
11
+ rootPubkey?: Uint8Array;
12
+ rootPubkeyFile?: string;
13
+ enrollmentCredentialFile?: string;
14
+ allowAllConsumers: boolean;
15
+ allowAllProducers: boolean;
16
+ endpointAddr?: string;
17
+ storagePath?: string;
18
+ healthPort: number;
19
+ healthHost: string;
20
+ secretKey?: Uint8Array;
21
+ relayMode?: string;
22
+ bindAddr?: string;
23
+ enableMonitoring: boolean;
24
+ enableHooks: boolean;
25
+ hookTimeoutMs: number;
26
+ logFormat: 'json' | 'text';
27
+ logLevel: 'debug' | 'info' | 'warning' | 'error';
28
+ logMask: boolean;
29
+ identityFile?: string;
30
+ }
31
+ /** Load config from environment variables with built-in defaults. */
32
+ export declare function configFromEnv(): AsterConfig;
33
+ /**
34
+ * Load config from a TOML file, then overlay env vars.
35
+ *
36
+ * Supports aster.toml with sections: [trust], [connect], [storage],
37
+ * [network], [logging], [health].
38
+ */
39
+ export declare function configFromFile(filePath: string): AsterConfig;
40
+ /** Parsed identity data from a .aster-identity TOML file. */
41
+ export interface IdentityData {
42
+ node: Record<string, unknown>;
43
+ peers: Record<string, unknown>[];
44
+ published_services: Record<string, Record<string, unknown>>;
45
+ }
46
+ /**
47
+ * Load and parse an .aster-identity TOML file.
48
+ *
49
+ * Synthesizes ``aster.role`` and ``aster.name`` into each peer's
50
+ * ``attributes`` from the top-level ``role`` and ``name`` fields.
51
+ * Merges the top-level ``[published_services.*]`` into each peer's
52
+ * ``published_services`` so callers always see a complete peer dict.
53
+ *
54
+ * Returns the full parsed identity or null if the file doesn't exist.
55
+ */
56
+ export declare function loadIdentityFile(filePath?: string): IdentityData | null;
57
+ /**
58
+ * Load identity from a .aster-identity TOML file.
59
+ *
60
+ * Returns secretKey + matching peer, or null if not found.
61
+ * This is the simple convenience wrapper; use loadIdentityFile()
62
+ * for full access to published_services and all peers.
63
+ */
64
+ export declare function loadIdentity(filePath?: string, peerName?: string, role?: string): {
65
+ secretKey: Uint8Array;
66
+ peer: Record<string, unknown>;
67
+ } | null;
68
+ /**
69
+ * Find a peer entry by name or role from parsed identity data.
70
+ */
71
+ export declare function findPeer(identity: IdentityData, name?: string, role?: string): Record<string, unknown> | undefined;
72
+ /**
73
+ * Extract producer tokens from a peer's published_services.
74
+ *
75
+ * Returns a map of service name to token data (entries that
76
+ * have a ``producer_token`` field).
77
+ */
78
+ export declare function getProducerTokens(peer: Record<string, unknown>): Record<string, Record<string, unknown>>;
79
+ /**
80
+ * Minimal TOML parser for config files.
81
+ * Handles sections (including dotted like [a.b]), array-of-tables,
82
+ * strings, numbers, booleans, inline tables, and simple arrays.
83
+ * Not a full TOML parser.
84
+ */
85
+ export declare function parseSimpleToml(text: string): Record<string, unknown>;
86
+ /**
87
+ * Load endpoint config from a file path (alias for configFromFile).
88
+ */
89
+ export declare function loadEndpointConfig(filePath: string): AsterConfig;
90
+ /**
91
+ * Resolve the root public key from config (raw bytes or from file).
92
+ * Returns undefined if neither is set.
93
+ */
94
+ export declare function resolveRootPubkey(config: AsterConfig): Uint8Array | undefined;
95
+ /**
96
+ * Convert AsterConfig to an endpoint-specific config subset.
97
+ * Returns the config fields relevant to network endpoint setup.
98
+ */
99
+ export declare function toEndpointConfig(config: AsterConfig): Record<string, unknown>;
100
+ /** Print resolved config (masks sensitive values). */
101
+ export declare function printConfig(config: AsterConfig): void;
102
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,2BAA2B;AAC3B,MAAM,WAAW,WAAW;IAE1B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,iBAAiB,EAAE,OAAO,CAAC;IAG3B,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IAGnB,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IAGtB,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACjD,OAAO,EAAE,OAAO,CAAC;IAGjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAyBD,qEAAqE;AACrE,wBAAgB,aAAa,IAAI,WAAW,CAsB3C;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAsF5D;AAED,6DAA6D;AAC7D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACjC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC7D;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,CAAC,EAAE,MAAM,GAChB,YAAY,GAAG,IAAI,CAoCrB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,MAAM,GACZ;IAAE,SAAS,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,IAAI,CAmBjE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,YAAY,EACtB,IAAI,CAAC,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,GACZ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAMrC;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAWzC;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkDrE;AAmFD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAEhE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,UAAU,GAAG,SAAS,CAe7E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAO7E;AAED,sDAAsD;AACtD,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAoBrD"}