Single instance checks
This commit is contained in:
parent
65377e2121
commit
a09191b65f
@ -133,7 +133,7 @@ Config.LangCountries = {"es": "ES", "ru": "RU", "en": "US", "de": "DE", "it": "I
|
||||
|
||||
for (i = 0; i < keys.length; i++) {
|
||||
key = keys[i] = prefix + keys[i];
|
||||
if (cache[key] !== undefined) {
|
||||
if (key.substr(0, 3) != 'xt_' && cache[key] !== undefined) {
|
||||
result.push(cache[key]);
|
||||
}
|
||||
else if (useLs) {
|
||||
|
@ -563,6 +563,7 @@ angular.module('izhukov.mtproto', ['izhukov.utils'])
|
||||
iii = 0,
|
||||
offline,
|
||||
offlineInited = false,
|
||||
akStopped = false,
|
||||
chromeMatches = navigator.userAgent.match(/Chrome\/(\d+(\.\d+)?)/),
|
||||
chromeVersion = chromeMatches && parseFloat(chromeMatches[1]) || false,
|
||||
xhrSendBuffer = !('ArrayBufferView' in window) && (!chromeVersion || chromeVersion < 30);
|
||||
@ -771,7 +772,9 @@ angular.module('izhukov.mtproto', ['izhukov.utils'])
|
||||
MtpNetworker.prototype.checkLongPoll = function(force) {
|
||||
var isClean = this.cleanupSent();
|
||||
// console.log('Check lp', this.longPollPending, tsNow(), this.dcID, isClean);
|
||||
if (this.longPollPending && tsNow() < this.longPollPending || this.offline) {
|
||||
if (this.longPollPending && tsNow() < this.longPollPending ||
|
||||
this.offline ||
|
||||
akStopped) {
|
||||
return false;
|
||||
}
|
||||
var self = this;
|
||||
@ -962,7 +965,7 @@ angular.module('izhukov.mtproto', ['izhukov.utils'])
|
||||
|
||||
MtpNetworker.prototype.performSheduledRequest = function() {
|
||||
// console.log(dT(), 'sheduled', this.dcID, this.iii);
|
||||
if (this.offline) {
|
||||
if (this.offline || akStopped) {
|
||||
console.log(dT(), 'Cancel sheduled');
|
||||
return false;
|
||||
}
|
||||
@ -1558,13 +1561,26 @@ angular.module('izhukov.mtproto', ['izhukov.utils'])
|
||||
}
|
||||
};
|
||||
|
||||
function startAll() {
|
||||
if (akStopped) {
|
||||
akStopped = false;
|
||||
updatesProcessor({_: 'new_session_created'});
|
||||
}
|
||||
}
|
||||
|
||||
function stopAll() {
|
||||
akStopped = true;
|
||||
}
|
||||
|
||||
return {
|
||||
getNetworker: function (dcID, authKey, serverSalt, options) {
|
||||
return new MtpNetworker(dcID, authKey, serverSalt, options);
|
||||
},
|
||||
setUpdatesProcessor: function (callback) {
|
||||
updatesProcessor = callback;
|
||||
}
|
||||
},
|
||||
stopAll: stopAll,
|
||||
startAll: startAll
|
||||
};
|
||||
|
||||
})
|
||||
|
@ -7,12 +7,14 @@
|
||||
|
||||
angular.module('izhukov.mtproto.wrapper', ['izhukov.utils', 'izhukov.mtproto'])
|
||||
|
||||
.factory('MtpApiManager', function (Storage, MtpAuthorizer, MtpNetworkerFactory, ErrorService, $q) {
|
||||
.factory('MtpApiManager', function (Storage, MtpAuthorizer, MtpNetworkerFactory, MtpSingleInstanceService, ErrorService, $q) {
|
||||
var cachedNetworkers = {},
|
||||
cachedUploadNetworkers = {},
|
||||
cachedExportPromise = {},
|
||||
baseDcID = false;
|
||||
|
||||
MtpSingleInstanceService.start();
|
||||
|
||||
Storage.get('dc').then(function (dcID) {
|
||||
if (dcID) {
|
||||
baseDcID = dcID;
|
||||
@ -610,3 +612,80 @@ angular.module('izhukov.mtproto.wrapper', ['izhukov.utils', 'izhukov.mtproto'])
|
||||
uploadFile: uploadFile
|
||||
};
|
||||
})
|
||||
|
||||
.service('MtpSingleInstanceService', function ($rootScope, $interval, Storage, AppRuntimeManager, IdleManager, ErrorService, MtpNetworkerFactory) {
|
||||
|
||||
var instanceID = nextRandomInt(0xFFFFFFFF);
|
||||
var started = false;
|
||||
var masterInstance = false;
|
||||
var startTime = tsNow();
|
||||
var errorShowTime = 0;
|
||||
|
||||
function start() {
|
||||
if (!started) {
|
||||
started = true;
|
||||
|
||||
IdleManager.start();
|
||||
|
||||
startTime = tsNow();
|
||||
$rootScope.$watch('idle.isIDLE', checkInstance);
|
||||
$interval(checkInstance, 5000);
|
||||
checkInstance();
|
||||
|
||||
try {
|
||||
$($window).on('beforeunload', clearInstance);
|
||||
} catch (e) {};
|
||||
}
|
||||
}
|
||||
|
||||
function clearInstance () {
|
||||
Storage.remove(masterInstance ? 'xt_instance' : 'xt_idle_instance');
|
||||
}
|
||||
|
||||
function checkInstance() {
|
||||
var time = tsNow();
|
||||
var idle = $rootScope.idle && $rootScope.idle.isIDLE;
|
||||
var newInstance = {id: instanceID, idle: idle, time: time};
|
||||
|
||||
Storage.get('xt_instance', 'xt_idle_instance').then(function (result) {
|
||||
var curInstance = result[0],
|
||||
idleInstance = result[1];
|
||||
|
||||
if (!curInstance ||
|
||||
curInstance.time < time - 60000 ||
|
||||
curInstance.id == instanceID ||
|
||||
curInstance.idle ||
|
||||
!idle) {
|
||||
|
||||
if (idleInstance) {
|
||||
if (idleInstance.id == instanceID) {
|
||||
Storage.remove('xt_idle_instance');
|
||||
}
|
||||
else if (idleInstance.time > time - 10000 &&
|
||||
time > errorShowTime) {
|
||||
|
||||
ErrorService.show({error: {type: 'MULTIPLE_TABS_OPEN'}});
|
||||
errorShowTime += tsNow() + 60000;
|
||||
}
|
||||
}
|
||||
Storage.set({xt_instance: newInstance});
|
||||
if (!masterInstance) {
|
||||
MtpNetworkerFactory.startAll();
|
||||
}
|
||||
masterInstance = true;
|
||||
} else {
|
||||
Storage.set({xt_idle_instance: newInstance});
|
||||
if (masterInstance) {
|
||||
MtpNetworkerFactory.stopAll();
|
||||
}
|
||||
masterInstance = false;
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
start: start
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -808,6 +808,11 @@ angular.module('izhukov.utils', [])
|
||||
chrome.runtime.reload();
|
||||
};
|
||||
},
|
||||
close: function () {
|
||||
try {
|
||||
$window.close();
|
||||
} catch (e) {}
|
||||
},
|
||||
focus: function () {
|
||||
if (window.navigator.mozApps && document.hidden) {
|
||||
// Get app instance and launch it to bring app to foreground
|
||||
|
@ -195,6 +195,7 @@
|
||||
"message_service_left_group": "left group",
|
||||
"message_service_unsupported_action": "Unsupported action {action}",
|
||||
|
||||
"error_modal_warning_title": "Warning",
|
||||
"error_modal_bad_request_title": "Error",
|
||||
"error_modal_unauthorized_title": "Unauthorized",
|
||||
"error_modal_forbidden_title": "Access denied",
|
||||
@ -224,6 +225,8 @@
|
||||
"error_modal_flood_description": "You are performing too many actions. Please try again later.",
|
||||
"error_modal_internal_description": "Internal server error occured. Please try again later.",
|
||||
"error_modal_tech_details": "Technical details here",
|
||||
"error_modal_multiple_open_tabs": "Telegram Web doesn't support working in multiple tabs. Please close other app instances.",
|
||||
|
||||
|
||||
"head_new_group": "New Group",
|
||||
"head_new_contact": "New Contact",
|
||||
|
@ -3463,7 +3463,9 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils'])
|
||||
|
||||
|
||||
try {
|
||||
$($window).on('beforeunload', notificationsClear);
|
||||
if ('onbeforeunload' in window) {
|
||||
$($window).on('beforeunload', notificationsClear);
|
||||
}
|
||||
} catch (e) {}
|
||||
}
|
||||
|
||||
|
@ -5,6 +5,7 @@
|
||||
<div class="modal-body">
|
||||
|
||||
<h4 ng-if="error" class="modal_simple_header" ng-switch="error.type">
|
||||
<span ng-switch-when="MULTIPLE_TABS_OPEN" my-i18n="error_modal_warning_title"></span>
|
||||
<span ng-switch-default ng-switch="error.code">
|
||||
<span ng-switch-when="400" my-i18n="error_modal_bad_request_title"></span>
|
||||
<span ng-switch-when="401" my-i18n="error_modal_unauthorized_title"></span>
|
||||
@ -35,6 +36,8 @@
|
||||
<span ng-switch-when="PHONEBOOK_GET_CONTACTS_FAILED" my-i18n="error_modal_phonebook_required_description"></span>
|
||||
<span ng-switch-when="USERNAME_INVALID" my-i18n="error_modal_username_invalid_description"></span>
|
||||
<span ng-switch-when="USERNAME_OCCUPIED" my-i18n="error_modal_username_occupied_description"></span>
|
||||
<span ng-switch-when="MULTIPLE_TABS_OPEN" my-i18n="error_modal_multiple_open_tabs"></span>
|
||||
|
||||
|
||||
<div ng-switch-default ng-switch="error.code">
|
||||
<span ng-switch-when="400" my-i18n="error_modal_bad_request_description"></span>
|
||||
|
Loading…
Reference in New Issue
Block a user