diff --git a/lib/internal/locks.js b/lib/internal/locks.js index a238a048ec6..b3d605aa8bc 100644 --- a/lib/internal/locks.js +++ b/lib/internal/locks.js @@ -3,7 +3,9 @@ const { ObjectDefineProperties, Promise, + PromisePrototypeThen, PromiseResolve, + SafePromisePrototypeFinally, Symbol, SymbolToStringTag, } = primordials; @@ -15,6 +17,7 @@ const { const { kEmptyObject, lazyDOMException, + kEnumerableProperty, } = require('internal/util'); const { validateAbortSignal, @@ -86,8 +89,8 @@ class Lock { } ObjectDefineProperties(Lock.prototype, { - name: { __proto__: null, enumerable: true }, - mode: { __proto__: null, enumerable: true }, + name: kEnumerableProperty, + mode: kEnumerableProperty, [SymbolToStringTag]: { __proto__: null, value: 'Lock', @@ -126,13 +129,13 @@ class LockManager { * @param {boolean} [options.ifAvailable] - Only grant if immediately available * @param {boolean} [options.steal] - Steal existing locks with same name * @param {AbortSignal} [options.signal] - Signal to abort pending lock request - * @param {Function} callback - Function called when lock is granted + * @param {Function} [callback] - Function called when lock is granted * @returns {Promise} Promise that resolves when the lock is released * @throws {TypeError} When name is not a string or callback is not a function * @throws {DOMException} When validation fails or operation is not supported */ // https://w3c.github.io/web-locks/#api-lock-manager-request - async request(name, options, callback) { + async request(name, options, callback = undefined) { if (callback === undefined) { callback = options; options = undefined; @@ -204,7 +207,7 @@ class LockManager { signal.addEventListener('abort', abortListener, { once: true }); const wrappedCallback = (lock) => { - return PromiseResolve().then(() => { + return PromisePrototypeThen(PromiseResolve(), () => { if (signal.aborted) { return undefined; } @@ -224,11 +227,10 @@ class LockManager { ); // When released promise settles, clean up listener and resolve main promise - released - .then(resolve, (error) => reject(convertLockError(error))) - .finally(() => { - signal.removeEventListener('abort', abortListener); - }); + SafePromisePrototypeFinally( + PromisePrototypeThen(released, resolve, (error) => reject(convertLockError(error))), + () => signal.removeEventListener('abort', abortListener), + ); } catch (error) { signal.removeEventListener('abort', abortListener); reject(convertLockError(error)); @@ -265,8 +267,8 @@ class LockManager { } ObjectDefineProperties(LockManager.prototype, { - request: { __proto__: null, enumerable: true }, - query: { __proto__: null, enumerable: true }, + request: kEnumerableProperty, + query: kEnumerableProperty, [SymbolToStringTag]: { __proto__: null, value: 'LockManager', @@ -276,16 +278,6 @@ ObjectDefineProperties(LockManager.prototype, { }, }); -ObjectDefineProperties(LockManager.prototype.request, { - length: { - __proto__: null, - value: 2, - writable: false, - enumerable: false, - configurable: true, - }, -}); - module.exports = { Lock, LockManager,