@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,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry ACL — access control list for registry doc entries.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors bindings/python/aster/registry/acl.py.
|
|
5
|
+
*
|
|
6
|
+
* Starts in open mode (all authors trusted). When the first ACL
|
|
7
|
+
* entry is set, switches to restricted mode.
|
|
8
|
+
*/
|
|
9
|
+
import { aclKey } from './keys.js';
|
|
10
|
+
/**
|
|
11
|
+
* Registry ACL — filters doc entries by trusted authors.
|
|
12
|
+
*/
|
|
13
|
+
export class RegistryACL {
|
|
14
|
+
writers = new Set();
|
|
15
|
+
readers = new Set();
|
|
16
|
+
admins = new Set();
|
|
17
|
+
_restricted = false;
|
|
18
|
+
/** Whether ACL is in restricted mode. */
|
|
19
|
+
get restricted() {
|
|
20
|
+
return this._restricted;
|
|
21
|
+
}
|
|
22
|
+
/** Check if an author is a trusted writer. */
|
|
23
|
+
isTrustedWriter(authorId) {
|
|
24
|
+
if (!this._restricted)
|
|
25
|
+
return true;
|
|
26
|
+
return this.writers.has(authorId) || this.admins.has(authorId);
|
|
27
|
+
}
|
|
28
|
+
/** Check if an author is a trusted reader. */
|
|
29
|
+
isTrustedReader(authorId) {
|
|
30
|
+
if (!this._restricted)
|
|
31
|
+
return true;
|
|
32
|
+
return this.readers.has(authorId) || this.writers.has(authorId) || this.admins.has(authorId);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Filter entries to only those from trusted authors.
|
|
36
|
+
*
|
|
37
|
+
* @param entries - Array of [authorId, value] pairs
|
|
38
|
+
* @returns Filtered entries
|
|
39
|
+
*/
|
|
40
|
+
filterTrusted(entries) {
|
|
41
|
+
if (!this._restricted)
|
|
42
|
+
return entries;
|
|
43
|
+
return entries.filter(e => this.isTrustedWriter(e.authorId));
|
|
44
|
+
}
|
|
45
|
+
/** Add a writer and switch to restricted mode. */
|
|
46
|
+
async addWriter(authorId, doc, adminAuthorId) {
|
|
47
|
+
this.writers.add(authorId);
|
|
48
|
+
this._restricted = true;
|
|
49
|
+
if (doc && adminAuthorId) {
|
|
50
|
+
const encoder = new TextEncoder();
|
|
51
|
+
const data = JSON.stringify([...this.writers]);
|
|
52
|
+
await doc.setBytes(adminAuthorId, aclKey('writers'), encoder.encode(data));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/** Add a reader. */
|
|
56
|
+
addReader(authorId) {
|
|
57
|
+
this.readers.add(authorId);
|
|
58
|
+
this._restricted = true;
|
|
59
|
+
}
|
|
60
|
+
/** Add an admin. */
|
|
61
|
+
addAdmin(authorId) {
|
|
62
|
+
this.admins.add(authorId);
|
|
63
|
+
this._restricted = true;
|
|
64
|
+
}
|
|
65
|
+
/** Remove a writer from the ACL. */
|
|
66
|
+
removeWriter(authorId) {
|
|
67
|
+
this.writers.delete(authorId);
|
|
68
|
+
}
|
|
69
|
+
/** Get all writers. */
|
|
70
|
+
getWriters() {
|
|
71
|
+
return [...this.writers];
|
|
72
|
+
}
|
|
73
|
+
/** Get all readers. */
|
|
74
|
+
getReaders() {
|
|
75
|
+
return [...this.readers];
|
|
76
|
+
}
|
|
77
|
+
/** Get all admins. */
|
|
78
|
+
getAdmins() {
|
|
79
|
+
return [...this.admins];
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Reload ACL state from the registry doc.
|
|
83
|
+
*/
|
|
84
|
+
async reload(doc, authorId) {
|
|
85
|
+
const decoder = new TextDecoder();
|
|
86
|
+
const writersData = await doc.getExact(authorId, aclKey('writers'));
|
|
87
|
+
if (writersData) {
|
|
88
|
+
const list = JSON.parse(decoder.decode(writersData));
|
|
89
|
+
this.writers = new Set(list);
|
|
90
|
+
this._restricted = true;
|
|
91
|
+
}
|
|
92
|
+
const readersData = await doc.getExact(authorId, aclKey('readers'));
|
|
93
|
+
if (readersData) {
|
|
94
|
+
const list = JSON.parse(decoder.decode(readersData));
|
|
95
|
+
this.readers = new Set(list);
|
|
96
|
+
}
|
|
97
|
+
const adminsData = await doc.getExact(authorId, aclKey('admins'));
|
|
98
|
+
if (adminsData) {
|
|
99
|
+
const list = JSON.parse(decoder.decode(adminsData));
|
|
100
|
+
this.admins = new Set(list);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=acl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acl.js","sourceRoot":"","sources":["../../src/registry/acl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry client — service discovery via Iroh docs + blobs.
|
|
3
|
+
*
|
|
4
|
+
* Reads contract manifests from the registry document (joined via
|
|
5
|
+
* the registry namespace from admission), discovers available services,
|
|
6
|
+
* and downloads contract collections from the blob store.
|
|
7
|
+
*/
|
|
8
|
+
import type { ContractManifest } from '../contract/manifest.js';
|
|
9
|
+
/** Registry key encoding: "contracts/{service_name}/v{version}" */
|
|
10
|
+
export declare function registryKey(serviceName: string, version: number): string;
|
|
11
|
+
/** Artifact reference stored in the registry doc. */
|
|
12
|
+
export interface RegistryArtifactRef {
|
|
13
|
+
contractId: string;
|
|
14
|
+
collectionHash: string;
|
|
15
|
+
collectionTicket: string;
|
|
16
|
+
}
|
|
17
|
+
/** Endpoint lease for a service provider. */
|
|
18
|
+
export interface EndpointLease {
|
|
19
|
+
endpointId: string;
|
|
20
|
+
serviceName: string;
|
|
21
|
+
serviceVersion: number;
|
|
22
|
+
contractId: string;
|
|
23
|
+
lastSeen: number;
|
|
24
|
+
status: 'ready' | 'degraded' | 'draining';
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Registry client — discovers services from the registry document.
|
|
28
|
+
*
|
|
29
|
+
* Usage:
|
|
30
|
+
* 1. Join the registry doc using the namespace ID from admission
|
|
31
|
+
* 2. Read contract entries
|
|
32
|
+
* 3. Download manifests from blob collections
|
|
33
|
+
*/
|
|
34
|
+
export declare class RegistryClient {
|
|
35
|
+
private manifests;
|
|
36
|
+
private leases;
|
|
37
|
+
/** Register a discovered manifest. */
|
|
38
|
+
addManifest(manifest: ContractManifest): void;
|
|
39
|
+
/** Get a manifest by service name and version. */
|
|
40
|
+
getManifest(serviceName: string, version?: number): ContractManifest | undefined;
|
|
41
|
+
/** All known manifests. */
|
|
42
|
+
allManifests(): ContractManifest[];
|
|
43
|
+
/** Register an endpoint lease. */
|
|
44
|
+
addLease(lease: EndpointLease): void;
|
|
45
|
+
/** Find ready endpoints for a service. */
|
|
46
|
+
findEndpoints(serviceName: string, version?: number): EndpointLease[];
|
|
47
|
+
/** Number of known services. */
|
|
48
|
+
get size(): number;
|
|
49
|
+
/**
|
|
50
|
+
* Resolve all endpoints for a service, returning leases from all known versions.
|
|
51
|
+
*/
|
|
52
|
+
resolveAll(serviceName: string): EndpointLease[];
|
|
53
|
+
/**
|
|
54
|
+
* Fetch a contract manifest by service name and version.
|
|
55
|
+
* Returns undefined if not locally known.
|
|
56
|
+
*/
|
|
57
|
+
fetchContract(serviceName: string, version?: number): ContractManifest | undefined;
|
|
58
|
+
/**
|
|
59
|
+
* Register a change callback invoked whenever new manifests are added.
|
|
60
|
+
* Returns an unsubscribe function.
|
|
61
|
+
*/
|
|
62
|
+
onChange(callback: (manifest: ContractManifest) => void): () => void;
|
|
63
|
+
private _changeCallbacks;
|
|
64
|
+
/**
|
|
65
|
+
* Parse a manifest from a blob collection download.
|
|
66
|
+
* The collection contains "manifest.json" as its first entry.
|
|
67
|
+
*/
|
|
68
|
+
static parseManifestFromCollection(entries: [string, Uint8Array][]): ContractManifest;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/registry/client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAGhE,mEAAmE;AACnE,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAExE;AAED,qDAAqD;AACrD,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,6CAA6C;AAC7C,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,UAAU,CAAC;CAC3C;AAED;;;;;;;GAOG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAuC;IACxD,OAAO,CAAC,MAAM,CAAsC;IAEpD,sCAAsC;IACtC,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAK7C,kDAAkD;IAClD,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAWhF,2BAA2B;IAC3B,YAAY,IAAI,gBAAgB,EAAE;IAIlC,kCAAkC;IAClC,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAapC,0CAA0C;IAC1C,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;IAarE,gCAAgC;IAChC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,EAAE;IAIhD;;;OAGG;IACH,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAIlF;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,GAAG,MAAM,IAAI;IAOpE,OAAO,CAAC,gBAAgB,CAAgD;IAExE;;;OAGG;IACH,MAAM,CAAC,2BAA2B,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,GAAG,gBAAgB;CAQtF"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry client — service discovery via Iroh docs + blobs.
|
|
3
|
+
*
|
|
4
|
+
* Reads contract manifests from the registry document (joined via
|
|
5
|
+
* the registry namespace from admission), discovers available services,
|
|
6
|
+
* and downloads contract collections from the blob store.
|
|
7
|
+
*/
|
|
8
|
+
import { manifestFromJson } from '../contract/manifest.js';
|
|
9
|
+
/** Registry key encoding: "contracts/{service_name}/v{version}" */
|
|
10
|
+
export function registryKey(serviceName, version) {
|
|
11
|
+
return `contracts/${serviceName}/v${version}`;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Registry client — discovers services from the registry document.
|
|
15
|
+
*
|
|
16
|
+
* Usage:
|
|
17
|
+
* 1. Join the registry doc using the namespace ID from admission
|
|
18
|
+
* 2. Read contract entries
|
|
19
|
+
* 3. Download manifests from blob collections
|
|
20
|
+
*/
|
|
21
|
+
export class RegistryClient {
|
|
22
|
+
manifests = new Map();
|
|
23
|
+
leases = new Map();
|
|
24
|
+
/** Register a discovered manifest. */
|
|
25
|
+
addManifest(manifest) {
|
|
26
|
+
const key = `${manifest.service}/v${manifest.version}`;
|
|
27
|
+
this.manifests.set(key, manifest);
|
|
28
|
+
}
|
|
29
|
+
/** Get a manifest by service name and version. */
|
|
30
|
+
getManifest(serviceName, version) {
|
|
31
|
+
if (version !== undefined) {
|
|
32
|
+
return this.manifests.get(`${serviceName}/v${version}`);
|
|
33
|
+
}
|
|
34
|
+
// Find any version
|
|
35
|
+
for (const [key, manifest] of this.manifests) {
|
|
36
|
+
if (key.startsWith(`${serviceName}/`))
|
|
37
|
+
return manifest;
|
|
38
|
+
}
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
/** All known manifests. */
|
|
42
|
+
allManifests() {
|
|
43
|
+
return [...this.manifests.values()];
|
|
44
|
+
}
|
|
45
|
+
/** Register an endpoint lease. */
|
|
46
|
+
addLease(lease) {
|
|
47
|
+
const key = `${lease.serviceName}/v${lease.serviceVersion}`;
|
|
48
|
+
const leases = this.leases.get(key) ?? [];
|
|
49
|
+
// Update or add
|
|
50
|
+
const idx = leases.findIndex(l => l.endpointId === lease.endpointId);
|
|
51
|
+
if (idx >= 0) {
|
|
52
|
+
leases[idx] = lease;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
leases.push(lease);
|
|
56
|
+
}
|
|
57
|
+
this.leases.set(key, leases);
|
|
58
|
+
}
|
|
59
|
+
/** Find ready endpoints for a service. */
|
|
60
|
+
findEndpoints(serviceName, version) {
|
|
61
|
+
const results = [];
|
|
62
|
+
for (const [key, leases] of this.leases) {
|
|
63
|
+
if (key.startsWith(`${serviceName}/`)) {
|
|
64
|
+
if (version !== undefined && !key.endsWith(`/v${version}`))
|
|
65
|
+
continue;
|
|
66
|
+
for (const lease of leases) {
|
|
67
|
+
if (lease.status === 'ready')
|
|
68
|
+
results.push(lease);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return results;
|
|
73
|
+
}
|
|
74
|
+
/** Number of known services. */
|
|
75
|
+
get size() {
|
|
76
|
+
return this.manifests.size;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Resolve all endpoints for a service, returning leases from all known versions.
|
|
80
|
+
*/
|
|
81
|
+
resolveAll(serviceName) {
|
|
82
|
+
return this.findEndpoints(serviceName);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Fetch a contract manifest by service name and version.
|
|
86
|
+
* Returns undefined if not locally known.
|
|
87
|
+
*/
|
|
88
|
+
fetchContract(serviceName, version) {
|
|
89
|
+
return this.getManifest(serviceName, version);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Register a change callback invoked whenever new manifests are added.
|
|
93
|
+
* Returns an unsubscribe function.
|
|
94
|
+
*/
|
|
95
|
+
onChange(callback) {
|
|
96
|
+
this._changeCallbacks.push(callback);
|
|
97
|
+
return () => {
|
|
98
|
+
this._changeCallbacks = this._changeCallbacks.filter(cb => cb !== callback);
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
_changeCallbacks = [];
|
|
102
|
+
/**
|
|
103
|
+
* Parse a manifest from a blob collection download.
|
|
104
|
+
* The collection contains "manifest.json" as its first entry.
|
|
105
|
+
*/
|
|
106
|
+
static parseManifestFromCollection(entries) {
|
|
107
|
+
const manifestEntry = entries.find(([name]) => name === 'manifest.json');
|
|
108
|
+
if (!manifestEntry) {
|
|
109
|
+
throw new Error('collection does not contain manifest.json');
|
|
110
|
+
}
|
|
111
|
+
const json = new TextDecoder().decode(manifestEntry[1]);
|
|
112
|
+
return manifestFromJson(json);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/registry/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry gossip — broadcasts and listens for registry events.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors bindings/python/aster/registry/gossip.py.
|
|
5
|
+
*/
|
|
6
|
+
import type { GossipEvent } from './models.js';
|
|
7
|
+
/** Gossip topic handle interface (matches NAPI GossipTopicHandle). */
|
|
8
|
+
interface GossipTopic {
|
|
9
|
+
broadcast(data: Uint8Array): Promise<void>;
|
|
10
|
+
recv(): Promise<Uint8Array>;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Registry gossip — broadcasts events and listens for updates.
|
|
14
|
+
*/
|
|
15
|
+
export declare class RegistryGossip {
|
|
16
|
+
private topic;
|
|
17
|
+
private encoder;
|
|
18
|
+
private decoder;
|
|
19
|
+
constructor(topic: GossipTopic);
|
|
20
|
+
/** Broadcast a contract publication event. */
|
|
21
|
+
broadcastContractPublished(contractId: string, service: string, version: number): Promise<void>;
|
|
22
|
+
/** Broadcast a channel update event. */
|
|
23
|
+
broadcastChannelUpdated(service: string, channel: string, contractId: string): Promise<void>;
|
|
24
|
+
/** Broadcast an endpoint lease upsert event. */
|
|
25
|
+
broadcastEndpointLeaseUpserted(endpointId: string, service: string, leaseSeq: number, contractId: string): Promise<void>;
|
|
26
|
+
/** Broadcast an endpoint down event. */
|
|
27
|
+
broadcastEndpointDown(endpointId: string, service: string): Promise<void>;
|
|
28
|
+
/** Broadcast an ACL change event. */
|
|
29
|
+
broadcastAclChanged(keyPrefix: string): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Broadcast a backwards-compatibility publication event.
|
|
32
|
+
* Used when a new service version is compatible with an older contract.
|
|
33
|
+
*/
|
|
34
|
+
broadcastCompatibilityPublished(contractId: string, service: string, compatibleWithVersion: number): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Listen for gossip events. Yields events as they arrive.
|
|
37
|
+
* Silently skips malformed messages.
|
|
38
|
+
*/
|
|
39
|
+
listen(): AsyncGenerator<GossipEvent>;
|
|
40
|
+
private broadcast;
|
|
41
|
+
}
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=gossip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gossip.d.ts","sourceRoot":"","sources":["../../src/registry/gossip.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,sEAAsE;AACtE,UAAU,WAAW;IACnB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;CAC7B;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,OAAO,CAAqB;gBAExB,KAAK,EAAE,WAAW;IAI9B,8CAA8C;IACxC,0BAA0B,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUrG,wCAAwC;IAClC,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUlG,gDAAgD;IAC1C,8BAA8B,CAClC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GACxE,OAAO,CAAC,IAAI,CAAC;IAWhB,wCAAwC;IAClC,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS/E,qCAAqC;IAC/B,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ3D;;;OAGG;IACG,+BAA+B,CACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,qBAAqB,EAAE,MAAM,GAC5B,OAAO,CAAC,IAAI,CAAC;IAUhB;;;OAGG;IACI,MAAM,IAAI,cAAc,CAAC,WAAW,CAAC;YAgB9B,SAAS;CAIxB"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry gossip — broadcasts and listens for registry events.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors bindings/python/aster/registry/gossip.py.
|
|
5
|
+
*/
|
|
6
|
+
import { GossipEventType as ET } from './models.js';
|
|
7
|
+
/**
|
|
8
|
+
* Registry gossip — broadcasts events and listens for updates.
|
|
9
|
+
*/
|
|
10
|
+
export class RegistryGossip {
|
|
11
|
+
topic;
|
|
12
|
+
encoder = new TextEncoder();
|
|
13
|
+
decoder = new TextDecoder();
|
|
14
|
+
constructor(topic) {
|
|
15
|
+
this.topic = topic;
|
|
16
|
+
}
|
|
17
|
+
/** Broadcast a contract publication event. */
|
|
18
|
+
async broadcastContractPublished(contractId, service, version) {
|
|
19
|
+
await this.broadcast({
|
|
20
|
+
type: ET.CONTRACT_PUBLISHED,
|
|
21
|
+
contractId,
|
|
22
|
+
service,
|
|
23
|
+
version,
|
|
24
|
+
timestampMs: Date.now(),
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/** Broadcast a channel update event. */
|
|
28
|
+
async broadcastChannelUpdated(service, channel, contractId) {
|
|
29
|
+
await this.broadcast({
|
|
30
|
+
type: ET.CHANNEL_UPDATED,
|
|
31
|
+
service,
|
|
32
|
+
channel,
|
|
33
|
+
contractId,
|
|
34
|
+
timestampMs: Date.now(),
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/** Broadcast an endpoint lease upsert event. */
|
|
38
|
+
async broadcastEndpointLeaseUpserted(endpointId, service, leaseSeq, contractId) {
|
|
39
|
+
await this.broadcast({
|
|
40
|
+
type: ET.ENDPOINT_LEASE_UPSERTED,
|
|
41
|
+
endpointId,
|
|
42
|
+
service,
|
|
43
|
+
version: leaseSeq,
|
|
44
|
+
contractId,
|
|
45
|
+
timestampMs: Date.now(),
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/** Broadcast an endpoint down event. */
|
|
49
|
+
async broadcastEndpointDown(endpointId, service) {
|
|
50
|
+
await this.broadcast({
|
|
51
|
+
type: ET.ENDPOINT_DOWN,
|
|
52
|
+
endpointId,
|
|
53
|
+
service,
|
|
54
|
+
timestampMs: Date.now(),
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/** Broadcast an ACL change event. */
|
|
58
|
+
async broadcastAclChanged(keyPrefix) {
|
|
59
|
+
await this.broadcast({
|
|
60
|
+
type: ET.ACL_CHANGED,
|
|
61
|
+
keyPrefix,
|
|
62
|
+
timestampMs: Date.now(),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Broadcast a backwards-compatibility publication event.
|
|
67
|
+
* Used when a new service version is compatible with an older contract.
|
|
68
|
+
*/
|
|
69
|
+
async broadcastCompatibilityPublished(contractId, service, compatibleWithVersion) {
|
|
70
|
+
await this.broadcast({
|
|
71
|
+
type: ET.CONTRACT_PUBLISHED,
|
|
72
|
+
contractId,
|
|
73
|
+
service,
|
|
74
|
+
version: compatibleWithVersion,
|
|
75
|
+
timestampMs: Date.now(),
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Listen for gossip events. Yields events as they arrive.
|
|
80
|
+
* Silently skips malformed messages.
|
|
81
|
+
*/
|
|
82
|
+
async *listen() {
|
|
83
|
+
while (true) {
|
|
84
|
+
try {
|
|
85
|
+
const data = await this.topic.recv();
|
|
86
|
+
const text = this.decoder.decode(data);
|
|
87
|
+
const event = JSON.parse(text);
|
|
88
|
+
yield event;
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// Skip undecipherable messages
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// -- Helper --
|
|
97
|
+
async broadcast(event) {
|
|
98
|
+
const data = this.encoder.encode(JSON.stringify(event));
|
|
99
|
+
await this.topic.broadcast(data);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=gossip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gossip.js","sourceRoot":"","sources":["../../src/registry/gossip.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry key-schema helpers.
|
|
3
|
+
*
|
|
4
|
+
* All functions return UTF-8 string keys for iroh-docs set/query calls.
|
|
5
|
+
* Mirrors bindings/python/aster/registry/keys.py.
|
|
6
|
+
*/
|
|
7
|
+
/** Key for a published contract artifact. */
|
|
8
|
+
export declare function contractKey(contractId: string): string;
|
|
9
|
+
/** Key for a service version pointer. */
|
|
10
|
+
export declare function versionKey(serviceName: string, version: number): string;
|
|
11
|
+
/** Key for a service channel alias (e.g., "stable", "canary"). */
|
|
12
|
+
export declare function channelKey(serviceName: string, channel: string): string;
|
|
13
|
+
/** Key for a service tag. */
|
|
14
|
+
export declare function tagKey(serviceName: string, tag: string): string;
|
|
15
|
+
/** Key for an endpoint lease. */
|
|
16
|
+
export declare function leaseKey(serviceName: string, contractId: string, endpointId: string): string;
|
|
17
|
+
/** Prefix for listing all endpoint leases for a service+contract. */
|
|
18
|
+
export declare function leasePrefix(serviceName: string, contractId: string): string;
|
|
19
|
+
/** Key for ACL entries. */
|
|
20
|
+
export declare function aclKey(subkey: string): string;
|
|
21
|
+
/** Key for internal config. */
|
|
22
|
+
export declare function configKey(subkey: string): string;
|
|
23
|
+
/** Well-known registry key prefixes. */
|
|
24
|
+
export declare const REGISTRY_PREFIXES: string[];
|
|
25
|
+
//# sourceMappingURL=keys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/registry/keys.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,6CAA6C;AAC7C,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,yCAAyC;AACzC,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED,kEAAkE;AAClE,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED,6BAA6B;AAC7B,wBAAgB,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,iCAAiC;AACjC,wBAAgB,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAE5F;AAED,qEAAqE;AACrE,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED,2BAA2B;AAC3B,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,+BAA+B;AAC/B,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wCAAwC;AACxC,eAAO,MAAM,iBAAiB,UAM7B,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry key-schema helpers.
|
|
3
|
+
*
|
|
4
|
+
* All functions return UTF-8 string keys for iroh-docs set/query calls.
|
|
5
|
+
* Mirrors bindings/python/aster/registry/keys.py.
|
|
6
|
+
*/
|
|
7
|
+
/** Key for a published contract artifact. */
|
|
8
|
+
export function contractKey(contractId) {
|
|
9
|
+
return `contracts/${contractId}`;
|
|
10
|
+
}
|
|
11
|
+
/** Key for a service version pointer. */
|
|
12
|
+
export function versionKey(serviceName, version) {
|
|
13
|
+
return `services/${serviceName}/versions/v${version}`;
|
|
14
|
+
}
|
|
15
|
+
/** Key for a service channel alias (e.g., "stable", "canary"). */
|
|
16
|
+
export function channelKey(serviceName, channel) {
|
|
17
|
+
return `services/${serviceName}/channels/${channel}`;
|
|
18
|
+
}
|
|
19
|
+
/** Key for a service tag. */
|
|
20
|
+
export function tagKey(serviceName, tag) {
|
|
21
|
+
return `services/${serviceName}/tags/${tag}`;
|
|
22
|
+
}
|
|
23
|
+
/** Key for an endpoint lease. */
|
|
24
|
+
export function leaseKey(serviceName, contractId, endpointId) {
|
|
25
|
+
return `services/${serviceName}/contracts/${contractId}/endpoints/${endpointId}`;
|
|
26
|
+
}
|
|
27
|
+
/** Prefix for listing all endpoint leases for a service+contract. */
|
|
28
|
+
export function leasePrefix(serviceName, contractId) {
|
|
29
|
+
return `services/${serviceName}/contracts/${contractId}/endpoints/`;
|
|
30
|
+
}
|
|
31
|
+
/** Key for ACL entries. */
|
|
32
|
+
export function aclKey(subkey) {
|
|
33
|
+
return `_aster/acl/${subkey}`;
|
|
34
|
+
}
|
|
35
|
+
/** Key for internal config. */
|
|
36
|
+
export function configKey(subkey) {
|
|
37
|
+
return `_aster/config/${subkey}`;
|
|
38
|
+
}
|
|
39
|
+
/** Well-known registry key prefixes. */
|
|
40
|
+
export const REGISTRY_PREFIXES = [
|
|
41
|
+
'contracts/',
|
|
42
|
+
'services/',
|
|
43
|
+
'endpoints/',
|
|
44
|
+
'compatibility/',
|
|
45
|
+
'_aster/',
|
|
46
|
+
];
|
|
47
|
+
//# sourceMappingURL=keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/registry/keys.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,6CAA6C;AAC7C,MAAM,UAAU,WAAW,CAAC,UAAkB;IAC5C,OAAO,aAAa,UAAU,EAAE,CAAC;AACnC,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,UAAU,CAAC,WAAmB,EAAE,OAAe;IAC7D,OAAO,YAAY,WAAW,cAAc,OAAO,EAAE,CAAC;AACxD,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,UAAU,CAAC,WAAmB,EAAE,OAAe;IAC7D,OAAO,YAAY,WAAW,aAAa,OAAO,EAAE,CAAC;AACvD,CAAC;AAED,6BAA6B;AAC7B,MAAM,UAAU,MAAM,CAAC,WAAmB,EAAE,GAAW;IACrD,OAAO,YAAY,WAAW,SAAS,GAAG,EAAE,CAAC;AAC/C,CAAC;AAED,iCAAiC;AACjC,MAAM,UAAU,QAAQ,CAAC,WAAmB,EAAE,UAAkB,EAAE,UAAkB;IAClF,OAAO,YAAY,WAAW,cAAc,UAAU,cAAc,UAAU,EAAE,CAAC;AACnF,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,WAAW,CAAC,WAAmB,EAAE,UAAkB;IACjE,OAAO,YAAY,WAAW,cAAc,UAAU,aAAa,CAAC;AACtE,CAAC;AAED,2BAA2B;AAC3B,MAAM,UAAU,MAAM,CAAC,MAAc;IACnC,OAAO,cAAc,MAAM,EAAE,CAAC;AAChC,CAAC;AAED,+BAA+B;AAC/B,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,OAAO,iBAAiB,MAAM,EAAE,CAAC;AACnC,CAAC;AAED,wCAAwC;AACxC,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,gBAAgB;IAChB,SAAS;CACV,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry data models.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors bindings/python/aster/registry/models.py.
|
|
5
|
+
*/
|
|
6
|
+
/** Endpoint health status. */
|
|
7
|
+
export declare const HealthStatus: {
|
|
8
|
+
readonly STARTING: "starting";
|
|
9
|
+
readonly READY: "ready";
|
|
10
|
+
readonly DEGRADED: "degraded";
|
|
11
|
+
readonly DRAINING: "draining";
|
|
12
|
+
};
|
|
13
|
+
export type HealthStatus = (typeof HealthStatus)[keyof typeof HealthStatus];
|
|
14
|
+
/** Validate that a string is a valid HealthStatus value. */
|
|
15
|
+
export declare function validate(value: string): value is HealthStatus;
|
|
16
|
+
/** Gossip event types. */
|
|
17
|
+
export declare const GossipEventType: {
|
|
18
|
+
readonly CONTRACT_PUBLISHED: 0;
|
|
19
|
+
readonly CHANNEL_UPDATED: 1;
|
|
20
|
+
readonly ENDPOINT_LEASE_UPSERTED: 2;
|
|
21
|
+
readonly ENDPOINT_DOWN: 3;
|
|
22
|
+
readonly ACL_CHANGED: 4;
|
|
23
|
+
readonly COMPATIBILITY_PUBLISHED: 5;
|
|
24
|
+
};
|
|
25
|
+
export type GossipEventType = (typeof GossipEventType)[keyof typeof GossipEventType];
|
|
26
|
+
/** Service summary returned in admission and registry. */
|
|
27
|
+
export interface ServiceSummary {
|
|
28
|
+
name: string;
|
|
29
|
+
version: number;
|
|
30
|
+
contractId: string;
|
|
31
|
+
channels: Record<string, string>;
|
|
32
|
+
}
|
|
33
|
+
/** Artifact reference stored in the registry doc. */
|
|
34
|
+
export interface ArtifactRef {
|
|
35
|
+
contractId: string;
|
|
36
|
+
collectionHash: string;
|
|
37
|
+
providerEndpointId?: string;
|
|
38
|
+
relayUrl?: string;
|
|
39
|
+
ticket?: string;
|
|
40
|
+
publishedBy: string;
|
|
41
|
+
publishedAtEpochMs: number;
|
|
42
|
+
collectionFormat: 'raw' | 'index';
|
|
43
|
+
}
|
|
44
|
+
/** Endpoint lease for a service provider. */
|
|
45
|
+
export interface EndpointLease {
|
|
46
|
+
endpointId: string;
|
|
47
|
+
contractId: string;
|
|
48
|
+
service: string;
|
|
49
|
+
version: number;
|
|
50
|
+
leaseExpiresEpochMs: number;
|
|
51
|
+
leaseSeq: number;
|
|
52
|
+
alpn: string;
|
|
53
|
+
serializationModes: string[];
|
|
54
|
+
featureFlags: string[];
|
|
55
|
+
relayUrl?: string;
|
|
56
|
+
directAddrs: string[];
|
|
57
|
+
load?: number;
|
|
58
|
+
languageRuntime?: string;
|
|
59
|
+
asterVersion?: string;
|
|
60
|
+
policyRealm?: string;
|
|
61
|
+
healthStatus: HealthStatus;
|
|
62
|
+
tags: string[];
|
|
63
|
+
updatedAtEpochMs: number;
|
|
64
|
+
}
|
|
65
|
+
/** Check if a lease is fresh (not expired). */
|
|
66
|
+
export declare function isLeaseFresh(lease: EndpointLease, leaseDurationS?: number): boolean;
|
|
67
|
+
/** Check if a lease is routable (ready + fresh). */
|
|
68
|
+
export declare function isLeaseRoutable(lease: EndpointLease): boolean;
|
|
69
|
+
/** Gossip event. */
|
|
70
|
+
export interface GossipEvent {
|
|
71
|
+
type: GossipEventType;
|
|
72
|
+
service?: string;
|
|
73
|
+
version?: number;
|
|
74
|
+
channel?: string;
|
|
75
|
+
contractId?: string;
|
|
76
|
+
endpointId?: string;
|
|
77
|
+
keyPrefix?: string;
|
|
78
|
+
timestampMs: number;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/registry/models.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,8BAA8B;AAC9B,eAAO,MAAM,YAAY;;;;;CAKf,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAE5E,4DAA4D;AAC5D,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,YAAY,CAE7D;AAED,0BAA0B;AAC1B,eAAO,MAAM,eAAe;;;;;;;CAOlB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,CAAC;AAErF,0DAA0D;AAC1D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,qDAAqD;AACrD,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,KAAK,GAAG,OAAO,CAAC;CACnC;AAED,6CAA6C;AAC7C,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,YAAY,CAAC;IAC3B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,+CAA+C;AAC/C,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,EAAE,cAAc,SAAK,GAAG,OAAO,CAG/E;AAED,oDAAoD;AACpD,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAE7D;AAED,oBAAoB;AACpB,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB"}
|