diff options
| author | siikamiika <siikamiika@users.noreply.github.com> | 2020-03-22 04:55:16 +0200 | 
|---|---|---|
| committer | siikamiika <siikamiika@users.noreply.github.com> | 2020-04-05 19:57:37 +0300 | 
| commit | d88635cbb28862e0efd79080e5c67865d0410238 (patch) | |
| tree | 6681db9a0f9a78855d7e652a9f6d43589f1768b1 /ext/mixed/js | |
| parent | 9fe1e38afb056164dbcc4369160bb9fd4790a2c0 (diff) | |
temporary listener abstraction
Diffstat (limited to 'ext/mixed/js')
| -rw-r--r-- | ext/mixed/js/core.js | 36 | 
1 files changed, 36 insertions, 0 deletions
| diff --git a/ext/mixed/js/core.js b/ext/mixed/js/core.js index fd762e97..f21bac23 100644 --- a/ext/mixed/js/core.js +++ b/ext/mixed/js/core.js @@ -312,6 +312,42 @@ const yomichan = (() => {              this.trigger('orphaned', {error});          } +        getTemporaryListenerResult(eventHandler, userCallback, timeout=30000) { +            let resolved = false; +            let resolve; +            let reject; +            const listenerPromise = new Promise((_resolve, _reject) => { +                resolve = _resolve; +                reject = _reject; +            }); + +            if (eventHandler === chrome.runtime.onMessage) { +                const runtimeMessageCallback = ({action, params}, sender, sendResponse) => { +                    const cleanupResolve = (value) => { +                        resolved = true; +                        eventHandler.removeListener(runtimeMessageCallback); +                        sendResponse(); +                        resolve(value); +                    }; + +                    setTimeout(() => { +                        if (!resolved) { +                            reject(new Error(`Listener timed out in ${timeout} ms`)); +                            eventHandler.removeListener(runtimeMessageCallback); +                        } +                    }, timeout); + +                    userCallback({action, params}, {resolve: cleanupResolve, sender}); +                }; + +                eventHandler.addListener(runtimeMessageCallback); +            } else { +                throw new Error('Event handler type not supported'); +            } + +            return listenerPromise; +        } +          // Private          _onMessage({action, params}, sender, callback) { |