diff --git a/build/main.cjs b/build/main.cjs index 34aa4e5..97b93b2 100644 --- a/build/main.cjs +++ b/build/main.cjs @@ -39,6 +39,7 @@ class FastFile { this.reading = false; this.avBuffs = []; this.history = {}; + this.maxPromises = 1 << 10; } _loadPage(p) { @@ -114,8 +115,8 @@ class FastFile { while ( (self.pendingLoads.length>0) && ( (typeof self.pages[self.pendingLoads[0].page] != "undefined" ) - ||( (freePages>0) - ||(deletablePages.length>0)))) { + ||( (freePages>0) + ||(deletablePages.length>0)))) { const load = self.pendingLoads.shift(); if (typeof self.pages[load.page] != "undefined") { self.pages[load.page].pendingOps ++; @@ -165,7 +166,15 @@ class FastFile { } // if (ops.length>1) console.log(ops.length); - Promise.all(ops).then( () => { + // This avoids 'too many promises for Promise.all' error + const opsWrapper = []; + for (let from=0; from { self.reading = false; if (self.pendingLoads.length>0) setImmediate(self._triggerLoad.bind(self)); self._tryClose(); diff --git a/src/osfile.js b/src/osfile.js index fcd8445..830ae30 100644 --- a/src/osfile.js +++ b/src/osfile.js @@ -32,6 +32,7 @@ class FastFile { this.reading = false; this.avBuffs = []; this.history = {}; + this.maxPromises = 1 << 10; } _loadPage(p) { @@ -107,8 +108,8 @@ class FastFile { while ( (self.pendingLoads.length>0) && ( (typeof self.pages[self.pendingLoads[0].page] != "undefined" ) - ||( (freePages>0) - ||(deletablePages.length>0)))) { + ||( (freePages>0) + ||(deletablePages.length>0)))) { const load = self.pendingLoads.shift(); if (typeof self.pages[load.page] != "undefined") { self.pages[load.page].pendingOps ++; @@ -158,7 +159,15 @@ class FastFile { } // if (ops.length>1) console.log(ops.length); - Promise.all(ops).then( () => { + // This avoids 'too many promises for Promise.all' error + const opsWrapper = []; + for (let from=0; from { self.reading = false; if (self.pendingLoads.length>0) setImmediate(self._triggerLoad.bind(self)); self._tryClose(); diff --git a/test/osfile.test.js b/test/osfile.test.js index 855d644..06a1885 100644 --- a/test/osfile.test.js +++ b/test/osfile.test.js @@ -49,6 +49,17 @@ describe("fastfile testing suite for osfile", function () { expect(fd.readString(0)).to.be.rejectedWith("Reading a closing file"); await fs.promises.unlink(fileName); }); + + it("should read a large file", async () => { + const fileName = "//path/to/large/file.ptau"; + const bytesToRead = 1<<16; + const ff = await fastFile.readExisting(fileName, 1024, 1024); + assert(ff.totalSize>0); + + let buff = new Uint8Array(bytesToRead); + await ff.readToBuffer(buff, 0, bytesToRead); + assert.equal(ff.pos, bytesToRead); + }); });