You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			94 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
			
		
		
	
	
			94 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
| /* global log, window */
 | |
| /* global log: false */
 | |
| 
 | |
| const LokiAppDotNetAPI = require('./loki_app_dot_net_api');
 | |
| 
 | |
| // can have multiple of these instances as each user can have a
 | |
| // different home server
 | |
| class LokiFileServerInstance {
 | |
|   constructor(ourKey) {
 | |
|     this.ourKey = ourKey;
 | |
|   }
 | |
| 
 | |
|   // FIXME: this is not file-server specific
 | |
|   // and is currently called by LokiAppDotNetAPI.
 | |
|   // LokiAppDotNetAPI (base) should not know about LokiFileServer.
 | |
|   async establishConnection(serverUrl, options) {
 | |
|     // why don't we extend this?
 | |
|     this._server = new LokiAppDotNetAPI(this.ourKey, serverUrl);
 | |
| 
 | |
|     // make sure pubKey & pubKeyHex are set in _server
 | |
|     this.pubKey = this._server.getPubKeyForUrl();
 | |
| 
 | |
|     if (options !== undefined && options.skipToken) {
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     // get a token for multidevice
 | |
|     const gotToken = await this._server.getOrRefreshServerToken();
 | |
|     // TODO: Handle this failure gracefully
 | |
|     if (!gotToken) {
 | |
|       log.error('You are blacklisted form this home server');
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   // for files
 | |
|   async downloadAttachment(url) {
 | |
|     return this._server.downloadAttachment(url);
 | |
|   }
 | |
| }
 | |
| 
 | |
| // extends LokiFileServerInstance with functions we'd only perform on our own home server
 | |
| // so we don't accidentally send info to the wrong file server
 | |
| class LokiHomeServerInstance extends LokiFileServerInstance {
 | |
|   // you only upload to your own home server
 | |
|   // you can download from any server...
 | |
|   uploadAvatar(data) {
 | |
|     if (!this._server.token) {
 | |
|       log.warn('uploadAvatar no token yet');
 | |
|     }
 | |
|     return this._server.uploadAvatar(data);
 | |
|   }
 | |
| 
 | |
|   static uploadPrivateAttachment(data) {
 | |
|     return window.tokenlessFileServerAdnAPI.uploadData(data);
 | |
|   }
 | |
| }
 | |
| 
 | |
| // this will be our instance factory
 | |
| class LokiFileServerFactoryAPI {
 | |
|   constructor(ourKey) {
 | |
|     this.ourKey = ourKey;
 | |
|     this.servers = [];
 | |
|   }
 | |
| 
 | |
|   establishHomeConnection(serverUrl) {
 | |
|     let thisServer = this.servers.find(
 | |
|       server => server._server.baseServerUrl === serverUrl
 | |
|     );
 | |
|     if (!thisServer) {
 | |
|       thisServer = new LokiHomeServerInstance(this.ourKey);
 | |
|       log.info(`Registering HomeServer ${serverUrl}`);
 | |
|       // not await, so a failure or slow connection doesn't hinder loading of the app
 | |
|       thisServer.establishConnection(serverUrl);
 | |
|       this.servers.push(thisServer);
 | |
|     }
 | |
|     return thisServer;
 | |
|   }
 | |
| 
 | |
|   async establishConnection(serverUrl) {
 | |
|     let thisServer = this.servers.find(
 | |
|       server => server._server.baseServerUrl === serverUrl
 | |
|     );
 | |
|     if (!thisServer) {
 | |
|       thisServer = new LokiFileServerInstance(this.ourKey);
 | |
|       log.info(`Registering FileServer ${serverUrl}`);
 | |
|       await thisServer.establishConnection(serverUrl, { skipToken: true });
 | |
|       this.servers.push(thisServer);
 | |
|     }
 | |
|     return thisServer;
 | |
|   }
 | |
| }
 | |
| 
 | |
| module.exports = LokiFileServerFactoryAPI;
 |