import { Vault } from "obsidian" ; import type { DropboxConfig , OnedriveConfig , S3Config , SUPPORTED_SERVICES_TYPE , WebdavConfig , } from "./baseTypes" ; import * as dropbox from "./remoteForDropbox" ; import * as onedrive from "./remoteForOnedrive" ; import * as s3 from "./remoteForS3" ; import * as webdav from "./remoteForWebdav" ; import * as origLog from "loglevel" ; const log = origLog . getLogger ( "rs-default" ) ; export class RemoteClient { readonly serviceType : SUPPORTED_SERVICES_TYPE ; readonly s3Client ? : s3 . S3Client ; readonly s3Config ? : S3Config ; readonly webdavClient ? : webdav . WrappedWebdavClient ; readonly webdavConfig ? : WebdavConfig ; readonly dropboxClient ? : dropbox . WrappedDropboxClient ; readonly dropboxConfig ? : DropboxConfig ; readonly onedriveClient ? : onedrive . WrappedOnedriveClient ; readonly onedriveConfig ? : OnedriveConfig ; constructor ( serviceType , s3Config ? , webdavConfig ? , dropboxConfig ? , onedriveConfig ? , vaultName ? , saveUpdatedConfigFunc ? ) { this . serviceType = serviceType ; if ( serviceType === "s3" ) { this . s3Config = s3Config ; this . s3Client = s3 . getS3Client ( this . s3Config ) ; } else if ( serviceType === "webdav" ) { if ( vaultName === undefined ) { throw Error ( "remember to provide vault name while init webdav client" ) ; } this . webdavConfig = webdavConfig ; this . webdavClient = webdav . getWebdavClient ( this . webdavConfig , vaultName ) ; } else if ( serviceType === "dropbox" ) { if ( vaultName === undefined || saveUpdatedConfigFunc === undefined ) { throw Error ( "remember to provide vault name and callback while init dropbox client" ) ; } this . dropboxConfig = dropboxConfig ; this . dropboxClient = dropbox . getDropboxClient ( this . dropboxConfig , vaultName , saveUpdatedConfigFunc ) ; } else if ( serviceType === "onedrive" ) { if ( vaultName === undefined || saveUpdatedConfigFunc === undefined ) { throw Error ( "remember to provide vault name and callback while init onedrive client" ) ; } this . onedriveConfig = onedriveConfig ; this . onedriveClient = onedrive . getOnedriveClient ( this . onedriveConfig , vaultName , saveUpdatedConfigFunc ) ; } else { throw Error ( `not supported service type ${ this . serviceType }` ) ; } } getRemoteMeta = async ( fileOrFolderPath ) => { if ( this . serviceType === "s3" ) { return await s3 . getRemoteMeta ( this . s3Client , this . s3Config , fileOrFolderPath ) ; } else if ( this . serviceType === "webdav" ) { return await webdav . getRemoteMeta ( this . webdavClient , fileOrFolderPath ) ; } else if ( this . serviceType === "dropbox" ) { return await dropbox . getRemoteMeta ( this . dropboxClient , fileOrFolderPath ) ; } else if ( this . serviceType === "onedrive" ) { return await onedrive . getRemoteMeta ( this . onedriveClient , fileOrFolderPath ) ; } else { throw Error ( `not supported service type ${ this . serviceType }` ) ; } } ; uploadToRemote = async ( fileOrFolderPath , vault , isRecursively = false , password = "" , remoteEncryptedKey = "" , foldersCreatedBefore = undefined ) => { if ( this . serviceType === "s3" ) { return await s3 . uploadToRemote ( this . s3Client , this . s3Config , fileOrFolderPath , vault , isRecursively , password , remoteEncryptedKey ) ; } else if ( this . serviceType === "webdav" ) { return await webdav . uploadToRemote ( this . webdavClient , fileOrFolderPath , vault , isRecursively , password , remoteEncryptedKey ) ; } else if ( this . serviceType === "dropbox" ) { return await dropbox . uploadToRemote ( this . dropboxClient , fileOrFolderPath , vault , isRecursively , password , remoteEncryptedKey , foldersCreatedBefore ) ; } else if ( this . serviceType === "onedrive" ) { return await onedrive . uploadToRemote ( this . onedriveClient , fileOrFolderPath , vault , isRecursively , password , remoteEncryptedKey , foldersCreatedBefore ) ; } else { throw Error ( `not supported service type ${ this . serviceType }` ) ; } } ; listFromRemote = async ( prefix ? ) => { if ( this . serviceType === "s3" ) { return await s3 . listFromRemote ( this . s3Client , this . s3Config , prefix ) ; } else if ( this . serviceType === "webdav" ) { return await webdav . listFromRemote ( this . webdavClient , prefix ) ; } else if ( this . serviceType === "dropbox" ) { return await dropbox . listFromRemote ( this . dropboxClient , prefix ) ; } else if ( this . serviceType === "onedrive" ) { return await onedrive . listFromRemote ( this . onedriveClient , prefix ) ; } else { throw Error ( `not supported service type ${ this . serviceType }` ) ; } } ; downloadFromRemote = async ( fileOrFolderPath , vault , mtime , password = "" , remoteEncryptedKey = "" ) => { if ( this . serviceType === "s3" ) { return await s3 . downloadFromRemote ( this . s3Client , this . s3Config , fileOrFolderPath , vault , mtime , password , remoteEncryptedKey ) ; } else if ( this . serviceType === "webdav" ) { return await webdav . downloadFromRemote ( this . webdavClient , fileOrFolderPath , vault , mtime , password , remoteEncryptedKey ) ; } else if ( this . serviceType === "dropbox" ) { return await dropbox . downloadFromRemote ( this . dropboxClient , fileOrFolderPath , vault , mtime , password , remoteEncryptedKey ) ; } else if ( this . serviceType === "onedrive" ) { return await onedrive . downloadFromRemote ( this . onedriveClient , fileOrFolderPath , vault , mtime , password , remoteEncryptedKey ) ; } else { throw Error ( `not supported service type ${ this . serviceType }` ) ; } } ; deleteFromRemote = async ( fileOrFolderPath , password = "" , remoteEncryptedKey = "" ) => { if ( this . serviceType === "s3" ) { return await s3 . deleteFromRemote ( this . s3Client , this . s3Config , fileOrFolderPath , password , remoteEncryptedKey ) ; } else if ( this . serviceType === "webdav" ) { return await webdav . deleteFromRemote ( this . webdavClient , fileOrFolderPath , password , remoteEncryptedKey ) ; } else if ( this . serviceType === "dropbox" ) { return await dropbox . deleteFromRemote ( this . dropboxClient , fileOrFolderPath , password , remoteEncryptedKey ) ; } else if ( this . serviceType === "onedrive" ) { return await onedrive . deleteFromRemote ( this . onedriveClient , fileOrFolderPath , password , remoteEncryptedKey ) ; } else { throw Error ( `not supported service type ${ this . serviceType }` ) ; } } ; checkConnectivity = async ( ) => { if ( this . serviceType === "s3" ) { return await s3 . checkConnectivity ( this . s3Client , this . s3Config ) ; } else if ( this . serviceType === "webdav" ) { return await webdav . checkConnectivity ( this . webdavClient ) ; } else if ( this . serviceType === "dropbox" ) { return await dropbox . checkConnectivity ( this . dropboxClient ) ; } else if ( this . serviceType === "onedrive" ) { return await onedrive . checkConnectivity ( this . onedriveClient ) ; } else { throw Error ( `not supported service type ${ this . serviceType }` ) ; } } ; getUser = async ( ) => { if ( this . serviceType === "dropbox" ) { return await dropbox . getUserDisplayName ( this . dropboxClient ) ; } else if ( this . serviceType === "onedrive" ) { return await onedrive . getUserDisplayName ( this . onedriveClient ) ; } else { throw Error ( `not supported service type ${ this . serviceType }` ) ; } } ; revokeAuth = async ( ) => { if ( this . serviceType === "dropbox" ) { return await dropbox . revokeAuth ( this . dropboxClient ) ; } else { throw Error ( `not supported service type ${ this . serviceType }` ) ; } } ; }