Changeset 0403187 in Klonkt for src/services/Scheduler.js
- Timestamp:
- 07/01/2026 12:53:32 PM (2 months ago)
- Branches:
- main
- Children:
- bb3f67c
- Parents:
- 731e431
- File:
-
- 1 edited
-
src/services/Scheduler.js (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/services/Scheduler.js
r731e431 r0403187 15 15 try { 16 16 const due = db.prepare(` 17 SELECT p.id, p.site_id, p.slug, p.title, p.content, p.cover_image_url, p.cover_video_url, p.fan_only, p.nsfw, p.content_warning, 17 SELECT p.id, p.site_id, p.slug, p.title, p.content, p.cover_image_url, p.cover_video_url, p.fan_only, p.nsfw, p.content_warning, p.poll_json, 18 18 p.published_at, p.publish_at, p.created_at, u.username 19 19 FROM posts p JOIN users u ON u.id = p.author_id … … 39 39 id: p.id, slug: p.slug, title: p.title || p.slug, 40 40 content: p.content, cover_image_url: p.cover_image_url || null, cover_video_url: p.cover_video_url || null, 41 published_at: p.published_at || p.publish_at, created_at: p.created_at, fan_only: p.fan_only, nsfw: p.nsfw, content_warning: p.content_warning, 41 published_at: p.published_at || p.publish_at, created_at: p.created_at, fan_only: p.fan_only, nsfw: p.nsfw, content_warning: p.content_warning, poll_json: p.poll_json, 42 42 }).catch(() => { /* best-effort */ }); 43 43 } … … 48 48 } 49 49 50 // Close hosted polls whose endTime has passed: mark them closed (once) and push the final 51 // tally + closed state to followers as Update(Question). The `closed` flag in poll_json 52 // guards against re-sending — a poll is only processed on the tick that crosses its endTime. 53 export function closeExpiredPolls() { 54 try { 55 const due = db.prepare(` 56 SELECT id, poll_json FROM posts 57 WHERE poll_json IS NOT NULL 58 AND status = 'published' 59 AND json_extract(poll_json, '$.endTime') IS NOT NULL 60 AND IFNULL(json_extract(poll_json, '$.closed'), 0) = 0 61 AND datetime(json_extract(poll_json, '$.endTime')) <= datetime('now') 62 `).all(); 63 if (!due.length) return 0; 64 const upd = db.prepare('UPDATE posts SET poll_json = ? WHERE id = ?'); 65 for (const p of due) { 66 let d; try { d = JSON.parse(p.poll_json); } catch { continue; } 67 d.closed = true; 68 upd.run(JSON.stringify(d), p.id); 69 ActivityPubService.deliverPollUpdate(p.id).catch(() => { /* best-effort */ }); 70 } 71 return due.length; 72 } catch { return 0; } 73 } 74 50 75 let _timer = null; 76 function tick() { flipScheduledPosts(); closeExpiredPolls(); } 51 77 export function startScheduler() { 52 flipScheduledPosts();// run immediately on boot78 tick(); // run immediately on boot 53 79 if (_timer) return; 54 _timer = setInterval( flipScheduledPosts, 60 * 1000); // every minute80 _timer = setInterval(tick, 60 * 1000); // every minute 55 81 if (_timer.unref) _timer.unref(); 56 82 }
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)