// eslint-disable-next-line @typescript-eslint/triple-slash-reference /// import { Adapter, AdapterState, AdapterCreator, AdapterOptions, IterateActivitiesOptions } from '../../types/AdapterTypes'; const SUPPORTED_FUNCTIONS = [ 'activities', 'addEventListener', 'close', 'dispatchEvent', 'egress', 'getReadyState', 'getState', 'ingress', 'removeEventListener', 'setReadyState', 'setState', 'subscribe' ]; // Only create adapter when activities is being iterated. export default function createLazyEnhancer() { return (next: AdapterCreator) => (adapterOptions: AdapterOptions): Adapter => { let adapter: Adapter; return { activities: (options?: IterateActivitiesOptions) => { // The next time this function is called, it will be calling the adapter.activities() instead. if (!adapter) { adapter = next(adapterOptions); } if (Object.keys(adapter).some((name) => !~SUPPORTED_FUNCTIONS.indexOf(name))) { throw new Error('Lazy enhancer cannot be used on adapters with extra functions.'); } return adapter.activities(options); }, addEventListener: (...args) => { if (!adapter) { throw new Error('You must call activities() first.'); } return adapter.addEventListener(...args); }, close: (...args) => { if (!adapter) { throw new Error('You must call activities() first.'); } return adapter.close(...args); }, dispatchEvent: (...args) => { if (!adapter) { throw new Error('You must call activities() first.'); } return adapter.dispatchEvent(...args); }, egress: (...args) => { if (!adapter) { return Promise.reject(new Error('You must call activities() first.')); } return adapter.egress(...args); }, getState: (...args) => { if (!adapter) { throw new Error('You must call activities() first.'); } return adapter.getState(...args); }, getReadyState: (...args) => { if (!adapter) { throw new Error('You must call activities() first.'); } return adapter.getReadyState(...args); }, ingress: (...args) => { if (!adapter) { throw new Error('You must call activities() first.'); } return adapter.ingress(...args); }, subscribe: (...args) => { if (!adapter) { throw new Error('You must call activities() first.'); } return adapter.subscribe(...args); }, setState: (...args) => { if (!adapter) { throw new Error('You must call activities() first.'); } return adapter.setState(...args); }, removeEventListener: (...args) => { if (!adapter) { throw new Error('You must call activities() first.'); } return adapter.removeEventListener(...args); }, setReadyState: (...args) => { if (!adapter) { throw new Error('You must call activities() first.'); } return adapter.setReadyState(...args); } }; }; }