Cache asar archives on JavaScript side.

This commit is contained in:
Cheng Zhao 2014-09-25 20:48:32 +08:00
parent 4006b6407c
commit dbbfef38b1
3 changed files with 25 additions and 20 deletions

View file

@ -20,16 +20,15 @@ class Archive : public mate::Wrappable {
public:
static v8::Handle<v8::Value> Create(v8::Isolate* isolate,
const base::FilePath& path) {
static asar::ArchiveFactory archive_factory;
asar::Archive* archive = archive_factory.GetOrCreate(path);
if (!archive)
scoped_ptr<asar::Archive> archive(new asar::Archive(path));
if (!archive->Init())
return v8::False(isolate);
return (new Archive(archive))->GetWrapper(isolate);
return (new Archive(archive.Pass()))->GetWrapper(isolate);
}
protected:
explicit Archive(asar::Archive* archive) : archive_(archive) {}
virtual ~Archive() {}
explicit Archive(scoped_ptr<asar::Archive> archive)
: archive_(archive.Pass()) {}
// Reads the offset and size of file.
v8::Handle<v8::Value> GetFileInfo(v8::Isolate* isolate,
@ -87,7 +86,7 @@ class Archive : public mate::Wrappable {
}
private:
asar::Archive* archive_;
scoped_ptr<asar::Archive> archive_;
DISALLOW_COPY_AND_ASSIGN(Archive);
};

View file

@ -10,8 +10,7 @@ namespace asar {
ArchiveFactory::ArchiveFactory() {}
ArchiveFactory::~ArchiveFactory() {
}
ArchiveFactory::~ArchiveFactory() {}
Archive* ArchiveFactory::GetOrCreate(const base::FilePath& path) {
if (!archives_.contains(path)) {

View file

@ -3,6 +3,13 @@ fs = require 'fs'
path = require 'path'
util = require 'util'
# Cache asar archive objects.
cachedArchives = {}
getOrCreateArchive = (p) ->
unless cachedArchives[p]?
cachedArchives[p] = asar.createArchive p
cachedArchives[p]
# Separate asar package's path from full path.
splitPath = (p) ->
components = p.split path.sep
@ -49,7 +56,7 @@ fs.lstatSync = (p) ->
[isAsar, asarPath, filePath] = splitPath p
return lstatSync p unless isAsar
archive = asar.createArchive asarPath
archive = getOrCreateArchive asarPath
throw new Error("Invalid package #{asarPath}") unless archive
stats = archive.stat filePath
@ -62,10 +69,10 @@ fs.lstat = (p, callback) ->
[isAsar, asarPath, filePath] = splitPath p
return lstat p, callback unless isAsar
archive = asar.createArchive asarPath
archive = getOrCreateArchive asarPath
return callback throw new Error("Invalid package #{asarPath}") unless archive
stats = asar.createArchive(asarPath).stat filePath
stats = getOrCreateArchive(asarPath).stat filePath
return callback createNotFoundError(asarPath, filePath) unless stats
callback undefined, asarStatsToFsStats stats
@ -91,9 +98,9 @@ fs.statSyncNoException = (p) ->
[isAsar, asarPath, filePath] = splitPath p
return statSyncNoException p unless isAsar
archive = asar.createArchive asarPath
archive = getOrCreateArchive asarPath
return false unless archive
stats = asar.createArchive(asarPath).stat filePath
stats = archive.stat filePath
return false unless stats
asarStatsToFsStats stats
@ -102,7 +109,7 @@ fs.exists = (p, callback) ->
[isAsar, asarPath, filePath] = splitPath p
return exists p, callback unless isAsar
archive = asar.createArchive asarPath
archive = getOrCreateArchive asarPath
return callback throw new Error("Invalid package #{asarPath}") unless archive
callback archive.stat(filePath) isnt false
@ -112,7 +119,7 @@ fs.existsSync = (p) ->
[isAsar, asarPath, filePath] = splitPath p
return existsSync p unless isAsar
archive = asar.createArchive asarPath
archive = getOrCreateArchive asarPath
return false unless archive
archive.stat(filePath) isnt false
@ -122,7 +129,7 @@ fs.readFile = (p, options, callback) ->
[isAsar, asarPath, filePath] = splitPath p
return readFile.apply this, arguments unless isAsar
archive = asar.createArchive asarPath
archive = getOrCreateArchive asarPath
return callback throw new Error("Invalid package #{asarPath}") unless archive
info = archive.getFileInfo filePath
@ -154,7 +161,7 @@ fs.readFileSync = (p, options) ->
[isAsar, asarPath, filePath] = splitPath p
return readFileSync.apply this, arguments unless isAsar
archive = asar.createArchive asarPath
archive = getOrCreateArchive asarPath
throw new Error("Invalid package #{asarPath}") unless archive
info = archive.getFileInfo filePath
@ -185,7 +192,7 @@ fs.readdir = (p, callback) ->
[isAsar, asarPath, filePath] = splitPath p
return readdir.apply this, arguments unless isAsar
archive = asar.createArchive asarPath
archive = getOrCreateArchive asarPath
return callback throw new Error("Invalid package #{asarPath}") unless archive
files = archive.readdir filePath
@ -199,7 +206,7 @@ fs.readdirSync = (p) ->
[isAsar, asarPath, filePath] = splitPath p
return readdirSync.apply this, arguments unless isAsar
archive = asar.createArchive asarPath
archive = getOrCreateArchive asarPath
throw new Error("Invalid package #{asarPath}") unless archive
files = archive.readdir filePath