From 3c424977cd35968f87426f47bc62155f4bc4048e Mon Sep 17 00:00:00 2001 From: juner Date: Mon, 17 Nov 2025 13:41:09 +0900 Subject: [PATCH] =?UTF-8?q?request()=20=E3=81=AE=E6=88=BB=E3=82=8A?= =?UTF-8?q?=E5=80=A4=E3=81=AB=E3=82=88=E3=82=8A=20=E6=88=BB=E3=82=8A?= =?UTF-8?q?=E5=9E=8B=E3=81=AF=20=E7=A2=BA=E5=AE=9A=E3=81=99=E3=82=8B?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C=20fix=20#4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lock.test.ts | 8 -------- src/lock.ts | 10 +++++++--- src/request.ts | 4 +++- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/lock.test.ts b/src/lock.test.ts index e25ad14..6fec188 100644 --- a/src/lock.test.ts +++ b/src/lock.test.ts @@ -13,7 +13,6 @@ describe("simple use", () => { { await using l = await request(); expect(l).toBeDefined(); - if (!l) return; expect(l.name).toEqual(name); expect(l.mode).toEqual("exclusive"); expect(l.release).instanceOf(Function); @@ -46,7 +45,6 @@ describe("simple use", () => { mode: "exclusive", }); expect(lock1).toBeDefined(); - if (!lock1) return; expect(counter++).toEqual(0); await expect(query()).resolves.toEqual({ held: [ @@ -82,7 +80,6 @@ describe("simple use", () => { await lock1.release(); await using lock2 = await lock2Wait; expect(lock2).toBeDefined(); - if (!lock2) return; expect(lock2.name).toBeDefined(); expect(counter++).toEqual(3); } @@ -101,13 +98,11 @@ describe("simple use", () => { mode: "shared", }); expect(lock1).toBeDefined(); - if (!lock1) return; await expect(query()).resolves.toHaveProperty("held"); await using lock2 = await request({ mode: "shared", }); expect(lock2).toBeDefined(); - if (!lock2) return; expect(lock2.name).toBe(name); const lock3Wait = request({ mode: "exclusive", @@ -148,7 +143,6 @@ describe("simple use", () => { }); await using lock3 = await lock3Wait; expect(lock3).toBeDefined(); - if (!lock3) return; expect(lock3.name).toBe(name); await expect(query()).resolves.toEqual({ held: [ @@ -197,13 +191,11 @@ describe("simple use", () => { { await using lock1 = await request(); expect(lock1).toBeDefined(); - if (!lock1) return; const lock2Wait = request(); await using lock3 = await request({ steal: true, }); expect(lock3).toBeDefined(); - if(!lock3) return; expect(lock3.name).toBe(name); await expect(lock1.release()).resolves.toBe(false); await expect(lock3.release()).resolves.toBe(true); diff --git a/src/lock.ts b/src/lock.ts index 1646e02..a01fc24 100644 --- a/src/lock.ts +++ b/src/lock.ts @@ -1,6 +1,6 @@ -import type { InnerLock } from "./types/index.ts"; +import type { InnerLock, ReleasableLock } from "./types/index.ts"; import { query } from "./query.js"; -import { request } from "./request.js"; +import { request as originalRequest } from "./request.js"; /** * Creates a simple lock handler for the specified `name`. @@ -22,8 +22,12 @@ export function lock(name: string, options?: { locks?: LockManager }) { throw new Error("navigator.locks is not found. required options.locks argument."); } const thisArgs: InnerLock = { locks, name }; + const request = originalRequest.bind(thisArgs) as { + (options: Omit & { ifAvailable: true }): Promise; + (options?: Omit & { ifAvailable?: false }): Promise; + }; return { - request: request.bind(thisArgs), + request, query: query.bind(thisArgs), }; } diff --git a/src/request.ts b/src/request.ts index e9fe1ec..f7ecb54 100644 --- a/src/request.ts +++ b/src/request.ts @@ -14,7 +14,9 @@ import type { InnerLock, ReleasableLock } from "./types/index.ts"; * @param options - LockOptions (mode, ifAvailable, steal, signal, etc.) * @returns A promise that resolves to either a ReleasableLock or a NotHaveLock. */ -export async function request(this: InnerLock, options?: LockOptions): Promise { +export async function request(this: InnerLock, options: Omit & { ifAvailable: true }): Promise; +export async function request(this: InnerLock, options?: Omit & { ifAvailable?: false }): Promise; +export async function request(this: InnerLock, options?: LockOptions): Promise { // #region Create resolvers to coordinate async lock lifecycle // case1: called callback