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 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;
@@ -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 };