50 lines
1.4 KiB
JavaScript
50 lines
1.4 KiB
JavaScript
import { syncGeneratedPagesFromPublicAssets } from './mindspace-page-sync.mjs';
|
|
import { resolvePublishDir } from './user-publish.mjs';
|
|
|
|
export function createPageSyncService({
|
|
pool,
|
|
pageService,
|
|
assetService,
|
|
h5Root,
|
|
syncWorkspaceAssets = null,
|
|
logger = console,
|
|
} = {}) {
|
|
const syncInFlight = new Map();
|
|
|
|
async function syncUserGeneratedPages(userId, { onlyRelativePaths = null } = {}) {
|
|
if (!pool || !pageService || !userId) {
|
|
return { created: 0, skipped: 0, updated: 0 };
|
|
}
|
|
|
|
const scopeKey = onlyRelativePaths == null
|
|
? '*'
|
|
: [...new Set(onlyRelativePaths)].sort().join('|');
|
|
const inFlightKey = `${userId}:${scopeKey}`;
|
|
let inFlight = syncInFlight.get(inFlightKey);
|
|
if (!inFlight) {
|
|
inFlight = syncGeneratedPagesFromPublicAssets({
|
|
pool,
|
|
pageService,
|
|
assetService,
|
|
userId,
|
|
publishDir: h5Root ? resolvePublishDir(h5Root, { id: userId }) : null,
|
|
syncWorkspaceAssets,
|
|
onlyRelativePaths,
|
|
})
|
|
.catch((error) => {
|
|
logger.warn?.('[MindSpace] page sync failed:', error?.message ?? error);
|
|
return { created: 0, skipped: 0, updated: 0 };
|
|
})
|
|
.finally(() => {
|
|
if (syncInFlight.get(inFlightKey) === inFlight) {
|
|
syncInFlight.delete(inFlightKey);
|
|
}
|
|
});
|
|
syncInFlight.set(inFlightKey, inFlight);
|
|
}
|
|
return inFlight;
|
|
}
|
|
|
|
return { syncUserGeneratedPages };
|
|
}
|