From feea68846b4c3c871cc29674dbab4a0ecfa9b64a Mon Sep 17 00:00:00 2001 From: Termopus Bot Date: Thu, 5 Mar 2026 12:44:25 +0000 Subject: [PATCH] Sync from private repo Source: Termopus/termopus@59cc913 Date: 2026-03-05T12:44:25Z Validated: 21 security checks passed --- relay_worker/src/relay.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/relay_worker/src/relay.ts b/relay_worker/src/relay.ts index 12f47ce..48de71a 100644 --- a/relay_worker/src/relay.ts +++ b/relay_worker/src/relay.ts @@ -190,7 +190,7 @@ export class SessionRelay extends DurableObject { /** Write-through caches (populated on first access, lost on hibernation). */ private _lastActivity?: number; private _handledRequests?: Record; - private _fcmToken?: string; + private _fcmToken?: string | null; // undefined=unchecked, null=checked-no-token, string=token constructor(ctx: DurableObjectState, env: Env) { super(ctx, env); // REQUIRED for hibernation — sets this.ctx + this.env @@ -1081,12 +1081,18 @@ export class SessionRelay extends DurableObject { if (fcmToken) { this._fcmToken = fcmToken; await this.ctx.storage.put('fcmToken', fcmToken); + } else { + this._fcmToken = null; // Cache the miss — prevents KV reads on every message } } else { this._fcmToken = fcmToken; } } - if (!fcmToken) return false; + if (!fcmToken) { + // Write cooldown even on miss — protects across DO hibernation boundaries + await this.ctx.storage.put('lastPushTimestamp', now); + return false; + } await this.ctx.storage.put('lastPushTimestamp', now);