Как перенести и установить скрипт мессенджера КОРП на сервер


1.Установить web-сервер. Web-сервер — это программа, которая предназначена для обработки запросов к сайтам и отправки пользователям страниц веб-сайтов.
2. Разместить на web-сервере скрипт js клиенской части мессенджера
3. Прописать в 1С путь к скрипту мессенджера (см. скрин).
4. Установить node js. Node.js® — это JavaScript-окружение построенное на движке Chrome V8.
5. Сделать службу из node-js скрипта.
6. Открыть порт 3484 




Скрипты:  

main.js

//developertment
  //alert('Внимание! Мессенджер находится на beta тестировании.');
  //developertment
  var externalForm 	= null;
  var windowHeight 	= document.documentElement.clientHeight;
  var dataWasSand 	= false;

  try {

      var socket = new WebSocket("ws://zakupki.enter-it.ru:3484");

      socket.onmessage = function(event) {
          var incomingMessage = event.data;
          if (incomingMessage[0] == '@') {
              if (incomingMessage == '@RequestForSubmission') {
                  var TimeToStartWaitiong = performance.now() + 10000;
                  do {
                      try {
                          externalForm.ОтправитьДанныеДляСозданияОбсуждения();
                      } catch (ex) {
                          if (externalForm != null) {
                              alert('Ошибка выполнения сценария: ' + ex.message);
                          }
                      }
                      if (performance.now() > TimeToStartWaitiong) {
                          alert('Инициализация мессенджера длится дольше, чем обычно. Возможно, на загрузку вложений потребуется больше времени. Нажмите ОК, для продолжения.');
                          externalForm.ОтправитьДанныеДляСозданияОбсуждения();
                      }
                  }
                  while (externalForm == null)
              } else if (incomingMessage.substring(0, 14) == '@InformNewUser') {
                  UserData = JSON.parse(incomingMessage.replace('@InformNewUser', ''));
                  AddNewClient(UserData.UserIcon, UserData.UserName, UserData.UserID);
              } else if (incomingMessage.substring(0, 14) == '@InformDelUser') {
                  UserData = JSON.parse(incomingMessage.replace('@InformDelUser', ''));
                  DellClient(UserData.UserID);
              }

          } else {
              showMessage(incomingMessage);
          }
      };
  } catch (ex) {
      alert(ex.message);
  }


  function CloseConnection() {
      socket.close();
  }


  // показать сообщение в div#subscribe
  function showMessage(message) {
      OBJ_Message = JSON.parse(message);
      var mess_main = document.createElement('table');
      mess_main.className = 'mess_main';
      mess_main.setAttribute('mess_stat', 'new');

      var TR_Main = document.createElement('tr');
      mess_main.appendChild(TR_Main);

      var mess_logo = document.createElement('th');
      mess_logo.className = 'mess_logo';
      TR_Main.appendChild(mess_logo);

      var mess_logoImage = document.createElement('img')
      mess_logoImage.className = 'mess_logoImage';
      mess_logoImage.src = OBJ_Message.UserLogo;
      mess_logo.appendChild(mess_logoImage);

      var mess_content = document.createElement('th');
      mess_content.className = 'mess_content';
      TR_Main.appendChild(mess_content);

      var div_mainTH = document.createElement('div');
      mess_content.appendChild(div_mainTH);

      var div_mainTH_header = document.createElement('div');
      div_mainTH.appendChild(div_mainTH_header);

      var mess_headName = document.createElement('p');
      mess_headName.className = 'mess_headName';
      mess_headName.appendChild(document.createTextNode(' ' + OBJ_Message.User + ' '));
      div_mainTH_header.appendChild(mess_headName);

      var mess_headTime = document.createElement('p');
      mess_headTime.className = 'mess_headTime';
      mess_headTime.appendChild(document.createTextNode(' ' + OBJ_Message.DateTime + ' '));
      div_mainTH_header.appendChild(mess_headTime);
      var mess_textMessage = document.createElement('div');
      mess_textMessage.className = 'mess_textMessage';
      mess_textMessage.appendChild(document.createTextNode(OBJ_Message.TextMessage))
      div_mainTH.appendChild(mess_textMessage);

      if (OBJ_Message.attach == 'uri_1C' || OBJ_Message.attach == 'uri_file'){                        
        var Uri_contrl = document.createElement('p');
        var Uri_contrl_but = document.createElement('attach');
        Uri_contrl.appendChild(Uri_contrl_but);
        Uri_contrl_but.appendChild(document.createTextNode(OBJ_Message.attachDescription));
        Uri_contrl_but.setAttribute('attachFile', OBJ_Message.attachValue);
        if(OBJ_Message.attach == 'uri_1C'){
          Uri_contrl_but.setAttribute('onclick', 'openThisObject(this)');
        } else{
          Uri_contrl_but.setAttribute('onclick', 'opneThisFile(this)');
        }
        Uri_contrl_but.className = 'attachedFile';
        mess_textMessage.appendChild(Uri_contrl);
      } else if (OBJ_Message.attach == 'uri_img')
        {
          mess_textMessage.innerHTML = mess_textMessage.textContent + '<p><img src="' + OBJ_Message.attachValue + '"></p>';
        }

      document.getElementById('main_body').appendChild(mess_main);
      ScrollChatToButtom();
      showVisible();
  }

  function AddNewClient(UserIcon, UserName, UserID) {
      var NewClient = document.createElement('img');
      NewClient.id = UserID;
      NewClient.src = UserIcon;
      NewClient.alt = UserName;
      NewClient.className = 'OnLineUser';
      var OnLineClientsDiv = document.getElementById('OnLineUsers');
      OnLineClientsDiv.appendChild(NewClient);
  }

  function DellClient(UserID) {
      var OnLineClientsDiv = document.getElementById('OnLineUsers');
      var DelUser = document.getElementById(UserID);
      OnLineClientsDiv.removeChild(DelUser);

  }

  //Элементы управления диалогом:
  function ScrollChatToButtom() {
      try {
          window.scrollTo(0, getDocumentHeight());
      } catch (err) {
          alert(err.message);
      }
  }

  function getDocumentHeight() {
      return (document.body.scrollHeight > document.body.offsetHeight) ?
          document.body.scrollHeight :
          document.body.offsetHeight;
  }

  // Визуализаторы состояния прчтения
  function showVisible() {
      var _messgaes = document.getElementsByTagName('table');
      for (var i = 0; i < _messgaes.length; i++) {

          var _message = _messgaes[i];

          if (isVisible(_message)) {
              _message.style.backgroundColor = '#fff';
              if (_message.getAttribute('mess_stat') == 'new') {
                  externalForm.ОтметитьКомментарииКакПрочитанные();
              }
              _message.setAttribute('mess_stat', 'readed');
          }
      }
  }

  function isVisible(elem) {

      var coords = elem.getBoundingClientRect();

      // верхняя граница elem в пределах видимости ИЛИ нижняя граница видима
      var topVisible = coords.top > 0 && coords.top < windowHeight;
      var bottomVisible = coords.bottom < windowHeight && coords.bottom > 0;

      return topVisible || bottomVisible;
  }


  // Вызовый из 1С (команды)
  function SendMessageFrom1C(TextMessage) {
      socket.send(TextMessage);
      return false;
  }

  function openThisObject(object){

  }

  function opneThisFile(object){
    externalForm.ОткрытьПрикрепленныйФайл(object.getAttribute('attachFile'))
  }

  setTimeout(showVisible, 2000);​



mes-srv.js


var http = require('http');
var Static = require('node-static');
var WebSocketServer = new require('ws');
var ID_MIN = 1;
var ID_MAX = 5000;

function GetRandomID() {
    var RandomValue = ID_MIN - 0.5 + Math.random() * (ID_MAX - ID_MIN + 1);
    return RandomValue;
}

//Откроем WebSocket-сервер на порту 3484
var webSocketServer = new WebSocketServer.Server({
    port: 3484
});

//Описание класса "Куча" - сюда подключаются все клиенты WS, отсюда мы и будем брать WS для отправки
class _Stack {
    constructor() {
        this.Clients = new Map();
    }
    Add(ws) {
        var _StackClientID = Math.round(GetRandomID());
        this.Clients.set(_StackClientID, ws);
        return _StackClientID;
    }
}

//Описание класса "Дисскуссия" - это объект кторый содержит в себе информацию о предмете дисскуссиии и список всех ее членов
class _Discussion {
    constructor(Discussion_ID, Discussion_Description) {
        this.Discussion_ID = Discussion_ID;
        this.Discussion_Description = Discussion_Description;
        this.Clients = new Map();
    }
    AddClient(Client_ID, ClientData) {
        this.Clients.set(Client_ID, ClientData);
    }
    IsEmpty() {
        if (this.Clients.size > 0) {
            return false;
        } else {
            return true;
        }
    }
}

//Объявим глобальные переменные
var Discussions = new Map();
var Stack = new _Stack();



webSocketServer.on('connection', function(ThisClientWS) {
    //Добивим подключившегося клиента в кучу
    var ThisClientID = Stack.Add(ThisClientWS);
    ThisClientWS.send('@RequestForSubmission');

    ThisClientWS.on('message', function(WS_Message) {
        try {
            OBJ_Message = JSON.parse(WS_Message);
            if (OBJ_Message.TypeOf == 'RequestForSubmission') {
                if (Discussions.get(OBJ_Message.Discussion_ID) == undefined) {
                    var Discussion = new _Discussion(OBJ_Message.Discussion_ID, OBJ_Message.Discussion_description);
                    var ClientData = {};
                    ClientData['UserName'] = OBJ_Message.UserName;
                    ClientData['UserIcon'] = OBJ_Message.UserIcon;
                    ClientData['UserID'] = ThisClientID;
                    Discussion.AddClient(ThisClientID, ClientData);
                    Discussions.set(Discussion.Discussion_ID, Discussion);
                    //Оповестим всех участников дисскуссии о добавлении нового клиента
                    for (let ClntDsctn_ID of Discussion.Clients.keys()) {
                        Stack.Clients.get(ClntDsctn_ID).send('@InformNewUser' + JSON.stringify(ClientData));
                    }
                } else {
                    var Discussion = Discussions.get(OBJ_Message.Discussion_ID);
                    //Отправим клиенту данные обо всех участниках дисскусссии
                    if (Discussion.IsEmpty() != true) {
                        for (let ClntData of Discussion.Clients.values()) {
                            ThisClientWS.send('@InformNewUser' + JSON.stringify(ClntData));
                        }
                    }
                    var ClientData = {};
                    ClientData['UserName'] = OBJ_Message.UserName;
                    ClientData['UserIcon'] = OBJ_Message.UserIcon;
                    ClientData['UserID'] = ThisClientID;
                    Discussion.AddClient(ThisClientID, ClientData);
                    //Оповестим всех участников дисскуссии о добавлении нового клиента
                    for (let ClntDsctn_ID of Discussion.Clients.keys()) {
                        Stack.Clients.get(ClntDsctn_ID).send('@InformNewUser' + JSON.stringify(ClientData));
                    }
                }
            } else if (OBJ_Message.TypeOf == 'TextMessage') {
                var Discussion = Discussions.get(OBJ_Message.Discussion_ID);
                for (let ClntDsctn_ID of Discussion.Clients.keys()) {
                    Stack.Clients.get(ClntDsctn_ID).send(WS_Message);
                }
            }
        } catch (ex) {
            console.log('ОШИБКА!=' + ex.message);
        }
    });

    ThisClientWS.on('close', function() {
        Stack.Clients.delete(ThisClientID);
        for (let Dsctn of Discussions.values()) {
            if (Dsctn.Clients.get(ThisClientID) != undefined) {
                ClientData = Dsctn.Clients.get(ThisClientID);
                Dsctn.Clients.delete(ThisClientID);
            }
            if (Dsctn.IsEmpty() == true) {
                Discussions.delete(Dsctn.Discussion_ID);
            } else {
                for (let ClntDsctn_ID of Dsctn.Clients.keys()) {
                    try{
                        Stack.Clients.get(ClntDsctn_ID).send('@InformDelUser' + JSON.stringify(ClientData));
                    } catch(ex) {
                        //TODO: добавить тут удаление пользователя из кучи и из дискуссий
                        console.log('Клиенту c ID: ' + ClntDsctn_ID + ' не удалось отправить сообщение. Он был удален из кучи (:TODO Пока не реализовано!)');
                    }
                }
            }
        }
    });
});



console.log('Сервер мессенджера успешно запущен на порту: < 3484 >');
console.log('Ожидание новых подключений......');
​

Вы нашли эту статью полезной?