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.
		
		
		
		
		
			
		
			
				
	
	
		
			179 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			JavaScript
		
	
			
		
		
	
	
			179 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			JavaScript
		
	
| /* global window: false */
 | |
| /* global callWorker: false */
 | |
| /* global textsecure: false */
 | |
| /* global WebSocket: false */
 | |
| /* global Event: false */
 | |
| /* global dcodeIO: false */
 | |
| /* global lokiPublicChatAPI: false */
 | |
| /* global feeds: false */
 | |
| /* global WebAPI: false */
 | |
| 
 | |
| /* eslint-disable more/no-then */
 | |
| /* eslint-disable no-unreachable */
 | |
| 
 | |
| let openGroupBound = false;
 | |
| 
 | |
| function MessageReceiver(username, password, signalingKey) {
 | |
|   this.count = 0;
 | |
| 
 | |
|   this.signalingKey = signalingKey;
 | |
|   this.server = WebAPI.connect();
 | |
| 
 | |
|   this.pending = Promise.resolve();
 | |
| 
 | |
|   // only do this once to prevent duplicates
 | |
|   if (lokiPublicChatAPI) {
 | |
|     window.log.info('Binding open group events handler', openGroupBound);
 | |
|     if (!openGroupBound) {
 | |
|       // clear any previous binding
 | |
|       lokiPublicChatAPI.removeAllListeners('publicMessage');
 | |
|       // we only need one MR in the system handling these
 | |
|       // bind events
 | |
|       lokiPublicChatAPI.on(
 | |
|         'publicMessage',
 | |
|         window.NewReceiver.handleUnencryptedMessage
 | |
|       );
 | |
|       openGroupBound = true;
 | |
|     }
 | |
|   } else {
 | |
|     window.log.warn('Can not handle open group data, API is not available');
 | |
|   }
 | |
| }
 | |
| 
 | |
| MessageReceiver.stringToArrayBuffer = string =>
 | |
|   Promise.resolve(dcodeIO.ByteBuffer.wrap(string, 'binary').toArrayBuffer());
 | |
| MessageReceiver.arrayBufferToString = arrayBuffer =>
 | |
|   Promise.resolve(dcodeIO.ByteBuffer.wrap(arrayBuffer).toString('binary'));
 | |
| 
 | |
| MessageReceiver.stringToArrayBufferBase64 = string =>
 | |
|   callWorker('stringToArrayBufferBase64', string);
 | |
| MessageReceiver.arrayBufferToStringBase64 = arrayBuffer =>
 | |
|   callWorker('arrayBufferToStringBase64', arrayBuffer);
 | |
| 
 | |
| MessageReceiver.prototype = new textsecure.EventTarget();
 | |
| MessageReceiver.prototype.extend({
 | |
|   constructor: MessageReceiver,
 | |
|   connect() {
 | |
|     if (this.calledClose) {
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     this.count = 0;
 | |
|     if (this.hasConnected) {
 | |
|       const ev = new Event('reconnect');
 | |
|       this.dispatchEvent(ev);
 | |
|     }
 | |
| 
 | |
|     this.hasConnected = true;
 | |
| 
 | |
|     // start polling all open group rooms you have registered
 | |
|     // if not registered yet, they'll get started when they're created
 | |
|     if (lokiPublicChatAPI) {
 | |
|       lokiPublicChatAPI.open();
 | |
|     }
 | |
|     // set up pollers for any RSS feeds
 | |
|     feeds.forEach(feed => {
 | |
|       feed.on('rssMessage', window.NewReceiver.handleUnencryptedMessage);
 | |
|     });
 | |
| 
 | |
|     // Ensures that an immediate 'empty' event from the websocket will fire only after
 | |
|     //   all cached envelopes are processed.
 | |
|     this.incoming = [this.pending];
 | |
|   },
 | |
|   stopProcessing() {
 | |
|     window.log.info('MessageReceiver: stopProcessing requested');
 | |
|     this.stoppingProcessing = true;
 | |
|     return this.close();
 | |
|   },
 | |
|   shutdown() {},
 | |
|   async close() {
 | |
|     window.log.info('MessageReceiver.close()');
 | |
|     this.calledClose = true;
 | |
| 
 | |
|     // stop polling all open group rooms
 | |
|     if (lokiPublicChatAPI) {
 | |
|       await lokiPublicChatAPI.close();
 | |
|     }
 | |
| 
 | |
|     return this.drain();
 | |
|   },
 | |
|   onopen() {
 | |
|     window.log.info('websocket open');
 | |
|   },
 | |
|   onerror() {
 | |
|     window.log.error('websocket error');
 | |
|   },
 | |
|   onclose(ev) {
 | |
|     window.log.info(
 | |
|       'websocket closed',
 | |
|       ev.code,
 | |
|       ev.reason || '',
 | |
|       'calledClose:',
 | |
|       this.calledClose
 | |
|     );
 | |
|   },
 | |
|   drain() {
 | |
|     const { incoming } = this;
 | |
|     this.incoming = [];
 | |
| 
 | |
|     // This promise will resolve when there are no more messages to be processed.
 | |
|     return Promise.all(incoming);
 | |
|   },
 | |
|   updateProgress(count) {
 | |
|     // count by 10s
 | |
|     if (count % 10 !== 0) {
 | |
|       return;
 | |
|     }
 | |
|     const ev = new Event('progress');
 | |
|     ev.count = count;
 | |
|     this.dispatchEvent(ev);
 | |
|   },
 | |
|   getStatus() {
 | |
|     if (this.hasConnected) {
 | |
|       return WebSocket.CLOSED;
 | |
|     }
 | |
|     return -1;
 | |
|   },
 | |
| });
 | |
| 
 | |
| window.textsecure = window.textsecure || {};
 | |
| 
 | |
| textsecure.MessageReceiver = function MessageReceiverWrapper(
 | |
|   username,
 | |
|   password,
 | |
|   signalingKey,
 | |
|   options
 | |
| ) {
 | |
|   const messageReceiver = new MessageReceiver(
 | |
|     username,
 | |
|     password,
 | |
|     signalingKey,
 | |
|     options
 | |
|   );
 | |
|   this.addEventListener = messageReceiver.addEventListener.bind(
 | |
|     messageReceiver
 | |
|   );
 | |
|   this.removeEventListener = messageReceiver.removeEventListener.bind(
 | |
|     messageReceiver
 | |
|   );
 | |
|   this.getStatus = messageReceiver.getStatus.bind(messageReceiver);
 | |
|   this.close = messageReceiver.close.bind(messageReceiver);
 | |
| 
 | |
|   this.stopProcessing = messageReceiver.stopProcessing.bind(messageReceiver);
 | |
| 
 | |
|   messageReceiver.connect();
 | |
| };
 | |
| 
 | |
| textsecure.MessageReceiver.prototype = {
 | |
|   constructor: textsecure.MessageReceiver,
 | |
| };
 | |
| 
 | |
| textsecure.MessageReceiver.stringToArrayBuffer =
 | |
|   MessageReceiver.stringToArrayBuffer;
 | |
| textsecure.MessageReceiver.arrayBufferToString =
 | |
|   MessageReceiver.arrayBufferToString;
 | |
| textsecure.MessageReceiver.stringToArrayBufferBase64 =
 | |
|   MessageReceiver.stringToArrayBufferBase64;
 | |
| textsecure.MessageReceiver.arrayBufferToStringBase64 =
 | |
|   MessageReceiver.arrayBufferToStringBase64;
 |