import { Subject, Observable } from 'rxjs' import { Http, Update, Operation, Revision, Source, Store } from 'patch-db-client' import { RR } from '../api.types' import { DataModel } from 'src/app/services/patch-db/data-model' export abstract class ApiService implements Source, Http { protected readonly sync = new Subject>() /** PatchDb Source interface. Post/Patch requests provide a source of patches to the db. */ // sequenceStream '_' is not used by the live api, but is overridden by the mock watch$ (_?: Store): Observable> { return this.sync.asObservable() } // for getting static files: ex icons, instructions, licenses abstract getStatic (url: string): Promise // db abstract getRevisions (since: number): Promise abstract getDump (): Promise protected abstract setDbValueRaw (params: RR.SetDBValueReq): Promise setDbValue = (params: RR.SetDBValueReq) => this.syncResponse( () => this.setDbValueRaw(params), )() // auth abstract login (params: RR.LoginReq): Promise abstract logout (params: RR.LogoutReq): Promise abstract getSessions (params: RR.GetSessionsReq): Promise abstract killSessions (params: RR.KillSessionsReq): Promise // server protected abstract setShareStatsRaw (params: RR.SetShareStatsReq): Promise setShareStats = (params: RR.SetShareStatsReq) => this.syncResponse( () => this.setShareStatsRaw(params), )() abstract getServerLogs (params: RR.GetServerLogsReq): Promise abstract getServerMetrics (params: RR.GetServerMetricsReq): Promise abstract getPkgMetrics (params: RR.GetPackageMetricsReq): Promise protected abstract updateServerRaw (params: RR.UpdateServerReq): Promise updateServer = (params: RR.UpdateServerReq) => this.syncResponse( () => this.updateServerRaw(params), )() abstract restartServer (params: RR.UpdateServerReq): Promise abstract shutdownServer (params: RR.ShutdownServerReq): Promise // network abstract refreshLan (params: RR.RefreshLanReq): Promise // marketplace URLs protected abstract setEosMarketplaceRaw (isTor: boolean): Promise setEosMarketplace = (isTor: boolean) => this.syncResponse( () => this.setEosMarketplaceRaw(isTor), )() // protected abstract setPackageMarketplaceRaw (params: RR.SetPackageMarketplaceReq): Promise // setPackageMarketplace = (params: RR.SetPackageMarketplaceReq) => this.syncResponse( // () => this.setPackageMarketplaceRaw(params), // )() // password // abstract updatePassword (params: RR.UpdatePasswordReq): Promise // notification abstract getNotificationsRaw (params: RR.GetNotificationsReq): Promise getNotifications = (params: RR.GetNotificationsReq) => this.syncResponse( () => this.getNotificationsRaw(params), )() abstract deleteNotification (params: RR.DeleteNotificationReq): Promise // wifi abstract addWifi (params: RR.AddWifiReq): Promise protected abstract connectWifiRaw (params: RR.ConnectWifiReq): Promise connectWifi = (params: RR.ConnectWifiReq) => this.syncResponse( () => this.connectWifiRaw(params), )() protected abstract deleteWifiRaw (params: RR.DeleteWifiReq): Promise deleteWifi = (params: RR.DeleteWifiReq) => this.syncResponse( () => this.deleteWifiRaw(params), )() // ssh abstract getSshKeys (params: RR.GetSSHKeysReq): Promise abstract addSshKey (params: RR.AddSSHKeyReq): Promise abstract deleteSshKey (params: RR.DeleteSSHKeyReq): Promise // backup protected abstract createBackupRaw (params: RR.CreateBackupReq): Promise createBackup = (params: RR.CreateBackupReq) => this.syncResponse( () => this.createBackupRaw(params), )() protected abstract restoreBackupRaw (params: RR.RestoreBackupReq): Promise restoreBackup = (params: RR.RestoreBackupReq) => this.syncResponse( () => this.restoreBackupRaw(params), )() // disk abstract getDisks (params: RR.GetDisksReq): Promise abstract ejectDisk (params: RR.EjectDisksReq): Promise // package abstract getPackageProperties (params: RR.GetPackagePropertiesReq): Promise['data']> abstract getPackageLogs (params: RR.GetPackageLogsReq): Promise protected abstract installPackageRaw (params: RR.InstallPackageReq): Promise installPackage = (params: RR.InstallPackageReq) => this.syncResponse( () => this.installPackageRaw(params), )() abstract dryUpdatePackage (params: RR.DryUpdatePackageReq): Promise abstract getPackageConfig (params: RR.GetPackageConfigReq): Promise abstract drySetPackageConfig (params: RR.DrySetPackageConfigReq): Promise protected abstract setPackageConfigRaw (params: RR.SetPackageConfigReq): Promise setPackageConfig = (params: RR.SetPackageConfigReq) => this.syncResponse( () => this.setPackageConfigRaw(params), )() protected abstract restorePackageRaw (params: RR.RestorePackageReq): Promise restorePackage = (params: RR.RestorePackageReq) => this.syncResponse( () => this.restorePackageRaw(params), )() abstract executePackageAction (params: RR.ExecutePackageActionReq): Promise protected abstract startPackageRaw (params: RR.StartPackageReq): Promise startPackage = (params: RR.StartPackageReq) => this.syncResponse( () => this.startPackageRaw(params), )() abstract dryStopPackage (params: RR.DryStopPackageReq): Promise protected abstract stopPackageRaw (params: RR.StopPackageReq): Promise stopPackage = (params: RR.StopPackageReq) => this.syncResponse( () => this.stopPackageRaw(params), )() abstract dryRemovePackage (params: RR.DryRemovePackageReq): Promise protected abstract removePackageRaw (params: RR.RemovePackageReq): Promise removePackage = (params: RR.RemovePackageReq) => this.syncResponse( () => this.removePackageRaw(params), )() abstract dryConfigureDependency (params: RR.DryConfigureDependencyReq): Promise // Helper allowing quick decoration to sync the response patch and return the response contents. // Pass in a tempUpdate function which returns a UpdateTemp corresponding to a temporary // state change you'd like to enact prior to request and expired when request terminates. private syncResponse Promise<{ response: T, revision?: Revision }>> (f: F, temp?: Operation): (...args: Parameters) => Promise { return (...a) => { // let expireId = undefined // if (temp) { // expireId = uuid.v4() // this.sync.next({ patch: [temp], expiredBy: expireId }) // } return f(a).then(({ response, revision }) => { if (revision) this.sync.next(revision) return response }) as any } } }