1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00

update javascript connection manager to latest feature set

This commit is contained in:
Luke Pulverenti 2015-02-15 19:33:06 -05:00
parent 12e5298463
commit f7bb1a627d
11 changed files with 494 additions and 217 deletions

View file

@ -14,10 +14,11 @@
globalScope.MediaBrowser.ConnectionMode = {
Local: 0,
Remote: 1
Remote: 1,
Manual: 2
};
globalScope.MediaBrowser.ConnectionManager = function ($, logger, credentialProvider, appName, appVersion, deviceName, deviceId, capabilities) {
globalScope.MediaBrowser.ConnectionManager = function (logger, credentialProvider, appName, appVersion, deviceName, deviceId, capabilities) {
logger.log('Begin MediaBrowser.ConnectionManager constructor');
@ -63,10 +64,14 @@
function tryConnect(url, timeout) {
return $.ajax({
url += "/system/info/public";
logger.log('tryConnect url: ' + url);
return AjaxApi.ajax({
type: "GET",
url: url + "/system/info/public",
url: url,
dataType: "json",
timeout: timeout || 15000
@ -116,7 +121,7 @@
updateServerInfo(server, systemInfo);
apiClient.serverInfo(server);
$(self).trigger('apiclientcreated', [apiClient]);
Events.trigger(self, 'apiclientcreated', [apiClient]);
if (enableAutomaticNetworking) {
self.connectToServer(server);
@ -125,10 +130,10 @@
};
function onConnectAuthenticated(user) {
function onConnectUserSignIn(user) {
connectUser = user;
$(self).trigger('connectusersignedin', [user]);
Events.trigger(self, 'connectusersignedin', [user]);
}
function getOrAddApiClient(server, connectionMode) {
@ -139,88 +144,104 @@
var url = connectionMode == MediaBrowser.ConnectionMode.Local ? server.LocalAddress : server.RemoteAddress;
apiClient = new MediaBrowser.ApiClient($, logger, url, appName, appVersion, deviceName, deviceId, capabilities);
apiClient = new MediaBrowser.ApiClient(logger, url, appName, appVersion, deviceName, deviceId, capabilities);
apiClients.push(apiClient);
apiClient.serverInfo(server);
$(apiClient).on('authenticated', function (e, result) {
onLocalAuthenticated(this, result, true);
Events.on(apiClient, 'authenticated', function (e, result) {
onAuthenticated(this, result, {}, true);
});
$(self).trigger('apiclientcreated', [apiClient]);
Events.trigger(self, 'apiclientcreated', [apiClient]);
}
if (!server.AccessToken) {
apiClient.clearAuthenticationInfo();
}
else {
if (server.AccessToken) {
apiClient.setAuthenticationInfo(server.AccessToken, server.UserId);
}
else {
apiClient.clearAuthenticationInfo();
}
logger.log('returning instance from getOrAddApiClient');
return apiClient;
}
function onLocalAuthenticated(apiClient, result, saveCredentials) {
function onAuthenticated(apiClient, result, options, saveCredentials) {
apiClient.getSystemInfo().done(function (systemInfo) {
var server = apiClient.serverInfo;
var server = apiClient.serverInfo;
updateServerInfo(server, systemInfo);
var credentials = credentialProvider.credentials();
var credentials = credentialProvider.credentials();
server.DateLastAccessed = new Date().getTime();
server.DateLastAccessed = new Date().getTime();
if (saveCredentials) {
server.UserId = result.User.Id;
server.AccessToken = result.AccessToken;
} else {
server.UserId = null;
server.AccessToken = null;
}
if (saveCredentials) {
server.UserId = result.User.Id;
server.AccessToken = result.AccessToken;
} else {
server.UserId = null;
server.AccessToken = null;
}
credentials.addOrUpdateServer(credentials.servers, server);
saveUserInfoIntoCredentials(server, result.User);
credentialProvider.credentials(credentials);
credentials.addOrUpdateServer(credentials.servers, server);
credentialProvider.credentials(credentials);
afterConnected(apiClient, options);
ensureWebSocket(apiClient);
onLocalUserSignIn(result.User);
});
onLocalUserSignIn(result.User);
}
function ensureWebSocket(apiClient) {
function saveUserInfoIntoCredentials(server, user) {
if (!apiClient.isWebSocketOpenOrConnecting && apiClient.isWebSocketSupported()) {
apiClient.openWebSocket();
//ServerUserInfo info = new ServerUserInfo();
//info.setIsSignedInOffline(true);
//info.setId(user.getId());
//// Record user info here
//server.AddOrUpdate(info);
}
function afterConnected(apiClient, options) {
options = options || {};
if (options.reportCapabilities !== false) {
apiClient.reportCapabilities(capabilities);
}
if (options.enableWebSocket !== false) {
if (!apiClient.isWebSocketOpenOrConnecting && apiClient.isWebSocketSupported()) {
logger.log('calling apiClient.openWebSocket');
apiClient.openWebSocket();
}
}
}
function onLocalUserSignIn(user) {
$(self).trigger('localusersignedin', [user]);
Events.trigger(self, 'localusersignedin', [user]);
}
function ensureConnectUser(credentials) {
var deferred = $.Deferred();
var deferred = Deferred.Deferred();
if (connectUser && connectUser.Id == credentials.ConnectUserId) {
deferred.resolveWith(null, [[]]);
}
else if (credentials.ConnectAccessToken && credentials.ConnectUserId) {
else if (credentials.ConnectUserId && credentials.ConnectAccessToken) {
connectUser = null;
getConnectUser(credentials.ConnectUserId, credentials.ConnectAccessToken).done(function (user) {
onConnectAuthenticated(user);
onConnectUserSignIn(user);
deferred.resolveWith(null, [[]]);
}).fail(function () {
@ -245,7 +266,7 @@
var url = "https://connect.mediabrowser.tv/service/user?id=" + userId;
return $.ajax({
return AjaxApi.ajax({
type: "GET",
url: url,
dataType: "json",
@ -270,7 +291,7 @@
url += "/Connect/Exchange?format=json&ConnectUserId=" + credentials.ConnectUserId;
return $.ajax({
return AjaxApi.ajax({
type: "GET",
url: url,
dataType: "json",
@ -292,11 +313,11 @@
function validateAuthentication(server, connectionMode) {
var deferred = $.Deferred();
var deferred = Deferred.Deferred();
var url = connectionMode == MediaBrowser.ConnectionMode.Local ? server.LocalAddress : server.RemoteAddress;
$.ajax({
AjaxApi.ajax({
type: "GET",
url: url + "/system/info",
@ -311,7 +332,7 @@
if (server.UserId) {
$.ajax({
AjaxApi.ajax({
type: "GET",
url: url + "/users/" + server.UserId,
@ -374,7 +395,7 @@
self.user = function () {
var deferred = $.Deferred();
var deferred = Deferred.Deferred();
var localUser;
@ -433,7 +454,7 @@
}
}
return $.when(promises).done(function () {
return Deferred.when(promises).done(function () {
var credentials = credentialProvider.credentials();
@ -442,9 +463,18 @@
});
for (var j = 0, numServers = servers.length; j < numServers; j++) {
servers[j].UserId = null;
servers[j].AccessToken = null;
servers[j].ExchangeToken = null;
var server = servers[j];
server.UserId = null;
server.AccessToken = null;
server.ExchangeToken = null;
var serverUsers = server.Users || [];
for (var k = 0, numUsers = serverUsers.length; k < numUsers; k++) {
serverUsers[k].IsSignedInOffline = false;
}
}
credentials.servers = servers;
@ -453,9 +483,10 @@
credentialProvider.credentials(credentials);
connectUser = null;
$(self).trigger('signedout');
if (connectUser) {
connectUser = null;
Events.trigger(self, 'connectusersignedout');
}
});
};
@ -463,7 +494,7 @@
logger.log('Begin getConnectServers');
var deferred = $.Deferred();
var deferred = Deferred.Deferred();
if (!self.connectToken() || !self.connectUserId()) {
deferred.resolveWith(null, [[]]);
@ -472,7 +503,7 @@
var url = "https://connect.mediabrowser.tv/service/servers?userId=" + self.connectUserId();
$.ajax({
AjaxApi.ajax({
type: "GET",
url: url,
dataType: "json",
@ -505,15 +536,15 @@
return deferred.promise();
}
self.getServers = function () {
self.getAvailableServers = function () {
logger.log('Begin getServers');
logger.log('Begin getAvailableServers');
// Clone the array
var credentials = credentialProvider.credentials();
var servers = credentials.servers.slice(0);
var deferred = $.Deferred();
var deferred = Deferred.Deferred();
getConnectServers().done(function (result) {
@ -537,23 +568,41 @@
logger.log('Begin connect');
var deferred = $.Deferred();
var deferred = Deferred.Deferred();
var isResolved = false;
self.getServers().done(function (servers) {
if (capabilities.SupportsOfflineAccess) {
if (!NetworkStatus.isNetworkAvailable()) {
self.connectToServers(servers).done(function (result) {
deferred.resolveWith(null, [self.getOffineResult()]);
isResolved = true;
}
}
deferred.resolveWith(null, [result]);
if (!isResolved) {
self.getAvailableServers().done(function (servers) {
self.connectToServers(servers).done(function (result) {
deferred.resolveWith(null, [result]);
});
});
});
}
return deferred.promise();
};
self.getOffineResult = function () {
// TODO: Implement
};
self.connectToServers = function (servers) {
var deferred = $.Deferred();
logger.log('Begin connectToServers, with ' + servers.length + ' servers');
var deferred = Deferred.Deferred();
if (servers.length == 1) {
@ -566,19 +615,17 @@
MediaBrowser.ConnectionState.ServerSelection;
}
logger.log('resolving connectToServers with result.State: ' + result.State);
deferred.resolveWith(null, [result]);
});
} else {
// Find the first server with a saved access token
var currentServer = servers.filter(function (s) {
return s.AccessToken;
})[0];
if (currentServer) {
self.connectToServer(currentServer).done(function (result) {
var firstServer = servers[0];
// See if we have any saved credentials and can auto sign in
if (firstServer) {
self.connectToServer(firstServer).done(function (result) {
if (result.State == MediaBrowser.ConnectionState.SignedIn) {
@ -608,132 +655,194 @@
return deferred.promise();
};
self.connectToServer = function (server) {
function beginWakeServer(server) {
var deferred = $.Deferred();
}
function onLocalServerTokenValidationDone(connectionMode, credentials) {
self.connectToServer = function (server, options) {
credentialProvider.addOrUpdateServer(credentials.servers, server);
server.DateLastAccessed = new Date().getTime();
var deferred = Deferred.Deferred();
credentialProvider.credentials(credentials);
var tests = [];
var result = {
Servers: []
};
if (server.LastConnectionMode) {
tests.push(server.LastConnectionMode);
}
if (tests.indexOf(MediaBrowser.ConnectionMode.Manual) == -1) { tests.push(MediaBrowser.ConnectionMode.Manual); }
if (tests.indexOf(MediaBrowser.ConnectionMode.Local) == -1) { tests.push(MediaBrowser.ConnectionMode.Local); }
if (tests.indexOf(MediaBrowser.ConnectionMode.Remote) == -1) { tests.push(MediaBrowser.ConnectionMode.Remote); }
result.ApiClient = getOrAddApiClient(server, connectionMode);
result.State = server.AccessToken ?
MediaBrowser.ConnectionState.SignedIn :
MediaBrowser.ConnectionState.ServerSignIn;
var isLocalNetworkAvailable = NetworkStatus.isAnyLocalNetworkAvailable();
var sendWakeOnLan = server.WakeOnLanInfos && server.WakeOnLanInfos.length && isLocalNetworkAvailable;
result.ApiClient.enableAutomaticNetworking(server, connectionMode);
if (result.State == MediaBrowser.ConnectionState.SignedIn) {
ensureWebSocket(result.ApiClient);
}
result.Servers.push(server);
deferred.resolveWith(null, [result]);
$(self).trigger('connected', [result]);
if (sendWakeOnLan) {
beginWakeServer(server);
}
function onExchangeTokenDone(connectionMode, credentials) {
var wakeOnLanSendTime = new Date().getTime();
if (server.AccessToken) {
validateAuthentication(server, connectionMode).always(function() {
onLocalServerTokenValidationDone(connectionMode, credentials);
});
} else {
onLocalServerTokenValidationDone(connectionMode, credentials);
}
}
function onEnsureConnectUserDone(connectionMode, credentials) {
if (credentials.ConnectUserId && credentials.ConnectAccessToken && server.ExchangeToken) {
addAuthenticationInfoFromConnect(server, connectionMode, credentials).always(function() {
onExchangeTokenDone(connectionMode, credentials);
});
} else {
onExchangeTokenDone(connectionMode, credentials);
}
}
function onRemoteTestDone(systemInfo, connectionMode) {
if (systemInfo == null) {
resolveWithFailure(deferred);
return;
}
updateServerInfo(server, systemInfo);
server.LastConnectionMode = connectionMode;
var credentials = credentialProvider.credentials();
if (credentials.ConnectUserId && credentials.ConnectAccessToken) {
ensureConnectUser(credentials).always(function() {
onEnsureConnectUserDone(connectionMode, credentials);
});
} else {
onEnsureConnectUserDone(connectionMode, credentials);
}
}
function onLocalTestDone(systemInfo, connectionMode) {
if (!systemInfo && server.RemoteAddress) {
// Try to connect to the local address
tryConnect(server.RemoteAddress).done(function (result) {
onRemoteTestDone(result, MediaBrowser.ConnectionMode.Remote);
}).fail(function() {
onRemoteTestDone();
});
} else {
onRemoteTestDone(systemInfo, connectionMode);
}
}
if (server.LocalAddress) {
//onLocalTestDone();
// Try to connect to the local address
tryConnect(server.LocalAddress, 5000).done(function (result) {
onLocalTestDone(result, MediaBrowser.ConnectionMode.Local);
}).fail(function () {
onLocalTestDone();
});
} else {
onLocalTestDone();
}
testNextConnectionMode(tests, 0, isLocalNetworkAvailable, server, wakeOnLanSendTime, options, deferred);
return deferred.promise();
};
function stringEqualsIgnoreCase(str1, str2) {
return (str1 || '').toLowerCase() == (str2 || '').toLowerCase();
}
function testNextConnectionMode(tests, index, isLocalNetworkAvailable, server, wakeOnLanSendTime, options, deferred) {
if (index >= tests.length) {
OnFailedConnection(response);
return;
}
var mode = tests[index];
var address = self.getServerAddress(server, mode);
var enableRetry = false;
var skipTest = false;
var timeout = 15000;
if (mode == MediaBrowser.ConnectionMode.Local) {
if (!isLocalNetworkAvailable) {
skipTest = true;
}
enableRetry = true;
timeout = 5000;
}
else if (mode == MediaBrowser.ConnectionMode.Manual) {
if (stringEqualsIgnoreCase(address, server.LocalAddress) ||
stringEqualsIgnoreCase(address, server.RemoteAddress)) {
skipTest = true;
}
}
if (skipTest || !address) {
testNextConnectionMode(tests, index + 1, isLocalNetworkAvailable, server, wakeOnLanSendTime, options, deferred);
return;
}
tryConnect(address, timeout).done(function (result) {
onSuccessfulConnection(server, result, mode, options, deferred);
}).fail(function () {
if (enableRetry) {
var sleepTime = 10000 - (new Date().getTime() - wakeOnLanSendTime);
// TODO: Implement delay and retry
testNextConnectionMode(tests, index + 1, isLocalNetworkAvailable, server, wakeOnLanSendTime, options, deferred);
} else {
}
testNextConnectionMode(tests, index + 1, isLocalNetworkAvailable, server, wakeOnLanSendTime, options, deferred);
});
}
function onSuccessfulConnection(server, systemInfo, connectionMode, options, deferred) {
var credentials = credentialProvider.credentials();
if (credentials.ConnectAccessToken) {
ensureConnectUser(credentials).done(function () {
if (server.ExchangeToken) {
addAuthenticationInfoFromConnect(server, connectionMode, credentials).always(function () {
afterConnectValidated(server, credentials, systemInfo, connectionMode, true, options, deferred);
});
} else {
afterConnectValidated(server, credentials, systemInfo, connectionMode, true, options, deferred);
}
});
}
else {
afterConnectValidated(server, credentials, systemInfo, connectionMode, true, options, deferred);
}
}
function afterConnectValidated(server, credentials, systemInfo, connectionMode, verifyLocalAuthentication, options, deferred) {
if (verifyLocalAuthentication && server.AccessToken) {
validateAuthentication(server, connectionMode).done(function () {
afterConnectValidated(server, credentials, systemInfo, connectionMode, false, options, deferred);
});
return;
}
updateServerInfo(server, systemInfo);
server.DateLastAccessed = new Date().getTime();
server.LastConnectionMode = connectionMode;
credentialProvider.addOrUpdateServer(credentials.servers, server);
credentialProvider.credentials(credentials);
var result = {
Servers: []
};
result.ApiClient = getOrAddApiClient(server, connectionMode);
result.State = server.AccessToken ?
MediaBrowser.ConnectionState.SignedIn :
MediaBrowser.ConnectionState.ServerSignIn;
result.Servers.push(server);
result.ApiClient.enableAutomaticNetworking(server, connectionMode);
if (result.State == MediaBrowser.ConnectionState.SignedIn) {
afterConnected(result.ApiClient, options);
}
deferred.resolveWith(null, [result]);
Events.trigger(self, 'connected', [result]);
}
self.getServerAddress = function (server, mode) {
switch (mode) {
case MediaBrowser.ConnectionMode.Local:
return server.LocalAddress;
case MediaBrowser.ConnectionMode.Manual:
return server.ManualAddress;
case MediaBrowser.ConnectionMode.Remote:
return server.RemoteAddress;
default:
throw new Error("Unexpected ConnectionMode");
}
};
self.connectToAddress = function (address) {
if (address.toLowerCase().indexOf('http') != 0) {
address = "http://" + address;
}
var deferred = $.Deferred();
var deferred = Deferred.Deferred();
tryConnect(address).done(function (publicInfo) {
tryConnect(address, 15000).done(function (publicInfo) {
var server = {};
logger.log('connectToAddress ' + address + ' succeeded');
var server = {
ManualAddress: address,
LastConnectionMode: MediaBrowser.ConnectionMode.Manual
};
updateServerInfo(server, publicInfo);
self.connectToServer(server).done(function (result) {
@ -747,6 +856,7 @@
}).fail(function () {
logger.log('connectToAddress ' + address + ' failed');
resolveWithFailure(deferred);
});
@ -764,7 +874,7 @@
var md5 = self.getConnectPasswordHash(password);
return $.ajax({
return AjaxApi.ajax({
type: "POST",
url: "https://connect.mediabrowser.tv/service/user/authenticate",
data: {
@ -786,7 +896,7 @@
credentialProvider.credentials(credentials);
onConnectAuthenticated(result.User);
onConnectUserSignIn(result.User);
});
};
@ -825,7 +935,7 @@
var url = "https://connect.mediabrowser.tv/service/servers?userId=" + self.connectUserId() + "&status=Waiting";
return $.ajax({
return AjaxApi.ajax({
type: "GET",
url: url,
dataType: "json",
@ -851,7 +961,7 @@
var url = "https://connect.mediabrowser.tv/service/serverAuthorizations?serverId=" + serverId + "&userId=" + self.connectUserId();
return $.ajax({
return AjaxApi.ajax({
type: "DELETE",
url: url,
headers: {
@ -886,7 +996,7 @@
var url = "https://connect.mediabrowser.tv/service/serverAuthorizations?serverId=" + serverId + "&userId=" + self.connectUserId();
return $.ajax({
return AjaxApi.ajax({
type: "DELETE",
url: url,
headers: {
@ -911,7 +1021,7 @@
var url = "https://connect.mediabrowser.tv/service/ServerAuthorizations/accept?serverId=" + serverId + "&userId=" + self.connectUserId();
return $.ajax({
return AjaxApi.ajax({
type: "GET",
url: url,
headers: {
@ -925,4 +1035,4 @@
return self;
};
})(window, window.jQuery, window.Logger);
})(window, window.Logger);