chore: rely on websockets for autosync if a websocket connection is open (#2672)
This commit is contained in:
@@ -137,9 +137,6 @@ import { TYPES } from './Dependencies/Types'
|
||||
import { RegisterApplicationServicesEvents } from './Dependencies/DependencyEvents'
|
||||
import { Result } from '@standardnotes/domain-core'
|
||||
|
||||
/** How often to automatically sync, in milliseconds */
|
||||
const DEFAULT_AUTO_SYNC_INTERVAL = 30_000
|
||||
|
||||
type LaunchCallback = {
|
||||
receiveChallenge: (challenge: Challenge) => void
|
||||
}
|
||||
@@ -165,7 +162,6 @@ export class SNApplication implements ApplicationInterface, AppGroupManagedAppli
|
||||
|
||||
private serviceObservers: ObserverRemover[] = []
|
||||
private managedSubscribers: ObserverRemover[] = []
|
||||
private autoSyncInterval!: ReturnType<typeof setInterval>
|
||||
|
||||
/** True if the result of deviceInterface.openDatabase yields a new database being created */
|
||||
private createdNewDatabase = false
|
||||
@@ -463,7 +459,7 @@ export class SNApplication implements ApplicationInterface, AppGroupManagedAppli
|
||||
throw 'Application has been destroyed.'
|
||||
}
|
||||
await this.handleStage(ApplicationStage.LoadedDatabase_12)
|
||||
this.beginAutoSyncTimer()
|
||||
this.sync.beginAutoSyncTimer()
|
||||
await this.sync.sync({
|
||||
mode: SyncMode.DownloadFirst,
|
||||
source: SyncSource.External,
|
||||
@@ -503,14 +499,6 @@ export class SNApplication implements ApplicationInterface, AppGroupManagedAppli
|
||||
}
|
||||
}
|
||||
|
||||
private beginAutoSyncTimer() {
|
||||
this.autoSyncInterval = setInterval(() => {
|
||||
const logger = this.dependencies.get<LoggerInterface>(TYPES.Logger)
|
||||
logger.info('Syncing from autosync')
|
||||
void this.sync.sync({ sourceDescription: 'Auto Sync' })
|
||||
}, DEFAULT_AUTO_SYNC_INTERVAL)
|
||||
}
|
||||
|
||||
private async handleStage(stage: ApplicationStage) {
|
||||
await this.events.publishSync(
|
||||
{
|
||||
@@ -743,9 +731,6 @@ export class SNApplication implements ApplicationInterface, AppGroupManagedAppli
|
||||
public deinit(mode: DeinitMode, source: DeinitSource): void {
|
||||
this.dealloced = true
|
||||
|
||||
clearInterval(this.autoSyncInterval)
|
||||
;(this.autoSyncInterval as unknown) = undefined
|
||||
|
||||
for (const uninstallObserver of this.serviceObservers) {
|
||||
uninstallObserver()
|
||||
}
|
||||
|
||||
@@ -1331,6 +1331,15 @@ export class Dependencies {
|
||||
)
|
||||
})
|
||||
|
||||
this.factory.set(TYPES.WebSocketsService, () => {
|
||||
return new WebSocketsService(
|
||||
this.get<DiskStorageService>(TYPES.DiskStorageService),
|
||||
this.options.webSocketUrl,
|
||||
this.get<WebSocketApiService>(TYPES.WebSocketApiService),
|
||||
this.get<InternalEventBus>(TYPES.InternalEventBus),
|
||||
)
|
||||
})
|
||||
|
||||
this.factory.set(TYPES.SyncService, () => {
|
||||
return new SyncService(
|
||||
this.get<ItemManager>(TYPES.ItemManager),
|
||||
@@ -1347,6 +1356,7 @@ export class Dependencies {
|
||||
sleepBetweenBatches: this.options.sleepBetweenBatches,
|
||||
},
|
||||
this.get<Logger>(TYPES.Logger),
|
||||
this.get<WebSocketsService>(TYPES.WebSocketsService),
|
||||
this.get<InternalEventBus>(TYPES.InternalEventBus),
|
||||
)
|
||||
})
|
||||
@@ -1390,15 +1400,6 @@ export class Dependencies {
|
||||
)
|
||||
})
|
||||
|
||||
this.factory.set(TYPES.WebSocketsService, () => {
|
||||
return new WebSocketsService(
|
||||
this.get<DiskStorageService>(TYPES.DiskStorageService),
|
||||
this.options.webSocketUrl,
|
||||
this.get<WebSocketApiService>(TYPES.WebSocketApiService),
|
||||
this.get<InternalEventBus>(TYPES.InternalEventBus),
|
||||
)
|
||||
})
|
||||
|
||||
this.factory.set(TYPES.WebSocketApiService, () => {
|
||||
return new WebSocketApiService(this.get<WebSocketServer>(TYPES.WebSocketServer))
|
||||
})
|
||||
|
||||
@@ -40,6 +40,7 @@ export function RegisterApplicationServicesEvents(container: Dependencies, event
|
||||
events.addEventHandler(container.get(TYPES.SubscriptionManager), ApplicationEvent.UserRolesChanged)
|
||||
events.addEventHandler(container.get(TYPES.SubscriptionManager), SessionEvent.Restored)
|
||||
events.addEventHandler(container.get(TYPES.SyncService), IntegrityEvent.IntegrityCheckCompleted)
|
||||
events.addEventHandler(container.get(TYPES.SyncService), WebSocketsServiceEvent.ItemsChangedOnServer)
|
||||
events.addEventHandler(container.get(TYPES.UserService), AccountEvent.SignedInOrRegistered)
|
||||
events.addEventHandler(container.get(TYPES.VaultInviteService), ApplicationEvent.Launched)
|
||||
events.addEventHandler(container.get(TYPES.VaultInviteService), SyncEvent.ReceivedSharedVaultInvites)
|
||||
|
||||
@@ -84,6 +84,8 @@ import {
|
||||
SyncEventReceivedAsymmetricMessagesData,
|
||||
SyncOpStatus,
|
||||
ApplicationSyncOptions,
|
||||
WebSocketsServiceEvent,
|
||||
WebSocketsService,
|
||||
} from '@standardnotes/services'
|
||||
import { OfflineSyncResponse } from './Offline/Response'
|
||||
import {
|
||||
@@ -98,6 +100,7 @@ import { ContentType } from '@standardnotes/domain-core'
|
||||
|
||||
const DEFAULT_MAJOR_CHANGE_THRESHOLD = 15
|
||||
const INVALID_SESSION_RESPONSE_STATUS = 401
|
||||
const DEFAULT_AUTO_SYNC_INTERVAL = 30_000
|
||||
|
||||
/** Content types appearing first are always mapped first */
|
||||
const ContentTypeLocalLoadPriorty = [
|
||||
@@ -149,6 +152,9 @@ export class SyncService
|
||||
public lastSyncInvokationPromise?: Promise<unknown>
|
||||
public currentSyncRequestPromise?: Promise<void>
|
||||
|
||||
private autoSyncInterval?: NodeJS.Timer
|
||||
private wasNotifiedOfItemsChangeOnServer = false
|
||||
|
||||
constructor(
|
||||
private itemManager: ItemManager,
|
||||
private sessionManager: SessionManager,
|
||||
@@ -161,6 +167,7 @@ export class SyncService
|
||||
private identifier: string,
|
||||
private readonly options: ApplicationSyncOptions,
|
||||
private logger: LoggerInterface,
|
||||
private sockets: WebSocketsService,
|
||||
protected override internalEventBus: InternalEventBusInterface,
|
||||
) {
|
||||
super(internalEventBus)
|
||||
@@ -187,6 +194,10 @@ export class SyncService
|
||||
|
||||
public override deinit(): void {
|
||||
this.dealloced = true
|
||||
if (this.autoSyncInterval) {
|
||||
clearInterval(this.autoSyncInterval)
|
||||
}
|
||||
;(this.autoSyncInterval as unknown) = undefined
|
||||
;(this.sessionManager as unknown) = undefined
|
||||
;(this.itemManager as unknown) = undefined
|
||||
;(this.encryptionService as unknown) = undefined
|
||||
@@ -349,6 +360,28 @@ export class SyncService
|
||||
this.opStatus.setDatabaseLoadStatus(0, 0, true)
|
||||
}
|
||||
|
||||
beginAutoSyncTimer(): void {
|
||||
this.autoSyncInterval = setInterval(this.autoSync.bind(this), DEFAULT_AUTO_SYNC_INTERVAL)
|
||||
}
|
||||
|
||||
private autoSync(): void {
|
||||
if (!this.sockets.isWebSocketConnectionOpen()) {
|
||||
this.logger.debug('WebSocket connection is closed, doing autosync')
|
||||
|
||||
void this.sync({ sourceDescription: 'Auto Sync' })
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if (this.wasNotifiedOfItemsChangeOnServer) {
|
||||
this.logger.debug('Was notified of items changed on server, doing autosync')
|
||||
|
||||
this.wasNotifiedOfItemsChangeOnServer = false
|
||||
|
||||
void this.sync({ sourceDescription: 'WebSockets Event - Items Changed On Server' })
|
||||
}
|
||||
}
|
||||
|
||||
private async processPayloadBatch(
|
||||
batch: FullyFormedPayloadInterface<ItemContent>[],
|
||||
currentPosition?: number,
|
||||
@@ -1400,8 +1433,15 @@ export class SyncService
|
||||
}
|
||||
|
||||
async handleEvent(event: InternalEventInterface): Promise<void> {
|
||||
if (event.type === IntegrityEvent.IntegrityCheckCompleted) {
|
||||
await this.handleIntegrityCheckEventResponse(event.payload as IntegrityEventPayload)
|
||||
switch (event.type) {
|
||||
case IntegrityEvent.IntegrityCheckCompleted:
|
||||
await this.handleIntegrityCheckEventResponse(event.payload as IntegrityEventPayload)
|
||||
break
|
||||
case WebSocketsServiceEvent.ItemsChangedOnServer:
|
||||
this.wasNotifiedOfItemsChangeOnServer = true
|
||||
break
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
"@standardnotes/api": "workspace:*",
|
||||
"@standardnotes/common": "^1.50.0",
|
||||
"@standardnotes/domain-core": "^1.40.0",
|
||||
"@standardnotes/domain-events": "^2.122.0",
|
||||
"@standardnotes/domain-events": "^2.138.1",
|
||||
"@standardnotes/encryption": "workspace:*",
|
||||
"@standardnotes/features": "workspace:*",
|
||||
"@standardnotes/files": "workspace:*",
|
||||
|
||||
Reference in New Issue
Block a user