@dynamic-labs-wallet/forward-mpc-client 0.4.0 → 0.5.1

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/index.cjs CHANGED
@@ -588,8 +588,6 @@ var ForwardMPCClient = class extends EventEmitter2.EventEmitter {
588
588
  }
589
589
  }
590
590
  };
591
-
592
- // src/client-v2/errors.ts
593
591
  var ErrorCode = {
594
592
  // Transport
595
593
  CONNECTION_FAILED: "CONNECTION_FAILED",
@@ -830,7 +828,7 @@ var ForwardMPCTransport = class extends EventEmitter2__default.default {
830
828
  this.ws = null;
831
829
  }
832
830
  this._isConnected = false;
833
- this.emit("disconnected");
831
+ this.emit("disconnected", forwardMpcShared.WebSocketCloseCode.NORMAL);
834
832
  }
835
833
  send(data) {
836
834
  if (!this._isConnected || !this.ws) {
@@ -888,23 +886,35 @@ var ForwardMPCTransport = class extends EventEmitter2__default.default {
888
886
  });
889
887
  this.emit("message", event.data);
890
888
  };
891
- this.ws.onclose = () => {
889
+ this.ws.onclose = (event) => {
892
890
  this._isConnected = false;
891
+ this.logger?.warn("WebSocket closed", {
892
+ url: this.url,
893
+ closeCode: event.code
894
+ });
893
895
  if (!this._destroyed) {
894
- this.emit("disconnected");
896
+ this.emit("disconnected", event.code);
895
897
  }
896
- this.maybeReconnect();
898
+ this.maybeReconnect(event.code);
897
899
  };
898
900
  });
899
901
  }
900
902
  /**
901
903
  * Attempts mid-session reconnects after a drop, up to `reconnectAttempts`
902
- * times. Only fires when a successful connection was previously established.
904
+ * times. Only fires when a successful connection was previously established
905
+ * and the close was unexpected (not a normal or idle-timeout close).
903
906
  */
904
- maybeReconnect() {
907
+ maybeReconnect(closeCode) {
905
908
  if (this._destroyed) return;
906
909
  if (!this._hadSuccessfulConnection) return;
907
910
  if (this._midSessionReconnectCount >= this.options.reconnectAttempts) return;
911
+ if (closeCode === forwardMpcShared.WebSocketCloseCode.NORMAL || closeCode === forwardMpcShared.WebSocketCloseCode.IDLE_TIMEOUT) {
912
+ this.logger?.info("WebSocket closed gracefully \u2014 not reconnecting", {
913
+ url: this.url,
914
+ closeCode
915
+ });
916
+ return;
917
+ }
908
918
  this._midSessionReconnectCount++;
909
919
  this.logger?.warn("WebSocket disconnected \u2014 attempting reconnect", {
910
920
  url: this.url,
@@ -1194,7 +1204,7 @@ var ForwardMPCClientV2 = class extends EventEmitter2__default.default {
1194
1204
  requestTimeout: options.requestTimeout
1195
1205
  };
1196
1206
  this.transport.on("connected", () => this.onTransportConnected());
1197
- this.transport.on("disconnected", () => this.onTransportDisconnected());
1207
+ this.transport.on("disconnected", (closeCode) => this.onTransportDisconnected(closeCode));
1198
1208
  this.transport.on("error", (error) => this.emit("error", error));
1199
1209
  }
1200
1210
  get connected() {
@@ -1353,7 +1363,7 @@ var ForwardMPCClientV2 = class extends EventEmitter2__default.default {
1353
1363
  }, "doHandshake");
1354
1364
  this._connectPromise = doHandshake();
1355
1365
  }
1356
- onTransportDisconnected() {
1366
+ onTransportDisconnected(closeCode) {
1357
1367
  const intentional = this._disconnectedIntentionally;
1358
1368
  this._disconnectedIntentionally = false;
1359
1369
  this.session?.dispose();
@@ -1361,54 +1371,15 @@ var ForwardMPCClientV2 = class extends EventEmitter2__default.default {
1361
1371
  if (!intentional) {
1362
1372
  this.logger.warn("Unexpected WebSocket disconnect");
1363
1373
  }
1364
- this.emit("disconnected");
1374
+ this.emit("disconnected", closeCode);
1365
1375
  }
1366
1376
  };
1367
1377
 
1368
- // src/client-v2/utils.ts
1369
- function deepEqual(obj1, obj2) {
1370
- if (obj1 === obj2) return true;
1371
- if (typeof obj1 !== "object" || obj1 === null || typeof obj2 !== "object" || obj2 === null) {
1372
- return false;
1373
- }
1374
- const keys1 = Object.keys(obj1);
1375
- const keys2 = Object.keys(obj2);
1376
- if (keys1.length !== keys2.length) return false;
1377
- for (const key of keys1) {
1378
- if (!keys2.includes(key) || !deepEqual(obj1[key], obj2[key])) {
1379
- return false;
1380
- }
1381
- }
1382
- return true;
1383
- }
1384
- __name(deepEqual, "deepEqual");
1385
-
1386
1378
  // src/client-v2/singleton.ts
1387
- var ForwardMPCClientSingleton = class _ForwardMPCClientSingleton extends ForwardMPCClientV2 {
1379
+ var ForwardMPCClientSingleton = class extends ForwardMPCClientV2 {
1388
1380
  static {
1389
1381
  __name(this, "ForwardMPCClientSingleton");
1390
1382
  }
1391
- static _instance = null;
1392
- constructor(url, options) {
1393
- const existing = _ForwardMPCClientSingleton._instance;
1394
- if (existing !== null) {
1395
- if (existing.url !== url) {
1396
- throw new Error(`ForwardMPCClientSingleton already exists for "${existing.url}". Call disconnect() first to create a new instance.`);
1397
- }
1398
- if (!deepEqual(options, existing.options)) {
1399
- throw new Error(`ForwardMPCClientSingleton already exists for the same URL but with different options.Call disconnect() first to create a new instance.`);
1400
- }
1401
- return existing;
1402
- }
1403
- super(url, options);
1404
- _ForwardMPCClientSingleton._instance = this;
1405
- }
1406
- disconnect() {
1407
- super.disconnect();
1408
- if (_ForwardMPCClientSingleton._instance === this) {
1409
- _ForwardMPCClientSingleton._instance = null;
1410
- }
1411
- }
1412
1383
  };
1413
1384
 
1414
1385
  Object.defineProperty(exports, "SigningAlgorithm", {