Commit b64239f5 authored by konovalovsergey's avatar konovalovsergey

session idle/absolute timeout

parent 13f47601
......@@ -37,6 +37,7 @@
// Import
var offlineMode = AscCommon.offlineMode;
var c_oEditorId = AscCommon.c_oEditorId;
var c_oCloseCode = AscCommon.c_oCloseCode;
var c_oAscError = Asc.c_oAscError;
var c_oAscAsyncAction = Asc.c_oAscAsyncAction;
......@@ -583,6 +584,33 @@
}
t.sendEvent('asc_onMeta', data);
};
this.CoAuthoringApi.onSession = function(data) {
var code = data["code"];
var reason = data["reason"];
var extendSession = true;
if (c_oCloseCode.sessionIdle == code) {
extendSession = false;
} else if (c_oCloseCode.sessionAbsolute == code) {
extendSession = false;
}
if (!extendSession) {
if (true != History.Is_Clear()) {
//enter view mode because save async
t.sendEvent('asc_onCoAuthoringDisconnect');
t.asc_setViewMode(true);
t.CoAuthoringApi.onUnSaveLock = function() {
t.CoAuthoringApi.onUnSaveLock = null;
t.CoAuthoringApi.disconnect(code, reason);
};
AscCommon.CollaborativeEditing.Apply_Changes();
AscCommon.CollaborativeEditing.Send_Changes();
} else {
t.CoAuthoringApi.disconnect(code, reason);
}
}
};
/**
* Event об отсоединении от сервера
* @param {jQuery} e event об отсоединении с причиной
......
......@@ -38,6 +38,7 @@
var asc_coAuthV = '3.0.9';
var ConnectionState = AscCommon.ConnectionState;
var c_oEditorId = AscCommon.c_oEditorId;
var c_oCloseCode = AscCommon.c_oCloseCode;
// Класс надстройка, для online и offline работы
function CDocsCoApi(options) {
......@@ -50,6 +51,7 @@
this.onMessage = options.onMessage;
this.onCursor = options.onCursor;
this.onMeta = options.onMeta;
this.onSession = options.onSession;
this.onLocksAcquired = options.onLocksAcquired;
this.onLocksReleased = options.onLocksReleased;
this.onLocksReleasedEnd = options.onLocksReleasedEnd; // ToDo переделать на массив release locks
......@@ -88,6 +90,9 @@
this._CoAuthoringApi.onMeta = function(e) {
t.callback_OnMeta(e);
};
this._CoAuthoringApi.onSession = function(e) {
t.callback_OnSession(e);
};
this._CoAuthoringApi.onLocksAcquired = function(e) {
t.callback_OnLocksAcquired(e);
};
......@@ -317,9 +322,15 @@
}
};
CDocsCoApi.prototype.disconnect = function() {
CDocsCoApi.prototype.disconnect = function(opt_code, opt_reason) {
if (this._CoAuthoringApi && this._onlineWork) {
this._CoAuthoringApi.disconnect(opt_code, opt_reason);
}
};
CDocsCoApi.prototype.extendSession = function() {
if (this._CoAuthoringApi && this._onlineWork) {
this._CoAuthoringApi.disconnect();
this._CoAuthoringApi.extendSession();
}
};
......@@ -353,6 +364,12 @@
}
};
CDocsCoApi.prototype.callback_OnSession = function(e) {
if (this.onSession) {
this.onSession(e);
}
};
CDocsCoApi.prototype.callback_OnLocksAcquired = function(e) {
if (this.onLocksAcquired) {
this.onLocksAcquired(e);
......@@ -467,6 +484,7 @@
this.onMessage = options.onMessage;
this.onCursor = options.onCursor;
this.onMeta = options.onMeta;
this.onSession = options.onSession;
this.onLocksAcquired = options.onLocksAcquired;
this.onLocksReleased = options.onLocksReleased;
this.onLocksReleasedEnd = options.onLocksReleasedEnd; // ToDo переделать на массив release locks
......@@ -500,7 +518,7 @@
this.saveCallbackErrorTimeOutId = null;
this.unSaveLockCallbackErrorTimeOutId = null;
this._id = null;
this._timeConnect = null;
this._sessionTimeConnect = null;
this._indexUser = -1;
// Если пользователей больше 1, то совместно редактируем
this.isCoAuthoring = false;
......@@ -757,11 +775,19 @@
}
};
DocsCoApi.prototype.disconnect = function() {
DocsCoApi.prototype.disconnect = function(opt_code, opt_reason) {
// Отключаемся сами
this.isCloseCoAuthoring = true;
this._send({"type": "close"});
this._state = ConnectionState.ClosedCoAuth;
if (opt_code) {
this.sockjs.close(opt_code, opt_reason);
} else {
this._send({"type": "close"});
this._state = ConnectionState.ClosedCoAuth;
}
};
DocsCoApi.prototype.extendSession = function() {
this._send({'type': 'extendSession'});
};
DocsCoApi.prototype.openDocument = function(data) {
......@@ -839,6 +865,12 @@
}
};
DocsCoApi.prototype._onSession = function(data) {
if (data["messages"] && this.onSession) {
this.onSession(data["messages"]);
}
};
DocsCoApi.prototype._onGetLock = function(data) {
if (data["locks"]) {
for (var key in data["locks"]) {
......@@ -1183,7 +1215,7 @@
//TODO: add checks
this._state = ConnectionState.Authorized;
this._id = data['sessionId'];
this._timeConnect = data['timeConnect'];
this._sessionTimeConnect = data['sessionTimeConnect'];
this._onAuthParticipantsChanged(data['participants']);
......@@ -1268,7 +1300,7 @@
'lastOtherSaveTime': this.lastOtherSaveTime,
'block': this.ownedLockBlocks,
'sessionId': this._id,
'timeConnect': this._timeConnect,
'sessionTimeConnect': this._sessionTimeConnect,
'documentFormatSave': this._documentFormatSave,
'view': this._isViewer,
'isCloseCoAuthoring': this.isCloseCoAuthoring,
......@@ -1355,6 +1387,9 @@
case 'license':
t._onLicense(dataObject);
break;
case 'session' :
t._onSession(dataObject);
break;
}
};
sockjs.onclose = function(evt) {
......@@ -1367,7 +1402,8 @@
}
}
t._state = ConnectionState.Reconnect;
var bIsDisconnectAtAll = (4001 === evt.code || 4002 === evt.code || 4003 === evt.code || t.attemptCount >= t.maxAttemptCount);
var bIsDisconnectAtAll = (c_oCloseCode.serverShutdown === evt.code || c_oCloseCode.sessionIdle === evt.code ||
c_oCloseCode.sessionAbsolute === evt.code || t.attemptCount >= t.maxAttemptCount);
if (bIsDisconnectAtAll) {
t._state = ConnectionState.ClosedAll;
}
......
/* * (c) Copyright Ascensio System SIA 2010-2016 * * This program is a free software product. You can redistribute it and/or * modify it under the terms of the GNU Affero General Public License (AGPL) * version 3 as published by the Free Software Foundation. In accordance with * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect * that Ascensio System SIA expressly excludes the warranty of non-infringement * of any third-party rights. * * This program is distributed WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html * * You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, * EU, LV-1021. * * The interactive user interfaces in modified source and object code versions * of the Program must display Appropriate Legal Notices, as required under * Section 5 of the GNU AGPL version 3. * * Pursuant to Section 7(b) of the License you must retain the original Product * logo when distributing the program. Pursuant to Section 7(e) we decline to * grant you any rights under trademark law for use of our trademarks. * * All the Product's GUI elements, including illustrations and icon sets, as * well as technical writing content are licensed under the terms of the * Creative Commons Attribution-ShareAlike 4.0 International. See the License * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode * */ "use strict"; (/** * @param {Window} window * @param {undefined} undefined */ function(window, undefined) { /** * Класс user для совместного редактирования/просмотра документа * ----------------------------------------------------------------------------- * * @constructor * @memberOf Asc */ function asc_CUser(val) { this.id = null; // уникальный id - пользователя this.idOriginal = null; // уникальный id - пользователя this.userName = null; // имя пользователя this.state = undefined; // состояние (true - подключен, false - отключился) this.indexUser = -1; // Индекс пользователя (фактически равно числу заходов в документ на сервере) this.color = null; // цвет пользователя this.view = false; // просмотр(true), редактор(false) this._setUser(val); return this; } asc_CUser.prototype._setUser = function(val) { if (val) { this.id = val['id']; this.idOriginal = val['idOriginal']; this.userName = val['username']; this.indexUser = val['indexUser']; this.color = AscCommon.getUserColorById(this.idOriginal, this.userName, false, true); this.view = val['view']; } }; asc_CUser.prototype.asc_getId = function() { return this.id; }; asc_CUser.prototype.asc_getUserName = function() { return this.userName; }; asc_CUser.prototype.asc_getState = function() { return this.state; }; asc_CUser.prototype.asc_getColor = function() { return '#' + ('000000' + this.color.toString(16)).substr(-6); }; asc_CUser.prototype.asc_getView = function() { return this.view; }; asc_CUser.prototype.setId = function(val) { this.id = val; }; asc_CUser.prototype.setUserName = function(val) { this.userName = val; }; asc_CUser.prototype.setState = function(val) { this.state = val; }; var ConnectionState = { Reconnect: -1, // reconnect state None: 0, // not initialized WaitAuth: 1, // waiting session id Authorized: 2, // authorized ClosedCoAuth: 3, // closed coauthoring ClosedAll: 4, // closed all SaveChanges: 10 // save }; var c_oEditorId = { Word:0, Spreadsheet:1, Presentation:2 }; /* * Export * ----------------------------------------------------------------------------- */ var prot; window['AscCommon'] = window['AscCommon'] || {}; window["AscCommon"].asc_CUser = asc_CUser; prot = asc_CUser.prototype; prot["asc_getId"] = prot.asc_getId; prot["asc_getUserName"] = prot.asc_getUserName; prot["asc_getState"] = prot.asc_getState; prot["asc_getColor"] = prot.asc_getColor; prot["asc_getView"] = prot.asc_getView; window["AscCommon"].ConnectionState = ConnectionState; window["AscCommon"].c_oEditorId = c_oEditorId; })(window);
\ No newline at end of file
/* * (c) Copyright Ascensio System SIA 2010-2016 * * This program is a free software product. You can redistribute it and/or * modify it under the terms of the GNU Affero General Public License (AGPL) * version 3 as published by the Free Software Foundation. In accordance with * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect * that Ascensio System SIA expressly excludes the warranty of non-infringement * of any third-party rights. * * This program is distributed WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html * * You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, * EU, LV-1021. * * The interactive user interfaces in modified source and object code versions * of the Program must display Appropriate Legal Notices, as required under * Section 5 of the GNU AGPL version 3. * * Pursuant to Section 7(b) of the License you must retain the original Product * logo when distributing the program. Pursuant to Section 7(e) we decline to * grant you any rights under trademark law for use of our trademarks. * * All the Product's GUI elements, including illustrations and icon sets, as * well as technical writing content are licensed under the terms of the * Creative Commons Attribution-ShareAlike 4.0 International. See the License * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode * */ "use strict"; (/** * @param {Window} window * @param {undefined} undefined */ function(window, undefined) { /** * Класс user для совместного редактирования/просмотра документа * ----------------------------------------------------------------------------- * * @constructor * @memberOf Asc */ function asc_CUser(val) { this.id = null; // уникальный id - пользователя this.idOriginal = null; // уникальный id - пользователя this.userName = null; // имя пользователя this.state = undefined; // состояние (true - подключен, false - отключился) this.indexUser = -1; // Индекс пользователя (фактически равно числу заходов в документ на сервере) this.color = null; // цвет пользователя this.view = false; // просмотр(true), редактор(false) this._setUser(val); return this; } asc_CUser.prototype._setUser = function(val) { if (val) { this.id = val['id']; this.idOriginal = val['idOriginal']; this.userName = val['username']; this.indexUser = val['indexUser']; this.color = AscCommon.getUserColorById(this.idOriginal, this.userName, false, true); this.view = val['view']; } }; asc_CUser.prototype.asc_getId = function() { return this.id; }; asc_CUser.prototype.asc_getUserName = function() { return this.userName; }; asc_CUser.prototype.asc_getState = function() { return this.state; }; asc_CUser.prototype.asc_getColor = function() { return '#' + ('000000' + this.color.toString(16)).substr(-6); }; asc_CUser.prototype.asc_getView = function() { return this.view; }; asc_CUser.prototype.setId = function(val) { this.id = val; }; asc_CUser.prototype.setUserName = function(val) { this.userName = val; }; asc_CUser.prototype.setState = function(val) { this.state = val; }; var ConnectionState = { Reconnect: -1, // reconnect state None: 0, // not initialized WaitAuth: 1, // waiting session id Authorized: 2, // authorized ClosedCoAuth: 3, // closed coauthoring ClosedAll: 4, // closed all SaveChanges: 10 // save }; var c_oEditorId = { Word:0, Spreadsheet:1, Presentation:2 }; var c_oCloseCode = { serverShutdown: 4001, sessionIdle: 4002, sessionAbsolute: 4003 }; /* * Export * ----------------------------------------------------------------------------- */ var prot; window['AscCommon'] = window['AscCommon'] || {}; window["AscCommon"].asc_CUser = asc_CUser; prot = asc_CUser.prototype; prot["asc_getId"] = prot.asc_getId; prot["asc_getUserName"] = prot.asc_getUserName; prot["asc_getState"] = prot.asc_getState; prot["asc_getColor"] = prot.asc_getColor; prot["asc_getView"] = prot.asc_getView; window["AscCommon"].ConnectionState = ConnectionState; window["AscCommon"].c_oEditorId = c_oEditorId; window["AscCommon"].c_oCloseCode = c_oCloseCode; })(window);
\ No newline at end of file
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment