videomail-client 15.7.12 → 15.7.14

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.
@@ -1575,7 +1575,7 @@ var __webpack_modules__ = {
1575
1575
  return intrinsic;
1576
1576
  };
1577
1577
  },
1578
- r (module) {
1578
+ rX (module) {
1579
1579
  module.exports = Emitter;
1580
1580
  function Emitter(obj) {
1581
1581
  if (obj) return mixin(obj);
@@ -1832,7 +1832,7 @@ var __webpack_modules__ = {
1832
1832
  xF (module, __unused_rspack_exports, __webpack_require__) {
1833
1833
  "use strict";
1834
1834
  var document1 = __webpack_require__("g");
1835
- var Event = __webpack_require__("cE");
1835
+ var Event1 = __webpack_require__("cE");
1836
1836
  var Keys = __webpack_require__("Dy");
1837
1837
  module.exports = Visibility;
1838
1838
  function Visibility() {
@@ -1840,7 +1840,7 @@ var __webpack_modules__ = {
1840
1840
  if (!keys) return noopShim();
1841
1841
  return {
1842
1842
  visible: visible,
1843
- onChange: Event(listen)
1843
+ onChange: Event1(listen)
1844
1844
  };
1845
1845
  function visible() {
1846
1846
  return !document1[keys.hidden];
@@ -4868,8 +4868,8 @@ var __webpack_modules__ = {
4868
4868
  } : null;
4869
4869
  },
4870
4870
  Ne (module) {
4871
- module.exports = Event;
4872
- function Event() {
4871
+ module.exports = Event1;
4872
+ function Event1() {
4873
4873
  var listeners = [];
4874
4874
  return {
4875
4875
  broadcast: broadcast,
@@ -4889,10 +4889,10 @@ var __webpack_modules__ = {
4889
4889
  }
4890
4890
  },
4891
4891
  cE (module, __unused_rspack_exports, __webpack_require__) {
4892
- var Event = __webpack_require__("Ne");
4892
+ var Event1 = __webpack_require__("Ne");
4893
4893
  module.exports = Source;
4894
4894
  function Source(broadcaster) {
4895
- var tuple = Event();
4895
+ var tuple = Event1();
4896
4896
  broadcaster(tuple.broadcast);
4897
4897
  return tuple.listen;
4898
4898
  }
@@ -6783,7 +6783,7 @@ var __webpack_modules__ = {
6783
6783
  return fn;
6784
6784
  };
6785
6785
  },
6786
- x5 (module, __unused_rspack_exports, __webpack_require__) {
6786
+ x (module, __unused_rspack_exports, __webpack_require__) {
6787
6787
  "use strict";
6788
6788
  var inspect = __webpack_require__("L");
6789
6789
  var $TypeError = __webpack_require__("N");
@@ -6944,7 +6944,7 @@ var __webpack_modules__ = {
6944
6944
  "use strict";
6945
6945
  var $TypeError = __webpack_require__("N");
6946
6946
  var inspect = __webpack_require__("L");
6947
- var getSideChannelList = __webpack_require__("x5");
6947
+ var getSideChannelList = __webpack_require__("x");
6948
6948
  var getSideChannelMap = __webpack_require__("J");
6949
6949
  var getSideChannelWeakMap = __webpack_require__("c");
6950
6950
  var makeChannel = getSideChannelWeakMap || getSideChannelMap || getSideChannelList;
@@ -7041,7 +7041,7 @@ var __webpack_modules__ = {
7041
7041
  console.warn('Using browser-only version of superagent in non-browser environment');
7042
7042
  root = void 0;
7043
7043
  } else root = self;
7044
- const Emitter = __webpack_require__("r");
7044
+ const Emitter = __webpack_require__("rX");
7045
7045
  const safeStringify = __webpack_require__("X");
7046
7046
  const qs = __webpack_require__("b");
7047
7047
  const RequestBase = __webpack_require__("d");
@@ -10970,7 +10970,7 @@ var __webpack_exports__ = {};
10970
10970
  var client = __webpack_require__("Q");
10971
10971
  var client_default = /*#__PURE__*/ __webpack_require__.n(client);
10972
10972
  var package_namespaceObject = {
10973
- rE: "15.7.12"
10973
+ rE: "15.7.14"
10974
10974
  };
10975
10975
  function isAudioEnabled(options) {
10976
10976
  return Boolean(options.audio.enabled);
@@ -10984,6 +10984,52 @@ var __webpack_exports__ = {};
10984
10984
  }
10985
10985
  var util = __webpack_require__("S");
10986
10986
  var util_default = /*#__PURE__*/ __webpack_require__.n(util);
10987
+ function getEventDetails(event) {
10988
+ const eventWithErrorDetails = event;
10989
+ const details = {
10990
+ constructor: event.constructor.name,
10991
+ type: event.type,
10992
+ isTrusted: event.isTrusted,
10993
+ bubbles: event.bubbles,
10994
+ cancelable: event.cancelable,
10995
+ composed: event.composed,
10996
+ defaultPrevented: event.defaultPrevented,
10997
+ eventPhase: event.eventPhase,
10998
+ timeStamp: event.timeStamp,
10999
+ returnValue: eventWithErrorDetails.returnValue,
11000
+ cancelBubble: eventWithErrorDetails.cancelBubble
11001
+ };
11002
+ for (const property of [
11003
+ "message",
11004
+ "filename",
11005
+ "lineno",
11006
+ "colno"
11007
+ ]){
11008
+ const value = eventWithErrorDetails[property];
11009
+ if (void 0 !== value) details[property] = value;
11010
+ }
11011
+ if (eventWithErrorDetails.error instanceof Error) details.error = serializeError(eventWithErrorDetails.error);
11012
+ if (event.target) {
11013
+ const target = event.target;
11014
+ const targetDetails = {
11015
+ constructor: target.constructor.name
11016
+ };
11017
+ for (const property of [
11018
+ "url",
11019
+ "readyState",
11020
+ "protocol",
11021
+ "extensions",
11022
+ "binaryType",
11023
+ "bufferedAmount"
11024
+ ]){
11025
+ const value = target[property];
11026
+ if (void 0 !== value) targetDetails[property] = value;
11027
+ }
11028
+ details.target = targetDetails;
11029
+ }
11030
+ return details;
11031
+ }
11032
+ const error_getEventDetails = getEventDetails;
10987
11033
  function inspect(element) {
10988
11034
  return util_default().inspect(element, {
10989
11035
  colors: false,
@@ -10999,6 +11045,7 @@ var __webpack_exports__ = {};
10999
11045
  else if (anything.className) return `.${anything.className}`;
11000
11046
  return "(No HTML identifier available)";
11001
11047
  }
11048
+ if ("u" > typeof Event && anything instanceof Event) return inspect(error_getEventDetails(anything));
11002
11049
  return inspect(anything);
11003
11050
  }
11004
11051
  const util_pretty = pretty;
@@ -17596,7 +17643,7 @@ var __webpack_exports__ = {};
17596
17643
  this.connectionTimeout = void 0;
17597
17644
  }
17598
17645
  failConnection(params) {
17599
- var _ref, _ref1;
17646
+ var _ref, _this_unloaded, _this_userMediaLoaded, _ref1;
17600
17647
  if (this.connectionFailed || this.connected || this.unloaded) return;
17601
17648
  this.connectionFailed = true;
17602
17649
  this.connecting = false;
@@ -17605,10 +17652,27 @@ var __webpack_exports__ = {};
17605
17652
  const online = navigator.onLine;
17606
17653
  const elapsedMs = this.connectingStartedAt ? Date.now() - this.connectingStartedAt : void 0;
17607
17654
  const closeEvent = this.lastCloseEvent;
17608
- const debugLine = `Recorder: failConnection() diagnostic - cause=${cause}, online=${online}, elapsedMs=${null != elapsedMs ? elapsedMs : "unknown"}, closeCode=${null != (_ref = null == closeEvent ? void 0 : closeEvent.code) ? _ref : "none"}, closeReason=${(null == closeEvent ? void 0 : closeEvent.reason) || "none"}, wasClean=${null != (_ref1 = null == closeEvent ? void 0 : closeEvent.wasClean) ? _ref1 : "unknown"}`;
17655
+ const socketError = this.lastSocketError;
17656
+ const diagnosticLines = [
17657
+ ` • cause: ${cause}`,
17658
+ ` • closeCode: ${null != (_ref = null == closeEvent ? void 0 : closeEvent.code) ? _ref : "undefined"}`,
17659
+ ` • closeReason: ${(null == closeEvent ? void 0 : closeEvent.reason) || "undefined"}`,
17660
+ ` • elapsedMs: ${null != elapsedMs ? elapsedMs : "undefined"}`,
17661
+ ` • online: ${online}`,
17662
+ ` • unloaded: ${null != (_this_unloaded = this.unloaded) ? _this_unloaded : "undefined"}`,
17663
+ ` • userMediaLoaded: ${null != (_this_userMediaLoaded = this.userMediaLoaded) ? _this_userMediaLoaded : "undefined"}`,
17664
+ ` • userMediaLoading: ${this.userMediaLoading}`,
17665
+ ` • wasClean: ${null != (_ref1 = null == closeEvent ? void 0 : closeEvent.wasClean) ? _ref1 : "undefined"}`,
17666
+ ` • socketError: ${socketError ? util_pretty(socketError) : "undefined"}`
17667
+ ];
17668
+ const debugLine = [
17669
+ "🔎 Recorder: failConnection() diagnostic",
17670
+ ...diagnosticLines
17671
+ ].join("\n");
17609
17672
  this.options.logger.debug(debugLine);
17610
17673
  let explanation;
17611
17674
  if (online) if ("timeout" === cause) explanation = `The server at ${url2Connect} did not respond within ${this.options.timeouts.connection}ms, even though your device is online. This usually points to a firewall or proxy silently dropping the connection. Please try a different network. If the problem persists, contact us.`;
17675
+ else if ("error" === cause) explanation = `The WebSocket reported an error while connecting to ${url2Connect}. Details: ${util_pretty(null != socketError ? socketError : {})} Please check your internet connection and try again. If the problem persists, contact us.`;
17612
17676
  else {
17613
17677
  const closeSuffix = closeEvent ? ` (code ${closeEvent.code})` : "";
17614
17678
  explanation = `Connection to ${url2Connect} is closed${closeSuffix}. Please check your internet connection and try again. If the problem persists, contact us.`;
@@ -17621,7 +17685,10 @@ var __webpack_exports__ = {};
17621
17685
  const err = error_createError({
17622
17686
  message: "Unable to connect to the server",
17623
17687
  explanation,
17624
- options: this.options
17688
+ options: this.options,
17689
+ exc: socketError ? new Error("WebSocket connection error", {
17690
+ cause: socketError
17691
+ }) : void 0
17625
17692
  });
17626
17693
  this.emit("ERROR", {
17627
17694
  err
@@ -17707,6 +17774,7 @@ var __webpack_exports__ = {};
17707
17774
  this.connectionFailed = false;
17708
17775
  this.connectingStartedAt = Date.now();
17709
17776
  this.lastCloseEvent = void 0;
17777
+ this.lastSocketError = void 0;
17710
17778
  this.emit("CONNECTING");
17711
17779
  let url2Connect;
17712
17780
  try {
@@ -17737,6 +17805,9 @@ var __webpack_exports__ = {};
17737
17805
  wasClean: event.wasClean
17738
17806
  };
17739
17807
  });
17808
+ nativeSocket.addEventListener("error", (event)=>{
17809
+ this.lastSocketError = error_getEventDetails(event);
17810
+ });
17740
17811
  } catch (exc) {
17741
17812
  this.connecting = this.connected = false;
17742
17813
  const diagnostic = error_getWebSocketDiagnostic(url2Connect);
@@ -17776,11 +17847,11 @@ var __webpack_exports__ = {};
17776
17847
  });
17777
17848
  }, connectionTimeoutMs);
17778
17849
  this.stream.on("close", ()=>{
17779
- this.options.logger.debug(`${PIPE_SYMBOL}Stream has closed, connecting=${this.connecting}, connected=${this.connected},`);
17780
- const tryReconnect = this.connecting && this.userMediaLoaded;
17850
+ this.options.logger.debug(`${PIPE_SYMBOL}Stream has closed, connecting=${this.connecting}, connected=${this.connected}, userMediaLoaded=${this.userMediaLoaded}`);
17851
+ const tryReconnect = this.connected && this.userMediaLoaded;
17781
17852
  this.connected = false;
17782
17853
  if (tryReconnect) this.initSocket();
17783
- else window.setTimeout(()=>{
17854
+ else if (!this.connecting) window.setTimeout(()=>{
17784
17855
  this.failConnection({
17785
17856
  url2Connect,
17786
17857
  cause: "closed"
@@ -17818,7 +17889,25 @@ var __webpack_exports__ = {};
17818
17889
  }
17819
17890
  });
17820
17891
  this.stream.on("error", (err)=>{
17892
+ var _this_lastSocketError;
17893
+ if ("u" > typeof Event && err instanceof Event) this.lastSocketError = error_getEventDetails(err);
17894
+ else this.lastSocketError = serializeError(err);
17821
17895
  this.options.logger.debug(`${PIPE_SYMBOL}Stream *error* event emitted: ${util_pretty(err)}`);
17896
+ if (!this.connected) return void this.failConnection({
17897
+ url2Connect,
17898
+ cause: "error"
17899
+ });
17900
+ const streamError = err instanceof Error ? err : new Error("WebSocket stream emitted an error event", {
17901
+ cause: null != (_this_lastSocketError = this.lastSocketError) ? _this_lastSocketError : err
17902
+ });
17903
+ this.emit("ERROR", {
17904
+ err: error_createError({
17905
+ message: "WebSocket stream error",
17906
+ explanation: `The WebSocket stream emitted an error event. Details: ${util_pretty(err)}`,
17907
+ options: this.options,
17908
+ exc: streamError
17909
+ })
17910
+ });
17822
17911
  });
17823
17912
  this.stream.on("drain", ()=>{
17824
17913
  this.options.logger.debug(`${PIPE_SYMBOL}Stream *drain* event emitted (should not happen!)`);
@@ -18567,7 +18656,7 @@ var __webpack_exports__ = {};
18567
18656
  return this.userMediaLoaded;
18568
18657
  }
18569
18658
  constructor(visuals, replay, options){
18570
- super("Recorder", options), recorder_define_property(this, "visuals", void 0), recorder_define_property(this, "replay", void 0), recorder_define_property(this, "loop", void 0), recorder_define_property(this, "originalAnimationFrameObject", void 0), recorder_define_property(this, "samplesCount", 0), recorder_define_property(this, "framesCount", 0), recorder_define_property(this, "recordingStats", void 0), recorder_define_property(this, "confirmedFrameNumber", 0), recorder_define_property(this, "confirmedSampleNumber", 0), recorder_define_property(this, "recorderElement", void 0), recorder_define_property(this, "userMedia", void 0), recorder_define_property(this, "userMediaTimeout", void 0), recorder_define_property(this, "retryTimeout", void 0), recorder_define_property(this, "connectionTimeout", void 0), recorder_define_property(this, "frameProgress", void 0), recorder_define_property(this, "sampleProgress", void 0), recorder_define_property(this, "canvas", void 0), recorder_define_property(this, "ctx", void 0), recorder_define_property(this, "userMediaLoaded", void 0), recorder_define_property(this, "userMediaLoading", false), recorder_define_property(this, "submitting", false), recorder_define_property(this, "unloaded", void 0), recorder_define_property(this, "stopTime", void 0), recorder_define_property(this, "stream", void 0), recorder_define_property(this, "connecting", false), recorder_define_property(this, "connected", false), recorder_define_property(this, "connectionFailed", false), recorder_define_property(this, "blocking", false), recorder_define_property(this, "built", false), recorder_define_property(this, "key", void 0), recorder_define_property(this, "waitingTime", void 0), recorder_define_property(this, "connectingStartedAt", void 0), recorder_define_property(this, "lastCloseEvent", void 0), recorder_define_property(this, "pingInterval", void 0), recorder_define_property(this, "frame", void 0), recorder_define_property(this, "recordingBuffer", void 0), recorder_define_property(this, "facingMode", void 0);
18659
+ super("Recorder", options), recorder_define_property(this, "visuals", void 0), recorder_define_property(this, "replay", void 0), recorder_define_property(this, "loop", void 0), recorder_define_property(this, "originalAnimationFrameObject", void 0), recorder_define_property(this, "samplesCount", 0), recorder_define_property(this, "framesCount", 0), recorder_define_property(this, "recordingStats", void 0), recorder_define_property(this, "confirmedFrameNumber", 0), recorder_define_property(this, "confirmedSampleNumber", 0), recorder_define_property(this, "recorderElement", void 0), recorder_define_property(this, "userMedia", void 0), recorder_define_property(this, "userMediaTimeout", void 0), recorder_define_property(this, "retryTimeout", void 0), recorder_define_property(this, "connectionTimeout", void 0), recorder_define_property(this, "frameProgress", void 0), recorder_define_property(this, "sampleProgress", void 0), recorder_define_property(this, "canvas", void 0), recorder_define_property(this, "ctx", void 0), recorder_define_property(this, "userMediaLoaded", void 0), recorder_define_property(this, "userMediaLoading", false), recorder_define_property(this, "submitting", false), recorder_define_property(this, "unloaded", void 0), recorder_define_property(this, "stopTime", void 0), recorder_define_property(this, "stream", void 0), recorder_define_property(this, "connecting", false), recorder_define_property(this, "connected", false), recorder_define_property(this, "connectionFailed", false), recorder_define_property(this, "blocking", false), recorder_define_property(this, "built", false), recorder_define_property(this, "key", void 0), recorder_define_property(this, "waitingTime", void 0), recorder_define_property(this, "connectingStartedAt", void 0), recorder_define_property(this, "lastCloseEvent", void 0), recorder_define_property(this, "lastSocketError", void 0), recorder_define_property(this, "pingInterval", void 0), recorder_define_property(this, "frame", void 0), recorder_define_property(this, "recordingBuffer", void 0), recorder_define_property(this, "facingMode", void 0);
18571
18660
  this.visuals = visuals;
18572
18661
  this.replay = replay;
18573
18662
  this.facingMode = options.video.facingMode;
package/dist/esm/index.js CHANGED
@@ -3619,7 +3619,7 @@ const constants = {
3619
3619
  }
3620
3620
  };
3621
3621
  var package_namespaceObject = {
3622
- rE: "15.7.12"
3622
+ rE: "15.7.14"
3623
3623
  };
3624
3624
  function isAudioEnabled(options) {
3625
3625
  return Boolean(options.audio.enabled);
@@ -3631,6 +3631,52 @@ function setAudioEnabled(enabled, options) {
3631
3631
  function isAutoPauseEnabled(options) {
3632
3632
  return options.enableAutoPause && options.enablePause;
3633
3633
  }
3634
+ function getEventDetails(event) {
3635
+ const eventWithErrorDetails = event;
3636
+ const details = {
3637
+ constructor: event.constructor.name,
3638
+ type: event.type,
3639
+ isTrusted: event.isTrusted,
3640
+ bubbles: event.bubbles,
3641
+ cancelable: event.cancelable,
3642
+ composed: event.composed,
3643
+ defaultPrevented: event.defaultPrevented,
3644
+ eventPhase: event.eventPhase,
3645
+ timeStamp: event.timeStamp,
3646
+ returnValue: eventWithErrorDetails.returnValue,
3647
+ cancelBubble: eventWithErrorDetails.cancelBubble
3648
+ };
3649
+ for (const property of [
3650
+ "message",
3651
+ "filename",
3652
+ "lineno",
3653
+ "colno"
3654
+ ]){
3655
+ const value = eventWithErrorDetails[property];
3656
+ if (void 0 !== value) details[property] = value;
3657
+ }
3658
+ if (eventWithErrorDetails.error instanceof Error) details.error = serializeError(eventWithErrorDetails.error);
3659
+ if (event.target) {
3660
+ const target = event.target;
3661
+ const targetDetails = {
3662
+ constructor: target.constructor.name
3663
+ };
3664
+ for (const property of [
3665
+ "url",
3666
+ "readyState",
3667
+ "protocol",
3668
+ "extensions",
3669
+ "binaryType",
3670
+ "bufferedAmount"
3671
+ ]){
3672
+ const value = target[property];
3673
+ if (void 0 !== value) targetDetails[property] = value;
3674
+ }
3675
+ details.target = targetDetails;
3676
+ }
3677
+ return details;
3678
+ }
3679
+ const error_getEventDetails = getEventDetails;
3634
3680
  const util = __webpack_require__("Sy");
3635
3681
  var util_default = /*#__PURE__*/ __webpack_require__.n(util);
3636
3682
  function inspect(element) {
@@ -3648,6 +3694,7 @@ function pretty(anything) {
3648
3694
  else if (anything.className) return `.${anything.className}`;
3649
3695
  return "(No HTML identifier available)";
3650
3696
  }
3697
+ if ("u" > typeof Event && anything instanceof Event) return inspect(error_getEventDetails(anything));
3651
3698
  return inspect(anything);
3652
3699
  }
3653
3700
  const util_pretty = pretty;
@@ -6627,10 +6674,27 @@ class Recorder extends util_Despot {
6627
6674
  const online = navigator.onLine;
6628
6675
  const elapsedMs = this.connectingStartedAt ? Date.now() - this.connectingStartedAt : void 0;
6629
6676
  const closeEvent = this.lastCloseEvent;
6630
- const debugLine = `Recorder: failConnection() diagnostic - cause=${cause}, online=${online}, elapsedMs=${elapsedMs ?? "unknown"}, closeCode=${closeEvent?.code ?? "none"}, closeReason=${closeEvent?.reason || "none"}, wasClean=${closeEvent?.wasClean ?? "unknown"}`;
6677
+ const socketError = this.lastSocketError;
6678
+ const diagnosticLines = [
6679
+ ` • cause: ${cause}`,
6680
+ ` • closeCode: ${closeEvent?.code ?? "undefined"}`,
6681
+ ` • closeReason: ${closeEvent?.reason || "undefined"}`,
6682
+ ` • elapsedMs: ${elapsedMs ?? "undefined"}`,
6683
+ ` • online: ${online}`,
6684
+ ` • unloaded: ${this.unloaded ?? "undefined"}`,
6685
+ ` • userMediaLoaded: ${this.userMediaLoaded ?? "undefined"}`,
6686
+ ` • userMediaLoading: ${this.userMediaLoading}`,
6687
+ ` • wasClean: ${closeEvent?.wasClean ?? "undefined"}`,
6688
+ ` • socketError: ${socketError ? util_pretty(socketError) : "undefined"}`
6689
+ ];
6690
+ const debugLine = [
6691
+ "🔎 Recorder: failConnection() diagnostic",
6692
+ ...diagnosticLines
6693
+ ].join("\n");
6631
6694
  this.options.logger.debug(debugLine);
6632
6695
  let explanation;
6633
6696
  if (online) if ("timeout" === cause) explanation = `The server at ${url2Connect} did not respond within ${this.options.timeouts.connection}ms, even though your device is online. This usually points to a firewall or proxy silently dropping the connection. Please try a different network. If the problem persists, contact us.`;
6697
+ else if ("error" === cause) explanation = `The WebSocket reported an error while connecting to ${url2Connect}. Details: ${util_pretty(socketError ?? {})} Please check your internet connection and try again. If the problem persists, contact us.`;
6634
6698
  else {
6635
6699
  const closeSuffix = closeEvent ? ` (code ${closeEvent.code})` : "";
6636
6700
  explanation = `Connection to ${url2Connect} is closed${closeSuffix}. Please check your internet connection and try again. If the problem persists, contact us.`;
@@ -6643,7 +6707,10 @@ class Recorder extends util_Despot {
6643
6707
  const err = error_createError({
6644
6708
  message: "Unable to connect to the server",
6645
6709
  explanation,
6646
- options: this.options
6710
+ options: this.options,
6711
+ exc: socketError ? new Error("WebSocket connection error", {
6712
+ cause: socketError
6713
+ }) : void 0
6647
6714
  });
6648
6715
  this.emit("ERROR", {
6649
6716
  err
@@ -6728,6 +6795,7 @@ class Recorder extends util_Despot {
6728
6795
  this.connectionFailed = false;
6729
6796
  this.connectingStartedAt = Date.now();
6730
6797
  this.lastCloseEvent = void 0;
6798
+ this.lastSocketError = void 0;
6731
6799
  this.emit("CONNECTING");
6732
6800
  let url2Connect;
6733
6801
  try {
@@ -6758,6 +6826,9 @@ class Recorder extends util_Despot {
6758
6826
  wasClean: event.wasClean
6759
6827
  };
6760
6828
  });
6829
+ nativeSocket.addEventListener("error", (event)=>{
6830
+ this.lastSocketError = error_getEventDetails(event);
6831
+ });
6761
6832
  } catch (exc) {
6762
6833
  this.connecting = this.connected = false;
6763
6834
  const diagnostic = error_getWebSocketDiagnostic(url2Connect);
@@ -6797,11 +6868,11 @@ class Recorder extends util_Despot {
6797
6868
  });
6798
6869
  }, connectionTimeoutMs);
6799
6870
  this.stream.on("close", ()=>{
6800
- this.options.logger.debug(`${PIPE_SYMBOL}Stream has closed, connecting=${this.connecting}, connected=${this.connected},`);
6801
- const tryReconnect = this.connecting && this.userMediaLoaded;
6871
+ this.options.logger.debug(`${PIPE_SYMBOL}Stream has closed, connecting=${this.connecting}, connected=${this.connected}, userMediaLoaded=${this.userMediaLoaded}`);
6872
+ const tryReconnect = this.connected && this.userMediaLoaded;
6802
6873
  this.connected = false;
6803
6874
  if (tryReconnect) this.initSocket();
6804
- else window.setTimeout(()=>{
6875
+ else if (!this.connecting) window.setTimeout(()=>{
6805
6876
  this.failConnection({
6806
6877
  url2Connect,
6807
6878
  cause: "closed"
@@ -6838,7 +6909,24 @@ class Recorder extends util_Despot {
6838
6909
  }
6839
6910
  });
6840
6911
  this.stream.on("error", (err)=>{
6912
+ if ("u" > typeof Event && err instanceof Event) this.lastSocketError = error_getEventDetails(err);
6913
+ else this.lastSocketError = serializeError(err);
6841
6914
  this.options.logger.debug(`${PIPE_SYMBOL}Stream *error* event emitted: ${util_pretty(err)}`);
6915
+ if (!this.connected) return void this.failConnection({
6916
+ url2Connect,
6917
+ cause: "error"
6918
+ });
6919
+ const streamError = err instanceof Error ? err : new Error("WebSocket stream emitted an error event", {
6920
+ cause: this.lastSocketError ?? err
6921
+ });
6922
+ this.emit("ERROR", {
6923
+ err: error_createError({
6924
+ message: "WebSocket stream error",
6925
+ explanation: `The WebSocket stream emitted an error event. Details: ${util_pretty(err)}`,
6926
+ options: this.options,
6927
+ exc: streamError
6928
+ })
6929
+ });
6842
6930
  });
6843
6931
  this.stream.on("drain", ()=>{
6844
6932
  this.options.logger.debug(`${PIPE_SYMBOL}Stream *drain* event emitted (should not happen!)`);
@@ -7572,7 +7660,7 @@ class Recorder extends util_Despot {
7572
7660
  return this.userMediaLoaded;
7573
7661
  }
7574
7662
  constructor(visuals, replay, options){
7575
- super("Recorder", options), recorder_define_property(this, "visuals", void 0), recorder_define_property(this, "replay", void 0), recorder_define_property(this, "loop", void 0), recorder_define_property(this, "originalAnimationFrameObject", void 0), recorder_define_property(this, "samplesCount", 0), recorder_define_property(this, "framesCount", 0), recorder_define_property(this, "recordingStats", void 0), recorder_define_property(this, "confirmedFrameNumber", 0), recorder_define_property(this, "confirmedSampleNumber", 0), recorder_define_property(this, "recorderElement", void 0), recorder_define_property(this, "userMedia", void 0), recorder_define_property(this, "userMediaTimeout", void 0), recorder_define_property(this, "retryTimeout", void 0), recorder_define_property(this, "connectionTimeout", void 0), recorder_define_property(this, "frameProgress", void 0), recorder_define_property(this, "sampleProgress", void 0), recorder_define_property(this, "canvas", void 0), recorder_define_property(this, "ctx", void 0), recorder_define_property(this, "userMediaLoaded", void 0), recorder_define_property(this, "userMediaLoading", false), recorder_define_property(this, "submitting", false), recorder_define_property(this, "unloaded", void 0), recorder_define_property(this, "stopTime", void 0), recorder_define_property(this, "stream", void 0), recorder_define_property(this, "connecting", false), recorder_define_property(this, "connected", false), recorder_define_property(this, "connectionFailed", false), recorder_define_property(this, "blocking", false), recorder_define_property(this, "built", false), recorder_define_property(this, "key", void 0), recorder_define_property(this, "waitingTime", void 0), recorder_define_property(this, "connectingStartedAt", void 0), recorder_define_property(this, "lastCloseEvent", void 0), recorder_define_property(this, "pingInterval", void 0), recorder_define_property(this, "frame", void 0), recorder_define_property(this, "recordingBuffer", void 0), recorder_define_property(this, "facingMode", void 0);
7663
+ super("Recorder", options), recorder_define_property(this, "visuals", void 0), recorder_define_property(this, "replay", void 0), recorder_define_property(this, "loop", void 0), recorder_define_property(this, "originalAnimationFrameObject", void 0), recorder_define_property(this, "samplesCount", 0), recorder_define_property(this, "framesCount", 0), recorder_define_property(this, "recordingStats", void 0), recorder_define_property(this, "confirmedFrameNumber", 0), recorder_define_property(this, "confirmedSampleNumber", 0), recorder_define_property(this, "recorderElement", void 0), recorder_define_property(this, "userMedia", void 0), recorder_define_property(this, "userMediaTimeout", void 0), recorder_define_property(this, "retryTimeout", void 0), recorder_define_property(this, "connectionTimeout", void 0), recorder_define_property(this, "frameProgress", void 0), recorder_define_property(this, "sampleProgress", void 0), recorder_define_property(this, "canvas", void 0), recorder_define_property(this, "ctx", void 0), recorder_define_property(this, "userMediaLoaded", void 0), recorder_define_property(this, "userMediaLoading", false), recorder_define_property(this, "submitting", false), recorder_define_property(this, "unloaded", void 0), recorder_define_property(this, "stopTime", void 0), recorder_define_property(this, "stream", void 0), recorder_define_property(this, "connecting", false), recorder_define_property(this, "connected", false), recorder_define_property(this, "connectionFailed", false), recorder_define_property(this, "blocking", false), recorder_define_property(this, "built", false), recorder_define_property(this, "key", void 0), recorder_define_property(this, "waitingTime", void 0), recorder_define_property(this, "connectingStartedAt", void 0), recorder_define_property(this, "lastCloseEvent", void 0), recorder_define_property(this, "lastSocketError", void 0), recorder_define_property(this, "pingInterval", void 0), recorder_define_property(this, "frame", void 0), recorder_define_property(this, "recordingBuffer", void 0), recorder_define_property(this, "facingMode", void 0);
7576
7664
  this.visuals = visuals;
7577
7665
  this.replay = replay;
7578
7666
  this.facingMode = options.video.facingMode;
@@ -0,0 +1,2 @@
1
+ declare function getEventDetails(event: Event): Record<string, unknown>;
2
+ export default getEventDetails;
@@ -45,6 +45,7 @@ declare class Recorder extends Despot {
45
45
  private waitingTime?;
46
46
  private connectingStartedAt?;
47
47
  private lastCloseEvent?;
48
+ private lastSocketError?;
48
49
  private pingInterval?;
49
50
  private frame?;
50
51
  private recordingBuffer?;
package/dist/umd/index.js CHANGED
@@ -1581,7 +1581,7 @@
1581
1581
  return intrinsic;
1582
1582
  };
1583
1583
  },
1584
- r (module1) {
1584
+ rX (module1) {
1585
1585
  module1.exports = Emitter;
1586
1586
  function Emitter(obj) {
1587
1587
  if (obj) return mixin(obj);
@@ -1838,7 +1838,7 @@
1838
1838
  xF (module1, __unused_rspack_exports, __webpack_require__) {
1839
1839
  "use strict";
1840
1840
  var document1 = __webpack_require__("g");
1841
- var Event = __webpack_require__("cE");
1841
+ var Event1 = __webpack_require__("cE");
1842
1842
  var Keys = __webpack_require__("Dy");
1843
1843
  module1.exports = Visibility;
1844
1844
  function Visibility() {
@@ -1846,7 +1846,7 @@
1846
1846
  if (!keys) return noopShim();
1847
1847
  return {
1848
1848
  visible: visible,
1849
- onChange: Event(listen)
1849
+ onChange: Event1(listen)
1850
1850
  };
1851
1851
  function visible() {
1852
1852
  return !document1[keys.hidden];
@@ -4874,8 +4874,8 @@
4874
4874
  } : null;
4875
4875
  },
4876
4876
  Ne (module1) {
4877
- module1.exports = Event;
4878
- function Event() {
4877
+ module1.exports = Event1;
4878
+ function Event1() {
4879
4879
  var listeners = [];
4880
4880
  return {
4881
4881
  broadcast: broadcast,
@@ -4895,10 +4895,10 @@
4895
4895
  }
4896
4896
  },
4897
4897
  cE (module1, __unused_rspack_exports, __webpack_require__) {
4898
- var Event = __webpack_require__("Ne");
4898
+ var Event1 = __webpack_require__("Ne");
4899
4899
  module1.exports = Source;
4900
4900
  function Source(broadcaster) {
4901
- var tuple = Event();
4901
+ var tuple = Event1();
4902
4902
  broadcaster(tuple.broadcast);
4903
4903
  return tuple.listen;
4904
4904
  }
@@ -6789,7 +6789,7 @@
6789
6789
  return fn;
6790
6790
  };
6791
6791
  },
6792
- x5 (module1, __unused_rspack_exports, __webpack_require__) {
6792
+ x (module1, __unused_rspack_exports, __webpack_require__) {
6793
6793
  "use strict";
6794
6794
  var inspect = __webpack_require__("L");
6795
6795
  var $TypeError = __webpack_require__("N");
@@ -6950,7 +6950,7 @@
6950
6950
  "use strict";
6951
6951
  var $TypeError = __webpack_require__("N");
6952
6952
  var inspect = __webpack_require__("L");
6953
- var getSideChannelList = __webpack_require__("x5");
6953
+ var getSideChannelList = __webpack_require__("x");
6954
6954
  var getSideChannelMap = __webpack_require__("J");
6955
6955
  var getSideChannelWeakMap = __webpack_require__("c");
6956
6956
  var makeChannel = getSideChannelWeakMap || getSideChannelMap || getSideChannelList;
@@ -7047,7 +7047,7 @@
7047
7047
  console.warn('Using browser-only version of superagent in non-browser environment');
7048
7048
  root = void 0;
7049
7049
  } else root = self;
7050
- const Emitter = __webpack_require__("r");
7050
+ const Emitter = __webpack_require__("rX");
7051
7051
  const safeStringify = __webpack_require__("X");
7052
7052
  const qs = __webpack_require__("b");
7053
7053
  const RequestBase = __webpack_require__("d");
@@ -10976,7 +10976,7 @@
10976
10976
  var client = __webpack_require__("Q");
10977
10977
  var client_default = /*#__PURE__*/ __webpack_require__.n(client);
10978
10978
  var package_namespaceObject = {
10979
- rE: "15.7.12"
10979
+ rE: "15.7.14"
10980
10980
  };
10981
10981
  function isAudioEnabled(options) {
10982
10982
  return Boolean(options.audio.enabled);
@@ -10990,6 +10990,52 @@
10990
10990
  }
10991
10991
  var util = __webpack_require__("S");
10992
10992
  var util_default = /*#__PURE__*/ __webpack_require__.n(util);
10993
+ function getEventDetails(event) {
10994
+ const eventWithErrorDetails = event;
10995
+ const details = {
10996
+ constructor: event.constructor.name,
10997
+ type: event.type,
10998
+ isTrusted: event.isTrusted,
10999
+ bubbles: event.bubbles,
11000
+ cancelable: event.cancelable,
11001
+ composed: event.composed,
11002
+ defaultPrevented: event.defaultPrevented,
11003
+ eventPhase: event.eventPhase,
11004
+ timeStamp: event.timeStamp,
11005
+ returnValue: eventWithErrorDetails.returnValue,
11006
+ cancelBubble: eventWithErrorDetails.cancelBubble
11007
+ };
11008
+ for (const property of [
11009
+ "message",
11010
+ "filename",
11011
+ "lineno",
11012
+ "colno"
11013
+ ]){
11014
+ const value = eventWithErrorDetails[property];
11015
+ if (void 0 !== value) details[property] = value;
11016
+ }
11017
+ if (eventWithErrorDetails.error instanceof Error) details.error = serializeError(eventWithErrorDetails.error);
11018
+ if (event.target) {
11019
+ const target = event.target;
11020
+ const targetDetails = {
11021
+ constructor: target.constructor.name
11022
+ };
11023
+ for (const property of [
11024
+ "url",
11025
+ "readyState",
11026
+ "protocol",
11027
+ "extensions",
11028
+ "binaryType",
11029
+ "bufferedAmount"
11030
+ ]){
11031
+ const value = target[property];
11032
+ if (void 0 !== value) targetDetails[property] = value;
11033
+ }
11034
+ details.target = targetDetails;
11035
+ }
11036
+ return details;
11037
+ }
11038
+ const error_getEventDetails = getEventDetails;
10993
11039
  function inspect(element) {
10994
11040
  return util_default().inspect(element, {
10995
11041
  colors: false,
@@ -11005,6 +11051,7 @@
11005
11051
  else if (anything.className) return `.${anything.className}`;
11006
11052
  return "(No HTML identifier available)";
11007
11053
  }
11054
+ if ("u" > typeof Event && anything instanceof Event) return inspect(error_getEventDetails(anything));
11008
11055
  return inspect(anything);
11009
11056
  }
11010
11057
  const util_pretty = pretty;
@@ -17265,6 +17312,7 @@
17265
17312
  waitingTime;
17266
17313
  connectingStartedAt;
17267
17314
  lastCloseEvent;
17315
+ lastSocketError;
17268
17316
  pingInterval;
17269
17317
  frame;
17270
17318
  recordingBuffer;
@@ -17376,10 +17424,27 @@
17376
17424
  const online = navigator.onLine;
17377
17425
  const elapsedMs = this.connectingStartedAt ? Date.now() - this.connectingStartedAt : void 0;
17378
17426
  const closeEvent = this.lastCloseEvent;
17379
- const debugLine = `Recorder: failConnection() diagnostic - cause=${cause}, online=${online}, elapsedMs=${elapsedMs ?? "unknown"}, closeCode=${closeEvent?.code ?? "none"}, closeReason=${closeEvent?.reason || "none"}, wasClean=${closeEvent?.wasClean ?? "unknown"}`;
17427
+ const socketError = this.lastSocketError;
17428
+ const diagnosticLines = [
17429
+ ` • cause: ${cause}`,
17430
+ ` • closeCode: ${closeEvent?.code ?? "undefined"}`,
17431
+ ` • closeReason: ${closeEvent?.reason || "undefined"}`,
17432
+ ` • elapsedMs: ${elapsedMs ?? "undefined"}`,
17433
+ ` • online: ${online}`,
17434
+ ` • unloaded: ${this.unloaded ?? "undefined"}`,
17435
+ ` • userMediaLoaded: ${this.userMediaLoaded ?? "undefined"}`,
17436
+ ` • userMediaLoading: ${this.userMediaLoading}`,
17437
+ ` • wasClean: ${closeEvent?.wasClean ?? "undefined"}`,
17438
+ ` • socketError: ${socketError ? util_pretty(socketError) : "undefined"}`
17439
+ ];
17440
+ const debugLine = [
17441
+ "🔎 Recorder: failConnection() diagnostic",
17442
+ ...diagnosticLines
17443
+ ].join("\n");
17380
17444
  this.options.logger.debug(debugLine);
17381
17445
  let explanation;
17382
17446
  if (online) if ("timeout" === cause) explanation = `The server at ${url2Connect} did not respond within ${this.options.timeouts.connection}ms, even though your device is online. This usually points to a firewall or proxy silently dropping the connection. Please try a different network. If the problem persists, contact us.`;
17447
+ else if ("error" === cause) explanation = `The WebSocket reported an error while connecting to ${url2Connect}. Details: ${util_pretty(socketError ?? {})} Please check your internet connection and try again. If the problem persists, contact us.`;
17383
17448
  else {
17384
17449
  const closeSuffix = closeEvent ? ` (code ${closeEvent.code})` : "";
17385
17450
  explanation = `Connection to ${url2Connect} is closed${closeSuffix}. Please check your internet connection and try again. If the problem persists, contact us.`;
@@ -17392,7 +17457,10 @@
17392
17457
  const err = error_createError({
17393
17458
  message: "Unable to connect to the server",
17394
17459
  explanation,
17395
- options: this.options
17460
+ options: this.options,
17461
+ exc: socketError ? new Error("WebSocket connection error", {
17462
+ cause: socketError
17463
+ }) : void 0
17396
17464
  });
17397
17465
  this.emit("ERROR", {
17398
17466
  err
@@ -17477,6 +17545,7 @@
17477
17545
  this.connectionFailed = false;
17478
17546
  this.connectingStartedAt = Date.now();
17479
17547
  this.lastCloseEvent = void 0;
17548
+ this.lastSocketError = void 0;
17480
17549
  this.emit("CONNECTING");
17481
17550
  let url2Connect;
17482
17551
  try {
@@ -17507,6 +17576,9 @@
17507
17576
  wasClean: event.wasClean
17508
17577
  };
17509
17578
  });
17579
+ nativeSocket.addEventListener("error", (event)=>{
17580
+ this.lastSocketError = error_getEventDetails(event);
17581
+ });
17510
17582
  } catch (exc) {
17511
17583
  this.connecting = this.connected = false;
17512
17584
  const diagnostic = error_getWebSocketDiagnostic(url2Connect);
@@ -17546,11 +17618,11 @@
17546
17618
  });
17547
17619
  }, connectionTimeoutMs);
17548
17620
  this.stream.on("close", ()=>{
17549
- this.options.logger.debug(`${PIPE_SYMBOL}Stream has closed, connecting=${this.connecting}, connected=${this.connected},`);
17550
- const tryReconnect = this.connecting && this.userMediaLoaded;
17621
+ this.options.logger.debug(`${PIPE_SYMBOL}Stream has closed, connecting=${this.connecting}, connected=${this.connected}, userMediaLoaded=${this.userMediaLoaded}`);
17622
+ const tryReconnect = this.connected && this.userMediaLoaded;
17551
17623
  this.connected = false;
17552
17624
  if (tryReconnect) this.initSocket();
17553
- else window.setTimeout(()=>{
17625
+ else if (!this.connecting) window.setTimeout(()=>{
17554
17626
  this.failConnection({
17555
17627
  url2Connect,
17556
17628
  cause: "closed"
@@ -17587,7 +17659,24 @@
17587
17659
  }
17588
17660
  });
17589
17661
  this.stream.on("error", (err)=>{
17662
+ if ("u" > typeof Event && err instanceof Event) this.lastSocketError = error_getEventDetails(err);
17663
+ else this.lastSocketError = serializeError(err);
17590
17664
  this.options.logger.debug(`${PIPE_SYMBOL}Stream *error* event emitted: ${util_pretty(err)}`);
17665
+ if (!this.connected) return void this.failConnection({
17666
+ url2Connect,
17667
+ cause: "error"
17668
+ });
17669
+ const streamError = err instanceof Error ? err : new Error("WebSocket stream emitted an error event", {
17670
+ cause: this.lastSocketError ?? err
17671
+ });
17672
+ this.emit("ERROR", {
17673
+ err: error_createError({
17674
+ message: "WebSocket stream error",
17675
+ explanation: `The WebSocket stream emitted an error event. Details: ${util_pretty(err)}`,
17676
+ options: this.options,
17677
+ exc: streamError
17678
+ })
17679
+ });
17591
17680
  });
17592
17681
  this.stream.on("drain", ()=>{
17593
17682
  this.options.logger.debug(`${PIPE_SYMBOL}Stream *drain* event emitted (should not happen!)`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "videomail-client",
3
- "version": "15.7.12",
3
+ "version": "15.7.14",
4
4
  "description": "A wicked npm package to record videos directly in the browser, for Deaf and Sign Language!",
5
5
  "keywords": [
6
6
  "webcam",