|
|
@@ -56,13 +56,12 @@ this.SingleFileCore = this.SingleFileCore || (() => {
|
|
|
const PAGE_LOADED = "page-loaded";
|
|
|
const RESOURCES_INITIALIZING = "resource-initializing";
|
|
|
const RESOURCES_INITIALIZED = "resources-initialized";
|
|
|
- const RESOURCE_LOADING = "resource-loading";
|
|
|
const RESOURCE_LOADED = "resource-loaded";
|
|
|
const PAGE_ENDED = "page-ended";
|
|
|
|
|
|
class ProgressEvent {
|
|
|
constructor(type, details) {
|
|
|
- return { type, details, PAGE_LOADING, PAGE_LOADED, RESOURCES_INITIALIZING, RESOURCES_INITIALIZED, RESOURCE_LOADING, RESOURCE_LOADED, PAGE_ENDED };
|
|
|
+ return { type, details, PAGE_LOADING, PAGE_LOADED, RESOURCES_INITIALIZING, RESOURCES_INITIALIZED, RESOURCE_LOADED, PAGE_ENDED };
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -132,10 +131,6 @@ this.SingleFileCore = this.SingleFileCore || (() => {
|
|
|
|
|
|
async preparePageData() {
|
|
|
await this.processor.retrieveResources(
|
|
|
- details => {
|
|
|
- details.pageURL = this.options.url;
|
|
|
- this.onprogress(new ProgressEvent(RESOURCE_LOADING, details));
|
|
|
- },
|
|
|
details => {
|
|
|
details.pageURL = this.options.url;
|
|
|
this.onprogress(new ProgressEvent(RESOURCE_LOADED, details));
|
|
|
@@ -168,6 +163,7 @@ this.SingleFileCore = this.SingleFileCore || (() => {
|
|
|
class BatchRequest {
|
|
|
constructor() {
|
|
|
this.requests = new Map();
|
|
|
+ this.MAX_REQUESTS = 32;
|
|
|
}
|
|
|
|
|
|
async addURL(resourceURL) {
|
|
|
@@ -185,25 +181,29 @@ this.SingleFileCore = this.SingleFileCore || (() => {
|
|
|
return Array.from(this.requests.keys()).length;
|
|
|
}
|
|
|
|
|
|
- async run(beforeListener, afterListener, options) {
|
|
|
+ async run(onloadListener, options) {
|
|
|
const resourceURLs = Array.from(this.requests.keys());
|
|
|
- let indexResource = 1, indexAfterResource = 1;
|
|
|
- return Promise.all(resourceURLs.map(async resourceURL => {
|
|
|
- let error;
|
|
|
- const resourceRequests = this.requests.get(resourceURL);
|
|
|
- beforeListener({ index: indexResource, max: resourceURLs.length, url: resourceURL, error });
|
|
|
- indexResource = indexResource + 1;
|
|
|
- try {
|
|
|
- const dataURI = await Download.getContent(resourceURL, { asDataURI: true, maxResourceSize: options.maxResourceSize, maxResourceSizeEnabled: options.maxResourceSizeEnabled });
|
|
|
- resourceRequests.forEach(resourceRequest => resourceRequest.resolve(dataURI));
|
|
|
- } catch (responseError) {
|
|
|
- error = responseError;
|
|
|
- resourceRequests.forEach(resourceRequest => resourceRequest.reject(error));
|
|
|
+ let indexResource = 0;
|
|
|
+ for (let requests = 0; requests < this.MAX_REQUESTS; requests++) {
|
|
|
+ await retrieveResourceContent(this.requests);
|
|
|
+ }
|
|
|
+
|
|
|
+ async function retrieveResourceContent(requests) {
|
|
|
+ const resourceURL = resourceURLs[indexResource];
|
|
|
+ if (resourceURL) {
|
|
|
+ const resourceRequests = requests.get(resourceURL);
|
|
|
+ indexResource = indexResource + 1;
|
|
|
+ try {
|
|
|
+ const dataURI = await Download.getContent(resourceURL, { asDataURI: true, maxResourceSize: options.maxResourceSize, maxResourceSizeEnabled: options.maxResourceSizeEnabled });
|
|
|
+ resourceRequests.forEach(resourceRequest => resourceRequest.resolve(dataURI));
|
|
|
+ } catch (error) {
|
|
|
+ resourceRequests.forEach(resourceRequest => resourceRequest.reject(error));
|
|
|
+ }
|
|
|
+ requests.delete(resourceURL);
|
|
|
+ onloadListener({ index: indexResource + 1, max: resourceURLs.length, url: resourceURL });
|
|
|
+ await retrieveResourceContent(requests);
|
|
|
}
|
|
|
- afterListener({ index: indexAfterResource, max: resourceURLs.length, url: resourceURL, error });
|
|
|
- indexAfterResource = indexAfterResource + 1;
|
|
|
- this.requests.delete(resourceURL);
|
|
|
- }));
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -243,8 +243,8 @@ this.SingleFileCore = this.SingleFileCore || (() => {
|
|
|
await this.loadPage();
|
|
|
}
|
|
|
|
|
|
- async retrieveResources(beforeListener, afterListener) {
|
|
|
- await batchRequest.run(beforeListener, afterListener, this.options);
|
|
|
+ async retrieveResources(onloadListener) {
|
|
|
+ await batchRequest.run(onloadListener, this.options);
|
|
|
}
|
|
|
|
|
|
getPageData() {
|