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;
 |