@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
package/dist/framing.js
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
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
|
+
import { MAX_FRAME_SIZE, DEFAULT_FRAME_READ_TIMEOUT_S } from './limits.js';
|
|
20
|
+
// -- Flag constants -----------------------------------------------------------
|
|
21
|
+
/** Bit 0 -- payload is zstd-compressed. */
|
|
22
|
+
export const COMPRESSED = 0x01;
|
|
23
|
+
/** Bit 1 -- trailing status frame. */
|
|
24
|
+
export const TRAILER = 0x02;
|
|
25
|
+
/** Bit 2 -- stream header (first frame). */
|
|
26
|
+
export const HEADER = 0x04;
|
|
27
|
+
/** Bit 3 -- Fory row schema frame. */
|
|
28
|
+
export const ROW_SCHEMA = 0x08;
|
|
29
|
+
/** Bit 4 -- per-call header in a session stream. */
|
|
30
|
+
export const CALL = 0x10;
|
|
31
|
+
/** Bit 5 -- cancel current call in a session stream. */
|
|
32
|
+
export const CANCEL = 0x20;
|
|
33
|
+
// -- Errors -------------------------------------------------------------------
|
|
34
|
+
/** Raised when a framing violation is detected. */
|
|
35
|
+
export class FramingError extends Error {
|
|
36
|
+
constructor(message) {
|
|
37
|
+
super(message);
|
|
38
|
+
this.name = 'FramingError';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// -- Internal constants -------------------------------------------------------
|
|
42
|
+
const LENGTH_SIZE = 4;
|
|
43
|
+
const FLAGS_SIZE = 1;
|
|
44
|
+
// -- writeFrame ---------------------------------------------------------------
|
|
45
|
+
/**
|
|
46
|
+
* Write a single frame to a send stream.
|
|
47
|
+
*
|
|
48
|
+
* @param stream - An async send stream with a writeAll method.
|
|
49
|
+
* @param payload - The serialized payload bytes.
|
|
50
|
+
* @param flags - The 1-byte flag bitfield (default 0).
|
|
51
|
+
* @throws FramingError if the frame exceeds MAX_FRAME_SIZE or has an invalid empty payload.
|
|
52
|
+
*/
|
|
53
|
+
export async function writeFrame(stream, payload, flags = 0) {
|
|
54
|
+
const frameBodyLen = FLAGS_SIZE + payload.byteLength;
|
|
55
|
+
// Zero-length payloads are permitted only for TRAILER and CANCEL control frames
|
|
56
|
+
if (frameBodyLen === FLAGS_SIZE && !(flags & (TRAILER | CANCEL))) {
|
|
57
|
+
throw new FramingError('zero-length payload is not permitted');
|
|
58
|
+
}
|
|
59
|
+
if (frameBodyLen > MAX_FRAME_SIZE) {
|
|
60
|
+
throw new FramingError(`frame size ${frameBodyLen} exceeds maximum ${MAX_FRAME_SIZE}`);
|
|
61
|
+
}
|
|
62
|
+
const buf = new Uint8Array(LENGTH_SIZE + FLAGS_SIZE + payload.byteLength);
|
|
63
|
+
const view = new DataView(buf.buffer);
|
|
64
|
+
view.setUint32(0, frameBodyLen, true); // little-endian
|
|
65
|
+
buf[LENGTH_SIZE] = flags;
|
|
66
|
+
buf.set(payload, LENGTH_SIZE + FLAGS_SIZE);
|
|
67
|
+
await stream.writeAll(buf);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Read a single frame from a receive stream.
|
|
71
|
+
*
|
|
72
|
+
* @param stream - The QUIC receive stream.
|
|
73
|
+
* @param timeoutS - Optional read timeout in seconds. Defaults to DEFAULT_FRAME_READ_TIMEOUT_S.
|
|
74
|
+
* Pass 0 to disable.
|
|
75
|
+
* @returns A [payload, flags] tuple, or null if the stream has ended cleanly.
|
|
76
|
+
* @throws FramingError on wire-format violations (zero length, oversized frame).
|
|
77
|
+
*/
|
|
78
|
+
export async function readFrame(stream, timeoutS) {
|
|
79
|
+
const timeout = timeoutS ?? DEFAULT_FRAME_READ_TIMEOUT_S;
|
|
80
|
+
const effectiveTimeout = timeout > 0 ? timeout * 1000 : undefined;
|
|
81
|
+
// Read the 4-byte length prefix
|
|
82
|
+
let lengthBytes;
|
|
83
|
+
try {
|
|
84
|
+
lengthBytes = await withTimeout(stream.readExact(LENGTH_SIZE), effectiveTimeout, 'frame read timed out waiting for length header');
|
|
85
|
+
}
|
|
86
|
+
catch (e) {
|
|
87
|
+
if (e instanceof FramingError)
|
|
88
|
+
throw e;
|
|
89
|
+
// Stream ended or was reset -- treat as clean EOF
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
if (lengthBytes.byteLength < LENGTH_SIZE) {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
const view = new DataView(lengthBytes.buffer, lengthBytes.byteOffset, lengthBytes.byteLength);
|
|
96
|
+
const frameBodyLen = view.getUint32(0, true);
|
|
97
|
+
if (frameBodyLen === 0) {
|
|
98
|
+
throw new FramingError('received zero-length frame');
|
|
99
|
+
}
|
|
100
|
+
if (frameBodyLen > MAX_FRAME_SIZE) {
|
|
101
|
+
throw new FramingError(`frame size ${frameBodyLen} exceeds maximum ${MAX_FRAME_SIZE}`);
|
|
102
|
+
}
|
|
103
|
+
let body;
|
|
104
|
+
try {
|
|
105
|
+
body = await withTimeout(stream.readExact(frameBodyLen), effectiveTimeout, `frame read timed out waiting for ${frameBodyLen} bytes of body`);
|
|
106
|
+
}
|
|
107
|
+
catch (e) {
|
|
108
|
+
if (e instanceof FramingError)
|
|
109
|
+
throw e;
|
|
110
|
+
throw new FramingError(`incomplete frame: expected ${frameBodyLen} bytes`);
|
|
111
|
+
}
|
|
112
|
+
if (body.byteLength < frameBodyLen) {
|
|
113
|
+
throw new FramingError(`incomplete frame: expected ${frameBodyLen} bytes, got ${body.byteLength}`);
|
|
114
|
+
}
|
|
115
|
+
const flags = body[0];
|
|
116
|
+
const payload = body.subarray(1);
|
|
117
|
+
return [payload, flags];
|
|
118
|
+
}
|
|
119
|
+
// -- Helpers ------------------------------------------------------------------
|
|
120
|
+
/**
|
|
121
|
+
* Encode a frame to raw bytes (for testing and conformance vectors).
|
|
122
|
+
* Does not write to a stream -- returns the complete wire bytes.
|
|
123
|
+
*/
|
|
124
|
+
export function encodeFrame(payload, flags = 0) {
|
|
125
|
+
const frameBodyLen = FLAGS_SIZE + payload.byteLength;
|
|
126
|
+
const buf = new Uint8Array(LENGTH_SIZE + frameBodyLen);
|
|
127
|
+
const view = new DataView(buf.buffer);
|
|
128
|
+
view.setUint32(0, frameBodyLen, true);
|
|
129
|
+
buf[LENGTH_SIZE] = flags;
|
|
130
|
+
buf.set(payload, LENGTH_SIZE + FLAGS_SIZE);
|
|
131
|
+
return buf;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Decode raw wire bytes into [payload, flags] (for testing and conformance vectors).
|
|
135
|
+
* Does not read from a stream -- parses the complete wire bytes.
|
|
136
|
+
*/
|
|
137
|
+
export function decodeFrame(wire) {
|
|
138
|
+
if (wire.byteLength < LENGTH_SIZE) {
|
|
139
|
+
throw new FramingError('wire bytes too short');
|
|
140
|
+
}
|
|
141
|
+
const view = new DataView(wire.buffer, wire.byteOffset, wire.byteLength);
|
|
142
|
+
const frameBodyLen = view.getUint32(0, true);
|
|
143
|
+
if (frameBodyLen === 0) {
|
|
144
|
+
throw new FramingError('received zero-length frame');
|
|
145
|
+
}
|
|
146
|
+
if (wire.byteLength < LENGTH_SIZE + frameBodyLen) {
|
|
147
|
+
throw new FramingError(`incomplete frame: expected ${frameBodyLen} bytes, got ${wire.byteLength - LENGTH_SIZE}`);
|
|
148
|
+
}
|
|
149
|
+
const flags = wire[LENGTH_SIZE];
|
|
150
|
+
const payload = wire.subarray(LENGTH_SIZE + FLAGS_SIZE, LENGTH_SIZE + frameBodyLen);
|
|
151
|
+
return [payload, flags];
|
|
152
|
+
}
|
|
153
|
+
/** Wrap a promise with a timeout. */
|
|
154
|
+
async function withTimeout(promise, timeoutMs, message) {
|
|
155
|
+
if (timeoutMs === undefined)
|
|
156
|
+
return promise;
|
|
157
|
+
return Promise.race([
|
|
158
|
+
promise,
|
|
159
|
+
new Promise((_, reject) => setTimeout(() => reject(new FramingError(message)), timeoutMs)),
|
|
160
|
+
]);
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=framing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framing.js","sourceRoot":"","sources":["../src/framing.ts"],"names":[],"mappings":"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"}
|
package/dist/health.d.ts
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Health and readiness HTTP endpoints.
|
|
3
|
+
*
|
|
4
|
+
* Provides /healthz, /readyz, /metrics, and /metrics/prometheus endpoints
|
|
5
|
+
* for Kubernetes probes and monitoring. Disabled by default (port 0).
|
|
6
|
+
*
|
|
7
|
+
* Default bind: 127.0.0.1 (localhost only). Set 0.0.0.0 for k8s pods.
|
|
8
|
+
*/
|
|
9
|
+
/** Connection-level metrics (singleton). */
|
|
10
|
+
export declare class ConnectionMetrics {
|
|
11
|
+
opened: number;
|
|
12
|
+
closed: number;
|
|
13
|
+
streamsOpened: number;
|
|
14
|
+
streamsClosed: number;
|
|
15
|
+
connectionOpened(): void;
|
|
16
|
+
connectionClosed(): void;
|
|
17
|
+
streamOpened(): void;
|
|
18
|
+
streamClosed(): void;
|
|
19
|
+
snapshot(): Record<string, number>;
|
|
20
|
+
}
|
|
21
|
+
/** Admission-level metrics (singleton). */
|
|
22
|
+
export declare class AdmissionMetrics {
|
|
23
|
+
consumerAdmits: number;
|
|
24
|
+
consumerDenies: number;
|
|
25
|
+
consumerErrors: number;
|
|
26
|
+
producerAdmits: number;
|
|
27
|
+
producerDenies: number;
|
|
28
|
+
producerErrors: number;
|
|
29
|
+
lastAdmissionMs: number;
|
|
30
|
+
totalAdmissionMs: number;
|
|
31
|
+
recordConsumerAdmit(durationMs?: number): void;
|
|
32
|
+
recordConsumerDeny(): void;
|
|
33
|
+
recordConsumerError(): void;
|
|
34
|
+
recordProducerAdmit(durationMs?: number): void;
|
|
35
|
+
recordProducerDeny(): void;
|
|
36
|
+
recordProducerError(): void;
|
|
37
|
+
snapshot(): Record<string, number>;
|
|
38
|
+
}
|
|
39
|
+
/** Get the singleton connection metrics instance. */
|
|
40
|
+
export declare function getConnectionMetrics(): ConnectionMetrics;
|
|
41
|
+
/** Get the singleton admission metrics instance. */
|
|
42
|
+
export declare function getAdmissionMetrics(): AdmissionMetrics;
|
|
43
|
+
/** Reset all singleton metrics. */
|
|
44
|
+
export declare function resetMetrics(): void;
|
|
45
|
+
/** Check health of a server (returns true if running). */
|
|
46
|
+
export declare function checkHealth(server: {
|
|
47
|
+
running?: boolean;
|
|
48
|
+
}): boolean;
|
|
49
|
+
/** Check readiness of a server (returns true if running and not draining). */
|
|
50
|
+
export declare function checkReady(server: {
|
|
51
|
+
running?: boolean;
|
|
52
|
+
draining?: boolean;
|
|
53
|
+
}): boolean;
|
|
54
|
+
/** Return health status as a JSON-serializable object. */
|
|
55
|
+
export declare function healthStatus(server: {
|
|
56
|
+
running?: boolean;
|
|
57
|
+
}): Record<string, unknown>;
|
|
58
|
+
/** Return readiness status as a JSON-serializable object. */
|
|
59
|
+
export declare function readyStatus(server: {
|
|
60
|
+
running?: boolean;
|
|
61
|
+
draining?: boolean;
|
|
62
|
+
}): Record<string, unknown>;
|
|
63
|
+
/** Return a full metrics snapshot. */
|
|
64
|
+
export declare function metricsSnapshot(_server?: unknown): Record<string, unknown>;
|
|
65
|
+
export interface HealthState {
|
|
66
|
+
isHealthy: () => boolean;
|
|
67
|
+
isReady: () => boolean;
|
|
68
|
+
metrics: () => HealthMetrics;
|
|
69
|
+
}
|
|
70
|
+
export interface HealthMetrics {
|
|
71
|
+
health: {
|
|
72
|
+
status: string;
|
|
73
|
+
uptimeS: number;
|
|
74
|
+
};
|
|
75
|
+
ready: {
|
|
76
|
+
status: string;
|
|
77
|
+
services: number;
|
|
78
|
+
};
|
|
79
|
+
rpc: {
|
|
80
|
+
started: number;
|
|
81
|
+
succeeded: number;
|
|
82
|
+
failed: number;
|
|
83
|
+
inFlight: number;
|
|
84
|
+
totalDurationS: number;
|
|
85
|
+
lastDurationS: number;
|
|
86
|
+
};
|
|
87
|
+
connections: {
|
|
88
|
+
active: number;
|
|
89
|
+
total: number;
|
|
90
|
+
streamsActive: number;
|
|
91
|
+
streamsTotal: number;
|
|
92
|
+
};
|
|
93
|
+
admission: {
|
|
94
|
+
attempted: number;
|
|
95
|
+
succeeded: number;
|
|
96
|
+
rejected: number;
|
|
97
|
+
errored: number;
|
|
98
|
+
lastAdmissionMs: number;
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Lightweight HTTP health server.
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```ts
|
|
106
|
+
* const health = new HealthServer({ port: 8080 });
|
|
107
|
+
* health.setState({ isHealthy: () => true, isReady: () => true, metrics: () => ({...}) });
|
|
108
|
+
* await health.start();
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
export declare class HealthServer {
|
|
112
|
+
private server;
|
|
113
|
+
private state;
|
|
114
|
+
private startTime;
|
|
115
|
+
private port;
|
|
116
|
+
private host;
|
|
117
|
+
constructor(opts?: {
|
|
118
|
+
port?: number;
|
|
119
|
+
host?: string;
|
|
120
|
+
});
|
|
121
|
+
setState(state: HealthState): void;
|
|
122
|
+
start(): Promise<void>;
|
|
123
|
+
stop(): Promise<void>;
|
|
124
|
+
private handle;
|
|
125
|
+
private renderPrometheus;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":"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"}
|
package/dist/health.js
ADDED
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Health and readiness HTTP endpoints.
|
|
3
|
+
*
|
|
4
|
+
* Provides /healthz, /readyz, /metrics, and /metrics/prometheus endpoints
|
|
5
|
+
* for Kubernetes probes and monitoring. Disabled by default (port 0).
|
|
6
|
+
*
|
|
7
|
+
* Default bind: 127.0.0.1 (localhost only). Set 0.0.0.0 for k8s pods.
|
|
8
|
+
*/
|
|
9
|
+
import { createServer } from 'node:http';
|
|
10
|
+
// ── Singleton metrics stores ──────────────────────────────────────────────────
|
|
11
|
+
/** Connection-level metrics (singleton). */
|
|
12
|
+
export class ConnectionMetrics {
|
|
13
|
+
opened = 0;
|
|
14
|
+
closed = 0;
|
|
15
|
+
streamsOpened = 0;
|
|
16
|
+
streamsClosed = 0;
|
|
17
|
+
connectionOpened() { this.opened++; }
|
|
18
|
+
connectionClosed() { this.closed++; }
|
|
19
|
+
streamOpened() { this.streamsOpened++; }
|
|
20
|
+
streamClosed() { this.streamsClosed++; }
|
|
21
|
+
snapshot() {
|
|
22
|
+
return {
|
|
23
|
+
connections_opened: this.opened,
|
|
24
|
+
connections_closed: this.closed,
|
|
25
|
+
streams_active: this.streamsOpened - this.streamsClosed,
|
|
26
|
+
streams_total: this.streamsOpened,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** Admission-level metrics (singleton). */
|
|
31
|
+
export class AdmissionMetrics {
|
|
32
|
+
consumerAdmits = 0;
|
|
33
|
+
consumerDenies = 0;
|
|
34
|
+
consumerErrors = 0;
|
|
35
|
+
producerAdmits = 0;
|
|
36
|
+
producerDenies = 0;
|
|
37
|
+
producerErrors = 0;
|
|
38
|
+
lastAdmissionMs = 0;
|
|
39
|
+
totalAdmissionMs = 0;
|
|
40
|
+
recordConsumerAdmit(durationMs = 0) {
|
|
41
|
+
this.consumerAdmits++;
|
|
42
|
+
this.lastAdmissionMs = durationMs;
|
|
43
|
+
this.totalAdmissionMs += durationMs;
|
|
44
|
+
}
|
|
45
|
+
recordConsumerDeny() { this.consumerDenies++; }
|
|
46
|
+
recordConsumerError() { this.consumerErrors++; }
|
|
47
|
+
recordProducerAdmit(durationMs = 0) {
|
|
48
|
+
this.producerAdmits++;
|
|
49
|
+
this.lastAdmissionMs = durationMs;
|
|
50
|
+
this.totalAdmissionMs += durationMs;
|
|
51
|
+
}
|
|
52
|
+
recordProducerDeny() { this.producerDenies++; }
|
|
53
|
+
recordProducerError() { this.producerErrors++; }
|
|
54
|
+
snapshot() {
|
|
55
|
+
return {
|
|
56
|
+
consumer_admits: this.consumerAdmits,
|
|
57
|
+
consumer_denies: this.consumerDenies,
|
|
58
|
+
consumer_errors: this.consumerErrors,
|
|
59
|
+
producer_admits: this.producerAdmits,
|
|
60
|
+
producer_denies: this.producerDenies,
|
|
61
|
+
producer_errors: this.producerErrors,
|
|
62
|
+
last_admission_ms: this.lastAdmissionMs,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const _connectionMetrics = new ConnectionMetrics();
|
|
67
|
+
const _admissionMetrics = new AdmissionMetrics();
|
|
68
|
+
/** Get the singleton connection metrics instance. */
|
|
69
|
+
export function getConnectionMetrics() {
|
|
70
|
+
return _connectionMetrics;
|
|
71
|
+
}
|
|
72
|
+
/** Get the singleton admission metrics instance. */
|
|
73
|
+
export function getAdmissionMetrics() {
|
|
74
|
+
return _admissionMetrics;
|
|
75
|
+
}
|
|
76
|
+
/** Reset all singleton metrics. */
|
|
77
|
+
export function resetMetrics() {
|
|
78
|
+
const cm = _connectionMetrics;
|
|
79
|
+
cm.opened = 0;
|
|
80
|
+
cm.closed = 0;
|
|
81
|
+
cm.streamsOpened = 0;
|
|
82
|
+
cm.streamsClosed = 0;
|
|
83
|
+
const am = _admissionMetrics;
|
|
84
|
+
am.consumerAdmits = 0;
|
|
85
|
+
am.consumerDenies = 0;
|
|
86
|
+
am.consumerErrors = 0;
|
|
87
|
+
am.producerAdmits = 0;
|
|
88
|
+
am.producerDenies = 0;
|
|
89
|
+
am.producerErrors = 0;
|
|
90
|
+
am.lastAdmissionMs = 0;
|
|
91
|
+
am.totalAdmissionMs = 0;
|
|
92
|
+
}
|
|
93
|
+
/** Check health of a server (returns true if running). */
|
|
94
|
+
export function checkHealth(server) {
|
|
95
|
+
return server.running !== false;
|
|
96
|
+
}
|
|
97
|
+
/** Check readiness of a server (returns true if running and not draining). */
|
|
98
|
+
export function checkReady(server) {
|
|
99
|
+
return server.running !== false && server.draining !== true;
|
|
100
|
+
}
|
|
101
|
+
/** Return health status as a JSON-serializable object. */
|
|
102
|
+
export function healthStatus(server) {
|
|
103
|
+
return {
|
|
104
|
+
status: checkHealth(server) ? 'ok' : 'unhealthy',
|
|
105
|
+
uptime_s: 0,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/** Return readiness status as a JSON-serializable object. */
|
|
109
|
+
export function readyStatus(server) {
|
|
110
|
+
return {
|
|
111
|
+
status: checkReady(server) ? 'ready' : 'not_ready',
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/** Return a full metrics snapshot. */
|
|
115
|
+
export function metricsSnapshot(_server) {
|
|
116
|
+
return {
|
|
117
|
+
connections: _connectionMetrics.snapshot(),
|
|
118
|
+
admission: _admissionMetrics.snapshot(),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Lightweight HTTP health server.
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* ```ts
|
|
126
|
+
* const health = new HealthServer({ port: 8080 });
|
|
127
|
+
* health.setState({ isHealthy: () => true, isReady: () => true, metrics: () => ({...}) });
|
|
128
|
+
* await health.start();
|
|
129
|
+
* ```
|
|
130
|
+
*/
|
|
131
|
+
export class HealthServer {
|
|
132
|
+
server = null;
|
|
133
|
+
state = null;
|
|
134
|
+
startTime = Date.now();
|
|
135
|
+
port;
|
|
136
|
+
host;
|
|
137
|
+
constructor(opts = {}) {
|
|
138
|
+
this.port = opts.port ?? 0;
|
|
139
|
+
this.host = opts.host ?? '127.0.0.1';
|
|
140
|
+
}
|
|
141
|
+
setState(state) {
|
|
142
|
+
this.state = state;
|
|
143
|
+
}
|
|
144
|
+
async start() {
|
|
145
|
+
if (this.port === 0)
|
|
146
|
+
return; // disabled
|
|
147
|
+
this.server = createServer((req, res) => this.handle(req, res));
|
|
148
|
+
return new Promise((resolve) => {
|
|
149
|
+
this.server.listen(this.port, this.host, () => resolve());
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
async stop() {
|
|
153
|
+
if (this.server) {
|
|
154
|
+
return new Promise((resolve) => this.server.close(() => resolve()));
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
handle(req, res) {
|
|
158
|
+
const url = req.url ?? '/';
|
|
159
|
+
if (url === '/healthz') {
|
|
160
|
+
const ok = this.state?.isHealthy() ?? true;
|
|
161
|
+
const uptimeS = (Date.now() - this.startTime) / 1000;
|
|
162
|
+
res.writeHead(ok ? 200 : 503, { 'Content-Type': 'application/json' });
|
|
163
|
+
res.end(JSON.stringify({ status: ok ? 'ok' : 'unhealthy', uptime_s: uptimeS }));
|
|
164
|
+
}
|
|
165
|
+
else if (url === '/readyz') {
|
|
166
|
+
const ok = this.state?.isReady() ?? false;
|
|
167
|
+
res.writeHead(ok ? 200 : 503, { 'Content-Type': 'application/json' });
|
|
168
|
+
res.end(JSON.stringify({ status: ok ? 'ready' : 'not_ready' }));
|
|
169
|
+
}
|
|
170
|
+
else if (url === '/metrics') {
|
|
171
|
+
const m = this.state?.metrics();
|
|
172
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
173
|
+
res.end(JSON.stringify(m ?? {}));
|
|
174
|
+
}
|
|
175
|
+
else if (url === '/metrics/prometheus') {
|
|
176
|
+
res.writeHead(200, { 'Content-Type': 'text/plain' });
|
|
177
|
+
res.end(this.renderPrometheus());
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
res.writeHead(404);
|
|
181
|
+
res.end('not found');
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
renderPrometheus() {
|
|
185
|
+
const m = this.state?.metrics();
|
|
186
|
+
if (!m)
|
|
187
|
+
return '';
|
|
188
|
+
const uptimeS = (Date.now() - this.startTime) / 1000;
|
|
189
|
+
const lines = [];
|
|
190
|
+
// Uptime
|
|
191
|
+
lines.push('# HELP aster_uptime_seconds Server uptime in seconds');
|
|
192
|
+
lines.push('# TYPE aster_uptime_seconds gauge');
|
|
193
|
+
lines.push(`aster_uptime_seconds ${uptimeS.toFixed(1)}`);
|
|
194
|
+
// RPC metrics
|
|
195
|
+
lines.push('# HELP aster_rpc_started_total Total RPC calls started');
|
|
196
|
+
lines.push('# TYPE aster_rpc_started_total counter');
|
|
197
|
+
lines.push(`aster_rpc_started_total ${m.rpc.started}`);
|
|
198
|
+
lines.push('# HELP aster_rpc_succeeded_total Total successful RPCs');
|
|
199
|
+
lines.push('# TYPE aster_rpc_succeeded_total counter');
|
|
200
|
+
lines.push(`aster_rpc_succeeded_total ${m.rpc.succeeded}`);
|
|
201
|
+
lines.push('# HELP aster_rpc_failed_total Total failed RPCs');
|
|
202
|
+
lines.push('# TYPE aster_rpc_failed_total counter');
|
|
203
|
+
lines.push(`aster_rpc_failed_total ${m.rpc.failed}`);
|
|
204
|
+
lines.push('# HELP aster_rpc_in_flight Current in-flight RPCs');
|
|
205
|
+
lines.push('# TYPE aster_rpc_in_flight gauge');
|
|
206
|
+
lines.push(`aster_rpc_in_flight ${m.rpc.inFlight}`);
|
|
207
|
+
lines.push('# HELP aster_rpc_duration_seconds_total Total RPC duration in seconds');
|
|
208
|
+
lines.push('# TYPE aster_rpc_duration_seconds_total counter');
|
|
209
|
+
lines.push(`aster_rpc_duration_seconds_total ${m.rpc.totalDurationS.toFixed(6)}`);
|
|
210
|
+
// Connection metrics
|
|
211
|
+
lines.push('# HELP aster_connections_active Active connections');
|
|
212
|
+
lines.push('# TYPE aster_connections_active gauge');
|
|
213
|
+
lines.push(`aster_connections_active ${m.connections.active}`);
|
|
214
|
+
lines.push('# HELP aster_connections_total Total connections accepted');
|
|
215
|
+
lines.push('# TYPE aster_connections_total counter');
|
|
216
|
+
lines.push(`aster_connections_total ${m.connections.total}`);
|
|
217
|
+
lines.push('# HELP aster_streams_active Active RPC streams');
|
|
218
|
+
lines.push('# TYPE aster_streams_active gauge');
|
|
219
|
+
lines.push(`aster_streams_active ${m.connections.streamsActive}`);
|
|
220
|
+
lines.push('# HELP aster_streams_total Total streams handled');
|
|
221
|
+
lines.push('# TYPE aster_streams_total counter');
|
|
222
|
+
lines.push(`aster_streams_total ${m.connections.streamsTotal}`);
|
|
223
|
+
// Admission metrics
|
|
224
|
+
lines.push('# HELP aster_admission_attempted_total Total admission attempts');
|
|
225
|
+
lines.push('# TYPE aster_admission_attempted_total counter');
|
|
226
|
+
lines.push(`aster_admission_attempted_total ${m.admission.attempted}`);
|
|
227
|
+
lines.push('# HELP aster_admission_succeeded_total Total successful admissions');
|
|
228
|
+
lines.push('# TYPE aster_admission_succeeded_total counter');
|
|
229
|
+
lines.push(`aster_admission_succeeded_total ${m.admission.succeeded}`);
|
|
230
|
+
lines.push('# HELP aster_admission_rejected_total Total rejected admissions');
|
|
231
|
+
lines.push('# TYPE aster_admission_rejected_total counter');
|
|
232
|
+
lines.push(`aster_admission_rejected_total ${m.admission.rejected}`);
|
|
233
|
+
return lines.join('\n') + '\n';
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @aster-rpc/aster -- Aster RPC framework for TypeScript.
|
|
3
|
+
*
|
|
4
|
+
* P2P services with type safety, streaming, and trust.
|
|
5
|
+
* Built on Iroh (QUIC, blobs, docs, gossip).
|
|
6
|
+
*
|
|
7
|
+
* Works with Node.js 20+, Bun 1.0+, and Deno (via Node compat).
|
|
8
|
+
* All examples use TypeScript; plain JavaScript works by omitting type annotations.
|
|
9
|
+
*
|
|
10
|
+
* @packageDocumentation
|
|
11
|
+
*/
|
|
12
|
+
export { StatusCode, statusName, RpcError, CancelledError, UnknownRpcError, InvalidArgumentError, DeadlineExceededError, NotFoundError, AlreadyExistsError, PermissionDeniedError, ResourceExhaustedError, FailedPreconditionError, AbortedError, OutOfRangeError, UnimplementedError, InternalError, UnavailableError, DataLossError, UnauthenticatedError, ContractViolationError, } from './status.js';
|
|
13
|
+
export { SerializationMode, RpcPattern, RpcScope, RPC_ALPN, DEFAULT_BACKOFF, DEFAULT_RETRY, type ExponentialBackoff, type RetryPolicy, } from './types.js';
|
|
14
|
+
export { MAX_FRAME_SIZE, MAX_DECOMPRESSED_SIZE, DEFAULT_FRAME_READ_TIMEOUT_S, MAX_METADATA_ENTRIES, MAX_METADATA_TOTAL_BYTES, MAX_STATUS_MESSAGE_LEN, HEX_FIELD_LENGTHS, LimitExceeded, validateHexField, validateMetadata, validateStatusMessage, } from './limits.js';
|
|
15
|
+
export { COMPRESSED, TRAILER, HEADER, ROW_SCHEMA, CALL, CANCEL, FramingError, writeFrame, readFrame, encodeFrame, decodeFrame, type FrameResult, } from './framing.js';
|
|
16
|
+
export { StreamHeader, CallHeader, RpcStatus } from './protocol.js';
|
|
17
|
+
export { SERVICE_INFO_KEY, METHOD_INFO_KEY, getServiceInfo, ServiceRegistry, getMethod, hasMethod, getDefaultRegistry, setDefaultRegistry, type ServiceInfo, type MethodInfo, type CapabilityRequirement, } from './service.js';
|
|
18
|
+
export { Metadata } from './metadata.js';
|
|
19
|
+
export { Service, Rpc, ServerStream, ClientStream, BidiStream, WireType, WIRE_TYPE_KEY, WIRE_TYPE_FIELDS_KEY, type ServiceOptions, type WireTypeOptions, } from './decorators.js';
|
|
20
|
+
export { JsonCodec, ForyCodec, DEFAULT_COMPRESSION_THRESHOLD, walkTypeGraph, wireType, resolveForyConfig, type Codec, type ForyConfig, type ResolvedForyConfig, } from './codec.js';
|
|
21
|
+
export { type AsterTransport, type CallOptions, type BidiChannel, } from './transport/base.js';
|
|
22
|
+
export { LocalTransport, MemRecvStream } from './transport/local.js';
|
|
23
|
+
export { createClient, createLocalClient, timeSleep, timeouts, ServiceClient, type AsterClient, type ClientOptions, } from './client.js';
|
|
24
|
+
export { CallContext, buildCallContext, applyRequestInterceptors, applyResponseInterceptors, applyErrorInterceptors, normalizeError, type Interceptor, } from './interceptors/base.js';
|
|
25
|
+
export { DeadlineInterceptor } from './interceptors/deadline.js';
|
|
26
|
+
export { MetricsInterceptor } from './interceptors/metrics.js';
|
|
27
|
+
export { RetryInterceptor } from './interceptors/retry.js';
|
|
28
|
+
export { RateLimitInterceptor, type RateLimitOptions } from './interceptors/rate-limit.js';
|
|
29
|
+
export { AuthInterceptor } from './interceptors/auth.js';
|
|
30
|
+
export { CircuitBreakerInterceptor, type CircuitBreakerOptions } from './interceptors/circuit-breaker.js';
|
|
31
|
+
export { CompressionInterceptor } from './interceptors/compression.js';
|
|
32
|
+
export { AuditLogInterceptor, type AuditLogFn, type AuditEntry } from './interceptors/audit.js';
|
|
33
|
+
export { CapabilityInterceptor } from './interceptors/capability.js';
|
|
34
|
+
export { canonicalXlangBytes, computeContractId, contractIdFromContract, contractIdFromJson, contractIdFromService, buildTypeGraph, fromServiceInfo, setNativeContract, TypeKind as ContractTypeKind, ContainerKind, TypeDefKind, MethodPattern, CapabilityKind, ScopeKind, type ServiceContract, type MethodDef as ContractMethodDef, type CapabilityRequirement as ContractCapabilityRequirement, } from './contract/identity.js';
|
|
35
|
+
export { type ContractManifest, type ManifestMethod, type ManifestField, FatalContractMismatch, verifyManifestOrFatal, manifestToJson, manifestFromJson, extractMethodDescriptors, saveManifest, } from './contract/manifest.js';
|
|
36
|
+
export { type ArtifactRef, buildCollection, publishContract, uploadCollection, fetchFromCollection, fetchContract, } from './contract/publication.js';
|
|
37
|
+
export { DynamicTypeFactory, createDynamicType, type DynamicType, } from './dynamic.js';
|
|
38
|
+
export { SessionServer, SessionStub, createSession } from './session.js';
|
|
39
|
+
export { IrohTransport } from './transport/iroh.js';
|
|
40
|
+
export { configFromEnv, configFromFile, loadEndpointConfig, resolveRootPubkey, toEndpointConfig, loadIdentity, loadIdentityFile, findPeer, getProducerTokens, parseSimpleToml, printConfig, type AsterConfig, type IdentityData, } from './config.js';
|
|
41
|
+
export { AsterLogger, createLogger, withRequestContext, getRequestContext, type RequestContext, type LoggerOptions, } from './logging.js';
|
|
42
|
+
export { HealthServer, ConnectionMetrics as HealthConnectionMetrics, AdmissionMetrics as HealthAdmissionMetrics, getConnectionMetrics, getAdmissionMetrics, resetMetrics, checkHealth, checkReady, healthStatus, readyStatus, metricsSnapshot, type HealthState, type HealthMetrics, } from './health.js';
|
|
43
|
+
export { AsterServer, AsterClientWrapper, ProxyClient, AdmissionDeniedError, type AsterServerOptions, type AsterClientOptions, } from './runtime.js';
|
|
44
|
+
export { loadProducerTokens, resolveAsterAddress, startRegistrationLoop, type ProducerTokenEntry, type NodeInfo, type RegistrationLoopOptions, type RegistrationTransport, } from './registration.js';
|
|
45
|
+
export { anyOf, allOf } from './capabilities.js';
|
|
46
|
+
export { generateKeypair, generateRootKeypair, loadPrivateKey, loadPublicKey, verifySignature, sign, verify, ATTR_ROLE, ATTR_NAME, type EnrollmentCredential, type ConsumerEnrollmentCredential, canonicalJson, producerSigningBytes, consumerSigningBytes, credentialSigningBytes, signCredential, verifyCredentialSignature, hexToBytes, bytesToHex, } from './trust/credentials.js';
|
|
47
|
+
export { verifyConsumerCredential, verifyProducerCredential, checkOffline, checkRuntime, admit, type AdmissionResult, type AdmitOptions, } from './trust/admission.js';
|
|
48
|
+
export { AllowAllPolicy, DenyAllPolicy, MeshEndpointHook, CONSUMER_ADMISSION_ALPN, type ConnectionPolicy, type HookDecision, } from './trust/hooks.js';
|
|
49
|
+
export { MeshState, saveMeshState, loadMeshState, type PeerService, } from './trust/mesh.js';
|
|
50
|
+
export { handleProducerAdmission, serveProducerAdmission, PRODUCER_ADMISSION_ALPN, type ProducerAdmissionRequest, type ProducerAdmissionResponse, type ProducerAdmissionOptions, } from './trust/producer.js';
|
|
51
|
+
export { InMemoryNonceStore, type NonceStore, } from './trust/nonce.js';
|
|
52
|
+
export { evaluateCapability, extractCallerRoles, validateRcan, encodeRcan, decodeRcan, } from './trust/rcan.js';
|
|
53
|
+
export { verifyIID, getIIDBackend, MockIIDBackend, AWSIIDBackend, GCPIIDBackend, AzureIIDBackend, ATTR_IID_PROVIDER, ATTR_IID_ACCOUNT, ATTR_IID_REGION, ATTR_IID_ROLE_ARN, type IIDBackend, } from './trust/iid.js';
|
|
54
|
+
export { ClockDriftTracker, computeDrift, shouldIsolate, DEFAULT_CLOCK_DRIFT_CONFIG, type ClockDriftConfig, } from './trust/clock.js';
|
|
55
|
+
export { ProducerMessageType, deriveGossipTopic, producerMessageSigningBytes, signProducerMessage, verifyProducerMessage, handleProducerMessage, encodeIntroducePayload, encodeDepartPayload, encodeContractPublishedPayload, encodeLeaseUpdatePayload, startLeaseHeartbeat, runLeaseHeartbeat, type ProducerMessage, type HandleMessageOptions, } from './trust/gossip.js';
|
|
56
|
+
export { startFoundingNode, joinMesh, applyAdmissionResponse, handleAdmissionRpc, handleProducerAdmissionConnection, makeEphemeralMeshState, type BootstrapConfig, } from './trust/bootstrap.js';
|
|
57
|
+
export { ConnectionMetrics, AdmissionMetrics } from './metrics.js';
|
|
58
|
+
export { RpcServer, type ServerOptions } from './server.js';
|
|
59
|
+
export { RegistryClient, registryKey, type RegistryArtifactRef, type EndpointLease as RegistryEndpointLease, } from './registry/client.js';
|
|
60
|
+
export { RegistryPublisher, type RegistryPublisherOptions, } from './registry/publisher.js';
|
|
61
|
+
export { RegistryACL, } from './registry/acl.js';
|
|
62
|
+
export { RegistryGossip, } from './registry/gossip.js';
|
|
63
|
+
export { contractKey, versionKey, channelKey, tagKey, leaseKey, leasePrefix, aclKey, configKey, REGISTRY_PREFIXES, } from './registry/keys.js';
|
|
64
|
+
export { HealthStatus, GossipEventType, validate as validateHealthStatus, isLeaseFresh, isLeaseRoutable, type ServiceSummary as RegistryServiceSummary, type ArtifactRef as RegistryArtifactModel, type EndpointLease, type GossipEvent, } from './registry/models.js';
|
|
65
|
+
export { performAdmission, consumerCredToJson, consumerCredFromJson, handleConsumerAdmissionRpc, handleConsumerAdmissionConnection, serveConsumerAdmission, type ConsumerAdmissionRequest, type ConsumerAdmissionResponse, type ConsumerAdmissionOpts, type ServiceSummary, } from './trust/consumer.js';
|
|
66
|
+
export { verifyAttestation, verifyToken, verifyProofOfPossession, buildChallengeBytes, handleDelegatedAdmissionConnection, type SigningKeyAttestation, type EnrollmentToken, type DelegatedAdmissionPolicy, type DelegatedAdmissionResult, type BiStream, type AdmissionConnection, } from './trust/delegated.js';
|
|
67
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|