// Fires a one-shot "starts in ~10 minutes" reminder to a scheduled meeting's host, // group members, and invited participants. Runs on a 60s tick; marks each meeting reminded. const R = require('./repos'); const CHAT = require('./chat'); const PUSH = require('./push'); // native/web background push so a CLOSED app still gets the reminder async function tick() { try { const now = Date.now(); const due = await R.scheduledMeetings.dueForReminder(now, now + 10 * 60 * 1000); // starting within 10 min for (const s of due) { const recipients = new Set([s.created_by]); let invited = []; try { invited = JSON.parse(s.participants || '[]'); } catch (_) {} invited.forEach((id) => recipients.add(id)); if (s.group_id) { try { (await R.conversations.members(s.group_id)).forEach((m) => recipients.add(m)); } catch (_) {} } const evt = { type: 'meeting-reminder', meeting: { id: s.id, title: s.title, scheduledAt: s.scheduled_at, room: s.room_code } }; recipients.forEach((uid) => { try { CHAT.pushToUser(uid, evt); } catch (_) {} }); // open tab recipients.forEach((uid) => { try { PUSH.sendToUser(uid, { title: 'Meeting starting soon', body: (s.title || 'Your meeting') + ' starts in ~10 minutes', kind: 'meeting', id: s.room_code, tag: 'meet:' + s.room_code }); } catch (_) {} }); // closed app (iOS APNs etc.) await R.scheduledMeetings.markReminded(s.id); } } catch (_) { /* never let the timer die */ } } let timer = null; function start() { if (!timer) timer = setInterval(tick, 60 * 1000); } start(); module.exports = { start, tick };