Files
speckle-server/packages/server/modules/multiregion/index.ts
T
Daniel Gak Anagrov 1f5003bd32 feat(multiregion): cron job to detect regions out of sync (#5392)
* feat: basic structure

* fix: detect regions out of sync

* feat: added sync logic

* fix: tests

* feat: merge all strategy

* fix: mr comments

* fix: updatedAt in updates

* feat: project updatedAt no longer is a hidden operation

* feat: project region sync

* feat: delete project on cross-region-move

* removal: unnecesary permisions

* fix: caching issue

* fix: saved views on project cross region move
2025-09-10 16:35:48 +01:00

61 lines
1.7 KiB
TypeScript

import { moduleLogger } from '@/observability/logging'
import {
getValidDefaultProjectRegionKey,
initializeRegisteredRegionClients as initDb
} from '@/modules/multiregion/utils/dbSelector'
import { isMultiRegionEnabled } from '@/modules/multiregion/helpers'
import type { SpeckleModule } from '@/modules/shared/helpers/typeHelper'
import {
initializeRegisteredRegionClients as initBlobs,
isMultiRegionBlobStorageEnabled
} from '@/modules/multiregion/utils/blobStorageSelector'
import {
initializeQueue,
shutdownQueue,
startQueue
} from '@/modules/multiregion/services/queue'
import { scheduleStalePreparedTransactionCleanup } from '@/modules/multiregion/tasks/pendingTransactions'
import type cron from 'node-cron'
import { scheduleAutoSyncRegions } from '@/modules/multiregion/tasks/regionSync'
let scheduledTasks: cron.ScheduledTask[] = []
const multiRegion: SpeckleModule = {
async init({ isInitial }) {
const isEnabled = isMultiRegionEnabled()
if (!isEnabled) {
return
}
moduleLogger.info('🌍 Init multiRegion module')
// Init registered region clients
await initDb()
// validate default project region key
await getValidDefaultProjectRegionKey()
const isBlobStorageEnabled = isMultiRegionBlobStorageEnabled()
if (isBlobStorageEnabled) {
moduleLogger.info('🌍 Init multiRegion blob storage')
await initBlobs()
}
if (isInitial) {
await initializeQueue()
await startQueue()
scheduledTasks = [
await scheduleStalePreparedTransactionCleanup(),
await scheduleAutoSyncRegions()
]
}
},
async shutdown() {
await shutdownQueue()
scheduledTasks.forEach((task) => {
task.stop()
})
}
}
export default multiRegion