(args: A)
| 116 | // The callable function - works in both MAIN and ISOLATED world |
| 117 | // Dispatches event and waits for response from ISOLATED world's handler |
| 118 | const fn = (args: A): Promise<T> => { |
| 119 | const seq = uuidv4(); |
| 120 | window.dispatchEvent(new CustomEvent(reqEvtName, { detail: { seq, req: args } })); |
| 121 | return new Promise((resolve, reject) => { |
| 122 | function resListener(evt: Event): void { |
| 123 | const customEvt = evt as CustomEvent; |
| 124 | const { res } = customEvt.detail; |
| 125 | cleanup(); |
| 126 | resolve(res); |
| 127 | } |
| 128 | function errListener(evt: Event): void { |
| 129 | const customEvt = evt as CustomEvent; |
| 130 | const { err } = customEvt.detail; |
| 131 | cleanup(); |
| 132 | reject(err); |
| 133 | } |
| 134 | function cleanup(): void { |
| 135 | window.removeEventListener(`${resEvtName}/${seq}`, resListener); |
| 136 | window.removeEventListener(`${errEvtName}/${seq}`, errListener); |
| 137 | } |
| 138 | window.addEventListener(`${resEvtName}/${seq}`, resListener); |
| 139 | window.addEventListener(`${errEvtName}/${seq}`, errListener); |
| 140 | if (!opts?.wait) { |
| 141 | setTimeout(() => { |
| 142 | cleanup(); |
| 143 | reject(new Error(`${handlerName} request timeout`)); |
| 144 | }, REQUEST_TIMEOUT_MS); |
| 145 | } |
| 146 | }); |
| 147 | }; |
| 148 | return fn; |
| 149 | } |
| 150 |
no test coverage detected