repo_description: Chrome DevTools for coding agents
repo_topics: browser chrome chrome-devtools debugging devtools mcp mcp-server puppeteer
code: /**
   * @license
   * Copyright 2025 Google Inc.
   * SPDX-License-Identifier: Apache-2.0
   */
  
  export class Mutex {
    static Guard = class Guard {
      #mutex: Mutex;
      constructor(mutex: Mutex) {
        this.#mutex = mutex;
      }
      dispose(): void {
        return this.#mutex.release();
      }
    };
  
    #locked = false;
    #acquirers: Array<() => void> = [];
  
    // This is FIFO.
    async acquire(): Promise<InstanceType<typeof Mutex.Guard>> {
      if (!this.#locked) {
        this.#locked = true;
        return new Mutex.Guard(this);
      }
      const {resolve, promise} = Promise.withResolvers<void>();
      this.#acquirers.push(resolve);
      await promise;
      return new Mutex.Guard(this);
    }
  
    release(): void {
      const resolve = this.#acquirers.shift();
      if (!resolve) {
        this.#locked = false;
        return;
      }
      resolve();
    }
  }
  