/** * Single Promise */ let jsSdkFnPromiseMap = new Map() export class SinglePromise { private clientId: string constructor(options) { this.clientId = options?.clientId || '' jsSdkFnPromiseMap = (jsSdkFnPromiseMap || new Map()) as Map> } /** * Run single promise. * @param {string} key * @param {Function} fn * @return {Promise} */ async run(key: string, fn: () => Promise): Promise { key = `${this.clientId}_${key}` let result: Promise = jsSdkFnPromiseMap.get(key) if (!(result as any)) { result = new Promise((resolve, reject) => { (async () => { try { // The idle promise must be run to prevent _fnPromiseMap from // storing the current promise function. await this.runIdlePromise() const fnResult: Promise = fn() resolve(await fnResult) } catch (error) { reject(error) } finally { jsSdkFnPromiseMap.delete(key) } })() }) jsSdkFnPromiseMap.set(key, result) } return result } /** * Run idle promise. * @return {Promise} */ private runIdlePromise(): Promise { return Promise.resolve() } }