diff options
Diffstat (limited to 'ext/mixed/js')
| -rw-r--r-- | ext/mixed/js/comm.js | 32 | 
1 files changed, 22 insertions, 10 deletions
| diff --git a/ext/mixed/js/comm.js b/ext/mixed/js/comm.js index 4a6786c3..ea450da6 100644 --- a/ext/mixed/js/comm.js +++ b/ext/mixed/js/comm.js @@ -43,19 +43,27 @@ class CrossFrameAPIPort extends EventDispatcher {      invoke(action, params, ackTimeout, responseTimeout) {          return new Promise((resolve, reject) => {              if (this._port === null) { -                reject(new Error('Port is disconnected')); +                reject(new Error(`Port is disconnected (${action})`));                  return;              }              const id = this._invocationId++; -            const invocation = {id, resolve, reject, responseTimeout, ack: false, timer: null}; +            const invocation = { +                id, +                resolve, +                reject, +                responseTimeout, +                action, +                ack: false, +                timer: null +            };              this._activeInvocations.set(id, invocation);              if (ackTimeout !== null) {                  try { -                    invocation.timer = setTimeout(() => this._onError(id, new Error('Timeout (ack)')), ackTimeout); +                    invocation.timer = setTimeout(() => this._onError(id, 'Acknowledgement timeout'), ackTimeout);                  } catch (e) { -                    this._onError(id, new Error('Failed to set timeout')); +                    this._onError(id, 'Failed to set timeout');                      return;                  }              } @@ -79,7 +87,7 @@ class CrossFrameAPIPort extends EventDispatcher {          this._eventListeners.removeAllEventListeners();          this._port = null;          for (const id of this._activeInvocations.keys()) { -            this._onError(id, new Error('Disconnected')); +            this._onError(id, 'Disconnected');          }          this.trigger('disconnect', this);      } @@ -103,12 +111,12 @@ class CrossFrameAPIPort extends EventDispatcher {      _onAck(id) {          const invocation = this._activeInvocations.get(id);          if (typeof invocation === 'undefined') { -            yomichan.logWarning(new Error(`Request ${id} not found for ack`)); +            yomichan.logWarning(new Error(`Request ${id} not found for acknowledgement`));              return;          }          if (invocation.ack) { -            this._onError(id, new Error(`Request ${id} already ack'd`)); +            this._onError(id, `Request ${id} already acknowledged`);              return;          } @@ -122,9 +130,9 @@ class CrossFrameAPIPort extends EventDispatcher {          const responseTimeout = invocation.responseTimeout;          if (responseTimeout !== null) {              try { -                invocation.timer = setTimeout(() => this._onError(id, new Error('Timeout (response)')), responseTimeout); +                invocation.timer = setTimeout(() => this._onError(id, 'Response timeout'), responseTimeout);              } catch (e) { -                this._onError(id, new Error('Failed to set timeout')); +                this._onError(id, 'Failed to set timeout');              }          }      } @@ -137,7 +145,7 @@ class CrossFrameAPIPort extends EventDispatcher {          }          if (!invocation.ack) { -            this._onError(id, new Error(`Request ${id} not ack'd`)); +            this._onError(id, `Request ${id} not acknowledged`);              return;          } @@ -160,6 +168,10 @@ class CrossFrameAPIPort extends EventDispatcher {          const invocation = this._activeInvocations.get(id);          if (typeof invocation === 'undefined') { return; } +        if (typeof error === 'string') { +            error = new Error(`${error} (${invocation.action})`); +        } +          this._activeInvocations.delete(id);          if (invocation.timer !== null) {              clearTimeout(invocation.timer); |