@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.
- package/dist/capabilities.d.ts +26 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +29 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/client.d.ts +65 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +108 -0
- package/dist/client.js.map +1 -0
- package/dist/codec.d.ts +156 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +477 -0
- package/dist/codec.js.map +1 -0
- package/dist/config.d.ts +102 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +454 -0
- package/dist/config.js.map +1 -0
- package/dist/contract/identity.d.ts +115 -0
- package/dist/contract/identity.d.ts.map +1 -0
- package/dist/contract/identity.js +188 -0
- package/dist/contract/identity.js.map +1 -0
- package/dist/contract/manifest.d.ts +77 -0
- package/dist/contract/manifest.d.ts.map +1 -0
- package/dist/contract/manifest.js +127 -0
- package/dist/contract/manifest.js.map +1 -0
- package/dist/contract/publication.d.ts +71 -0
- package/dist/contract/publication.d.ts.map +1 -0
- package/dist/contract/publication.js +85 -0
- package/dist/contract/publication.js.map +1 -0
- package/dist/decorators.d.ts +139 -0
- package/dist/decorators.d.ts.map +1 -0
- package/dist/decorators.js +175 -0
- package/dist/decorators.js.map +1 -0
- package/dist/dynamic.d.ts +61 -0
- package/dist/dynamic.d.ts.map +1 -0
- package/dist/dynamic.js +147 -0
- package/dist/dynamic.js.map +1 -0
- package/dist/framing.d.ts +74 -0
- package/dist/framing.d.ts.map +1 -0
- package/dist/framing.js +162 -0
- package/dist/framing.js.map +1 -0
- package/dist/health.d.ts +127 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +236 -0
- package/dist/health.js.map +1 -0
- package/dist/index.d.ts +67 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +101 -0
- package/dist/index.js.map +1 -0
- package/dist/interceptors/audit.d.ts +25 -0
- package/dist/interceptors/audit.d.ts.map +1 -0
- package/dist/interceptors/audit.js +46 -0
- package/dist/interceptors/audit.js.map +1 -0
- package/dist/interceptors/auth.d.ts +13 -0
- package/dist/interceptors/auth.d.ts.map +1 -0
- package/dist/interceptors/auth.js +34 -0
- package/dist/interceptors/auth.js.map +1 -0
- package/dist/interceptors/base.d.ts +74 -0
- package/dist/interceptors/base.d.ts.map +1 -0
- package/dist/interceptors/base.js +103 -0
- package/dist/interceptors/base.js.map +1 -0
- package/dist/interceptors/capability.d.ts +16 -0
- package/dist/interceptors/capability.d.ts.map +1 -0
- package/dist/interceptors/capability.js +63 -0
- package/dist/interceptors/capability.js.map +1 -0
- package/dist/interceptors/circuit-breaker.d.ts +40 -0
- package/dist/interceptors/circuit-breaker.d.ts.map +1 -0
- package/dist/interceptors/circuit-breaker.js +91 -0
- package/dist/interceptors/circuit-breaker.js.map +1 -0
- package/dist/interceptors/compression.d.ts +11 -0
- package/dist/interceptors/compression.d.ts.map +1 -0
- package/dist/interceptors/compression.js +12 -0
- package/dist/interceptors/compression.js.map +1 -0
- package/dist/interceptors/deadline.d.ts +12 -0
- package/dist/interceptors/deadline.d.ts.map +1 -0
- package/dist/interceptors/deadline.js +28 -0
- package/dist/interceptors/deadline.js.map +1 -0
- package/dist/interceptors/metrics.d.ts +43 -0
- package/dist/interceptors/metrics.d.ts.map +1 -0
- package/dist/interceptors/metrics.js +132 -0
- package/dist/interceptors/metrics.js.map +1 -0
- package/dist/interceptors/rate-limit.d.ts +24 -0
- package/dist/interceptors/rate-limit.d.ts.map +1 -0
- package/dist/interceptors/rate-limit.js +84 -0
- package/dist/interceptors/rate-limit.js.map +1 -0
- package/dist/interceptors/retry.d.ts +25 -0
- package/dist/interceptors/retry.d.ts.map +1 -0
- package/dist/interceptors/retry.js +55 -0
- package/dist/interceptors/retry.js.map +1 -0
- package/dist/limits.d.ts +77 -0
- package/dist/limits.d.ts.map +1 -0
- package/dist/limits.js +137 -0
- package/dist/limits.js.map +1 -0
- package/dist/logging.d.ts +40 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +92 -0
- package/dist/logging.js.map +1 -0
- package/dist/metadata.d.ts +14 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +68 -0
- package/dist/metadata.js.map +1 -0
- package/dist/metrics.d.ts +40 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +92 -0
- package/dist/metrics.js.map +1 -0
- package/dist/peer-store.d.ts +53 -0
- package/dist/peer-store.d.ts.map +1 -0
- package/dist/peer-store.js +105 -0
- package/dist/peer-store.js.map +1 -0
- package/dist/protocol.d.ts +44 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +59 -0
- package/dist/protocol.js.map +1 -0
- package/dist/registration.d.ts +81 -0
- package/dist/registration.d.ts.map +1 -0
- package/dist/registration.js +161 -0
- package/dist/registration.js.map +1 -0
- package/dist/registry/acl.d.ts +57 -0
- package/dist/registry/acl.d.ts.map +1 -0
- package/dist/registry/acl.js +104 -0
- package/dist/registry/acl.js.map +1 -0
- package/dist/registry/client.d.ts +70 -0
- package/dist/registry/client.d.ts.map +1 -0
- package/dist/registry/client.js +115 -0
- package/dist/registry/client.js.map +1 -0
- package/dist/registry/gossip.d.ts +43 -0
- package/dist/registry/gossip.d.ts.map +1 -0
- package/dist/registry/gossip.js +102 -0
- package/dist/registry/gossip.js.map +1 -0
- package/dist/registry/keys.d.ts +25 -0
- package/dist/registry/keys.d.ts.map +1 -0
- package/dist/registry/keys.js +47 -0
- package/dist/registry/keys.js.map +1 -0
- package/dist/registry/models.d.ts +80 -0
- package/dist/registry/models.d.ts.map +1 -0
- package/dist/registry/models.js +35 -0
- package/dist/registry/models.js.map +1 -0
- package/dist/registry/publisher.d.ts +65 -0
- package/dist/registry/publisher.d.ts.map +1 -0
- package/dist/registry/publisher.js +164 -0
- package/dist/registry/publisher.js.map +1 -0
- package/dist/runtime.d.ts +267 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1366 -0
- package/dist/runtime.js.map +1 -0
- package/dist/server.d.ts +100 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +511 -0
- package/dist/server.js.map +1 -0
- package/dist/service.d.ts +72 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +98 -0
- package/dist/service.js.map +1 -0
- package/dist/session.d.ts +64 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +350 -0
- package/dist/session.js.map +1 -0
- package/dist/status.d.ts +113 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +206 -0
- package/dist/status.js.map +1 -0
- package/dist/transport/base.d.ts +46 -0
- package/dist/transport/base.d.ts.map +1 -0
- package/dist/transport/base.js +10 -0
- package/dist/transport/base.js.map +1 -0
- package/dist/transport/iroh.d.ts +45 -0
- package/dist/transport/iroh.d.ts.map +1 -0
- package/dist/transport/iroh.js +225 -0
- package/dist/transport/iroh.js.map +1 -0
- package/dist/transport/local.d.ts +48 -0
- package/dist/transport/local.d.ts.map +1 -0
- package/dist/transport/local.js +139 -0
- package/dist/transport/local.js.map +1 -0
- package/dist/trust/admission.d.ts +60 -0
- package/dist/trust/admission.d.ts.map +1 -0
- package/dist/trust/admission.js +149 -0
- package/dist/trust/admission.js.map +1 -0
- package/dist/trust/bootstrap.d.ts +109 -0
- package/dist/trust/bootstrap.d.ts.map +1 -0
- package/dist/trust/bootstrap.js +311 -0
- package/dist/trust/bootstrap.js.map +1 -0
- package/dist/trust/clock.d.ts +93 -0
- package/dist/trust/clock.d.ts.map +1 -0
- package/dist/trust/clock.js +154 -0
- package/dist/trust/clock.js.map +1 -0
- package/dist/trust/consumer.d.ts +139 -0
- package/dist/trust/consumer.d.ts.map +1 -0
- package/dist/trust/consumer.js +323 -0
- package/dist/trust/consumer.js.map +1 -0
- package/dist/trust/credentials.d.ts +98 -0
- package/dist/trust/credentials.d.ts.map +1 -0
- package/dist/trust/credentials.js +250 -0
- package/dist/trust/credentials.js.map +1 -0
- package/dist/trust/delegated.d.ts +118 -0
- package/dist/trust/delegated.d.ts.map +1 -0
- package/dist/trust/delegated.js +292 -0
- package/dist/trust/delegated.js.map +1 -0
- package/dist/trust/gossip.d.ts +146 -0
- package/dist/trust/gossip.d.ts.map +1 -0
- package/dist/trust/gossip.js +334 -0
- package/dist/trust/gossip.js.map +1 -0
- package/dist/trust/hooks.d.ts +84 -0
- package/dist/trust/hooks.d.ts.map +1 -0
- package/dist/trust/hooks.js +125 -0
- package/dist/trust/hooks.js.map +1 -0
- package/dist/trust/iid.d.ts +65 -0
- package/dist/trust/iid.d.ts.map +1 -0
- package/dist/trust/iid.js +104 -0
- package/dist/trust/iid.js.map +1 -0
- package/dist/trust/mesh.d.ts +43 -0
- package/dist/trust/mesh.d.ts.map +1 -0
- package/dist/trust/mesh.js +105 -0
- package/dist/trust/mesh.js.map +1 -0
- package/dist/trust/nonce.d.ts +39 -0
- package/dist/trust/nonce.d.ts.map +1 -0
- package/dist/trust/nonce.js +46 -0
- package/dist/trust/nonce.js.map +1 -0
- package/dist/trust/producer.d.ts +80 -0
- package/dist/trust/producer.d.ts.map +1 -0
- package/dist/trust/producer.js +151 -0
- package/dist/trust/producer.js.map +1 -0
- package/dist/trust/rcan.d.ts +29 -0
- package/dist/trust/rcan.d.ts.map +1 -0
- package/dist/trust/rcan.js +57 -0
- package/dist/trust/rcan.js.map +1 -0
- package/dist/types.d.ts +57 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +50 -0
- package/dist/types.js.map +1 -0
- package/dist/xlang.d.ts +26 -0
- package/dist/xlang.d.ts.map +1 -0
- package/dist/xlang.js +55 -0
- package/dist/xlang.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service and method decorators for defining Aster RPC services.
|
|
3
|
+
*
|
|
4
|
+
* Spec reference: S7.1-7.4 (decorators), S7.6 (language ownership)
|
|
5
|
+
*
|
|
6
|
+
* Uses TC39 Stage 3 decorators (TS 5.0+). These compile away during
|
|
7
|
+
* TypeScript compilation -- no runtime decorator support needed.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* @Service({ name: "Echo", version: 1 })
|
|
12
|
+
* class EchoService {
|
|
13
|
+
* @Rpc({ timeout: 30 })
|
|
14
|
+
* async echo(req: EchoRequest): Promise<EchoResponse> {
|
|
15
|
+
* return new EchoResponse({ reply: req.message });
|
|
16
|
+
* }
|
|
17
|
+
*
|
|
18
|
+
* @ServerStream()
|
|
19
|
+
* async *watchItems(req: WatchRequest): AsyncGenerator<ItemUpdate> {
|
|
20
|
+
* yield new ItemUpdate({ item: "one" });
|
|
21
|
+
* }
|
|
22
|
+
* }
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
import type { SerializationMode } from './types.js';
|
|
26
|
+
import type { Metadata } from './metadata.js';
|
|
27
|
+
import { type CapabilityRequirement } from './service.js';
|
|
28
|
+
export interface ServiceOptions {
|
|
29
|
+
name: string;
|
|
30
|
+
version?: number;
|
|
31
|
+
/** Dispatch scope. Canonical values are 'shared' and 'session'.
|
|
32
|
+
* The legacy alias 'stream' is still accepted on input. */
|
|
33
|
+
scoped?: 'shared' | 'session' | 'stream';
|
|
34
|
+
serialization?: SerializationMode[];
|
|
35
|
+
requires?: CapabilityRequirement;
|
|
36
|
+
metadata?: Metadata;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Decorate a class as an Aster RPC service.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* @Service({ name: "Echo", version: 1 })
|
|
44
|
+
* class EchoService { ... }
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export declare function Service(options: ServiceOptions): <T extends new (...args: any[]) => any>(target: T, _context: ClassDecoratorContext) => T;
|
|
48
|
+
interface RpcOptions {
|
|
49
|
+
/** Override wire name (defaults to the method name). */
|
|
50
|
+
name?: string;
|
|
51
|
+
timeout?: number;
|
|
52
|
+
idempotent?: boolean;
|
|
53
|
+
serialization?: SerializationMode;
|
|
54
|
+
requires?: CapabilityRequirement | string;
|
|
55
|
+
metadata?: Metadata;
|
|
56
|
+
/**
|
|
57
|
+
* Request message constructor. TypeScript erases type parameters at runtime,
|
|
58
|
+
* so the contract publisher and codegen pipeline cannot discover the request
|
|
59
|
+
* shape unless it is passed explicitly here. Without it the published manifest
|
|
60
|
+
* will lack the wire tag and field list, which breaks `aster gen-client`
|
|
61
|
+
* for cross-language consumers.
|
|
62
|
+
*/
|
|
63
|
+
request?: new (...args: any[]) => any;
|
|
64
|
+
/** Response message constructor. See `request` for why this is needed. */
|
|
65
|
+
response?: new (...args: any[]) => any;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Mark a method as a unary RPC (single request, single response).
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```ts
|
|
72
|
+
* @Rpc({ timeout: 30, idempotent: true })
|
|
73
|
+
* async getUser(req: GetUserRequest): Promise<User> { ... }
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
export declare function Rpc(options?: RpcOptions): <T extends (...args: any[]) => any>(target: T, _context: ClassMethodDecoratorContext) => T;
|
|
77
|
+
/**
|
|
78
|
+
* Mark a method as a server-streaming RPC (single request, multiple responses).
|
|
79
|
+
* Method must be an async generator.
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```ts
|
|
83
|
+
* @ServerStream()
|
|
84
|
+
* async *watchUpdates(req: WatchRequest): AsyncGenerator<Update> { ... }
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
export declare function ServerStream(options?: RpcOptions): <T extends (...args: any[]) => any>(target: T, _context: ClassMethodDecoratorContext) => T;
|
|
88
|
+
/**
|
|
89
|
+
* Mark a method as a client-streaming RPC (multiple requests, single response).
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```ts
|
|
93
|
+
* @ClientStream()
|
|
94
|
+
* async uploadBatch(requests: AsyncIterable<Item>): Promise<BatchResult> { ... }
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
export declare function ClientStream(options?: RpcOptions): <T extends (...args: any[]) => any>(target: T, _context: ClassMethodDecoratorContext) => T;
|
|
98
|
+
/**
|
|
99
|
+
* Mark a method as a bidirectional-streaming RPC.
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* ```ts
|
|
103
|
+
* @BidiStream()
|
|
104
|
+
* async *chat(requests: AsyncIterable<Message>): AsyncGenerator<Message> { ... }
|
|
105
|
+
* ```
|
|
106
|
+
*/
|
|
107
|
+
export declare function BidiStream(options?: RpcOptions): <T extends (...args: any[]) => any>(target: T, _context: ClassMethodDecoratorContext) => T;
|
|
108
|
+
/** Metadata key for wire type tag. */
|
|
109
|
+
export declare const WIRE_TYPE_KEY: unique symbol;
|
|
110
|
+
/** Metadata key for wire type field metadata. */
|
|
111
|
+
export declare const WIRE_TYPE_FIELDS_KEY: unique symbol;
|
|
112
|
+
/** Options for @WireType decorator. */
|
|
113
|
+
export interface WireTypeOptions {
|
|
114
|
+
/** Field-level metadata (field name -> Metadata). */
|
|
115
|
+
metadata?: Record<string, Metadata>;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Register a class as a Fory XLANG wire type.
|
|
119
|
+
*
|
|
120
|
+
* @example
|
|
121
|
+
* ```ts
|
|
122
|
+
* @WireType("billing/Invoice")
|
|
123
|
+
* class Invoice {
|
|
124
|
+
* amount = 0;
|
|
125
|
+
* currency = "USD";
|
|
126
|
+
* }
|
|
127
|
+
*
|
|
128
|
+
* @WireType("billing/Invoice", {
|
|
129
|
+
* metadata: { amount: new Metadata({ description: "Total in cents" }) }
|
|
130
|
+
* })
|
|
131
|
+
* class InvoiceWithDocs {
|
|
132
|
+
* amount = 0;
|
|
133
|
+
* currency = "USD";
|
|
134
|
+
* }
|
|
135
|
+
* ```
|
|
136
|
+
*/
|
|
137
|
+
export declare function WireType(tag: string, options?: WireTypeOptions): <T extends new (...args: any[]) => any>(target: T, _context: ClassDecoratorContext) => T;
|
|
138
|
+
export {};
|
|
139
|
+
//# sourceMappingURL=decorators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAKL,KAAK,qBAAqB,EAC3B,MAAM,cAAc,CAAC;AAItB,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;gEAC4D;IAC5D,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;IACzC,aAAa,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACpC,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,cAAc,IAC5B,CAAC,SAAS,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACpD,QAAQ,CAAC,EACT,UAAU,qBAAqB,KAC9B,CAAC,CAyCL;AAID,UAAU,UAAU;IAClB,wDAAwD;IACxD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,EAAE,qBAAqB,GAAG,MAAM,CAAC;IAC1C,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;IACtC,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;CACxC;AAyBD;;;;;;;;GAQG;AACH,wBAAgB,GAAG,CAAC,OAAO,CAAC,EAAE,UAAU,IA/BrB,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,UACxC,CAAC,YACC,2BAA2B,KACpC,CAAC,CA8BL;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,UAAU,IA7C9B,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,UACxC,CAAC,YACC,2BAA2B,KACpC,CAAC,CA4CL;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,UAAU,IA1D9B,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,UACxC,CAAC,YACC,2BAA2B,KACpC,CAAC,CAyDL;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,OAAO,CAAC,EAAE,UAAU,IAvE5B,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,UACxC,CAAC,YACC,2BAA2B,KACpC,CAAC,CAsEL;AAID,sCAAsC;AACtC,eAAO,MAAM,aAAa,eAAgC,CAAC;AAE3D,iDAAiD;AACjD,eAAO,MAAM,oBAAoB,eAAuC,CAAC;AAEzE,uCAAuC;AACvC,MAAM,WAAW,eAAe;IAC9B,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CACrC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,IAC5C,CAAC,SAAS,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACpD,QAAQ,CAAC,EACT,UAAU,qBAAqB,KAC9B,CAAC,CAOL"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service and method decorators for defining Aster RPC services.
|
|
3
|
+
*
|
|
4
|
+
* Spec reference: S7.1-7.4 (decorators), S7.6 (language ownership)
|
|
5
|
+
*
|
|
6
|
+
* Uses TC39 Stage 3 decorators (TS 5.0+). These compile away during
|
|
7
|
+
* TypeScript compilation -- no runtime decorator support needed.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* @Service({ name: "Echo", version: 1 })
|
|
12
|
+
* class EchoService {
|
|
13
|
+
* @Rpc({ timeout: 30 })
|
|
14
|
+
* async echo(req: EchoRequest): Promise<EchoResponse> {
|
|
15
|
+
* return new EchoResponse({ reply: req.message });
|
|
16
|
+
* }
|
|
17
|
+
*
|
|
18
|
+
* @ServerStream()
|
|
19
|
+
* async *watchItems(req: WatchRequest): AsyncGenerator<ItemUpdate> {
|
|
20
|
+
* yield new ItemUpdate({ item: "one" });
|
|
21
|
+
* }
|
|
22
|
+
* }
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
import { RpcPattern } from './types.js';
|
|
26
|
+
import { SERVICE_INFO_KEY, METHOD_INFO_KEY, } from './service.js';
|
|
27
|
+
/**
|
|
28
|
+
* Decorate a class as an Aster RPC service.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```ts
|
|
32
|
+
* @Service({ name: "Echo", version: 1 })
|
|
33
|
+
* class EchoService { ... }
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export function Service(options) {
|
|
37
|
+
return function (target, _context) {
|
|
38
|
+
// Collect methods that were decorated with @Rpc etc.
|
|
39
|
+
const methods = new Map();
|
|
40
|
+
// Scan prototype for method decorators
|
|
41
|
+
const proto = target.prototype;
|
|
42
|
+
const methodNames = Object.getOwnPropertyNames(proto).filter((n) => n !== 'constructor');
|
|
43
|
+
for (const name of methodNames) {
|
|
44
|
+
const descriptor = Object.getOwnPropertyDescriptor(proto, name);
|
|
45
|
+
if (!descriptor || typeof descriptor.value !== 'function')
|
|
46
|
+
continue;
|
|
47
|
+
const info = descriptor.value[METHOD_INFO_KEY];
|
|
48
|
+
if (info) {
|
|
49
|
+
// Use explicit name from @Rpc({name: "..."}) if set, else method name
|
|
50
|
+
if (!info.name) {
|
|
51
|
+
info.name = name;
|
|
52
|
+
}
|
|
53
|
+
info.handler = descriptor.value;
|
|
54
|
+
methods.set(info.name, info);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Canonical scope value is 'session'; accept the legacy 'stream' alias
|
|
58
|
+
// on input.
|
|
59
|
+
const scoped = options.scoped === 'stream' ? 'session' : (options.scoped ?? 'shared');
|
|
60
|
+
const serviceInfo = {
|
|
61
|
+
name: options.name,
|
|
62
|
+
version: options.version ?? 1,
|
|
63
|
+
scoped,
|
|
64
|
+
methods,
|
|
65
|
+
serializationModes: options.serialization ?? [],
|
|
66
|
+
requires: options.requires,
|
|
67
|
+
metadata: options.metadata,
|
|
68
|
+
instance: undefined,
|
|
69
|
+
};
|
|
70
|
+
target[SERVICE_INFO_KEY] = serviceInfo;
|
|
71
|
+
return target;
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function methodDecorator(pattern, options) {
|
|
75
|
+
return function (target, _context) {
|
|
76
|
+
const info = {
|
|
77
|
+
name: options?.name ?? '', // explicit name or filled in by @Service
|
|
78
|
+
pattern,
|
|
79
|
+
requestType: options?.request,
|
|
80
|
+
responseType: options?.response,
|
|
81
|
+
timeout: options?.timeout,
|
|
82
|
+
idempotent: options?.idempotent ?? false,
|
|
83
|
+
serialization: options?.serialization,
|
|
84
|
+
requires: options?.requires,
|
|
85
|
+
handler: undefined, // filled in by @Service
|
|
86
|
+
metadata: options?.metadata,
|
|
87
|
+
};
|
|
88
|
+
target[METHOD_INFO_KEY] = info;
|
|
89
|
+
return target;
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Mark a method as a unary RPC (single request, single response).
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* ```ts
|
|
97
|
+
* @Rpc({ timeout: 30, idempotent: true })
|
|
98
|
+
* async getUser(req: GetUserRequest): Promise<User> { ... }
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
export function Rpc(options) {
|
|
102
|
+
return methodDecorator(RpcPattern.UNARY, options);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Mark a method as a server-streaming RPC (single request, multiple responses).
|
|
106
|
+
* Method must be an async generator.
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```ts
|
|
110
|
+
* @ServerStream()
|
|
111
|
+
* async *watchUpdates(req: WatchRequest): AsyncGenerator<Update> { ... }
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
export function ServerStream(options) {
|
|
115
|
+
return methodDecorator(RpcPattern.SERVER_STREAM, options);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Mark a method as a client-streaming RPC (multiple requests, single response).
|
|
119
|
+
*
|
|
120
|
+
* @example
|
|
121
|
+
* ```ts
|
|
122
|
+
* @ClientStream()
|
|
123
|
+
* async uploadBatch(requests: AsyncIterable<Item>): Promise<BatchResult> { ... }
|
|
124
|
+
* ```
|
|
125
|
+
*/
|
|
126
|
+
export function ClientStream(options) {
|
|
127
|
+
return methodDecorator(RpcPattern.CLIENT_STREAM, options);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Mark a method as a bidirectional-streaming RPC.
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* ```ts
|
|
134
|
+
* @BidiStream()
|
|
135
|
+
* async *chat(requests: AsyncIterable<Message>): AsyncGenerator<Message> { ... }
|
|
136
|
+
* ```
|
|
137
|
+
*/
|
|
138
|
+
export function BidiStream(options) {
|
|
139
|
+
return methodDecorator(RpcPattern.BIDI_STREAM, options);
|
|
140
|
+
}
|
|
141
|
+
// -- Wire type decorator ------------------------------------------------------
|
|
142
|
+
/** Metadata key for wire type tag. */
|
|
143
|
+
export const WIRE_TYPE_KEY = Symbol.for('aster.wire_type');
|
|
144
|
+
/** Metadata key for wire type field metadata. */
|
|
145
|
+
export const WIRE_TYPE_FIELDS_KEY = Symbol.for('aster.wire_type_fields');
|
|
146
|
+
/**
|
|
147
|
+
* Register a class as a Fory XLANG wire type.
|
|
148
|
+
*
|
|
149
|
+
* @example
|
|
150
|
+
* ```ts
|
|
151
|
+
* @WireType("billing/Invoice")
|
|
152
|
+
* class Invoice {
|
|
153
|
+
* amount = 0;
|
|
154
|
+
* currency = "USD";
|
|
155
|
+
* }
|
|
156
|
+
*
|
|
157
|
+
* @WireType("billing/Invoice", {
|
|
158
|
+
* metadata: { amount: new Metadata({ description: "Total in cents" }) }
|
|
159
|
+
* })
|
|
160
|
+
* class InvoiceWithDocs {
|
|
161
|
+
* amount = 0;
|
|
162
|
+
* currency = "USD";
|
|
163
|
+
* }
|
|
164
|
+
* ```
|
|
165
|
+
*/
|
|
166
|
+
export function WireType(tag, options) {
|
|
167
|
+
return function (target, _context) {
|
|
168
|
+
target[WIRE_TYPE_KEY] = tag;
|
|
169
|
+
if (options?.metadata) {
|
|
170
|
+
target[WIRE_TYPE_FIELDS_KEY] = options.metadata;
|
|
171
|
+
}
|
|
172
|
+
return target;
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=decorators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxC,OAAO,EACL,gBAAgB,EAChB,eAAe,GAIhB,MAAM,cAAc,CAAC;AAetB;;;;;;;;GAQG;AACH,MAAM,UAAU,OAAO,CAAC,OAAuB;IAC7C,OAAO,UACL,MAAS,EACT,QAA+B;QAE/B,qDAAqD;QACrD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;QAE9C,uCAAuC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC;QAC/B,MAAM,WAAW,GAAG,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,MAAM,CAC1D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,aAAa,CAC3B,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAChE,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,CAAC,KAAK,KAAK,UAAU;gBAAE,SAAS;YACpE,MAAM,IAAI,GAA2B,UAAU,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YACvE,IAAI,IAAI,EAAE,CAAC;gBACT,sEAAsE;gBACtE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;gBACnB,CAAC;gBACD,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,uEAAuE;QACvE,YAAY;QACZ,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC;QAEtF,MAAM,WAAW,GAAgB;YAC/B,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC;YAC7B,MAAM;YACN,OAAO;YACP,kBAAkB,EAAE,OAAO,CAAC,aAAa,IAAI,EAAE;YAC/C,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,QAAQ,EAAE,SAAS;SACpB,CAAC;QAED,MAAc,CAAC,gBAAgB,CAAC,GAAG,WAAW,CAAC;QAChD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAwBD,SAAS,eAAe,CAAC,OAAmB,EAAE,OAAoB;IAChE,OAAO,UACL,MAAS,EACT,QAAqC;QAErC,MAAM,IAAI,GAAe;YACvB,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,EAAE,yCAAyC;YACpE,OAAO;YACP,WAAW,EAAE,OAAO,EAAE,OAAO;YAC7B,YAAY,EAAE,OAAO,EAAE,QAAQ;YAC/B,OAAO,EAAE,OAAO,EAAE,OAAO;YACzB,UAAU,EAAE,OAAO,EAAE,UAAU,IAAI,KAAK;YACxC,aAAa,EAAE,OAAO,EAAE,aAAa;YACrC,QAAQ,EAAE,OAAO,EAAE,QAA6C;YAChE,OAAO,EAAE,SAAS,EAAE,wBAAwB;YAC5C,QAAQ,EAAE,OAAO,EAAE,QAAQ;SAC5B,CAAC;QAED,MAAc,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC;QACxC,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,GAAG,CAAC,OAAoB;IACtC,OAAO,eAAe,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AACpD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,OAAoB;IAC/C,OAAO,eAAe,CAAC,UAAU,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,OAAoB;IAC/C,OAAO,eAAe,CAAC,UAAU,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU,CAAC,OAAoB;IAC7C,OAAO,eAAe,CAAC,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;AAC1D,CAAC;AAED,gFAAgF;AAEhF,sCAAsC;AACtC,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AAE3D,iDAAiD;AACjD,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;AAQzE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,OAAyB;IAC7D,OAAO,UACL,MAAS,EACT,QAA+B;QAE9B,MAAc,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC;QACrC,IAAI,OAAO,EAAE,QAAQ,EAAE,CAAC;YACrB,MAAc,CAAC,oBAAoB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;QAC3D,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DynamicTypeFactory — synthesize wire-compatible types from contract manifests.
|
|
3
|
+
*
|
|
4
|
+
* Enables calling remote services without local type definitions.
|
|
5
|
+
* Given a ContractManifest, this factory creates JavaScript classes
|
|
6
|
+
* with the correct field names and Fory wire tags.
|
|
7
|
+
*
|
|
8
|
+
* Used by the shell, MCP server, and dynamic clients.
|
|
9
|
+
*/
|
|
10
|
+
import type { ManifestMethod, ManifestField } from './contract/manifest.js';
|
|
11
|
+
/** A dynamically synthesized type class. */
|
|
12
|
+
export interface DynamicType {
|
|
13
|
+
new (init?: Record<string, unknown>): Record<string, unknown>;
|
|
14
|
+
wireTag: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Create a dynamic type class from a wire tag and field descriptors.
|
|
18
|
+
*
|
|
19
|
+
* The returned class:
|
|
20
|
+
* - Has the correct wire tag (set via WIRE_TYPE_KEY symbol)
|
|
21
|
+
* - Accepts a partial init object in the constructor
|
|
22
|
+
* - Has default values for all fields based on their type
|
|
23
|
+
*/
|
|
24
|
+
export declare function createDynamicType(wireTag: string, fields: ManifestField[]): DynamicType;
|
|
25
|
+
/**
|
|
26
|
+
* Factory that synthesizes types for all methods in a manifest.
|
|
27
|
+
*
|
|
28
|
+
* Returns a map of wire tag -> DynamicType for both request and response types.
|
|
29
|
+
*/
|
|
30
|
+
export declare class DynamicTypeFactory {
|
|
31
|
+
private types;
|
|
32
|
+
/**
|
|
33
|
+
* Synthesize types for a method's request and response.
|
|
34
|
+
* Returns [RequestType, ResponseType] or undefined if wire tags are missing.
|
|
35
|
+
*/
|
|
36
|
+
synthesizeForMethod(method: ManifestMethod): [DynamicType, DynamicType] | undefined;
|
|
37
|
+
/** Get a previously synthesized type by wire tag. */
|
|
38
|
+
get(wireTag: string): DynamicType | undefined;
|
|
39
|
+
/** Get a type by wire tag (alias for get()). */
|
|
40
|
+
getType(wireTag: string): DynamicType | undefined;
|
|
41
|
+
/** Return all synthesized types. */
|
|
42
|
+
getAllTypes(): DynamicType[];
|
|
43
|
+
/** Number of registered types. */
|
|
44
|
+
get typeCount(): number;
|
|
45
|
+
/**
|
|
46
|
+
* Register types from a manifest's method descriptors.
|
|
47
|
+
* Synthesizes request and response types for all methods.
|
|
48
|
+
*/
|
|
49
|
+
registerFromManifest(manifest: {
|
|
50
|
+
methods: ManifestMethod[];
|
|
51
|
+
}): void;
|
|
52
|
+
/**
|
|
53
|
+
* Build a request object for a method using default values.
|
|
54
|
+
* Returns an instance of the synthesized request type.
|
|
55
|
+
*/
|
|
56
|
+
buildRequest(method: ManifestMethod, overrides?: Record<string, unknown>): unknown;
|
|
57
|
+
/** All synthesized types. */
|
|
58
|
+
allTypes(): IterableIterator<[string, DynamicType]>;
|
|
59
|
+
private getOrCreate;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=dynamic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic.d.ts","sourceRoot":"","sources":["../src/dynamic.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5E,4CAA4C;AAC5C,MAAM,WAAW,WAAW;IAC1B,KAAK,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,WAAW,CAgCvF;AAED;;;;GAIG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,KAAK,CAAkC;IAE/C;;;OAGG;IACH,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG,SAAS;IASnF,qDAAqD;IACrD,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI7C,gDAAgD;IAChD,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAIjD,oCAAoC;IACpC,WAAW,IAAI,WAAW,EAAE;IAI5B,kCAAkC;IAClC,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED;;;OAGG;IACH,oBAAoB,CAAC,QAAQ,EAAE;QAAE,OAAO,EAAE,cAAc,EAAE,CAAA;KAAE,GAAG,IAAI;IAMnE;;;OAGG;IACH,YAAY,CAAC,MAAM,EAAE,cAAc,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;IAYlF,6BAA6B;IAC7B,QAAQ,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAInD,OAAO,CAAC,WAAW;CAQpB"}
|
package/dist/dynamic.js
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DynamicTypeFactory — synthesize wire-compatible types from contract manifests.
|
|
3
|
+
*
|
|
4
|
+
* Enables calling remote services without local type definitions.
|
|
5
|
+
* Given a ContractManifest, this factory creates JavaScript classes
|
|
6
|
+
* with the correct field names and Fory wire tags.
|
|
7
|
+
*
|
|
8
|
+
* Used by the shell, MCP server, and dynamic clients.
|
|
9
|
+
*/
|
|
10
|
+
import { WIRE_TYPE_KEY } from './decorators.js';
|
|
11
|
+
/**
|
|
12
|
+
* Create a dynamic type class from a wire tag and field descriptors.
|
|
13
|
+
*
|
|
14
|
+
* The returned class:
|
|
15
|
+
* - Has the correct wire tag (set via WIRE_TYPE_KEY symbol)
|
|
16
|
+
* - Accepts a partial init object in the constructor
|
|
17
|
+
* - Has default values for all fields based on their type
|
|
18
|
+
*/
|
|
19
|
+
export function createDynamicType(wireTag, fields) {
|
|
20
|
+
// Build default values
|
|
21
|
+
const defaults = {};
|
|
22
|
+
for (const field of fields) {
|
|
23
|
+
defaults[field.name] = field.default ?? defaultForType(field.type);
|
|
24
|
+
}
|
|
25
|
+
// Create the class dynamically
|
|
26
|
+
const DynClass = class {
|
|
27
|
+
static wireTag = wireTag;
|
|
28
|
+
constructor(init) {
|
|
29
|
+
// Apply defaults
|
|
30
|
+
for (const [key, value] of Object.entries(defaults)) {
|
|
31
|
+
this[key] = value;
|
|
32
|
+
}
|
|
33
|
+
// Apply init overrides
|
|
34
|
+
if (init) {
|
|
35
|
+
for (const [key, value] of Object.entries(init)) {
|
|
36
|
+
this[key] = value;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
// Set wire type tag
|
|
42
|
+
DynClass[WIRE_TYPE_KEY] = wireTag;
|
|
43
|
+
// Set the class name for debugging
|
|
44
|
+
Object.defineProperty(DynClass, 'name', { value: wireTag.split('/').pop() ?? wireTag });
|
|
45
|
+
return DynClass;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Factory that synthesizes types for all methods in a manifest.
|
|
49
|
+
*
|
|
50
|
+
* Returns a map of wire tag -> DynamicType for both request and response types.
|
|
51
|
+
*/
|
|
52
|
+
export class DynamicTypeFactory {
|
|
53
|
+
types = new Map();
|
|
54
|
+
/**
|
|
55
|
+
* Synthesize types for a method's request and response.
|
|
56
|
+
* Returns [RequestType, ResponseType] or undefined if wire tags are missing.
|
|
57
|
+
*/
|
|
58
|
+
synthesizeForMethod(method) {
|
|
59
|
+
if (!method.requestWireTag || !method.responseWireTag)
|
|
60
|
+
return undefined;
|
|
61
|
+
const reqType = this.getOrCreate(method.requestWireTag, method.fields);
|
|
62
|
+
const respType = this.getOrCreate(method.responseWireTag, method.responseFields ?? []);
|
|
63
|
+
return [reqType, respType];
|
|
64
|
+
}
|
|
65
|
+
/** Get a previously synthesized type by wire tag. */
|
|
66
|
+
get(wireTag) {
|
|
67
|
+
return this.types.get(wireTag);
|
|
68
|
+
}
|
|
69
|
+
/** Get a type by wire tag (alias for get()). */
|
|
70
|
+
getType(wireTag) {
|
|
71
|
+
return this.types.get(wireTag);
|
|
72
|
+
}
|
|
73
|
+
/** Return all synthesized types. */
|
|
74
|
+
getAllTypes() {
|
|
75
|
+
return [...this.types.values()];
|
|
76
|
+
}
|
|
77
|
+
/** Number of registered types. */
|
|
78
|
+
get typeCount() {
|
|
79
|
+
return this.types.size;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Register types from a manifest's method descriptors.
|
|
83
|
+
* Synthesizes request and response types for all methods.
|
|
84
|
+
*/
|
|
85
|
+
registerFromManifest(manifest) {
|
|
86
|
+
for (const method of manifest.methods) {
|
|
87
|
+
this.synthesizeForMethod(method);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Build a request object for a method using default values.
|
|
92
|
+
* Returns an instance of the synthesized request type.
|
|
93
|
+
*/
|
|
94
|
+
buildRequest(method, overrides) {
|
|
95
|
+
if (!method.requestWireTag)
|
|
96
|
+
return overrides ?? {};
|
|
97
|
+
let type = this.types.get(method.requestWireTag);
|
|
98
|
+
if (!type && method.fields) {
|
|
99
|
+
type = createDynamicType(method.requestWireTag, method.fields);
|
|
100
|
+
this.types.set(method.requestWireTag, type);
|
|
101
|
+
}
|
|
102
|
+
if (!type)
|
|
103
|
+
return overrides ?? {};
|
|
104
|
+
const instance = new type(overrides);
|
|
105
|
+
return instance;
|
|
106
|
+
}
|
|
107
|
+
/** All synthesized types. */
|
|
108
|
+
allTypes() {
|
|
109
|
+
return this.types.entries();
|
|
110
|
+
}
|
|
111
|
+
getOrCreate(wireTag, fields) {
|
|
112
|
+
let type = this.types.get(wireTag);
|
|
113
|
+
if (!type) {
|
|
114
|
+
type = createDynamicType(wireTag, fields);
|
|
115
|
+
this.types.set(wireTag, type);
|
|
116
|
+
}
|
|
117
|
+
return type;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/** Get default value for a field type string. */
|
|
121
|
+
function defaultForType(typeStr) {
|
|
122
|
+
switch (typeStr) {
|
|
123
|
+
case 'str':
|
|
124
|
+
case 'string':
|
|
125
|
+
return '';
|
|
126
|
+
case 'int':
|
|
127
|
+
case 'int32':
|
|
128
|
+
case 'int64':
|
|
129
|
+
case 'float':
|
|
130
|
+
case 'float32':
|
|
131
|
+
case 'float64':
|
|
132
|
+
case 'number':
|
|
133
|
+
return 0;
|
|
134
|
+
case 'bool':
|
|
135
|
+
case 'boolean':
|
|
136
|
+
return false;
|
|
137
|
+
case 'bytes':
|
|
138
|
+
return new Uint8Array(0);
|
|
139
|
+
default:
|
|
140
|
+
if (typeStr.startsWith('list[') || typeStr.startsWith('List['))
|
|
141
|
+
return [];
|
|
142
|
+
if (typeStr.startsWith('dict[') || typeStr.startsWith('Dict[') || typeStr.startsWith('Map['))
|
|
143
|
+
return {};
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=dynamic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic.js","sourceRoot":"","sources":["../src/dynamic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wire-level frame read/write.
|
|
3
|
+
*
|
|
4
|
+
* Spec reference: S6.1 (stream framing)
|
|
5
|
+
*
|
|
6
|
+
* Frame layout (on a QUIC stream):
|
|
7
|
+
*
|
|
8
|
+
* +----------+-------+----------+
|
|
9
|
+
* | Length | Flags | Payload |
|
|
10
|
+
* | 4 bytes |1 byte | variable |
|
|
11
|
+
* | LE u32 | | |
|
|
12
|
+
* +----------+-------+----------+
|
|
13
|
+
*
|
|
14
|
+
* - Length is the total size of Flags + Payload (i.e. payload.length + 1).
|
|
15
|
+
* Maximum 16 MiB per frame. A Length of 0 is invalid.
|
|
16
|
+
* - Flags is a 1-byte bitfield (see constants below).
|
|
17
|
+
* - Payload is the serialized bytes.
|
|
18
|
+
*/
|
|
19
|
+
/** Minimal async send-stream interface (matches IrohSendStream from NAPI). */
|
|
20
|
+
export interface SendStream {
|
|
21
|
+
writeAll(data: Uint8Array): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
/** Minimal async recv-stream interface (matches IrohRecvStream from NAPI). */
|
|
24
|
+
export interface RecvStream {
|
|
25
|
+
readExact(n: number): Promise<Uint8Array>;
|
|
26
|
+
}
|
|
27
|
+
/** Bit 0 -- payload is zstd-compressed. */
|
|
28
|
+
export declare const COMPRESSED = 1;
|
|
29
|
+
/** Bit 1 -- trailing status frame. */
|
|
30
|
+
export declare const TRAILER = 2;
|
|
31
|
+
/** Bit 2 -- stream header (first frame). */
|
|
32
|
+
export declare const HEADER = 4;
|
|
33
|
+
/** Bit 3 -- Fory row schema frame. */
|
|
34
|
+
export declare const ROW_SCHEMA = 8;
|
|
35
|
+
/** Bit 4 -- per-call header in a session stream. */
|
|
36
|
+
export declare const CALL = 16;
|
|
37
|
+
/** Bit 5 -- cancel current call in a session stream. */
|
|
38
|
+
export declare const CANCEL = 32;
|
|
39
|
+
/** Raised when a framing violation is detected. */
|
|
40
|
+
export declare class FramingError extends Error {
|
|
41
|
+
constructor(message: string);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Write a single frame to a send stream.
|
|
45
|
+
*
|
|
46
|
+
* @param stream - An async send stream with a writeAll method.
|
|
47
|
+
* @param payload - The serialized payload bytes.
|
|
48
|
+
* @param flags - The 1-byte flag bitfield (default 0).
|
|
49
|
+
* @throws FramingError if the frame exceeds MAX_FRAME_SIZE or has an invalid empty payload.
|
|
50
|
+
*/
|
|
51
|
+
export declare function writeFrame(stream: SendStream, payload: Uint8Array, flags?: number): Promise<void>;
|
|
52
|
+
/** Result of reading a frame: [payload, flags]. */
|
|
53
|
+
export type FrameResult = [payload: Uint8Array, flags: number];
|
|
54
|
+
/**
|
|
55
|
+
* Read a single frame from a receive stream.
|
|
56
|
+
*
|
|
57
|
+
* @param stream - The QUIC receive stream.
|
|
58
|
+
* @param timeoutS - Optional read timeout in seconds. Defaults to DEFAULT_FRAME_READ_TIMEOUT_S.
|
|
59
|
+
* Pass 0 to disable.
|
|
60
|
+
* @returns A [payload, flags] tuple, or null if the stream has ended cleanly.
|
|
61
|
+
* @throws FramingError on wire-format violations (zero length, oversized frame).
|
|
62
|
+
*/
|
|
63
|
+
export declare function readFrame(stream: RecvStream, timeoutS?: number): Promise<FrameResult | null>;
|
|
64
|
+
/**
|
|
65
|
+
* Encode a frame to raw bytes (for testing and conformance vectors).
|
|
66
|
+
* Does not write to a stream -- returns the complete wire bytes.
|
|
67
|
+
*/
|
|
68
|
+
export declare function encodeFrame(payload: Uint8Array, flags?: number): Uint8Array;
|
|
69
|
+
/**
|
|
70
|
+
* Decode raw wire bytes into [payload, flags] (for testing and conformance vectors).
|
|
71
|
+
* Does not read from a stream -- parses the complete wire bytes.
|
|
72
|
+
*/
|
|
73
|
+
export declare function decodeFrame(wire: Uint8Array): FrameResult;
|
|
74
|
+
//# sourceMappingURL=framing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framing.d.ts","sourceRoot":"","sources":["../src/framing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAUH,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C;AAED,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAC3C;AAID,2CAA2C;AAC3C,eAAO,MAAM,UAAU,IAAO,CAAC;AAC/B,sCAAsC;AACtC,eAAO,MAAM,OAAO,IAAO,CAAC;AAC5B,4CAA4C;AAC5C,eAAO,MAAM,MAAM,IAAO,CAAC;AAC3B,sCAAsC;AACtC,eAAO,MAAM,UAAU,IAAO,CAAC;AAC/B,oDAAoD;AACpD,eAAO,MAAM,IAAI,KAAO,CAAC;AACzB,wDAAwD;AACxD,eAAO,MAAM,MAAM,KAAO,CAAC;AAI3B,mDAAmD;AACnD,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;CAI5B;AASD;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,UAAU,EACnB,KAAK,SAAI,GACR,OAAO,CAAC,IAAI,CAAC,CAqBf;AAID,mDAAmD;AACnD,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAE/D;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,UAAU,EAClB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA8D7B;AAID;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,SAAI,GAAG,UAAU,CAQtE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,CAoBzD"}
|