chore(logging): normalize wakeup flow observability with timings and summaries

Standardize console prefixes across scheduler, push, refresh, register,
auth, and debug endpoints. Add pass-level scheduler summaries, elapsed-time
logs, and masked-token-only push failure messages while reducing per-device
noise in scheduler loops.
This commit is contained in:
Jose Olarte III
2026-05-21 19:18:28 +08:00
parent e82c3ae5bc
commit f12dd03725
6 changed files with 184 additions and 68 deletions

View File

@@ -1,6 +1,6 @@
import { db } from "./db/fcmTokens.js";
import { sendPushToDevice } from "./services/pushService.js";
import { maskToken } from "./util/maskToken.js";
import { errorMessage, formatElapsedMs } from "./util/formatElapsed.js";
let intervalId: ReturnType<typeof setInterval> | undefined;
@@ -8,25 +8,52 @@ export function startScheduler(): void {
if (intervalId !== undefined) return;
intervalId = setInterval(async () => {
const passStarted = Date.now();
console.log("[Scheduler] Pass started");
try {
console.log("[Scheduler] Checking devices...");
const devices = await db.getAllForScheduler();
const seenTokens = new Set<string>();
let checked = 0;
let sent = 0;
let skipped = 0;
let failed = 0;
let duplicates = 0;
for (const d of devices) {
if (seenTokens.has(d.fcmToken)) {
console.log(
"[Scheduler] Duplicate device skipped:",
d.deviceId,
maskToken(d.fcmToken)
);
duplicates++;
continue;
}
seenTokens.add(d.fcmToken);
await sendPushToDevice(d.fcmToken);
checked++;
const result = await sendPushToDevice(d.fcmToken);
if (result === "sent") sent++;
else if (result === "skipped") skipped++;
else failed++;
}
const summaryParts = [
`Checked ${checked} devices`,
`sent ${sent} pushes`,
`skipped ${skipped}`,
];
if (failed > 0) summaryParts.push(`failed ${failed}`);
if (duplicates > 0) {
summaryParts.push(`${duplicates} duplicates ignored`);
}
console.log("[Scheduler]", summaryParts.join(", "));
console.log(
"[Scheduler] Pass completed in",
formatElapsedMs(Date.now() - passStarted)
);
} catch (err) {
console.error("[Scheduler] Tick failed", err);
console.error(
"[Scheduler] Pass failed in",
formatElapsedMs(Date.now() - passStarted) + ":",
errorMessage(err)
);
}
}, 5 * 60 * 1000);
}