@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,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry data models.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors bindings/python/aster/registry/models.py.
|
|
5
|
+
*/
|
|
6
|
+
/** Endpoint health status. */
|
|
7
|
+
export const HealthStatus = {
|
|
8
|
+
STARTING: 'starting',
|
|
9
|
+
READY: 'ready',
|
|
10
|
+
DEGRADED: 'degraded',
|
|
11
|
+
DRAINING: 'draining',
|
|
12
|
+
};
|
|
13
|
+
/** Validate that a string is a valid HealthStatus value. */
|
|
14
|
+
export function validate(value) {
|
|
15
|
+
return Object.values(HealthStatus).includes(value);
|
|
16
|
+
}
|
|
17
|
+
/** Gossip event types. */
|
|
18
|
+
export const GossipEventType = {
|
|
19
|
+
CONTRACT_PUBLISHED: 0,
|
|
20
|
+
CHANNEL_UPDATED: 1,
|
|
21
|
+
ENDPOINT_LEASE_UPSERTED: 2,
|
|
22
|
+
ENDPOINT_DOWN: 3,
|
|
23
|
+
ACL_CHANGED: 4,
|
|
24
|
+
COMPATIBILITY_PUBLISHED: 5,
|
|
25
|
+
};
|
|
26
|
+
/** Check if a lease is fresh (not expired). */
|
|
27
|
+
export function isLeaseFresh(lease, leaseDurationS = 45) {
|
|
28
|
+
return lease.leaseExpiresEpochMs > Date.now() ||
|
|
29
|
+
lease.updatedAtEpochMs + leaseDurationS * 1000 > Date.now();
|
|
30
|
+
}
|
|
31
|
+
/** Check if a lease is routable (ready + fresh). */
|
|
32
|
+
export function isLeaseRoutable(lease) {
|
|
33
|
+
return lease.healthStatus === HealthStatus.READY && isLeaseFresh(lease);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/registry/models.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,8BAA8B;AAC9B,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,QAAQ,EAAE,UAAU;IACpB,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,UAAU;CACZ,CAAC;AAIX,4DAA4D;AAC5D,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,OAAO,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,KAAqB,CAAC,CAAC;AACrE,CAAC;AAED,0BAA0B;AAC1B,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,kBAAkB,EAAE,CAAC;IACrB,eAAe,EAAE,CAAC;IAClB,uBAAuB,EAAE,CAAC;IAC1B,aAAa,EAAE,CAAC;IAChB,WAAW,EAAE,CAAC;IACd,uBAAuB,EAAE,CAAC;CAClB,CAAC;AA8CX,+CAA+C;AAC/C,MAAM,UAAU,YAAY,CAAC,KAAoB,EAAE,cAAc,GAAG,EAAE;IACpE,OAAO,KAAK,CAAC,mBAAmB,GAAG,IAAI,CAAC,GAAG,EAAE;QAC3C,KAAK,CAAC,gBAAgB,GAAG,cAAc,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAChE,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,eAAe,CAAC,KAAoB;IAClD,OAAO,KAAK,CAAC,YAAY,KAAK,YAAY,CAAC,KAAK,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;AAC1E,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry publisher — publishes contracts and manages endpoint leases.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors bindings/python/aster/registry/publisher.py.
|
|
5
|
+
*/
|
|
6
|
+
import type { ArtifactRef, EndpointLease, HealthStatus } from './models.js';
|
|
7
|
+
/** Doc handle interface (matches NAPI DocHandle). */
|
|
8
|
+
interface PublisherDoc {
|
|
9
|
+
setBytes(authorHex: string, key: string, value: Uint8Array): Promise<string>;
|
|
10
|
+
}
|
|
11
|
+
/** Gossip broadcaster interface. */
|
|
12
|
+
interface GossipBroadcaster {
|
|
13
|
+
broadcast(data: Uint8Array): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
/** Options for the registry publisher. */
|
|
16
|
+
export interface RegistryPublisherOptions {
|
|
17
|
+
doc: PublisherDoc;
|
|
18
|
+
authorId: string;
|
|
19
|
+
endpointId: string;
|
|
20
|
+
gossip?: GossipBroadcaster;
|
|
21
|
+
logger?: {
|
|
22
|
+
info(...args: any[]): void;
|
|
23
|
+
error(...args: any[]): void;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Registry publisher — publishes contracts and manages endpoint leases.
|
|
28
|
+
*/
|
|
29
|
+
export declare class RegistryPublisher {
|
|
30
|
+
private doc;
|
|
31
|
+
private authorId;
|
|
32
|
+
private endpointId;
|
|
33
|
+
private gossip?;
|
|
34
|
+
private logger;
|
|
35
|
+
private leases;
|
|
36
|
+
private refreshTimer?;
|
|
37
|
+
constructor(opts: RegistryPublisherOptions);
|
|
38
|
+
/**
|
|
39
|
+
* Publish a contract artifact to the registry.
|
|
40
|
+
*/
|
|
41
|
+
publishContract(artifact: ArtifactRef, serviceName: string, version: number): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Register an endpoint lease for a service.
|
|
44
|
+
*/
|
|
45
|
+
registerEndpoint(serviceName: string, version: number, contractId: string, opts?: {
|
|
46
|
+
alpn?: string;
|
|
47
|
+
serializationModes?: string[];
|
|
48
|
+
leaseDurationMs?: number;
|
|
49
|
+
refreshIntervalMs?: number;
|
|
50
|
+
}): Promise<EndpointLease>;
|
|
51
|
+
/**
|
|
52
|
+
* Set health status for a registered endpoint.
|
|
53
|
+
*/
|
|
54
|
+
setHealth(serviceName: string, contractId: string, status: HealthStatus): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Withdraw an endpoint (graceful shutdown).
|
|
57
|
+
*/
|
|
58
|
+
withdraw(serviceName: string, contractId: string, graceMs?: number): Promise<void>;
|
|
59
|
+
/** Stop all refresh timers. */
|
|
60
|
+
close(): void;
|
|
61
|
+
private writeLease;
|
|
62
|
+
private refreshLeases;
|
|
63
|
+
}
|
|
64
|
+
export {};
|
|
65
|
+
//# sourceMappingURL=publisher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publisher.d.ts","sourceRoot":"","sources":["../../src/registry/publisher.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI5E,qDAAqD;AACrD,UAAU,YAAY;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9E;AAED,oCAAoC;AACpC,UAAU,iBAAiB;IACzB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C;AAED,0CAA0C;AAC1C,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,YAAY,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAAC,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;KAAE,CAAC;CACtE;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,GAAG,CAAe;IAC1B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAC,CAAoB;IACnC,OAAO,CAAC,MAAM,CAA8D;IAC5E,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,YAAY,CAAC,CAAiC;gBAE1C,IAAI,EAAE,wBAAwB;IAQ1C;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BjG;;OAEG;IACG,gBAAgB,CACpB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE;QACL,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,GACA,OAAO,CAAC,aAAa,CAAC;IAkCzB;;OAEG;IACG,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAa7F;;OAEG;IACG,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BtF,+BAA+B;IAC/B,KAAK,IAAI,IAAI;YASC,UAAU;YAmBV,aAAa;CAS5B"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry publisher — publishes contracts and manages endpoint leases.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors bindings/python/aster/registry/publisher.py.
|
|
5
|
+
*/
|
|
6
|
+
import { HealthStatus as HS } from './models.js';
|
|
7
|
+
import { contractKey, versionKey, leaseKey } from './keys.js';
|
|
8
|
+
/**
|
|
9
|
+
* Registry publisher — publishes contracts and manages endpoint leases.
|
|
10
|
+
*/
|
|
11
|
+
export class RegistryPublisher {
|
|
12
|
+
doc;
|
|
13
|
+
authorId;
|
|
14
|
+
endpointId;
|
|
15
|
+
gossip;
|
|
16
|
+
logger;
|
|
17
|
+
leases = new Map();
|
|
18
|
+
refreshTimer;
|
|
19
|
+
constructor(opts) {
|
|
20
|
+
this.doc = opts.doc;
|
|
21
|
+
this.authorId = opts.authorId;
|
|
22
|
+
this.endpointId = opts.endpointId;
|
|
23
|
+
this.gossip = opts.gossip;
|
|
24
|
+
this.logger = opts.logger ?? console;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Publish a contract artifact to the registry.
|
|
28
|
+
*/
|
|
29
|
+
async publishContract(artifact, serviceName, version) {
|
|
30
|
+
const encoder = new TextEncoder();
|
|
31
|
+
// Write artifact to contracts/{contract_id}
|
|
32
|
+
const artifactJson = JSON.stringify(artifact);
|
|
33
|
+
await this.doc.setBytes(this.authorId, contractKey(artifact.contractId), encoder.encode(artifactJson));
|
|
34
|
+
// Write version pointer
|
|
35
|
+
await this.doc.setBytes(this.authorId, versionKey(serviceName, version), encoder.encode(artifact.contractId));
|
|
36
|
+
this.logger.info('published contract', {
|
|
37
|
+
service: serviceName,
|
|
38
|
+
version,
|
|
39
|
+
contractId: artifact.contractId.slice(0, 16),
|
|
40
|
+
});
|
|
41
|
+
// Broadcast gossip event
|
|
42
|
+
if (this.gossip) {
|
|
43
|
+
const event = {
|
|
44
|
+
type: 0, // CONTRACT_PUBLISHED
|
|
45
|
+
service: serviceName,
|
|
46
|
+
version,
|
|
47
|
+
contractId: artifact.contractId,
|
|
48
|
+
timestampMs: Date.now(),
|
|
49
|
+
};
|
|
50
|
+
await this.gossip.broadcast(encoder.encode(JSON.stringify(event)));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Register an endpoint lease for a service.
|
|
55
|
+
*/
|
|
56
|
+
async registerEndpoint(serviceName, version, contractId, opts) {
|
|
57
|
+
const now = Date.now();
|
|
58
|
+
const leaseDurationMs = opts?.leaseDurationMs ?? 45_000;
|
|
59
|
+
const lease = {
|
|
60
|
+
endpointId: this.endpointId,
|
|
61
|
+
contractId,
|
|
62
|
+
service: serviceName,
|
|
63
|
+
version,
|
|
64
|
+
leaseExpiresEpochMs: now + leaseDurationMs,
|
|
65
|
+
leaseSeq: 0,
|
|
66
|
+
alpn: opts?.alpn ?? 'aster/1',
|
|
67
|
+
serializationModes: opts?.serializationModes ?? ['xlang'],
|
|
68
|
+
featureFlags: [],
|
|
69
|
+
directAddrs: [],
|
|
70
|
+
healthStatus: HS.STARTING,
|
|
71
|
+
tags: [],
|
|
72
|
+
updatedAtEpochMs: now,
|
|
73
|
+
};
|
|
74
|
+
await this.writeLease(lease);
|
|
75
|
+
this.leases.set(`${serviceName}/${contractId}`, lease);
|
|
76
|
+
// Start refresh timer
|
|
77
|
+
const refreshMs = opts?.refreshIntervalMs ?? leaseDurationMs * 0.8;
|
|
78
|
+
this.refreshTimer = setInterval(() => {
|
|
79
|
+
this.refreshLeases().catch(e => {
|
|
80
|
+
this.logger.error('lease refresh error', { error: String(e) });
|
|
81
|
+
});
|
|
82
|
+
}, refreshMs);
|
|
83
|
+
return lease;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Set health status for a registered endpoint.
|
|
87
|
+
*/
|
|
88
|
+
async setHealth(serviceName, contractId, status) {
|
|
89
|
+
const key = `${serviceName}/${contractId}`;
|
|
90
|
+
const lease = this.leases.get(key);
|
|
91
|
+
if (!lease)
|
|
92
|
+
throw new Error(`no lease for ${key}`);
|
|
93
|
+
lease.healthStatus = status;
|
|
94
|
+
lease.leaseSeq++;
|
|
95
|
+
lease.updatedAtEpochMs = Date.now();
|
|
96
|
+
lease.leaseExpiresEpochMs = Date.now() + 45_000;
|
|
97
|
+
await this.writeLease(lease);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Withdraw an endpoint (graceful shutdown).
|
|
101
|
+
*/
|
|
102
|
+
async withdraw(serviceName, contractId, graceMs = 5000) {
|
|
103
|
+
const key = `${serviceName}/${contractId}`;
|
|
104
|
+
const lease = this.leases.get(key);
|
|
105
|
+
if (!lease)
|
|
106
|
+
return;
|
|
107
|
+
// Set draining
|
|
108
|
+
await this.setHealth(serviceName, contractId, HS.DRAINING);
|
|
109
|
+
// Grace period
|
|
110
|
+
await new Promise(r => setTimeout(r, graceMs));
|
|
111
|
+
// Write tombstone
|
|
112
|
+
const encoder = new TextEncoder();
|
|
113
|
+
const docKey = leaseKey(serviceName, contractId, this.endpointId);
|
|
114
|
+
await this.doc.setBytes(this.authorId, docKey, encoder.encode('null'));
|
|
115
|
+
// Broadcast endpoint down
|
|
116
|
+
if (this.gossip) {
|
|
117
|
+
const event = {
|
|
118
|
+
type: 3, // ENDPOINT_DOWN
|
|
119
|
+
service: serviceName,
|
|
120
|
+
endpointId: this.endpointId,
|
|
121
|
+
timestampMs: Date.now(),
|
|
122
|
+
};
|
|
123
|
+
await this.gossip.broadcast(encoder.encode(JSON.stringify(event)));
|
|
124
|
+
}
|
|
125
|
+
this.leases.delete(key);
|
|
126
|
+
this.logger.info('withdrew endpoint', { service: serviceName });
|
|
127
|
+
}
|
|
128
|
+
/** Stop all refresh timers. */
|
|
129
|
+
close() {
|
|
130
|
+
if (this.refreshTimer) {
|
|
131
|
+
clearInterval(this.refreshTimer);
|
|
132
|
+
this.refreshTimer = undefined;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// -- Helpers --
|
|
136
|
+
async writeLease(lease) {
|
|
137
|
+
const encoder = new TextEncoder();
|
|
138
|
+
const key = leaseKey(lease.service, lease.contractId, lease.endpointId);
|
|
139
|
+
await this.doc.setBytes(this.authorId, key, encoder.encode(JSON.stringify(lease)));
|
|
140
|
+
// Broadcast gossip event
|
|
141
|
+
if (this.gossip) {
|
|
142
|
+
const event = {
|
|
143
|
+
type: 2, // ENDPOINT_LEASE_UPSERTED
|
|
144
|
+
service: lease.service,
|
|
145
|
+
version: lease.leaseSeq,
|
|
146
|
+
contractId: lease.contractId,
|
|
147
|
+
endpointId: lease.endpointId,
|
|
148
|
+
timestampMs: Date.now(),
|
|
149
|
+
};
|
|
150
|
+
await this.gossip.broadcast(encoder.encode(JSON.stringify(event)));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
async refreshLeases() {
|
|
154
|
+
for (const lease of this.leases.values()) {
|
|
155
|
+
if (lease.healthStatus === HS.DRAINING)
|
|
156
|
+
continue;
|
|
157
|
+
lease.leaseSeq++;
|
|
158
|
+
lease.leaseExpiresEpochMs = Date.now() + 45_000;
|
|
159
|
+
lease.updatedAtEpochMs = Date.now();
|
|
160
|
+
await this.writeLease(lease);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=publisher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publisher.js","sourceRoot":"","sources":["../../src/registry/publisher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High-level AsterServer and AsterClient wrappers.
|
|
3
|
+
*
|
|
4
|
+
* These provide one-liner setup for the common case, hiding the
|
|
5
|
+
* details of endpoint creation, admission, and transport wiring.
|
|
6
|
+
*/
|
|
7
|
+
import { ServiceRegistry } from './service.js';
|
|
8
|
+
import { LocalTransport } from './transport/local.js';
|
|
9
|
+
import { type AsterClient as ClientProxy } from './client.js';
|
|
10
|
+
import type { AsterTransport } from './transport/base.js';
|
|
11
|
+
import type { AsterConfig } from './config.js';
|
|
12
|
+
import { type AsterLogger } from './logging.js';
|
|
13
|
+
import { type ExponentialBackoff } from './types.js';
|
|
14
|
+
import { type ServiceSummary } from './trust/consumer.js';
|
|
15
|
+
/**
|
|
16
|
+
* Raised when a consumer is refused by the server's admission check.
|
|
17
|
+
*
|
|
18
|
+
* The server never reveals *why* admission failed (no oracle leak), so this
|
|
19
|
+
* error enumerates the common causes as a hint to the user rather than a
|
|
20
|
+
* precise diagnosis. Its `message` is a multi-line actionable hint suitable
|
|
21
|
+
* for direct CLI output.
|
|
22
|
+
*/
|
|
23
|
+
export declare class AdmissionDeniedError extends Error {
|
|
24
|
+
readonly hadCredential: boolean;
|
|
25
|
+
readonly credentialFile: string | null;
|
|
26
|
+
readonly ourEndpointId: string;
|
|
27
|
+
readonly serverAddress: string;
|
|
28
|
+
constructor(opts: {
|
|
29
|
+
hadCredential: boolean;
|
|
30
|
+
credentialFile: string | null;
|
|
31
|
+
ourEndpointId: string;
|
|
32
|
+
serverAddress: string;
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/** Options for AsterServer. */
|
|
36
|
+
export interface AsterServerOptions {
|
|
37
|
+
services: object[];
|
|
38
|
+
config?: Partial<AsterConfig>;
|
|
39
|
+
/** Path to .aster-identity file. Overrides config.identityFile. */
|
|
40
|
+
identity?: string;
|
|
41
|
+
/** Peer name for identity file lookup. */
|
|
42
|
+
peer?: string;
|
|
43
|
+
/** Allow all consumers without credentials (dev mode). Default: true. */
|
|
44
|
+
allowAllConsumers?: boolean;
|
|
45
|
+
interceptors?: unknown[];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* High-level Aster RPC server.
|
|
49
|
+
*
|
|
50
|
+
* Creates an IrohNode, serves RPC over QUIC, handles consumer admission,
|
|
51
|
+
* and prints a startup banner.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```ts
|
|
55
|
+
* const server = new AsterServer({
|
|
56
|
+
* services: [new MissionControl()],
|
|
57
|
+
* });
|
|
58
|
+
* await server.start();
|
|
59
|
+
* console.log(server.address);
|
|
60
|
+
* await server.serve();
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export declare class AsterServer {
|
|
64
|
+
readonly registry: ServiceRegistry;
|
|
65
|
+
readonly config: AsterConfig;
|
|
66
|
+
readonly logger: AsterLogger;
|
|
67
|
+
private health;
|
|
68
|
+
private _node;
|
|
69
|
+
private _rpcServer;
|
|
70
|
+
private _hook;
|
|
71
|
+
private _peerStore;
|
|
72
|
+
private _delegationPolicies;
|
|
73
|
+
private _running;
|
|
74
|
+
private _closed;
|
|
75
|
+
private _allowAllConsumers;
|
|
76
|
+
private _userInterceptors;
|
|
77
|
+
private _signalHandlers;
|
|
78
|
+
private _serviceSummaries;
|
|
79
|
+
private _registryNamespace;
|
|
80
|
+
private _servePromise;
|
|
81
|
+
private _admissionAbort;
|
|
82
|
+
constructor(opts: AsterServerOptions);
|
|
83
|
+
/**
|
|
84
|
+
* Create the IrohNode and prepare for serving. Idempotent.
|
|
85
|
+
*/
|
|
86
|
+
start(): Promise<void>;
|
|
87
|
+
/**
|
|
88
|
+
* Create a registry doc and publish each service's contract.
|
|
89
|
+
*
|
|
90
|
+
* After publication, `_registryNamespace` is set to the 64-char hex
|
|
91
|
+
* namespace ID so the admission response can return it.
|
|
92
|
+
*
|
|
93
|
+
* Non-fatal: if publication fails, the server still works — consumers
|
|
94
|
+
* just won't get rich contract metadata.
|
|
95
|
+
*/
|
|
96
|
+
private _publishContracts;
|
|
97
|
+
/**
|
|
98
|
+
* Build a ContractManifest from a ServiceInfo with field-level detail.
|
|
99
|
+
*/
|
|
100
|
+
private _buildManifest;
|
|
101
|
+
/**
|
|
102
|
+
* Start accepting connections. Blocks until close() is called.
|
|
103
|
+
*/
|
|
104
|
+
serve(): Promise<void>;
|
|
105
|
+
/**
|
|
106
|
+
* Run the Gate 0 hook loop.
|
|
107
|
+
*
|
|
108
|
+
* Polls after_handshake events from the native receiver and dispatches
|
|
109
|
+
* each one through MeshEndpointHook.shouldAllow(). After-handshake fires
|
|
110
|
+
* for **all** connections (inbound and outbound) right after TLS, which
|
|
111
|
+
* is exactly when we want to enforce the admitted-set check.
|
|
112
|
+
*
|
|
113
|
+
* NOTE: We do NOT use before_connect — that fires only for *outgoing*
|
|
114
|
+
* connections in iroh, so it would miss incoming RPC connections to
|
|
115
|
+
* the server (which is what we need to gate).
|
|
116
|
+
*
|
|
117
|
+
* The native binding uses an event-id + respond-by-id API; this loop
|
|
118
|
+
* polls events directly and responds via respondAfterHandshake().
|
|
119
|
+
*/
|
|
120
|
+
private _runGate0;
|
|
121
|
+
/**
|
|
122
|
+
* Stop accepting connections and close the node.
|
|
123
|
+
*/
|
|
124
|
+
close(): Promise<void>;
|
|
125
|
+
/** The aster1... connection address for clients. */
|
|
126
|
+
get address(): string;
|
|
127
|
+
/** Hex endpoint ID of this server's node. */
|
|
128
|
+
get endpointId(): string;
|
|
129
|
+
/** Whether the server is running. */
|
|
130
|
+
get running(): boolean;
|
|
131
|
+
/** List of services hosted by this server. */
|
|
132
|
+
get services(): ServiceSummary[];
|
|
133
|
+
/** Create a local in-process transport for testing. */
|
|
134
|
+
localTransport(): LocalTransport;
|
|
135
|
+
/**
|
|
136
|
+
* Single accept loop with ALPN-based routing.
|
|
137
|
+
*
|
|
138
|
+
* All aster ALPNs (RPC, consumer admission, delegated admission) are
|
|
139
|
+
* multiplexed through one channel. This loop reads the ALPN tag and
|
|
140
|
+
* dispatches to the correct handler — matching Python's `_accept_loop`.
|
|
141
|
+
*/
|
|
142
|
+
private _acceptLoop;
|
|
143
|
+
private _handleAdmission;
|
|
144
|
+
private _handleProducerAdmission;
|
|
145
|
+
private _resolveRootPubkeyHex;
|
|
146
|
+
private _handleDelegatedAdmission;
|
|
147
|
+
private _installSignalHandlers;
|
|
148
|
+
private _printBanner;
|
|
149
|
+
}
|
|
150
|
+
/** Options for AsterClient. */
|
|
151
|
+
export interface AsterClientOptions {
|
|
152
|
+
/** Connection address (aster1... ticket, base64 NodeAddr, or hex EndpointId). */
|
|
153
|
+
address?: string;
|
|
154
|
+
/** @deprecated Use `address` instead. */
|
|
155
|
+
endpointAddr?: string;
|
|
156
|
+
transport?: AsterTransport;
|
|
157
|
+
config?: Partial<AsterConfig>;
|
|
158
|
+
/** Path to .aster-identity file. Overrides config.identityFile. */
|
|
159
|
+
identity?: string;
|
|
160
|
+
/** Peer name for identity file lookup. */
|
|
161
|
+
peer?: string;
|
|
162
|
+
/** Path to a pre-signed enrollment credential file (.cred JSON or .aster-identity TOML). */
|
|
163
|
+
enrollmentCredentialFile?: string;
|
|
164
|
+
/** Retry configuration for reconnection. */
|
|
165
|
+
retryBackoff?: ExponentialBackoff;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* High-level Aster RPC client.
|
|
169
|
+
*
|
|
170
|
+
* Wraps connection setup, admission, and client stub creation.
|
|
171
|
+
* Supports reconnection with exponential backoff.
|
|
172
|
+
*/
|
|
173
|
+
export declare class AsterClientWrapper {
|
|
174
|
+
private transport;
|
|
175
|
+
readonly config: AsterConfig;
|
|
176
|
+
private backoff;
|
|
177
|
+
private _connected;
|
|
178
|
+
private _gossipTopic;
|
|
179
|
+
private _address;
|
|
180
|
+
private _node;
|
|
181
|
+
private _services;
|
|
182
|
+
private _registryNamespace;
|
|
183
|
+
private _inlineCredential;
|
|
184
|
+
private _enrollmentCredentialFile;
|
|
185
|
+
private _identitySecretKey;
|
|
186
|
+
constructor(opts: AsterClientOptions);
|
|
187
|
+
/** Whether the client is connected. */
|
|
188
|
+
get connected(): boolean;
|
|
189
|
+
/** Services discovered during admission. */
|
|
190
|
+
get services(): ServiceSummary[];
|
|
191
|
+
/** Registry namespace ID for service discovery (set after admission). */
|
|
192
|
+
get registryNamespace(): string | undefined;
|
|
193
|
+
/** Hex-encoded 32-byte gossip topic ID for the producer mesh. */
|
|
194
|
+
get gossipTopic(): string;
|
|
195
|
+
/**
|
|
196
|
+
* Connect to the server via consumer admission, then open an RPC transport.
|
|
197
|
+
*
|
|
198
|
+
* If the client was created with a transport, this is a no-op.
|
|
199
|
+
* If created with an address, it performs the full admission handshake.
|
|
200
|
+
*/
|
|
201
|
+
connect(): Promise<void>;
|
|
202
|
+
/** Create a typed client proxy for a service class. */
|
|
203
|
+
client<T extends new (...args: any[]) => any>(serviceClass: T): Promise<ClientProxy<InstanceType<T>>>;
|
|
204
|
+
/** Create a typed client proxy for a service class. */
|
|
205
|
+
service<T extends new (...args: any[]) => any>(serviceClass: T): ClientProxy<InstanceType<T>>;
|
|
206
|
+
/**
|
|
207
|
+
* Create a dynamic proxy client for a service.
|
|
208
|
+
*
|
|
209
|
+
* @example
|
|
210
|
+
* ```ts
|
|
211
|
+
* const mc = client.proxy("MissionControl");
|
|
212
|
+
* const result = await mc.getStatus({ agentId: "edge-1" });
|
|
213
|
+
* console.log(result.status);
|
|
214
|
+
* ```
|
|
215
|
+
*/
|
|
216
|
+
proxy(serviceName: string): ProxyClient;
|
|
217
|
+
/** Reconnect with exponential backoff. */
|
|
218
|
+
reconnect(connectFn: () => Promise<AsterTransport>, maxAttempts?: number): Promise<void>;
|
|
219
|
+
/** Close the client and underlying transport. */
|
|
220
|
+
close(): Promise<void>;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Dynamic proxy client -- invokes RPC methods without local type definitions.
|
|
224
|
+
*
|
|
225
|
+
* Created via `AsterClientWrapper.proxy("ServiceName")`. Supports all four
|
|
226
|
+
* RPC patterns:
|
|
227
|
+
*
|
|
228
|
+
* ```ts
|
|
229
|
+
* const mc = client.proxy("MissionControl");
|
|
230
|
+
*
|
|
231
|
+
* // Unary
|
|
232
|
+
* const status = await mc.getStatus({ agent_id: "edge-7" });
|
|
233
|
+
*
|
|
234
|
+
* // Client streaming — pass an async iterable
|
|
235
|
+
* const result = await mc.ingestMetrics(asyncGenerator());
|
|
236
|
+
*
|
|
237
|
+
* // Server streaming — use .stream()
|
|
238
|
+
* for await (const entry of mc.tailLogs.stream({ level: "info" })) { ... }
|
|
239
|
+
*
|
|
240
|
+
* // Bidi streaming — use .bidi()
|
|
241
|
+
* const ch = mc.runCommand.bidi();
|
|
242
|
+
* await ch.open();
|
|
243
|
+
* await ch.send({ command: "ls" });
|
|
244
|
+
* for await (const r of ch) { ... }
|
|
245
|
+
* ```
|
|
246
|
+
*/
|
|
247
|
+
export declare class ProxyClient {
|
|
248
|
+
private readonly serviceName;
|
|
249
|
+
private readonly transport;
|
|
250
|
+
constructor(serviceName: string, transport: AsterTransport);
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Lazy bidi-stream wrapper used by ProxyClient. Opens the underlying
|
|
254
|
+
* transport channel on first .open() / .send() / iteration.
|
|
255
|
+
*/
|
|
256
|
+
export declare class ProxyBidiChannel {
|
|
257
|
+
private readonly serviceName;
|
|
258
|
+
private readonly methodName;
|
|
259
|
+
private readonly transport;
|
|
260
|
+
private _channel;
|
|
261
|
+
constructor(serviceName: string, methodName: string, transport: AsterTransport);
|
|
262
|
+
open(): Promise<void>;
|
|
263
|
+
send(payload: unknown): Promise<void>;
|
|
264
|
+
close(): Promise<void>;
|
|
265
|
+
[Symbol.asyncIterator](): AsyncIterator<unknown>;
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|