diff options
Diffstat (limited to 'src/nwc-lock.js')
| -rw-r--r-- | src/nwc-lock.js | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/nwc-lock.js b/src/nwc-lock.js new file mode 100644 index 0000000..c4fec08 --- /dev/null +++ b/src/nwc-lock.js @@ -0,0 +1,14 @@ +// One request, one answerer per origin. +// +// Every open tab of the same wallet (and its service worker) sees every NWC +// request. Without exclusion two hidden tabs on one laptop both paid a zap: +// the loser's "payment already in progress" error reached the client half a +// second before the winner's preimage, and the zap showed as failed while +// the sats had gone. Web Locks are shared by every same-origin context, so +// the first to claim a request's lock answers it and the rest stay quiet. +// Where locks are unavailable (tests, ancient engines) the caller just runs. +export async function withRequestLock(id, fn, held = () => undefined) { + const locks = typeof navigator !== 'undefined' && navigator.locks; + if (!locks || !id) return fn(); + return locks.request(`nwc-req:${id}`, { ifAvailable: true }, (lock) => (lock ? fn() : held())); +} |
