aboutsummaryrefslogtreecommitdiffstats
path: root/src/sw-nwc.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/sw-nwc.js')
-rw-r--r--src/sw-nwc.js19
1 files changed, 13 insertions, 6 deletions
diff --git a/src/sw-nwc.js b/src/sw-nwc.js
index 78bb2bd..3a48cff 100644
--- a/src/sw-nwc.js
+++ b/src/sw-nwc.js
@@ -6,7 +6,7 @@
import { respondFromBg, tendRenewals, tendLnPays } from './nwc-respond.js';
import { withRequestLock, withWorkLock } from './nwc-lock.js';
-import { appendBgLog } from './nwc-bg.js';
+import { appendBgLog, takeLease } from './nwc-bg.js';
import { bgAutoWithdraw } from './bg-autowithdraw.js';
import { allInboxes, classifyDm, shouldNotifyDm, classifyCall } from './dm-inbox.js';
@@ -15,7 +15,7 @@ const NOTIFIER = 'https://nwcpush.coinos.io';
// written, so a worker the phone stops mid-push leaves its last step behind.
const stamp = () => new Date().toISOString().replace('T', ' ').slice(0, 19);
const diary = (m) => { console.log('[sw-nwc]', m); appendBgLog(`${stamp()} ${m}`); };
-diary('worker started');
+diary(`worker started${typeof navigator !== 'undefined' && navigator.locks ? '' : ' (no Web Locks)'}`);
const CALL_CACHE = 'coinos-call'; // a call offer a push brought, for the app the tap opens
// where a call's offer wrap is fetched from: the notifier, or (the app served
// on this machine, as the tests do) this origin
@@ -179,6 +179,11 @@ self.addEventListener('push', (e) => {
// four payments, no line for the fourth, then no more wakes). On an
// Apple endpoint the stand-in goes up FIRST; the outcome replaces it.
const apple = await applePush();
+ // What a push may take. iOS stops the worker about ten seconds in (PullCap's
+ // diary of 2026-10-24: every wake's last line 8–12 s after its push, in the
+ // middle of a payment), whatever the waitUntil — so there everything is
+ // planned inside nine; elsewhere the usual thirty.
+ const budgetEnd = startedAt + (apple ? 9_000 : 27_000);
const dropStandIn = async () => {
const open = await self.registration.getNotifications({ tag: 'coinos-bg' }).catch(() => []);
for (const n of open) n.close();
@@ -204,10 +209,10 @@ self.addEventListener('push', (e) => {
// has run, cover coins without one. After the answer, inside what is
// left of the push budget.
const tend = async () => {
- const late = await tendLnPays({ deadline: startedAt + 27_000, log: diary }).catch((err) => { diary('earlier sends failed: ' + (err && err.message)); return []; });
+ const late = await tendLnPays({ deadline: budgetEnd, log: diary }).catch((err) => { diary('earlier sends failed: ' + (err && err.message)); return []; });
for (const n of late) await notice(n);
if (late.length && apple) await dropStandIn();
- await tendRenewals({ deadline: startedAt + 27_000, log: (m) => diary('renew: ' + m) })
+ await tendRenewals({ deadline: budgetEnd, log: (m) => diary('renew: ' + m) })
.catch((err) => diary('renewals failed: ' + (err && err.message)));
};
// an NWC wake-up may also have moved money in; check the rule after
@@ -217,10 +222,11 @@ self.addEventListener('push', (e) => {
await withWorkLock(async () => {
const waited = Date.now() - startedAt;
if (waited > 500) diary(`waited ${waited} ms for an earlier push to finish`);
+ if (Date.now() > budgetEnd - 2_000) { diary('no time left after waiting — leaving it to the next try'); return; }
let handled = false;
try {
handled = await withRequestLock(data.event && data.event.id,
- () => respondFromBg(data, { notifier: NOTIFIER, log: diary }),
+ () => respondFromBg(data, { notifier: NOTIFIER, log: diary, deadline: budgetEnd }),
() => { diary('another context holds this request'); return true; });
} catch (err) {
diary('auto-answer failed: ' + (err && err.message));
@@ -243,6 +249,7 @@ self.addEventListener('push', (e) => {
await tend();
return;
}
+ if (Date.now() > budgetEnd) { diary('out of time — leaving it to the next try'); return; }
// A kind-21001 offer request is money coming IN (someone asking us to
// mint an invoice) — "an app wants to pay" would read as the opposite.
const incoming = data.event && data.event.kind === 21001;
@@ -257,7 +264,7 @@ self.addEventListener('push', (e) => {
});
if (apple) await dropStandIn();
await tend();
- });
+ }, { lease: () => takeLease('work', { wait: Math.max(0, budgetEnd - Date.now() - 3_000) }) });
diary(`push done in ${Date.now() - startedAt} ms`);
});
});