Skip to content

Commit 9d5ded9

Browse files
jeremcomackode
authored andcommitted
Improve manifest download handling by checking status (#77)
1 parent 6926543 commit 9d5ded9

File tree

2 files changed

+36
-18
lines changed

2 files changed

+36
-18
lines changed

api/server/contentRoute.js

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ function _attachEvents () {
6565

6666
function ContentRoute (app, routeName) {
6767

68-
let manifestFolderPath = {};
68+
let manifestInfo = {};
6969

7070
_attachEvents();
7171

@@ -89,8 +89,8 @@ function ContentRoute (app, routeName) {
8989
}
9090
res.sendFile(file, options, function (err) {
9191
if (err && err.status) {
92-
// error to open file => remove saved folder (maybe moved)
93-
delete manifestFolderPath[manifestId];
92+
// error to open file => remove saved info (maybe moved)
93+
delete manifestInfo[manifestId];
9494
res.status(err.status).end();
9595
}
9696
})
@@ -100,7 +100,7 @@ function ContentRoute (app, routeName) {
100100
let file = folder + '/' + manifestId + '/' + req.params[0];
101101
fs.exists(file, (exists) => {
102102
if (exists) {
103-
// no cached folder for manifest id, asks main process for folder
103+
// fragment exists on disk, let's check if it is not being downloaded
104104
processCmd('is_downloading', {manifest: manifestId, file: file})
105105
.then(() => {
106106
sendFile(file)
@@ -109,32 +109,50 @@ function ContentRoute (app, routeName) {
109109
return res.status(404).end();
110110
});
111111
} else {
112-
// ask to perform seek
112+
// fragment doesn't on disk, ask to download it
113113
processCmd('perform_seek', {manifest: manifestId, file: file})
114114
.then(() => {
115115
sendFile(file)
116116
})
117-
.catch(function () {
117+
.catch(function () {
118118
return res.status(404).end();
119119
});
120120
}
121121
})
122122
}
123123

124-
// check if a folder has been already saved for the manifest
125-
if (manifestFolderPath[manifestId]) {
126-
seekIfNeeded(manifestFolderPath[manifestId]);
124+
let getFile = function (info) {
125+
if (info && info.status === 'FINISHED') {
126+
// if file has status finished, no need to check if fragment is being downloaded
127+
let file = info.folder + '/' + manifestId + '/' + req.params[0];
128+
fs.exists(file, (exists) => {
129+
if (exists) {
130+
// fragment exists => send data
131+
sendFile(file)
132+
} else {
133+
// fragment doesn't exists => 404 and remove cached data
134+
delete manifestInfo[manifestId];
135+
return res.status(404).end();
136+
}
137+
});
138+
} else {
139+
// file is not finished, let's perform seek if needed
140+
seekIfNeeded( info.folder);
141+
}
142+
}
143+
144+
// check if info have been already saved for the manifest
145+
if (manifestInfo[manifestId]) {
146+
getFile( manifestInfo[manifestId]);
127147
} else {
128-
// no cached folder for manifest id, asks main process for folder
129-
processCmd('get_folder', {manifest: manifestId})
148+
// no info for manifest id, asks main process to get manifest info
149+
processCmd('get_info', {manifest: manifestId})
130150
.then((result) => {
131-
let downloadFolder = result.folder;
132-
// save folder location for manifest and then send file
133-
manifestFolderPath[manifestId] = downloadFolder;
134-
seekIfNeeded(manifestFolderPath[manifestId]);
151+
manifestInfo[manifestId] = result;
152+
getFile( manifestInfo[manifestId]);
135153
})
136154
.catch(function () {
137-
delete manifestFolderPath[manifestId];
155+
delete manifestInfo[manifestId];
138156
return res.status(404).send('Cannot find manifest');
139157
});
140158
}

api/server/server.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ OfflineContentServer.prototype._startServer = function (port, callback) {
6969
callback(data.port);
7070
}
7171

72-
if (data.cmd === 'get_folder') {
72+
if (data.cmd === 'get_info') {
7373

7474
let requestId = data.requestId;
7575
// http server asks data folder for manifest id
@@ -88,7 +88,7 @@ OfflineContentServer.prototype._startServer = function (port, callback) {
8888
}
8989

9090
// send response back
91-
return self.childProcess.send({status: 'OK', requestId: requestId, result: {folder: downloadFolder}});
91+
return self.childProcess.send({status: 'OK', requestId: requestId, result: {folder: downloadFolder, status: info.status}});
9292
})
9393
}
9494

0 commit comments

Comments
 (0)