(signal: AbortSignal)
| 171 | } |
| 172 | |
| 173 | async function startDeepLinkSession(signal: AbortSignal) { |
| 174 | let settled = false; |
| 175 | let stopListening: (() => void) | undefined; |
| 176 | let resolvePromise: (data: AuthParams | null) => void = () => {}; |
| 177 | |
| 178 | const complete = new Promise<AuthParams | null>((resolve) => { |
| 179 | resolvePromise = resolve; |
| 180 | }); |
| 181 | |
| 182 | const settle = (value: AuthParams | null) => { |
| 183 | if (settled) return; |
| 184 | settled = true; |
| 185 | resolvePromise(value); |
| 186 | }; |
| 187 | |
| 188 | stopListening = await onOpenUrl(async (urls) => { |
| 189 | for (const urlString of urls) { |
| 190 | if (signal.aborted) return; |
| 191 | settle(parseAuthParams(new URL(urlString))); |
| 192 | } |
| 193 | }); |
| 194 | |
| 195 | const dispose = async () => { |
| 196 | stopListening?.(); |
| 197 | stopListening = undefined; |
| 198 | settle(null); |
| 199 | }; |
| 200 | |
| 201 | signal.addEventListener("abort", () => void dispose(), { once: true }); |
| 202 | |
| 203 | return { complete, dispose }; |
| 204 | } |
| 205 | |
| 206 | function parseAuthParams(url: URL) { |
| 207 | return paramsValidator.parse( |
no test coverage detected