/* Copyright 2019 Google LLC Use of this source code is governed by an MIT-style license that can be found in the LICENSE file or at https://opensource.org/licenses/MIT. */ import { timeout } from './timeout.js'; import '../_version.js'; const MAX_RETRY_TIME = 2000; /** * Returns a promise that resolves to a window client matching the passed * `resultingClientId`. For browsers that don't support `resultingClientId` * or if waiting for the resulting client to apper takes too long, resolve to * `undefined`. * * @param {string} [resultingClientId] * @return {Promise} * @private */ export async function resultingClientExists(resultingClientId) { if (!resultingClientId) { return; } let existingWindows = await self.clients.matchAll({ type: 'window' }); const existingWindowIds = new Set(existingWindows.map((w) => w.id)); let resultingWindow; const startTime = performance.now(); // Only wait up to `MAX_RETRY_TIME` to find a matching client. while (performance.now() - startTime < MAX_RETRY_TIME) { existingWindows = await self.clients.matchAll({ type: 'window' }); resultingWindow = existingWindows.find((w) => { if (resultingClientId) { // If we have a `resultingClientId`, we can match on that. return w.id === resultingClientId; } else { // Otherwise match on finding a window not in `existingWindowIds`. return !existingWindowIds.has(w.id); } }); if (resultingWindow) { break; } // Sleep for 100ms and retry. await timeout(100); } return resultingWindow; }