gennet.js 0.1.0
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/README.md +136 -0
- package/dist/index.cjs +311 -0
- package/dist/index.d.cts +261 -0
- package/dist/index.d.mts +261 -0
- package/dist/index.d.ts +261 -0
- package/dist/index.mjs +301 -0
- package/package.json +60 -0
package/README.md
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# gennet.js
|
|
2
|
+
|
|
3
|
+
Client library for [GenNet](https://github.com/cryptagoEU/gennet.js) — interact with GenNet nodes via JSON-RPC.
|
|
4
|
+
|
|
5
|
+
- Zero runtime dependencies
|
|
6
|
+
- Browser + Node.js compatible
|
|
7
|
+
- WebSocket & HTTP providers
|
|
8
|
+
- Full TypeScript support (ESM + CJS)
|
|
9
|
+
- Subscriptions (logs, messages, mempool)
|
|
10
|
+
|
|
11
|
+
## Installation
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install gennet.js
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Quick Start
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
import { GenNet } from 'gennet.js';
|
|
21
|
+
|
|
22
|
+
const gennet = new GenNet('ws://localhost:18789');
|
|
23
|
+
await gennet.connect();
|
|
24
|
+
|
|
25
|
+
// Node info
|
|
26
|
+
const info = await gennet.admin.nodeInfo();
|
|
27
|
+
console.log(info.address, info.peers);
|
|
28
|
+
|
|
29
|
+
// Send encrypted message
|
|
30
|
+
await gennet.net.send('0xRecipientAddress', 'Hello!');
|
|
31
|
+
|
|
32
|
+
// Disconnect
|
|
33
|
+
gennet.disconnect();
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Providers
|
|
37
|
+
|
|
38
|
+
gennet.js auto-detects the provider from the URL:
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
// WebSocket (supports subscriptions)
|
|
42
|
+
const gennet = new GenNet('ws://localhost:18789');
|
|
43
|
+
|
|
44
|
+
// HTTP (stateless, no subscriptions)
|
|
45
|
+
const gennet = new GenNet('http://localhost:18790');
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
You can also pass a custom provider:
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
import { GenNet, WebSocketProvider } from 'gennet.js';
|
|
52
|
+
|
|
53
|
+
const provider = new WebSocketProvider('ws://localhost:18789');
|
|
54
|
+
const gennet = new GenNet(provider);
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## API
|
|
58
|
+
|
|
59
|
+
### admin
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
await gennet.admin.nodeInfo(); // Node status, peers, uptime, modules
|
|
63
|
+
await gennet.admin.shutdown(); // Shutdown the gateway
|
|
64
|
+
await gennet.admin.modules(); // List all modules and their state
|
|
65
|
+
await gennet.admin.startModule('net'); // Start a module
|
|
66
|
+
await gennet.admin.stopModule('net'); // Stop a module
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### net
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
await gennet.net.peers(); // List known peers
|
|
73
|
+
await gennet.net.connect('/ip4/127.0.0.1/tcp/9000/p2p/…'); // Connect to peer
|
|
74
|
+
await gennet.net.send('0x…', 'Hello'); // Send encrypted message
|
|
75
|
+
await gennet.net.peerAgent('0x…', 'What is 2+2?'); // Remote agent execution
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### personal
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
await gennet.personal.newIdentity('password'); // Create new identity
|
|
82
|
+
await gennet.personal.listIdentities(); // List keystore identities
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### agent
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
await gennet.agent.run('What is 2+2?'); // Run local agent prompt
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### mempool
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
await gennet.mempool.broadcast('Hello network!'); // Broadcast via GossipSub
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Subscriptions
|
|
98
|
+
|
|
99
|
+
Subscriptions are available over WebSocket. Topics: `logs`, `messages`, `mempool`.
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
const sub = await gennet.subscribe('messages', (data) => {
|
|
103
|
+
console.log('New message:', data);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// Unsubscribe
|
|
107
|
+
await sub.unsubscribe();
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Raw RPC
|
|
111
|
+
|
|
112
|
+
For methods not covered by the namespaces:
|
|
113
|
+
|
|
114
|
+
```typescript
|
|
115
|
+
const result = await gennet.request('custom_method', { key: 'value' });
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Error Handling
|
|
119
|
+
|
|
120
|
+
RPC errors throw a typed `RpcError`:
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
import { RpcError } from 'gennet.js';
|
|
124
|
+
|
|
125
|
+
try {
|
|
126
|
+
await gennet.net.send('0xInvalid', 'Hello');
|
|
127
|
+
} catch (err) {
|
|
128
|
+
if (err instanceof RpcError) {
|
|
129
|
+
console.error(err.message, err.code);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## License
|
|
135
|
+
|
|
136
|
+
MIT
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
class RpcError extends Error {
|
|
4
|
+
code;
|
|
5
|
+
data;
|
|
6
|
+
constructor(message, code, data) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = "RpcError";
|
|
9
|
+
this.code = code;
|
|
10
|
+
this.data = data;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
let requestId = 0;
|
|
15
|
+
class HttpProvider {
|
|
16
|
+
url;
|
|
17
|
+
constructor(url) {
|
|
18
|
+
this.url = url;
|
|
19
|
+
}
|
|
20
|
+
get connected() {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
async request(method, params) {
|
|
24
|
+
const id = ++requestId;
|
|
25
|
+
const body = JSON.stringify({ jsonrpc: "2.0", id, method, params });
|
|
26
|
+
const res = await fetch(this.url, {
|
|
27
|
+
method: "POST",
|
|
28
|
+
headers: { "Content-Type": "application/json" },
|
|
29
|
+
body
|
|
30
|
+
});
|
|
31
|
+
if (!res.ok) {
|
|
32
|
+
throw new RpcError(`HTTP ${res.status}: ${res.statusText}`, -32e3);
|
|
33
|
+
}
|
|
34
|
+
const json = await res.json();
|
|
35
|
+
if ("error" in json) {
|
|
36
|
+
const err = json.error;
|
|
37
|
+
throw new RpcError(err.message, err.code, err.data);
|
|
38
|
+
}
|
|
39
|
+
return json.result;
|
|
40
|
+
}
|
|
41
|
+
// HTTP unterstützt keine Push-Notifications
|
|
42
|
+
on(_event, _listener) {
|
|
43
|
+
}
|
|
44
|
+
off(_event, _listener) {
|
|
45
|
+
}
|
|
46
|
+
disconnect() {
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const DEFAULT_TIMEOUT = 3e4;
|
|
51
|
+
class WebSocketProvider {
|
|
52
|
+
url;
|
|
53
|
+
timeout;
|
|
54
|
+
ws = null;
|
|
55
|
+
requestId = 0;
|
|
56
|
+
pending = /* @__PURE__ */ new Map();
|
|
57
|
+
listeners = /* @__PURE__ */ new Set();
|
|
58
|
+
connectPromise = null;
|
|
59
|
+
constructor(url, timeout = DEFAULT_TIMEOUT) {
|
|
60
|
+
this.url = url;
|
|
61
|
+
this.timeout = timeout;
|
|
62
|
+
}
|
|
63
|
+
get connected() {
|
|
64
|
+
return this.ws !== null && this.ws.readyState === WebSocket.OPEN;
|
|
65
|
+
}
|
|
66
|
+
async connect() {
|
|
67
|
+
if (this.connected) return;
|
|
68
|
+
if (this.connectPromise) return this.connectPromise;
|
|
69
|
+
this.connectPromise = new Promise((resolve, reject) => {
|
|
70
|
+
this.ws = new WebSocket(this.url);
|
|
71
|
+
this.ws.onopen = () => {
|
|
72
|
+
this.connectPromise = null;
|
|
73
|
+
resolve();
|
|
74
|
+
};
|
|
75
|
+
this.ws.onerror = (ev) => {
|
|
76
|
+
this.connectPromise = null;
|
|
77
|
+
reject(new Error(`WebSocket-Verbindung fehlgeschlagen: ${this.url} (${ev})`));
|
|
78
|
+
};
|
|
79
|
+
this.ws.onmessage = (ev) => {
|
|
80
|
+
this.handleMessage(typeof ev.data === "string" ? ev.data : String(ev.data));
|
|
81
|
+
};
|
|
82
|
+
this.ws.onclose = () => {
|
|
83
|
+
this.connectPromise = null;
|
|
84
|
+
for (const [id, req] of this.pending) {
|
|
85
|
+
clearTimeout(req.timer);
|
|
86
|
+
req.reject(new Error("WebSocket-Verbindung geschlossen"));
|
|
87
|
+
this.pending.delete(id);
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
});
|
|
91
|
+
return this.connectPromise;
|
|
92
|
+
}
|
|
93
|
+
async request(method, params) {
|
|
94
|
+
if (!this.connected) {
|
|
95
|
+
await this.connect();
|
|
96
|
+
}
|
|
97
|
+
const id = ++this.requestId;
|
|
98
|
+
const payload = JSON.stringify({ jsonrpc: "2.0", id, method, params });
|
|
99
|
+
return new Promise((resolve, reject) => {
|
|
100
|
+
const timer = setTimeout(() => {
|
|
101
|
+
this.pending.delete(id);
|
|
102
|
+
reject(new RpcError(`Timeout nach ${this.timeout}ms f\xFCr ${method}`, -32e3));
|
|
103
|
+
}, this.timeout);
|
|
104
|
+
this.pending.set(id, { resolve, reject, timer });
|
|
105
|
+
this.ws.send(payload);
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
on(_event, listener) {
|
|
109
|
+
this.listeners.add(listener);
|
|
110
|
+
}
|
|
111
|
+
off(_event, listener) {
|
|
112
|
+
this.listeners.delete(listener);
|
|
113
|
+
}
|
|
114
|
+
disconnect() {
|
|
115
|
+
if (this.ws) {
|
|
116
|
+
this.ws.close();
|
|
117
|
+
this.ws = null;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// ── Private ────────────────────────────────────────────────
|
|
121
|
+
handleMessage(raw) {
|
|
122
|
+
let msg;
|
|
123
|
+
try {
|
|
124
|
+
msg = JSON.parse(raw);
|
|
125
|
+
} catch {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
if (msg.id !== void 0 && ("result" in msg || "error" in msg)) {
|
|
129
|
+
const response = msg;
|
|
130
|
+
const pending = this.pending.get(response.id);
|
|
131
|
+
if (pending) {
|
|
132
|
+
clearTimeout(pending.timer);
|
|
133
|
+
this.pending.delete(response.id);
|
|
134
|
+
if ("error" in response) {
|
|
135
|
+
const err = response.error;
|
|
136
|
+
pending.reject(new RpcError(err.message, err.code, err.data));
|
|
137
|
+
} else {
|
|
138
|
+
pending.resolve(response.result);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
if ("method" in msg && "params" in msg) {
|
|
144
|
+
const notification = msg;
|
|
145
|
+
for (const listener of this.listeners) {
|
|
146
|
+
listener(notification);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
class Admin {
|
|
153
|
+
constructor(provider) {
|
|
154
|
+
this.provider = provider;
|
|
155
|
+
}
|
|
156
|
+
/** Node-Info: Status, PeerId, Adresse, Peers, Uptime, Module. */
|
|
157
|
+
async nodeInfo() {
|
|
158
|
+
return await this.provider.request("admin_nodeInfo");
|
|
159
|
+
}
|
|
160
|
+
/** Gateway herunterfahren. */
|
|
161
|
+
async shutdown() {
|
|
162
|
+
return await this.provider.request("admin_shutdown");
|
|
163
|
+
}
|
|
164
|
+
/** Alle Module und ihren Status auflisten. */
|
|
165
|
+
async modules() {
|
|
166
|
+
return await this.provider.request("admin_modules");
|
|
167
|
+
}
|
|
168
|
+
/** Ein Modul starten. */
|
|
169
|
+
async startModule(name) {
|
|
170
|
+
return await this.provider.request("admin_startModule", { name });
|
|
171
|
+
}
|
|
172
|
+
/** Ein Modul stoppen. */
|
|
173
|
+
async stopModule(name) {
|
|
174
|
+
return await this.provider.request("admin_stopModule", { name });
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
class Net {
|
|
179
|
+
constructor(provider) {
|
|
180
|
+
this.provider = provider;
|
|
181
|
+
}
|
|
182
|
+
/** Alle bekannten Peers auflisten. */
|
|
183
|
+
async peers() {
|
|
184
|
+
return await this.provider.request("net_peers");
|
|
185
|
+
}
|
|
186
|
+
/** Mit einem Peer über Multiaddr verbinden. */
|
|
187
|
+
async connect(multiaddr) {
|
|
188
|
+
return await this.provider.request("net_connect", { multiaddr });
|
|
189
|
+
}
|
|
190
|
+
/** Verschlüsselte Nachricht an einen Peer senden. */
|
|
191
|
+
async send(address, text) {
|
|
192
|
+
return await this.provider.request("net_send", { address, text });
|
|
193
|
+
}
|
|
194
|
+
/** Agent-Prompt auf einem Remote-Peer ausführen (ECIES-verschlüsselt). */
|
|
195
|
+
async peerAgent(address, prompt) {
|
|
196
|
+
return await this.provider.request("net_peerAgent", { address, prompt });
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
class Personal {
|
|
201
|
+
constructor(provider) {
|
|
202
|
+
this.provider = provider;
|
|
203
|
+
}
|
|
204
|
+
/** Neue Identität erstellen und im Keystore speichern. */
|
|
205
|
+
async newIdentity(password) {
|
|
206
|
+
return await this.provider.request("personal_newIdentity", { password });
|
|
207
|
+
}
|
|
208
|
+
/** Alle Identitäten im Keystore auflisten. */
|
|
209
|
+
async listIdentities() {
|
|
210
|
+
return await this.provider.request("personal_listIdentities");
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
class Agent {
|
|
215
|
+
constructor(provider) {
|
|
216
|
+
this.provider = provider;
|
|
217
|
+
}
|
|
218
|
+
/** Agent-Loop mit einem Prompt ausführen. */
|
|
219
|
+
async run(input) {
|
|
220
|
+
return await this.provider.request("agent_run", { input });
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
class Mempool {
|
|
225
|
+
constructor(provider) {
|
|
226
|
+
this.provider = provider;
|
|
227
|
+
}
|
|
228
|
+
/** Nachricht ans Netzwerk broadcasten (GossipSub). */
|
|
229
|
+
async broadcast(message) {
|
|
230
|
+
return await this.provider.request("mempool_broadcast", { message });
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
class GenNet {
|
|
235
|
+
admin;
|
|
236
|
+
net;
|
|
237
|
+
personal;
|
|
238
|
+
agent;
|
|
239
|
+
mempool;
|
|
240
|
+
provider;
|
|
241
|
+
constructor(providerOrUrl) {
|
|
242
|
+
if (typeof providerOrUrl === "string") {
|
|
243
|
+
this.provider = GenNet.createProvider(providerOrUrl);
|
|
244
|
+
} else {
|
|
245
|
+
this.provider = providerOrUrl;
|
|
246
|
+
}
|
|
247
|
+
this.admin = new Admin(this.provider);
|
|
248
|
+
this.net = new Net(this.provider);
|
|
249
|
+
this.personal = new Personal(this.provider);
|
|
250
|
+
this.agent = new Agent(this.provider);
|
|
251
|
+
this.mempool = new Mempool(this.provider);
|
|
252
|
+
}
|
|
253
|
+
/** Verbindung herstellen (nur bei WebSocket nötig). */
|
|
254
|
+
async connect() {
|
|
255
|
+
if (this.provider.connect) {
|
|
256
|
+
await this.provider.connect();
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/** Verbindung schließen. */
|
|
260
|
+
disconnect() {
|
|
261
|
+
this.provider.disconnect();
|
|
262
|
+
}
|
|
263
|
+
/** Ob eine aktive Verbindung besteht. */
|
|
264
|
+
get connected() {
|
|
265
|
+
return this.provider.connected;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Subscription starten (nur WebSocket).
|
|
269
|
+
* Topics: 'logs', 'messages', 'mempool'.
|
|
270
|
+
*/
|
|
271
|
+
async subscribe(topic, callback) {
|
|
272
|
+
const subId = await this.provider.request("gennet_subscribe", [topic]);
|
|
273
|
+
const listener = (notification) => {
|
|
274
|
+
if (notification.method === "gennet_subscription" && notification.params.subscription === subId) {
|
|
275
|
+
callback(notification.params.result);
|
|
276
|
+
}
|
|
277
|
+
};
|
|
278
|
+
this.provider.on("notification", listener);
|
|
279
|
+
return {
|
|
280
|
+
id: subId,
|
|
281
|
+
unsubscribe: async () => {
|
|
282
|
+
this.provider.off("notification", listener);
|
|
283
|
+
return await this.provider.request("gennet_unsubscribe", [subId]);
|
|
284
|
+
}
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
/** Raw JSON-RPC Request (für erweiterte Nutzung). */
|
|
288
|
+
async request(method, params) {
|
|
289
|
+
return this.provider.request(method, params);
|
|
290
|
+
}
|
|
291
|
+
// ── Private ────────────────────────────────────────────────
|
|
292
|
+
static createProvider(url) {
|
|
293
|
+
if (url.startsWith("ws://") || url.startsWith("wss://")) {
|
|
294
|
+
return new WebSocketProvider(url);
|
|
295
|
+
}
|
|
296
|
+
if (url.startsWith("http://") || url.startsWith("https://")) {
|
|
297
|
+
return new HttpProvider(url);
|
|
298
|
+
}
|
|
299
|
+
throw new Error(`Unbekanntes URL-Schema: ${url} (erwartet: ws://, wss://, http://, https://)`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
exports.Admin = Admin;
|
|
304
|
+
exports.Agent = Agent;
|
|
305
|
+
exports.GenNet = GenNet;
|
|
306
|
+
exports.HttpProvider = HttpProvider;
|
|
307
|
+
exports.Mempool = Mempool;
|
|
308
|
+
exports.Net = Net;
|
|
309
|
+
exports.Personal = Personal;
|
|
310
|
+
exports.RpcError = RpcError;
|
|
311
|
+
exports.WebSocketProvider = WebSocketProvider;
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
interface JsonRpcRequest {
|
|
2
|
+
jsonrpc: '2.0';
|
|
3
|
+
id: string | number;
|
|
4
|
+
method: string;
|
|
5
|
+
params?: Record<string, unknown> | unknown[];
|
|
6
|
+
}
|
|
7
|
+
interface JsonRpcSuccessResponse {
|
|
8
|
+
jsonrpc: '2.0';
|
|
9
|
+
id: string | number;
|
|
10
|
+
result: unknown;
|
|
11
|
+
}
|
|
12
|
+
interface JsonRpcErrorResponse {
|
|
13
|
+
jsonrpc: '2.0';
|
|
14
|
+
id: string | number;
|
|
15
|
+
error: {
|
|
16
|
+
code: number;
|
|
17
|
+
message: string;
|
|
18
|
+
data?: unknown;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
type JsonRpcResponse = JsonRpcSuccessResponse | JsonRpcErrorResponse;
|
|
22
|
+
interface JsonRpcNotification {
|
|
23
|
+
jsonrpc: '2.0';
|
|
24
|
+
method: string;
|
|
25
|
+
params: {
|
|
26
|
+
subscription: string;
|
|
27
|
+
result: unknown;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
declare class RpcError extends Error {
|
|
31
|
+
readonly code: number;
|
|
32
|
+
readonly data?: unknown;
|
|
33
|
+
constructor(message: string, code: number, data?: unknown);
|
|
34
|
+
}
|
|
35
|
+
type GatewayState = 'INITIALIZING' | 'READY' | 'RUNNING' | 'STOPPED';
|
|
36
|
+
interface ModuleInfo {
|
|
37
|
+
name: string;
|
|
38
|
+
version: string;
|
|
39
|
+
state: string;
|
|
40
|
+
status?: string;
|
|
41
|
+
}
|
|
42
|
+
interface NodeInfo {
|
|
43
|
+
state: GatewayState;
|
|
44
|
+
peerId: string | null;
|
|
45
|
+
address: string;
|
|
46
|
+
peers: number;
|
|
47
|
+
knownPeers: number;
|
|
48
|
+
uptime: number;
|
|
49
|
+
multiaddrs: string[];
|
|
50
|
+
tcpAddrs: string[];
|
|
51
|
+
circuitAddrs: string[];
|
|
52
|
+
relay: boolean;
|
|
53
|
+
listenPort: number;
|
|
54
|
+
datadir: string;
|
|
55
|
+
modules: ModuleInfo[];
|
|
56
|
+
}
|
|
57
|
+
interface PeerInfo {
|
|
58
|
+
peerId: string;
|
|
59
|
+
address: string;
|
|
60
|
+
multiaddr: string;
|
|
61
|
+
connected: boolean;
|
|
62
|
+
}
|
|
63
|
+
interface AgentResult {
|
|
64
|
+
ok: boolean;
|
|
65
|
+
response?: string;
|
|
66
|
+
toolCalls?: Array<{
|
|
67
|
+
name: string;
|
|
68
|
+
}>;
|
|
69
|
+
tokensUsed?: {
|
|
70
|
+
input: number;
|
|
71
|
+
output: number;
|
|
72
|
+
};
|
|
73
|
+
error?: string;
|
|
74
|
+
}
|
|
75
|
+
interface IdentityInfo {
|
|
76
|
+
index: number;
|
|
77
|
+
address: string;
|
|
78
|
+
filename: string;
|
|
79
|
+
}
|
|
80
|
+
type SubscriptionTopic = 'logs' | 'messages' | 'mempool';
|
|
81
|
+
interface Subscription {
|
|
82
|
+
id: string;
|
|
83
|
+
unsubscribe: () => Promise<boolean>;
|
|
84
|
+
}
|
|
85
|
+
interface Provider {
|
|
86
|
+
/** JSON-RPC Request senden und auf Response warten. */
|
|
87
|
+
request(method: string, params?: Record<string, unknown> | unknown[]): Promise<unknown>;
|
|
88
|
+
/** Listener für Push-Notifications (Subscriptions). */
|
|
89
|
+
on(event: 'notification', listener: (notification: JsonRpcNotification) => void): void;
|
|
90
|
+
/** Listener entfernen. */
|
|
91
|
+
off(event: 'notification', listener: (notification: JsonRpcNotification) => void): void;
|
|
92
|
+
/** Verbindung schließen. */
|
|
93
|
+
disconnect(): void;
|
|
94
|
+
/** Verbindung herstellen (bei WebSocket). */
|
|
95
|
+
connect?(): Promise<void>;
|
|
96
|
+
/** Ob eine aktive Verbindung besteht. */
|
|
97
|
+
readonly connected: boolean;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** admin Namespace — Node-Administration. */
|
|
101
|
+
declare class Admin {
|
|
102
|
+
private readonly provider;
|
|
103
|
+
constructor(provider: Provider);
|
|
104
|
+
/** Node-Info: Status, PeerId, Adresse, Peers, Uptime, Module. */
|
|
105
|
+
nodeInfo(): Promise<NodeInfo>;
|
|
106
|
+
/** Gateway herunterfahren. */
|
|
107
|
+
shutdown(): Promise<{
|
|
108
|
+
ok: boolean;
|
|
109
|
+
}>;
|
|
110
|
+
/** Alle Module und ihren Status auflisten. */
|
|
111
|
+
modules(): Promise<{
|
|
112
|
+
modules: ModuleInfo[];
|
|
113
|
+
}>;
|
|
114
|
+
/** Ein Modul starten. */
|
|
115
|
+
startModule(name: string): Promise<{
|
|
116
|
+
name: string;
|
|
117
|
+
state: string;
|
|
118
|
+
}>;
|
|
119
|
+
/** Ein Modul stoppen. */
|
|
120
|
+
stopModule(name: string): Promise<{
|
|
121
|
+
name: string;
|
|
122
|
+
state: string;
|
|
123
|
+
}>;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** net Namespace — P2P-Netzwerk. */
|
|
127
|
+
declare class Net {
|
|
128
|
+
private readonly provider;
|
|
129
|
+
constructor(provider: Provider);
|
|
130
|
+
/** Alle bekannten Peers auflisten. */
|
|
131
|
+
peers(): Promise<{
|
|
132
|
+
peers: PeerInfo[];
|
|
133
|
+
}>;
|
|
134
|
+
/** Mit einem Peer über Multiaddr verbinden. */
|
|
135
|
+
connect(multiaddr: string): Promise<{
|
|
136
|
+
peerId: string;
|
|
137
|
+
connected: boolean;
|
|
138
|
+
}>;
|
|
139
|
+
/** Verschlüsselte Nachricht an einen Peer senden. */
|
|
140
|
+
send(address: string, text: string): Promise<{
|
|
141
|
+
sent: boolean;
|
|
142
|
+
to: string;
|
|
143
|
+
}>;
|
|
144
|
+
/** Agent-Prompt auf einem Remote-Peer ausführen (ECIES-verschlüsselt). */
|
|
145
|
+
peerAgent(address: string, prompt: string): Promise<AgentResult>;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/** personal Namespace — Identity/Keystore-Management. */
|
|
149
|
+
declare class Personal {
|
|
150
|
+
private readonly provider;
|
|
151
|
+
constructor(provider: Provider);
|
|
152
|
+
/** Neue Identität erstellen und im Keystore speichern. */
|
|
153
|
+
newIdentity(password: string): Promise<{
|
|
154
|
+
address: string;
|
|
155
|
+
path: string;
|
|
156
|
+
}>;
|
|
157
|
+
/** Alle Identitäten im Keystore auflisten. */
|
|
158
|
+
listIdentities(): Promise<{
|
|
159
|
+
identities: IdentityInfo[];
|
|
160
|
+
}>;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/** agent Namespace — Lokaler AI-Agent. */
|
|
164
|
+
declare class Agent {
|
|
165
|
+
private readonly provider;
|
|
166
|
+
constructor(provider: Provider);
|
|
167
|
+
/** Agent-Loop mit einem Prompt ausführen. */
|
|
168
|
+
run(input: string): Promise<AgentResult>;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/** mempool Namespace — Transaction Mempool. */
|
|
172
|
+
declare class Mempool {
|
|
173
|
+
private readonly provider;
|
|
174
|
+
constructor(provider: Provider);
|
|
175
|
+
/** Nachricht ans Netzwerk broadcasten (GossipSub). */
|
|
176
|
+
broadcast(message: string): Promise<{
|
|
177
|
+
sent: boolean;
|
|
178
|
+
taskId: string;
|
|
179
|
+
}>;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* GenNet Client — Hauptklasse für die Interaktion mit einem GenNet-Node.
|
|
184
|
+
*
|
|
185
|
+
* @example
|
|
186
|
+
* ```typescript
|
|
187
|
+
* const gennet = new GenNet('ws://localhost:18789');
|
|
188
|
+
* await gennet.connect();
|
|
189
|
+
*
|
|
190
|
+
* const info = await gennet.admin.nodeInfo();
|
|
191
|
+
* const peers = await gennet.net.peers();
|
|
192
|
+
* await gennet.net.send('0x...', 'Hello');
|
|
193
|
+
*
|
|
194
|
+
* const sub = await gennet.subscribe('messages', (data) => console.log(data));
|
|
195
|
+
* await sub.unsubscribe();
|
|
196
|
+
*
|
|
197
|
+
* gennet.disconnect();
|
|
198
|
+
* ```
|
|
199
|
+
*/
|
|
200
|
+
declare class GenNet {
|
|
201
|
+
readonly admin: Admin;
|
|
202
|
+
readonly net: Net;
|
|
203
|
+
readonly personal: Personal;
|
|
204
|
+
readonly agent: Agent;
|
|
205
|
+
readonly mempool: Mempool;
|
|
206
|
+
private readonly provider;
|
|
207
|
+
constructor(providerOrUrl: string | Provider);
|
|
208
|
+
/** Verbindung herstellen (nur bei WebSocket nötig). */
|
|
209
|
+
connect(): Promise<void>;
|
|
210
|
+
/** Verbindung schließen. */
|
|
211
|
+
disconnect(): void;
|
|
212
|
+
/** Ob eine aktive Verbindung besteht. */
|
|
213
|
+
get connected(): boolean;
|
|
214
|
+
/**
|
|
215
|
+
* Subscription starten (nur WebSocket).
|
|
216
|
+
* Topics: 'logs', 'messages', 'mempool'.
|
|
217
|
+
*/
|
|
218
|
+
subscribe(topic: SubscriptionTopic, callback: (data: unknown) => void): Promise<Subscription>;
|
|
219
|
+
/** Raw JSON-RPC Request (für erweiterte Nutzung). */
|
|
220
|
+
request(method: string, params?: Record<string, unknown> | unknown[]): Promise<unknown>;
|
|
221
|
+
private static createProvider;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* WebSocket Provider — nutzt native WebSocket API (Browser + Node 22+).
|
|
226
|
+
* Unterstützt Subscriptions via Push-Notifications.
|
|
227
|
+
*/
|
|
228
|
+
declare class WebSocketProvider implements Provider {
|
|
229
|
+
private readonly url;
|
|
230
|
+
private readonly timeout;
|
|
231
|
+
private ws;
|
|
232
|
+
private requestId;
|
|
233
|
+
private pending;
|
|
234
|
+
private listeners;
|
|
235
|
+
private connectPromise;
|
|
236
|
+
constructor(url: string, timeout?: number);
|
|
237
|
+
get connected(): boolean;
|
|
238
|
+
connect(): Promise<void>;
|
|
239
|
+
request(method: string, params?: Record<string, unknown> | unknown[]): Promise<unknown>;
|
|
240
|
+
on(_event: 'notification', listener: (notification: JsonRpcNotification) => void): void;
|
|
241
|
+
off(_event: 'notification', listener: (notification: JsonRpcNotification) => void): void;
|
|
242
|
+
disconnect(): void;
|
|
243
|
+
private handleMessage;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* HTTP Provider — fetch-basiert, browser-kompatibel.
|
|
248
|
+
* Unterstützt keine Subscriptions (kein Push-Kanal).
|
|
249
|
+
*/
|
|
250
|
+
declare class HttpProvider implements Provider {
|
|
251
|
+
private readonly url;
|
|
252
|
+
constructor(url: string);
|
|
253
|
+
get connected(): boolean;
|
|
254
|
+
request(method: string, params?: Record<string, unknown> | unknown[]): Promise<unknown>;
|
|
255
|
+
on(_event: 'notification', _listener: (notification: JsonRpcNotification) => void): void;
|
|
256
|
+
off(_event: 'notification', _listener: (notification: JsonRpcNotification) => void): void;
|
|
257
|
+
disconnect(): void;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
export { Admin, Agent, GenNet, HttpProvider, Mempool, Net, Personal, RpcError, WebSocketProvider };
|
|
261
|
+
export type { AgentResult, GatewayState, IdentityInfo, JsonRpcErrorResponse, JsonRpcNotification, JsonRpcRequest, JsonRpcResponse, JsonRpcSuccessResponse, ModuleInfo, NodeInfo, PeerInfo, Provider, Subscription, SubscriptionTopic };
|