@waiaas/adapter-solana 2.12.0-rc.8 → 2.12.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 CHANGED
@@ -69,7 +69,7 @@ graph LR
69
69
  - **@waiaas/cli** — Command-line interface
70
70
  - **@waiaas/admin** — Preact-based Admin Web UI
71
71
  - **@waiaas/wallet-sdk** — Wallet Signing SDK for wallet app integration
72
- - **@waiaas/push-relay** — Push Relay Server (ntfy → push services)
72
+ - **@waiaas/push-relay** — Push Relay Server (daemonPushwoosh/FCM native push)
73
73
  - **@waiaas/skills** — Pre-built `.skill.md` instruction files for AI agents
74
74
 
75
75
  See [Architecture](docs/architecture.md) for the full technical deep-dive.
@@ -179,7 +179,7 @@ Access the admin panel at `http://127.0.0.1:3100/admin` with your master passwor
179
179
  - **Wallets** -- Create, manage, and monitor wallets across chains; RPC endpoints, balance monitoring, and WalletConnect settings
180
180
  - **Sessions** -- Issue and revoke agent session tokens; session lifetime and rate limit settings
181
181
  - **Policies** -- Configure 12 policy types with visual form editors; default deny and tier settings
182
- - **Notifications** -- Channel status and delivery logs; Telegram, Discord, ntfy, and Slack settings
182
+ - **Notifications** -- Channel status and delivery logs; Telegram, Discord, and Slack settings
183
183
  - **Security** -- Kill Switch emergency controls, AutoStop protection rules, JWT rotation
184
184
  - **System** -- API keys, display currency, price oracle, rate limits, log level, and daemon shutdown
185
185
 
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { SolanaAdapter } from './adapter.js';
2
2
  export { SolanaIncomingSubscriber, SolanaHeartbeat } from './solana-incoming-subscriber.js';
3
3
  export { parseSOLTransfer, parseSPLTransfers } from './incoming-tx-parser.js';
4
- export type { SolanaIncomingSubscriberConfig } from './solana-incoming-subscriber.js';
4
+ export type { SolanaIncomingSubscriberConfig, SolanaMonitorMode } from './solana-incoming-subscriber.js';
5
5
  export type { SolanaTransactionResult } from './incoming-tx-parser.js';
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAC5F,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,YAAY,EAAE,8BAA8B,EAAE,MAAM,iCAAiC,CAAC;AACtF,YAAY,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAC5F,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,YAAY,EAAE,8BAA8B,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACzG,YAAY,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -4,6 +4,7 @@
4
4
  * Detects incoming SOL, SPL, and Token-2022 transfers via:
5
5
  * - WebSocket: logsSubscribe({ mentions: [address] }) with getTransaction follow-up
6
6
  * - HTTP polling: getSignaturesForAddress + getTransaction (fallback / BackgroundWorkers)
7
+ * - Adaptive: starts with WS, auto-falls back to polling on repeated 429 (#454)
7
8
  *
8
9
  * SolanaHeartbeat sends getSlot() RPC ping every 60s to prevent provider inactivity timeout.
9
10
  *
@@ -11,12 +12,21 @@
11
12
  * Design doc 76 sections 3.1-3.7 (Solana subscriber), 5.3 (heartbeat)
12
13
  * IChainSubscriber 6-method interface from @waiaas/core
13
14
  */
14
- import type { IChainSubscriber, ChainType, IncomingTransaction } from '@waiaas/core';
15
+ import type { IChainSubscriber, ChainType, IncomingTransaction, ILogger } from '@waiaas/core';
16
+ export type SolanaMonitorMode = 'websocket' | 'polling' | 'adaptive';
15
17
  export interface SolanaIncomingSubscriberConfig {
16
18
  rpcUrl: string;
17
19
  wsUrl: string;
18
- mode?: 'websocket' | 'polling';
20
+ mode?: SolanaMonitorMode;
19
21
  generateId?: () => string;
22
+ /** Optional logger; when absent, rate-limit warnings are silently swallowed. */
23
+ logger?: ILogger;
24
+ /** Stagger delay (ms) between per-wallet WS subscriptions in connect(). Default: 300 */
25
+ staggerDelayMs?: number;
26
+ /** Consecutive 429 count before adaptive mode switches to polling. Default: 5 */
27
+ adaptiveThreshold?: number;
28
+ /** Interval (ms) between WS recovery attempts while in adaptive-polling. Default: 300_000 (5 min) */
29
+ wsRecoveryIntervalMs?: number;
20
30
  }
21
31
  /**
22
32
  * Sends periodic getSlot() RPC pings to prevent WebSocket inactivity timeout.
@@ -41,18 +51,39 @@ export declare class SolanaHeartbeat {
41
51
  *
42
52
  * Manages per-wallet WebSocket subscriptions via logsNotifications({ mentions: [addr] })
43
53
  * and provides a pollAll() method for HTTP-based fallback polling.
54
+ *
55
+ * Adaptive mode (#454): starts with WS, counts consecutive 429 errors, and
56
+ * automatically falls back to polling when the threshold is exceeded.
57
+ * Periodically re-attempts WS to restore real-time monitoring.
44
58
  */
45
59
  export declare class SolanaIncomingSubscriber implements IChainSubscriber {
46
60
  readonly chain: ChainType;
47
- private readonly mode;
61
+ private readonly configMode;
48
62
  private readonly generateId;
49
63
  private readonly rpc;
50
- private readonly rpcSubscriptions;
64
+ private rpcSubscriptions;
65
+ private readonly wsUrl;
51
66
  private readonly heartbeat;
52
67
  private readonly subscriptions;
68
+ private readonly logger?;
69
+ private readonly staggerDelayMs;
70
+ private readonly adaptiveThreshold;
71
+ private readonly wsRecoveryIntervalMs;
53
72
  private connected;
54
73
  private disconnectResolve;
74
+ /** Consecutive 429 error counter for adaptive mode */
75
+ private consecutive429Count;
76
+ /** Whether adaptive mode has switched to polling */
77
+ private adaptivePollingActive;
78
+ /** Timer for periodic WS recovery attempts */
79
+ private wsRecoveryTimer;
80
+ /** Whether a 429 rate-limit warning has been logged (log once) */
81
+ private rateLimitWarned;
82
+ /** Original process.stderr.write saved for restoration on destroy() */
83
+ private origStderrWrite;
55
84
  constructor(config: SolanaIncomingSubscriberConfig);
85
+ /** Current effective mode considering adaptive fallback */
86
+ get effectiveMode(): 'websocket' | 'polling';
56
87
  subscribe(walletId: string, addr: string, network: string, onTransaction: (tx: IncomingTransaction) => void): Promise<void>;
57
88
  unsubscribe(walletId: string): Promise<void>;
58
89
  subscribedWallets(): string[];
@@ -71,6 +102,15 @@ export declare class SolanaIncomingSubscriber implements IChainSubscriber {
71
102
  * Per-wallet errors are isolated (logged and skipped).
72
103
  */
73
104
  pollAll(): Promise<void>;
105
+ /**
106
+ * Record a 429 rate-limit error. If consecutive count exceeds threshold
107
+ * in adaptive mode, switch to polling and start WS recovery timer.
108
+ */
109
+ record429(): void;
110
+ /** Reset 429 counter (called on successful WS connection) */
111
+ reset429(): void;
112
+ /** Runtime mode switch for Admin Settings hot-reload (C-5) */
113
+ setMode(mode: SolanaMonitorMode): void;
74
114
  /**
75
115
  * Poll a single wallet for recent incoming transfers.
76
116
  */
@@ -79,6 +119,22 @@ export declare class SolanaIncomingSubscriber implements IChainSubscriber {
79
119
  * Start a fire-and-forget WebSocket subscription for a wallet.
80
120
  */
81
121
  private startWebSocketSubscription;
122
+ /**
123
+ * Start periodic WS recovery timer (adaptive mode).
124
+ * Attempts to re-create rpcSubscriptions and switch back to WS.
125
+ */
126
+ private startWsRecoveryTimer;
127
+ private stopWsRecoveryTimer;
128
+ /**
129
+ * C-3: Install a global stderr filter that intercepts `ws` library direct output (#454).
130
+ * The `ws` npm package writes "ws error: Unexpected server response: 429" to stderr
131
+ * during WebSocket handshake failures via console.error in its internal event handler.
132
+ * This bypasses all Node.js error handling including try/catch.
133
+ * The filter swallows these lines and routes 429s through record429() instead.
134
+ */
135
+ private installStderrFilter;
136
+ /** Restore original stderr.write on cleanup. */
137
+ private restoreStderrFilter;
82
138
  /**
83
139
  * Process a transaction result: parse SOL and SPL transfers and call onTransaction.
84
140
  */
@@ -1 +1 @@
1
- {"version":3,"file":"solana-incoming-subscriber.d.ts","sourceRoot":"","sources":["../src/solana-incoming-subscriber.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAgBrF,MAAM,WAAW,8BAA8B;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC;CAC3B;AAID;;;;GAIG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAU;IAEtC;;;;;OAKG;IACH,KAAK,CAAC,UAAU,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IAY/C,gCAAgC;IAChC,IAAI,IAAI,IAAI;CAMb;AAID;;;;;GAKG;AACH,qBAAa,wBAAyB,YAAW,gBAAgB;IAC/D,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAY;IAErC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA0B;IAC/C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAe;IAC1C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAY;IAChC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAyB;IAC1D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;IACnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwC;IAEtE,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,iBAAiB,CAA6B;gBAE1C,MAAM,EAAE,8BAA8B;IAS5C,SAAS,CACb,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,CAAC,EAAE,EAAE,mBAAmB,KAAK,IAAI,GAC/C,OAAO,CAAC,IAAI,CAAC;IAiBV,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUlD,iBAAiB,IAAI,MAAM,EAAE;IAMvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBxB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAMlC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAe9B;;;;OAIG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBtD;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAY9B;;OAEG;YACW,UAAU;IAiCxB;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAuDlC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA8B1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;CAM9B"}
1
+ {"version":3,"file":"solana-incoming-subscriber.d.ts","sourceRoot":"","sources":["../src/solana-incoming-subscriber.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@
4
4
  * Detects incoming SOL, SPL, and Token-2022 transfers via:
5
5
  * - WebSocket: logsSubscribe({ mentions: [address] }) with getTransaction follow-up
6
6
  * - HTTP polling: getSignaturesForAddress + getTransaction (fallback / BackgroundWorkers)
7
+ * - Adaptive: starts with WS, auto-falls back to polling on repeated 429 (#454)
7
8
  *
8
9
  * SolanaHeartbeat sends getSlot() RPC ping every 60s to prevent provider inactivity timeout.
9
10
  *
@@ -54,22 +55,59 @@ export class SolanaHeartbeat {
54
55
  *
55
56
  * Manages per-wallet WebSocket subscriptions via logsNotifications({ mentions: [addr] })
56
57
  * and provides a pollAll() method for HTTP-based fallback polling.
58
+ *
59
+ * Adaptive mode (#454): starts with WS, counts consecutive 429 errors, and
60
+ * automatically falls back to polling when the threshold is exceeded.
61
+ * Periodically re-attempts WS to restore real-time monitoring.
57
62
  */
58
63
  export class SolanaIncomingSubscriber {
59
64
  chain = 'solana';
60
- mode;
65
+ configMode;
61
66
  generateId;
62
67
  rpc;
63
68
  rpcSubscriptions;
69
+ wsUrl;
64
70
  heartbeat = new SolanaHeartbeat();
65
71
  subscriptions = new Map();
72
+ logger;
73
+ staggerDelayMs;
74
+ adaptiveThreshold;
75
+ wsRecoveryIntervalMs;
66
76
  connected = false;
67
77
  disconnectResolve = null;
78
+ /** Consecutive 429 error counter for adaptive mode */
79
+ consecutive429Count = 0;
80
+ /** Whether adaptive mode has switched to polling */
81
+ adaptivePollingActive = false;
82
+ /** Timer for periodic WS recovery attempts */
83
+ wsRecoveryTimer = null;
84
+ /** Whether a 429 rate-limit warning has been logged (log once) */
85
+ rateLimitWarned = false;
86
+ /** Original process.stderr.write saved for restoration on destroy() */
87
+ origStderrWrite = null;
68
88
  constructor(config) {
69
- this.mode = config.mode ?? 'websocket';
89
+ this.configMode = config.mode ?? 'adaptive';
70
90
  this.generateId = config.generateId ?? (() => crypto.randomUUID());
71
91
  this.rpc = createSolanaRpc(config.rpcUrl);
92
+ this.wsUrl = config.wsUrl;
72
93
  this.rpcSubscriptions = createSolanaRpcSubscriptions(config.wsUrl);
94
+ this.logger = config.logger;
95
+ this.staggerDelayMs = config.staggerDelayMs ?? 300;
96
+ this.adaptiveThreshold = config.adaptiveThreshold ?? 5;
97
+ this.wsRecoveryIntervalMs = config.wsRecoveryIntervalMs ?? 300_000;
98
+ // C-3: Install global stderr filter to suppress `ws` library's direct stderr output (#454).
99
+ // `ws` npm package writes "ws error: Unexpected server response: 429" directly to stderr
100
+ // during WebSocket handshake failures, bypassing all Node.js error handling.
101
+ // This filter intercepts those lines and routes them through record429() instead.
102
+ this.installStderrFilter();
103
+ }
104
+ /** Current effective mode considering adaptive fallback */
105
+ get effectiveMode() {
106
+ if (this.configMode === 'polling')
107
+ return 'polling';
108
+ if (this.configMode === 'adaptive' && this.adaptivePollingActive)
109
+ return 'polling';
110
+ return 'websocket';
73
111
  }
74
112
  // -- Subscription management (2) --
75
113
  async subscribe(walletId, addr, network, onTransaction) {
@@ -83,7 +121,7 @@ export class SolanaIncomingSubscriber {
83
121
  abortController,
84
122
  onTransaction,
85
123
  });
86
- if (this.mode === 'websocket' && this.connected) {
124
+ if (this.effectiveMode === 'websocket' && this.connected) {
87
125
  this.startWebSocketSubscription(walletId, addr, network, onTransaction, abortController);
88
126
  }
89
127
  }
@@ -104,9 +142,15 @@ export class SolanaIncomingSubscriber {
104
142
  // Start heartbeat: getSlot() HTTP RPC ping every 60s
105
143
  this.heartbeat.start(() => this.rpc.getSlot().send());
106
144
  // Start WebSocket subscriptions for all existing wallets
107
- if (this.mode === 'websocket') {
108
- for (const [walletId, sub] of this.subscriptions.entries()) {
109
- this.startWebSocketSubscription(walletId, sub.address, sub.network, sub.onTransaction, sub.abortController);
145
+ if (this.effectiveMode === 'websocket') {
146
+ const entries = Array.from(this.subscriptions.entries());
147
+ for (let i = 0; i < entries.length; i++) {
148
+ const entry = entries[i];
149
+ // C-1: Stagger subscriptions to avoid concurrent WS handshakes (#454)
150
+ if (i > 0 && this.staggerDelayMs > 0) {
151
+ await sleep(this.staggerDelayMs);
152
+ }
153
+ this.startWebSocketSubscription(entry[0], entry[1].address, entry[1].network, entry[1].onTransaction, entry[1].abortController);
110
154
  }
111
155
  }
112
156
  }
@@ -117,6 +161,8 @@ export class SolanaIncomingSubscriber {
117
161
  }
118
162
  async destroy() {
119
163
  this.heartbeat.stop();
164
+ this.stopWsRecoveryTimer();
165
+ this.restoreStderrFilter();
120
166
  // Abort all subscription AbortControllers
121
167
  for (const sub of this.subscriptions.values()) {
122
168
  sub.abortController.abort();
@@ -162,6 +208,45 @@ export class SolanaIncomingSubscriber {
162
208
  }
163
209
  }
164
210
  }
211
+ // -- Adaptive mode (#454) --
212
+ /**
213
+ * Record a 429 rate-limit error. If consecutive count exceeds threshold
214
+ * in adaptive mode, switch to polling and start WS recovery timer.
215
+ */
216
+ record429() {
217
+ this.consecutive429Count++;
218
+ // C-3: Log rate limit warning once via ILogger (not stderr)
219
+ if (!this.rateLimitWarned && this.logger) {
220
+ this.logger.warn('Solana RPC WebSocket rate limited (429). Tracking consecutive failures.');
221
+ this.rateLimitWarned = true;
222
+ }
223
+ if (this.configMode === 'adaptive' &&
224
+ !this.adaptivePollingActive &&
225
+ this.consecutive429Count >= this.adaptiveThreshold) {
226
+ this.adaptivePollingActive = true;
227
+ this.logger?.warn(`Solana adaptive mode: switched to polling after ${this.consecutive429Count} consecutive 429 errors. ` +
228
+ `Will attempt WS recovery every ${this.wsRecoveryIntervalMs / 1000}s.`);
229
+ this.startWsRecoveryTimer();
230
+ }
231
+ }
232
+ /** Reset 429 counter (called on successful WS connection) */
233
+ reset429() {
234
+ this.consecutive429Count = 0;
235
+ this.rateLimitWarned = false;
236
+ }
237
+ /** Runtime mode switch for Admin Settings hot-reload (C-5) */
238
+ setMode(mode) {
239
+ const oldMode = this.configMode;
240
+ this.configMode = mode;
241
+ if (mode !== oldMode) {
242
+ // Reset adaptive state on explicit mode change
243
+ this.adaptivePollingActive = false;
244
+ this.consecutive429Count = 0;
245
+ this.rateLimitWarned = false;
246
+ this.stopWsRecoveryTimer();
247
+ this.logger?.info(`Solana monitor mode changed: ${oldMode} → ${mode}`);
248
+ }
249
+ }
165
250
  // -- Private methods --
166
251
  /**
167
252
  * Poll a single wallet for recent incoming transfers.
@@ -203,6 +288,8 @@ export class SolanaIncomingSubscriber {
203
288
  const logNotifications = await this.rpcSubscriptions
204
289
  .logsNotifications({ mentions: [address(addr)] }, { commitment: 'confirmed' })
205
290
  .subscribe({ abortSignal: abortController.signal });
291
+ // Successful subscription: reset 429 counter
292
+ this.reset429();
206
293
  for await (const notification of logNotifications) {
207
294
  const { signature, err } = notification.value;
208
295
  if (err !== null)
@@ -231,15 +318,113 @@ export class SolanaIncomingSubscriber {
231
318
  }
232
319
  }
233
320
  }
234
- catch (_error) {
321
+ catch (error) {
235
322
  // If abort was requested, silently exit
236
323
  if (abortController.signal.aborted)
237
324
  return;
325
+ // C-2: Detect 429 rate-limit errors for adaptive mode (#454)
326
+ const errMsg = error instanceof Error ? error.message : String(error);
327
+ if (errMsg.includes('429')) {
328
+ this.record429();
329
+ }
238
330
  // Otherwise, signal disconnection
239
331
  this.disconnectResolve?.();
240
332
  }
241
333
  })();
242
334
  }
335
+ /**
336
+ * Start periodic WS recovery timer (adaptive mode).
337
+ * Attempts to re-create rpcSubscriptions and switch back to WS.
338
+ */
339
+ startWsRecoveryTimer() {
340
+ this.stopWsRecoveryTimer();
341
+ this.wsRecoveryTimer = setInterval(async () => {
342
+ if (!this.adaptivePollingActive || !this.connected)
343
+ return;
344
+ this.logger?.info('Solana adaptive mode: attempting WS recovery...');
345
+ try {
346
+ // Create fresh subscriptions transport
347
+ this.rpcSubscriptions = createSolanaRpcSubscriptions(this.wsUrl);
348
+ // Test with a single probe subscription (first wallet)
349
+ const firstEntry = this.subscriptions.entries().next();
350
+ if (firstEntry.done)
351
+ return;
352
+ const [, sub] = firstEntry.value;
353
+ const probeAbort = new AbortController();
354
+ const timeout = setTimeout(() => probeAbort.abort(), 10_000);
355
+ try {
356
+ await this.rpcSubscriptions
357
+ .logsNotifications({ mentions: [address(sub.address)] }, { commitment: 'confirmed' })
358
+ .subscribe({ abortSignal: probeAbort.signal });
359
+ // Probe succeeded -- switch back to WS mode
360
+ clearTimeout(timeout);
361
+ probeAbort.abort(); // Clean up probe subscription
362
+ this.adaptivePollingActive = false;
363
+ this.reset429();
364
+ this.stopWsRecoveryTimer();
365
+ this.logger?.info('Solana adaptive mode: WS recovered. Switching back to WebSocket mode.');
366
+ // Re-connect all wallet WS subscriptions with stagger
367
+ const entries = Array.from(this.subscriptions.entries());
368
+ for (let i = 0; i < entries.length; i++) {
369
+ const e = entries[i];
370
+ if (i > 0 && this.staggerDelayMs > 0) {
371
+ await sleep(this.staggerDelayMs);
372
+ }
373
+ // Create fresh abort controller for new subscription
374
+ const newAbort = new AbortController();
375
+ e[1].abortController = newAbort;
376
+ this.startWebSocketSubscription(e[0], e[1].address, e[1].network, e[1].onTransaction, newAbort);
377
+ }
378
+ }
379
+ catch {
380
+ clearTimeout(timeout);
381
+ probeAbort.abort();
382
+ this.record429();
383
+ this.logger?.info('Solana adaptive mode: WS recovery failed. Staying in polling mode.');
384
+ }
385
+ }
386
+ catch {
387
+ this.logger?.info('Solana adaptive mode: WS recovery failed (transport error). Staying in polling mode.');
388
+ }
389
+ }, this.wsRecoveryIntervalMs);
390
+ this.wsRecoveryTimer.unref();
391
+ }
392
+ stopWsRecoveryTimer() {
393
+ if (this.wsRecoveryTimer) {
394
+ clearInterval(this.wsRecoveryTimer);
395
+ this.wsRecoveryTimer = null;
396
+ }
397
+ }
398
+ /**
399
+ * C-3: Install a global stderr filter that intercepts `ws` library direct output (#454).
400
+ * The `ws` npm package writes "ws error: Unexpected server response: 429" to stderr
401
+ * during WebSocket handshake failures via console.error in its internal event handler.
402
+ * This bypasses all Node.js error handling including try/catch.
403
+ * The filter swallows these lines and routes 429s through record429() instead.
404
+ */
405
+ installStderrFilter() {
406
+ if (this.origStderrWrite)
407
+ return; // already installed
408
+ this.origStderrWrite = process.stderr.write;
409
+ const record = this.record429.bind(this);
410
+ const orig = this.origStderrWrite;
411
+ process.stderr.write = ((chunk, ...args) => {
412
+ if (typeof chunk === 'string' && chunk.includes('ws error:')) {
413
+ if (chunk.includes('429')) {
414
+ record();
415
+ }
416
+ return true; // swallow
417
+ }
418
+ return orig.call(process.stderr, chunk, ...args);
419
+ });
420
+ }
421
+ /** Restore original stderr.write on cleanup. */
422
+ restoreStderrFilter() {
423
+ if (this.origStderrWrite) {
424
+ process.stderr.write = this.origStderrWrite;
425
+ this.origStderrWrite = null;
426
+ }
427
+ }
243
428
  /**
244
429
  * Process a transaction result: parse SOL and SPL transfers and call onTransaction.
245
430
  */
@@ -268,4 +453,8 @@ export class SolanaIncomingSubscriber {
268
453
  return undefined;
269
454
  }
270
455
  }
456
+ // ─── Helpers ────────────────────────────────────────────────────
457
+ function sleep(ms) {
458
+ return new Promise((resolve) => setTimeout(resolve, ms));
459
+ }
271
460
  //# sourceMappingURL=solana-incoming-subscriber.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"solana-incoming-subscriber.js","sourceRoot":"","sources":["../src/solana-incoming-subscriber.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"solana-incoming-subscriber.js","sourceRoot":"","sources":["../src/solana-incoming-subscriber.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@waiaas/adapter-solana",
3
- "version": "2.12.0-rc.8",
3
+ "version": "2.12.0",
4
4
  "description": "WAIaaS Solana chain adapter - SPL/Token-2022 support",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -31,7 +31,7 @@
31
31
  "@solana-program/system": "^0.11.0",
32
32
  "@solana-program/token": "^0.10.0",
33
33
  "@solana/kit": "^6.0.1",
34
- "@waiaas/core": "2.12.0-rc.8"
34
+ "@waiaas/core": "2.12.0"
35
35
  },
36
36
  "scripts": {
37
37
  "build": "tsc -p tsconfig.build.json",