handle loading args in queue

This commit is contained in:
nklhrstv 2020-04-22 12:02:40 +03:00
parent 36ad3af9b4
commit ec7bb07c12

View file

@ -7,8 +7,11 @@ function withStreamingServer(Video) {
function StreamingServerVideo(options) { function StreamingServerVideo(options) {
var video = new Video(options); var video = new Video(options);
var events = new EventEmitter(); var events = new EventEmitter();
var destroyed = false; var destroyed = false;
var loaded = false;
var stream = null; var stream = null;
var dispatchArgsLoadingQueue = [];
events.on('error', function() { }); events.on('error', function() { });
@ -20,10 +23,15 @@ function withStreamingServer(Video) {
Object.freeze(error); Object.freeze(error);
events.emit('error', error); events.emit('error', error);
if (error.critical) { if (error.critical) {
video.dispatch({ commandName: 'stop' }); dispatch({ commandName: 'stop' });
}
}
function flushDispatchArgsQueue(dispatchArgsQueue) {
while (dispatchArgsQueue.length > 0) {
var args = dispatchArgsQueue.shift();
dispatch(args);
} }
} }
function on(eventName, listener) { function on(eventName, listener) {
if (!destroyed) { if (!destroyed) {
events.on(eventName, listener); events.on(eventName, listener);
@ -32,88 +40,121 @@ function withStreamingServer(Video) {
video.on(eventName, listener); video.on(eventName, listener);
} }
function dispatch(args) { function dispatch(args) {
if (!destroyed && args && args.commandName === 'load') { if (!destroyed && args) {
stream = null; if (typeof args.commandName === 'string') {
video.dispatch({ commandName: 'stop' }); switch (args.commandName) {
if (args.commandArgs && args.commandArgs.stream && typeof args.commandArgs.stream.infoHash === 'string' && typeof args.commandArgs.streamingServerUrl === 'string') { case 'addSubtitlesTracks': {
stream = args.commandArgs.stream; if (!loaded && stream !== null) {
if (stream.fileIdx !== null && !isNaN(stream.fileIdx)) { dispatchArgsLoadingQueue.push(args);
video.dispatch({
commandName: 'load',
commandArgs: {
autoplay: args.commandArgs.autoplay,
time: args.commandArgs.time,
stream: {
url: UrlUtils.resolve(args.commandArgs.streamingServerUrl, stream.infoHash + '/' + String(stream.fileIdx))
}
}
});
} else {
fetch(UrlUtils.resolve(args.commandArgs.streamingServerUrl, stream.infoHash + '/create'), {
method: 'POST',
headers: {
'content-type': 'application/json'
},
body: JSON.stringify({
torrent: {
infoHash: stream.infoHash
}
})
}).then(function(resp) {
return resp.json();
}).then(function(resp) {
if (stream !== args.commandArgs.stream) {
return; return;
} }
if (!Array.isArray(resp.files) || resp.files.length === 0) { break;
onError({ }
message: 'Unable to get files from torrent', case 'stop': {
critical: true loaded = false;
}); stream = null;
return; dispatchArgsLoadingQueue = [];
} break;
}
case 'load': {
dispatch({ commandName: 'stop' });
if (args.commandArgs && typeof args.commandArgs.streamingServerUrl === 'string' && args.commandArgs.stream) {
if (typeof args.commandArgs.stream.infoHash === 'string') {
stream = args.commandArgs.stream;
if (stream.fileIdx !== null && !isNaN(stream.fileIdx)) {
video.dispatch({
commandName: 'load',
commandArgs: {
autoplay: args.commandArgs.autoplay,
time: args.commandArgs.time,
stream: {
url: UrlUtils.resolve(args.commandArgs.streamingServerUrl, stream.infoHash + '/' + String(stream.fileIdx))
}
}
});
loaded = true;
} else {
fetch(UrlUtils.resolve(args.commandArgs.streamingServerUrl, stream.infoHash + '/create'), {
method: 'POST',
headers: {
'content-type': 'application/json'
},
body: JSON.stringify({
torrent: {
infoHash: stream.infoHash
}
})
}).then(function(resp) {
return resp.json();
}).then(function(resp) {
if (stream !== args.commandArgs.stream) {
return;
}
var fileIdx = resp.files.reduce((fileIdx, _, index, files) => { if (!Array.isArray(resp.files) || resp.files.length === 0) {
if (files[index].length > files[fileIdx].length) { onError({
return index; message: 'Unable to get files from torrent',
} critical: true
});
return;
}
return fileIdx; var fileIdx = resp.files.reduce((fileIdx, _, index, files) => {
}, 0); if (files[index].length > files[fileIdx].length) {
video.dispatch({ return index;
commandName: 'load', }
commandArgs: {
autoplay: args.commandArgs.autoplay, return fileIdx;
time: args.commandArgs.time, }, 0);
stream: { video.dispatch({
url: UrlUtils.resolve(args.commandArgs.streamingServerUrl, stream.infoHash + '/' + String(fileIdx)) commandName: 'load',
commandArgs: {
autoplay: args.commandArgs.autoplay,
time: args.commandArgs.time,
stream: {
url: UrlUtils.resolve(args.commandArgs.streamingServerUrl, stream.infoHash + '/' + String(fileIdx))
}
}
});
loaded = true;
flushDispatchArgsQueue(dispatchArgsLoadingQueue);
}).catch(function(error) {
if (stream !== args.commandArgs.stream) {
return;
}
onError({
message: 'Unable to get files from torrent',
critical: true,
error: error
});
});
} }
return;
} }
});
}).catch(function(error) {
if (stream !== args.commandArgs.stream) {
return;
} }
onError({ break;
message: 'Unable to get files from torrent', }
critical: true, case 'destroy': {
error: error dispatch({ commandName: 'stop' });
}); destroyed = true;
}); events.removeAllListeners();
events.on('error', function() { });
break;
}
}
} else if (typeof args.propName === 'string') {
if (!loaded && stream !== null && ['paused', 'time', 'selectedSubtitlesTrackId', 'subtitlesDelay'].indexOf(args.propName) !== -1) {
dispatchArgsLoadingQueue.push(args);
return;
} }
} }
} else {
if (args && args.commandName === 'destroy') {
destroyed = true;
stream = null;
events.removeAllListeners();
events.on('error', function() { });
}
video.dispatch(args);
} }
video.dispatch(args);
} }
this.on = on; this.on = on;