Files
memind/notification-dispatcher.mjs
T
john 1ca06e58e7
Memind CI / Test, build, and release guards (push) Successful in 8m42s
fix(scheduled-task): deliver verified WeChat links only after page is ready
Wait for HTML materialization before releasing delivery contracts, pass
verified MindSpace URLs through proactive WeChat sends, resend on reconcile
when pages land late, and report deferred customer-service delivery as unsent.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-17 22:07:41 +08:00

39 lines
1.2 KiB
JavaScript

function resolveWechatDispatchSent(result) {
if (result && typeof result === 'object') {
return result.sent !== false && !result.deferred && !result.skipped;
}
return result !== false;
}
export function createNotificationDispatcher({ sendWechatTextToUser, logger = console } = {}) {
const sendWechat = async (userId, text, options = {}) => {
if (typeof sendWechatTextToUser !== 'function') return false;
const result = await sendWechatTextToUser(userId, text, options);
return resolveWechatDispatchSent(result);
};
return {
async sendRechargeSuccess({ userId, title, body, dedupeKey = null }) {
const sent = await sendWechat(userId, `${title}\n${body}`.trim());
logger.info?.('Notification dispatch:', {
type: 'recharge_success',
userId,
dedupeKey,
sent,
});
return sent;
},
async sendScheduleNotification({ userId, text, verifiedHtmlUrls = [] }) {
const sent = await sendWechat(userId, text, { verifiedHtmlUrls });
logger.info?.('Notification dispatch:', {
type: 'schedule_notification',
userId,
dedupeKey: null,
sent,
verifiedHtmlCount: verifiedHtmlUrls.length,
});
return sent;
},
};
}