diff --git a/decls/vars.js b/decls/vars.js index 3404e00..723687a 100644 --- a/decls/vars.js +++ b/decls/vars.js @@ -14,6 +14,9 @@ declare var chrome: { sender: ?string, cb: (res: any) => void ) => ?boolean) => void + }, + onDisconnect: { + addListener: (handler: () => ?boolean) => void } } }; diff --git a/src/ui-store.js b/src/ui-store.js index 18008d7..8c2c933 100644 --- a/src/ui-store.js +++ b/src/ui-store.js @@ -8,6 +8,7 @@ import { let listeners = []; let state; +let onDisconnect; function handleMessage(msg: Object): void { if (msg.type === UPDATE_STATE) { @@ -17,6 +18,12 @@ function handleMessage(msg: Object): void { } } +function handleDisconnect(): void { + if (onDisconnect) { + onDisconnect(); + } +} + function subscribe(listener: EmptyFunc): EmptyFunc { listeners.push(listener); @@ -38,13 +45,23 @@ function getState(): Object { return state; } -export default function (): Promise { +export default function (options?: { + onDisconnect?: EmptyFunc, +} = {}): Promise { + if (options.hasOwnProperty('onDisconnect') && typeof options.onDisconnect !== 'function') { + return Promise.reject(new Error('Expected the "onDisconnect" to be a function.')); + } + + onDisconnect = options.onDisconnect; + // connect to "background" store const connection = chrome.runtime.connect({name: CONNECTION_NAME}); // listen for changes in the "background" store connection.onMessage.addListener(handleMessage); + connection.onDisconnect.addListener(handleDisconnect); + // return promise to allow getting current state of "background" store return new Promise(resolve => { chrome.runtime.sendMessage({type: UPDATE_STATE}, res => { diff --git a/tests/ui-store.js b/tests/ui-store.js index 166d681..170790c 100644 --- a/tests/ui-store.js +++ b/tests/ui-store.js @@ -9,6 +9,9 @@ async function createStore(state) { const connection = { onMessage: { addListener: jest.fn() + }, + onDisconnect: { + addListener: jest.fn() } };