guanghulab/sync/sync-engine.js

134 lines
3.1 KiB
JavaScript
Raw Normal View History

// 三节点数据同步引擎·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
};