web3-tools-mcp 1.3.2 → 1.3.3
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/wallet-server.d.ts +3 -2
- package/dist/wallet-server.d.ts.map +1 -1
- package/dist/wallet-server.js +48 -11
- package/dist/wallet-server.js.map +1 -1
- package/package.json +1 -1
- package/src/wallet-server.ts +59 -12
package/dist/wallet-server.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export interface TransactionResponse {
|
|
|
10
10
|
result?: unknown;
|
|
11
11
|
error?: string;
|
|
12
12
|
}
|
|
13
|
-
declare class WalletServer {
|
|
13
|
+
export declare class WalletServer {
|
|
14
14
|
private app;
|
|
15
15
|
private httpServer;
|
|
16
16
|
private wss;
|
|
@@ -22,6 +22,8 @@ declare class WalletServer {
|
|
|
22
22
|
private setupExpress;
|
|
23
23
|
private setupWebSocket;
|
|
24
24
|
start(): Promise<void>;
|
|
25
|
+
private tryListen;
|
|
26
|
+
private startWithRetry;
|
|
25
27
|
stop(): Promise<void>;
|
|
26
28
|
openBrowser(): void;
|
|
27
29
|
sendTransaction(request: TransactionRequest): Promise<unknown>;
|
|
@@ -30,5 +32,4 @@ declare class WalletServer {
|
|
|
30
32
|
}
|
|
31
33
|
export declare function getWalletServer(): WalletServer;
|
|
32
34
|
export declare function startWalletServer(): Promise<WalletServer>;
|
|
33
|
-
export {};
|
|
34
35
|
//# sourceMappingURL=wallet-server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet-server.d.ts","sourceRoot":"","sources":["../src/wallet-server.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,kBAAkB,GAAG,cAAc,GAAG,iBAAiB,CAAA;IAC7D,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,OAAO,CAAA;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,
|
|
1
|
+
{"version":3,"file":"wallet-server.d.ts","sourceRoot":"","sources":["../src/wallet-server.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,kBAAkB,GAAG,cAAc,GAAG,iBAAiB,CAAA;IAC7D,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,OAAO,CAAA;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,GAAG,CAAiB;IAC5B,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,eAAe,CAGT;IACd,OAAO,CAAC,IAAI,CAAQ;IACpB,OAAO,CAAC,SAAS,CAAQ;gBAEb,IAAI,SAAO;IAUvB,OAAO,CAAC,YAAY;IAkBpB,OAAO,CAAC,cAAc;IAqChB,KAAK;IAQX,OAAO,CAAC,SAAS;YA6BH,cAAc;IAgCtB,IAAI;IAaV,WAAW;IAuBL,eAAe,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IAoDpE,WAAW,IAAI,OAAO;IAItB,OAAO,IAAI,MAAM;CAGlB;AAKD,wBAAgB,eAAe,IAAI,YAAY,CAK9C;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,YAAY,CAAC,CAI/D"}
|
package/dist/wallet-server.js
CHANGED
|
@@ -7,7 +7,7 @@ import { dirname, join } from 'path';
|
|
|
7
7
|
import { exec } from 'child_process';
|
|
8
8
|
const __filename = fileURLToPath(import.meta.url);
|
|
9
9
|
const __dirname = dirname(__filename);
|
|
10
|
-
class WalletServer {
|
|
10
|
+
export class WalletServer {
|
|
11
11
|
app;
|
|
12
12
|
httpServer;
|
|
13
13
|
wss;
|
|
@@ -76,22 +76,59 @@ class WalletServer {
|
|
|
76
76
|
if (this.isStarted) {
|
|
77
77
|
return;
|
|
78
78
|
}
|
|
79
|
+
return this.startWithRetry();
|
|
80
|
+
}
|
|
81
|
+
tryListen(port) {
|
|
79
82
|
return new Promise((resolve, reject) => {
|
|
80
|
-
|
|
83
|
+
// Create a fresh server for this attempt
|
|
84
|
+
const tempServer = createServer(this.app);
|
|
85
|
+
const cleanup = () => {
|
|
86
|
+
tempServer.removeAllListeners();
|
|
87
|
+
};
|
|
88
|
+
const onError = (error) => {
|
|
89
|
+
cleanup();
|
|
90
|
+
reject(error);
|
|
91
|
+
};
|
|
92
|
+
const onListening = () => {
|
|
93
|
+
cleanup();
|
|
94
|
+
// Success! Replace our server instance with this working one
|
|
95
|
+
this.httpServer = tempServer;
|
|
96
|
+
this.wss = new WebSocketServer({ server: this.httpServer });
|
|
97
|
+
this.setupWebSocket();
|
|
98
|
+
resolve();
|
|
99
|
+
};
|
|
100
|
+
tempServer.once('error', onError);
|
|
101
|
+
tempServer.once('listening', onListening);
|
|
102
|
+
tempServer.listen(port);
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
async startWithRetry(maxAttempts = 10) {
|
|
106
|
+
const originalPort = this.port;
|
|
107
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
108
|
+
try {
|
|
109
|
+
await this.tryListen(this.port);
|
|
110
|
+
// Success - server started
|
|
81
111
|
this.isStarted = true;
|
|
112
|
+
if (this.port !== originalPort) {
|
|
113
|
+
console.error(`[Wallet Server] Port ${originalPort} was in use, using port ${this.port} instead`);
|
|
114
|
+
}
|
|
82
115
|
console.error(`[Wallet Server] Running on http://localhost:${this.port}`);
|
|
83
|
-
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
const errnoError = error;
|
|
120
|
+
if (errnoError.code === 'EADDRINUSE') {
|
|
121
|
+
console.error(`[Wallet Server] Port ${this.port} in use, trying port ${this.port + 1}...`);
|
|
122
|
+
this.port++;
|
|
89
123
|
}
|
|
90
124
|
else {
|
|
91
|
-
|
|
125
|
+
throw error;
|
|
92
126
|
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// If we exhausted all attempts
|
|
130
|
+
throw new Error(`Failed to start wallet server: Ports ${originalPort}-${originalPort + maxAttempts - 1} are all in use. ` +
|
|
131
|
+
`Please free up a port or specify a different starting port.`);
|
|
95
132
|
}
|
|
96
133
|
async stop() {
|
|
97
134
|
return new Promise((resolve) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet-server.js","sourceRoot":"","sources":["../src/wallet-server.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAA;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAgBrC,MAAM,YAAY;
|
|
1
|
+
{"version":3,"file":"wallet-server.js","sourceRoot":"","sources":["../src/wallet-server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/wallet-server.ts
CHANGED
|
@@ -23,7 +23,7 @@ export interface TransactionResponse {
|
|
|
23
23
|
error?: string
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
class WalletServer {
|
|
26
|
+
export class WalletServer {
|
|
27
27
|
private app: express.Application
|
|
28
28
|
private httpServer: ReturnType<typeof createServer>
|
|
29
29
|
private wss: WebSocketServer
|
|
@@ -105,21 +105,68 @@ class WalletServer {
|
|
|
105
105
|
return
|
|
106
106
|
}
|
|
107
107
|
|
|
108
|
-
return
|
|
109
|
-
|
|
108
|
+
return this.startWithRetry()
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
private tryListen(port: number): Promise<void> {
|
|
112
|
+
return new Promise((resolve, reject) => {
|
|
113
|
+
// Create a fresh server for this attempt
|
|
114
|
+
const tempServer = createServer(this.app)
|
|
115
|
+
|
|
116
|
+
const cleanup = () => {
|
|
117
|
+
tempServer.removeAllListeners()
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const onError = (error: NodeJS.ErrnoException) => {
|
|
121
|
+
cleanup()
|
|
122
|
+
reject(error)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const onListening = () => {
|
|
126
|
+
cleanup()
|
|
127
|
+
// Success! Replace our server instance with this working one
|
|
128
|
+
this.httpServer = tempServer
|
|
129
|
+
this.wss = new WebSocketServer({ server: this.httpServer })
|
|
130
|
+
this.setupWebSocket()
|
|
131
|
+
resolve()
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
tempServer.once('error', onError)
|
|
135
|
+
tempServer.once('listening', onListening)
|
|
136
|
+
tempServer.listen(port)
|
|
137
|
+
})
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
private async startWithRetry(maxAttempts = 10): Promise<void> {
|
|
141
|
+
const originalPort = this.port
|
|
142
|
+
|
|
143
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
144
|
+
try {
|
|
145
|
+
await this.tryListen(this.port)
|
|
146
|
+
|
|
147
|
+
// Success - server started
|
|
110
148
|
this.isStarted = true
|
|
149
|
+
if (this.port !== originalPort) {
|
|
150
|
+
console.error(`[Wallet Server] Port ${originalPort} was in use, using port ${this.port} instead`)
|
|
151
|
+
}
|
|
111
152
|
console.error(`[Wallet Server] Running on http://localhost:${this.port}`)
|
|
112
|
-
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
this.
|
|
117
|
-
|
|
153
|
+
return
|
|
154
|
+
} catch (error: unknown) {
|
|
155
|
+
const errnoError = error as NodeJS.ErrnoException
|
|
156
|
+
if (errnoError.code === 'EADDRINUSE') {
|
|
157
|
+
console.error(`[Wallet Server] Port ${this.port} in use, trying port ${this.port + 1}...`)
|
|
158
|
+
this.port++
|
|
118
159
|
} else {
|
|
119
|
-
|
|
160
|
+
throw error
|
|
120
161
|
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// If we exhausted all attempts
|
|
166
|
+
throw new Error(
|
|
167
|
+
`Failed to start wallet server: Ports ${originalPort}-${originalPort + maxAttempts - 1} are all in use. ` +
|
|
168
|
+
`Please free up a port or specify a different starting port.`
|
|
169
|
+
)
|
|
123
170
|
}
|
|
124
171
|
|
|
125
172
|
async stop() {
|