guanghulab/sync/sync-engine.js
2026-05-10 13:12:44 +08:00

134 lines
3.1 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 三节点数据同步引擎·sync-engine.js
// HoloLake·M-DINGTALK Phase 3
// DEV-004 之之×秋秋
//
// 三个节点钉钉本地·GitHub·Notion
//
const fs = require('fs');
const path = require('path');
const syncToGitHub = require('./sync-to-github');
const syncToNotion = require('./sync-to-notion');
// 同步状态记录
const syncStatus = {
lastSync: null,
syncCount: 0,
errors: [],
history: []
};
/**
* 执行全量同步(三节点)
*/
async function syncAll() {
console.log('\n[Sync] ====================');
console.log('[Sync] 开始三节点全量同步...');
console.log(`[Sync] 时间: ${new Date().toLocaleString('zh-CN')}`);
const result = {
timestamp: new Date().toISOString(),
github: { status: 'pending' },
notion: { status: 'pending' }
};
// 第一步同步到GitHubSYSLOG归档 + 广播归档)
try {
result.github = await syncToGitHub.sync();
console.log(`[Sync] GitHub同步: ${result.github.status}`);
} catch (err) {
result.github = { status: 'error', error: err.message };
console.error('[Sync] GitHub同步失败:', err.message);
}
// 第二步同步到Notion主控台回写
try {
result.notion = await syncToNotion.sync();
console.log(`[Sync] Notion同步: ${result.notion.status}`);
} catch (err) {
result.notion = { status: 'error', error: err.message };
console.error('[Sync] Notion同步失败:', err.message);
}
// 更新同步状态
syncStatus.lastSync = result.timestamp;
syncStatus.syncCount++;
syncStatus.history.unshift(result);
if (syncStatus.history.length > 50) {
syncStatus.history = syncStatus.history.slice(0, 50);
}
// 记录错误
if (result.github.status === 'error') {
syncStatus.errors.push({
time: result.timestamp,
target: 'github',
error: result.github.error
});
}
if (result.notion.status === 'error') {
syncStatus.errors.push({
time: result.timestamp,
target: 'notion',
error: result.notion.error
});
}
console.log('[Sync] 三节点同步完成 ✅');
console.log(`[Sync] 累计同步次数:${syncStatus.syncCount}`);
console.log('[Sync] ====================');
return result;
}
/**
* SYSLOG提交后触发同步
*/
async function syncAfterSyslog(syslogData) {
console.log('[Sync] SYSLOG处理后同步...');
const result = {
timestamp: new Date().toISOString(),
trigger: 'syslog',
syslogId: syslogData.session_id
};
// 归档SYSLOG到GitHub
try {
result.github = await syncToGitHub.archiveSyslog(syslogData);
} catch (err) {
result.github = { status: 'error', error: err.message };
}
// 回写进度到Notion
try {
result.notion = await syncToNotion.updateProgress(syslogData);
} catch (err) {
result.notion = { status: 'error', error: err.message };
}
syncStatus.lastSync = result.timestamp;
syncStatus.syncCount++;
syncStatus.history.unshift(result);
return result;
}
/**
* 获取同步状态
*/
function getStatus() {
return {
...syncStatus,
recentErrors: syncStatus.errors.slice(-5)
};
}
module.exports = {
syncAll,
syncAfterSyslog,
getStatus
};