Extend progress monitoring

NW.js downloader now supports progress monitoring
Progress updates are logged into the console
This commit is contained in:
Thomas Weber committed 2020-10-10 15:15:54 -05:00
1 parent 5538979aa0
commit ff34a03e02
2 files changed
+64 -21

No files matched your search

+18 -13
View File
@@ -226,7 +226,13 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
O.onchange = updateConditionals;
updateConditionals();
const progressTarget = new EventTarget();
progressTarget.addEventListener('data-progress', (e) => console.log(e.detail));
// progressTarget.addEventListener('asset-fetch', (e) => console.log(e.detail));
// progressTarget.addEventListener('asset-fetched', (e) => console.log(e.detail));
progressTarget.addEventListener('nwjs-progress', (e) => console.log(e.detail));
const loadProject = async () => {
if (O.project.source === 'file') {
if (!O.project.file) {
@@ -239,7 +245,9 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
if (!match) {
throw new Error('Invalid project ID');
}
const project = await SBDownloader.download(match[0]);
const project = await SBDownloader.download(match[0], {
progressTarget
});
return new Packager.Project(await project.asBlob(), project.type);
}
throw new Error('unknown project source');
@@ -269,16 +277,13 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
switch (O.environment.target) {
case 'html': return new Packager.environments.HTML();
case 'zip': return new Packager.environments.Zip();
case 'nwjs-win64': return new Packager.environments.NWjs({
icon: O.nwjs.icon || getDefaultIcon(),
manifest: O.nwjs.manifest,
platform: 'windows',
});
case 'nwjs-mac': return new Packager.environments.NWjs({
icon: O.nwjs.icon || getDefaultIcon(),
manifest: O.nwjs.manifest,
platform: 'mac',
})
case 'nwjs-win64':
case 'nwjs-mac':
return new Packager.environments.NWjs({
icon: O.nwjs.icon || getDefaultIcon(),
manifest: O.nwjs.manifest,
platform: O.environment.target.substr('nwjs-'.length),
});
}
throw new Error('unknown environment');
};
@@ -313,7 +318,7 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
const runtime = getRuntime();
const environment = getEnvironment();
const projectData = await loadProject();
const result = await environment.package(runtime, projectData);
const result = await environment.package(runtime, projectData, progressTarget);
if (!(result.data instanceof Blob)) {
result.data = new Blob([result.data]);
}
+46 -8
View File
@@ -19,14 +19,14 @@ window.Packager = (function() {
const readAsDataURL = (blob) => new Promise((resolve, reject) => {
const fr = new FileReader();
fr.onload = () => resolve(fr.result);
fr.onerror = () => reject('could not read as data url');
fr.onerror = () => reject(new Error('could not read as data url'));
fr.readAsDataURL(blob);
});
const readAsArrayBuffer = (blob) => new Promise((resolve, reject) => {
const fr = new FileReader();
fr.onload = () => resolve(fr.result);
fr.onerror = () => reject('could not read as arraybuffer');
fr.onerror = () => reject(new Error('could not read as arraybuffer'));
fr.readAsArrayBuffer(blob);
});
@@ -37,18 +37,53 @@ window.Packager = (function() {
image.src = src;
});
const isObject = (obj) => typeof obj === 'object' && obj !== null;
const canvasToBlob = (canvas) => new Promise((resolve, reject) => {
canvas.toBlob((blob) => {
if (blob) {
resolve(blob);
} else {
reject('Could not read <canvas> as blob');
reject(new Error('Could not read <canvas> as blob'));
}
}); // png is default type, quality is ignored
});
const isObject = (obj) => typeof obj === 'object' && obj !== null;
// TODO: load dynamically
const assetManifest = {
'nwjs-win64': {
src: 'https://packagerdata.turbowarp.org/nwjs-v0.49.0-win-x64.zip',
size: 97406745
},
'nwjs-mac': {
src: 'https://packagerdata.turbowarp.org/nwjs-v0.49.0-osx-x64.zip',
size: 128684835
}
};
const fetchManifestAsset = (assetName, progressCallback) => {
const manifestEntry = assetManifest[assetName];
if (manifestEntry._data) {
return Promise.resolve(manifestEntry._data);
}
return new Promise((resolve, reject) => {
const {src, size} = manifestEntry;
const xhr = new XMLHttpRequest();
xhr.responseType = 'blob';
xhr.onload = () => {
manifestEntry._data = xhr.response;
resolve(xhr.response);
};
xhr.onerror = () => reject(new Error('XHR failed'));
xhr.onprogress = (e) => {
progressCallback(e.loaded / size);
};
xhr.onloadend = () => progressCallback(1);
xhr.open('GET', src);
xhr.send();
});
};
class Project {
constructor(blob, type) {
this.blob = blob;
@@ -588,11 +623,14 @@ ${scripts}
this.platform = platform;
this.icon = icon;
}
async package(runtime, projectData) {
async package(runtime, projectData, progressTarget) {
const packagerData = await runtime.package(await projectData.asFetchedFrom('project.zip'));
const response = await fetch(`https://packagerdata.turbowarp.org/nwjs-v0.49.0-${this.platform === 'windows' ? 'win' : 'osx'}-x64.zip`);
const nwjsData = await response.arrayBuffer();
const nwjsData = await fetchManifestAsset(`nwjs-${this.platform}`, (progress) => {
progressTarget.dispatchEvent(new CustomEvent('nwjs-progress', {
detail: progress
}));
})
const nwjsZip = await JSZip.loadAsync(nwjsData);
// Inside the nw.js zip is another folder called something like nwjs-v0.48.2-win-x64