134 lines
3.1 KiB
JavaScript
134 lines
3.1 KiB
JavaScript
// 三节点数据同步引擎·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' }
|
||
};
|
||
|
||
// 第一步:同步到GitHub(SYSLOG归档 + 广播归档)
|
||
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
|
||
};
|