123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- /*
- 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<Client|undefined>}
- * @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;
- }
|