Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 0 additions & 8 deletions src/lock.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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: [
Expand Down Expand Up @@ -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);
}
Expand All @@ -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",
Expand Down Expand Up @@ -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: [
Expand Down Expand Up @@ -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);
Expand Down
10 changes: 7 additions & 3 deletions src/lock.ts
Original file line number Diff line number Diff line change
@@ -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`.
Expand All @@ -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<LockOptions, "ifAvailable"> & { ifAvailable: true }): Promise<ReleasableLock | null>;
(options?: Omit<LockOptions, "ifAvailable"> & { ifAvailable?: false }): Promise<ReleasableLock>;
};
return {
request: request.bind(thisArgs),
request,
query: query.bind(thisArgs),
};
}
4 changes: 3 additions & 1 deletion src/request.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<ReleasableLock|null> {
export async function request(this: InnerLock, options: Omit<LockOptions, "ifAvailable"> & { ifAvailable: true }): Promise<ReleasableLock | null>;
export async function request(this: InnerLock, options?: Omit<LockOptions, "ifAvailable"> & { ifAvailable?: false }): Promise<ReleasableLock>;
export async function request(this: InnerLock, options?: LockOptions): Promise<ReleasableLock | null> {
// #region Create resolvers to coordinate async lock lifecycle

// case1: called callback
Expand Down
Loading