mirror of
https://github.com/jellyfin/jellyfin-web.git
synced 2024-11-18 03:18:19 -07:00
132 lines
3.5 KiB
JavaScript
132 lines
3.5 KiB
JavaScript
define([], function () {
|
|
'use strict';
|
|
|
|
function getFetchPromise(request) {
|
|
|
|
var headers = request.headers || {};
|
|
|
|
if (request.dataType === 'json') {
|
|
headers.accept = 'application/json';
|
|
}
|
|
|
|
var fetchRequest = {
|
|
headers: headers,
|
|
method: request.type,
|
|
credentials: 'same-origin'
|
|
};
|
|
|
|
var contentType = request.contentType;
|
|
|
|
if (request.data) {
|
|
|
|
if (typeof request.data === 'string') {
|
|
fetchRequest.body = request.data;
|
|
} else {
|
|
fetchRequest.body = paramsToString(request.data);
|
|
|
|
contentType = contentType || 'application/x-www-form-urlencoded; charset=UTF-8';
|
|
}
|
|
}
|
|
|
|
if (contentType) {
|
|
|
|
headers['Content-Type'] = contentType;
|
|
}
|
|
|
|
var url = request.url;
|
|
|
|
if (request.query) {
|
|
var paramString = paramsToString(request.query);
|
|
if (paramString) {
|
|
url += '?' + paramString;
|
|
}
|
|
}
|
|
|
|
if (!request.timeout) {
|
|
return fetch(url, fetchRequest);
|
|
}
|
|
|
|
return fetchWithTimeout(url, fetchRequest, request.timeout);
|
|
}
|
|
|
|
function fetchWithTimeout(url, options, timeoutMs) {
|
|
|
|
console.log('fetchWithTimeout: timeoutMs: ' + timeoutMs + ', url: ' + url);
|
|
|
|
return new Promise(function (resolve, reject) {
|
|
|
|
var timeout = setTimeout(reject, timeoutMs);
|
|
|
|
options = options || {};
|
|
options.credentials = 'same-origin';
|
|
|
|
fetch(url, options).then(function (response) {
|
|
clearTimeout(timeout);
|
|
|
|
console.log('fetchWithTimeout: succeeded connecting to url: ' + url);
|
|
|
|
resolve(response);
|
|
}, function (error) {
|
|
|
|
clearTimeout(timeout);
|
|
|
|
console.log('fetchWithTimeout: timed out connecting to url: ' + url);
|
|
|
|
reject();
|
|
});
|
|
});
|
|
}
|
|
|
|
function paramsToString(params) {
|
|
|
|
var values = [];
|
|
|
|
for (var key in params) {
|
|
|
|
var value = params[key];
|
|
|
|
if (value !== null && value !== undefined && value !== '') {
|
|
values.push(encodeURIComponent(key) + "=" + encodeURIComponent(value));
|
|
}
|
|
}
|
|
return values.join('&');
|
|
}
|
|
|
|
function ajax(request) {
|
|
|
|
if (!request) {
|
|
throw new Error("Request cannot be null");
|
|
}
|
|
|
|
request.headers = request.headers || {};
|
|
|
|
console.log('requesting url: ' + request.url);
|
|
|
|
return getFetchPromise(request).then(function (response) {
|
|
|
|
console.log('response status: ' + response.status + ', url: ' + request.url);
|
|
|
|
if (response.status < 400) {
|
|
|
|
if (request.dataType === 'json' || request.headers.accept === 'application/json') {
|
|
return response.json();
|
|
} else if (request.dataType === 'text' || (response.headers.get('Content-Type') || '').toLowerCase().indexOf('text/') === 0) {
|
|
return response.text();
|
|
} else {
|
|
return response;
|
|
}
|
|
} else {
|
|
return Promise.reject(response);
|
|
}
|
|
|
|
}, function (err) {
|
|
|
|
console.log('request failed to url: ' + request.url);
|
|
throw err;
|
|
});
|
|
}
|
|
return {
|
|
getFetchPromise: getFetchPromise,
|
|
ajax: ajax
|
|
};
|
|
}); |