asar: make fs async methods create errors asynchronously
authordeepak1556 <hop2deep@gmail.com>
Tue, 21 Apr 2015 09:50:08 +0000 (15:20 +0530)
committerdeepak1556 <hop2deep@gmail.com>
Sat, 25 Apr 2015 04:38:02 +0000 (10:08 +0530)
atom/common/lib/asar.coffee
spec/asar-spec.coffee

index 8530071..f36a149 100644 (file)
@@ -53,11 +53,20 @@ asarStatsToFsStats = (stats) ->
   }
 
 # Create a ENOENT error.
-createNotFoundError = (asarPath, filePath) ->
+notFoundError = (asarPath, filePath, callback) ->
   error = new Error("ENOENT, #{filePath} not found in #{asarPath}")
   error.code = "ENOENT"
   error.errno = -2
-  error
+  unless typeof callback is 'function'
+    throw error
+  process.nextTick -> callback error
+
+# Create invalid archive error.
+invalidArchiveError = (asarPath, callback) ->
+  error = new Error("Invalid package #{asarPath}")
+  unless typeof callback is 'function'
+    throw error
+  process.nextTick -> callback error
 
 # Override APIs that rely on passing file path instead of content to C++.
 overrideAPISync = (module, name, arg = 0) ->
@@ -68,10 +77,10 @@ overrideAPISync = (module, name, arg = 0) ->
     return old.apply this, arguments unless isAsar
 
     archive = getOrCreateArchive asarPath
-    throw new Error("Invalid package #{asarPath}") unless archive
+    invalidArchiveError asarPath unless archive
 
     newPath = archive.copyFileOut filePath
-    throw createNotFoundError(asarPath, filePath) unless newPath
+    notFoundError asarPath, filePath unless newPath
 
     arguments[arg] = newPath
     old.apply this, arguments
@@ -87,10 +96,10 @@ overrideAPI = (module, name, arg = 0) ->
     return overrideAPISync module, name, arg unless typeof callback is 'function'
 
     archive = getOrCreateArchive asarPath
-    return callback new Error("Invalid package #{asarPath}") unless archive
+    return invalidArchiveError asarPath, callback unless archive
 
     newPath = archive.copyFileOut filePath
-    return callback createNotFoundError(asarPath, filePath) unless newPath
+    return notFoundError asarPath, filePath, callback unless newPath
 
     arguments[arg] = newPath
     old.apply this, arguments
@@ -103,10 +112,10 @@ exports.wrapFsWithAsar = (fs) ->
     return lstatSync p unless isAsar
 
     archive = getOrCreateArchive asarPath
-    throw new Error("Invalid package #{asarPath}") unless archive
+    invalidArchiveError asarPath unless archive
 
     stats = archive.stat filePath
-    throw createNotFoundError(asarPath, filePath) unless stats
+    notFoundError asarPath, filePath unless stats
 
     asarStatsToFsStats stats
 
@@ -116,10 +125,10 @@ exports.wrapFsWithAsar = (fs) ->
     return lstat p, callback unless isAsar
 
     archive = getOrCreateArchive asarPath
-    return callback new Error("Invalid package #{asarPath}") unless archive
+    return invalidArchiveError asarPath, callback unless archive
 
     stats = getOrCreateArchive(asarPath).stat filePath
-    return callback createNotFoundError(asarPath, filePath) unless stats
+    return notFoundError asarPath, filePath, callback unless stats
 
     process.nextTick -> callback null, asarStatsToFsStats stats
 
@@ -156,10 +165,10 @@ exports.wrapFsWithAsar = (fs) ->
     return realpathSync.apply this, arguments unless isAsar
 
     archive = getOrCreateArchive asarPath
-    throw new Error("Invalid package #{asarPath}") unless archive
+    invalidArchiveError asarPath unless archive
 
     real = archive.realpath filePath
-    throw createNotFoundError(asarPath, filePath) if real is false
+    notFoundError asarPath, filePath if real is false
 
     path.join realpathSync(asarPath), real
 
@@ -173,10 +182,11 @@ exports.wrapFsWithAsar = (fs) ->
       cache = undefined
 
     archive = getOrCreateArchive asarPath
-    return callback new Error("Invalid package #{asarPath}") unless archive
+    return invalidArchiveError asarPath, callback unless archive
 
     real = archive.realpath filePath
-    return callback createNotFoundError(asarPath, filePath) if real is false
+    if real is false
+      return notFoundError asarPath, filePath, callback
 
     realpath asarPath, (err, p) ->
       return callback err if err
@@ -188,7 +198,7 @@ exports.wrapFsWithAsar = (fs) ->
     return exists p, callback unless isAsar
 
     archive = getOrCreateArchive asarPath
-    return callback new Error("Invalid package #{asarPath}") unless archive
+    return invalidArchiveError asarPath, callback unless archive
 
     process.nextTick -> callback archive.stat(filePath) isnt false
 
@@ -213,11 +223,13 @@ exports.wrapFsWithAsar = (fs) ->
       options = undefined
 
     archive = getOrCreateArchive asarPath
-    return callback new Error("Invalid package #{asarPath}") unless archive
+    return invalidArchiveError asarPath, callback unless archive
 
     info = archive.getFileInfo filePath
-    return callback createNotFoundError(asarPath, filePath) unless info
-    return callback null, new Buffer(0) if info.size is 0
+    return notFoundError asarPath, filePath, callback unless info
+
+    if info.size is 0
+      return process.nextTick -> callback null, new Buffer(0)
 
     if info.unpacked
       realPath = archive.copyFileOut filePath
@@ -247,10 +259,10 @@ exports.wrapFsWithAsar = (fs) ->
     return readFileSync.apply this, arguments unless isAsar
 
     archive = getOrCreateArchive asarPath
-    throw new Error("Invalid package #{asarPath}") unless archive
+    invalidArchiveError asarPath unless archive
 
     info = archive.getFileInfo filePath
-    throw createNotFoundError(asarPath, filePath) unless info
+    notFoundError asarPath, filePath unless info
     return new Buffer(0) if info.size is 0
 
     if info.unpacked
@@ -283,10 +295,10 @@ exports.wrapFsWithAsar = (fs) ->
     return readdir.apply this, arguments unless isAsar
 
     archive = getOrCreateArchive asarPath
-    return callback new Error("Invalid package #{asarPath}") unless archive
+    return invalidArchiveError asarPath, callback unless archive
 
     files = archive.readdir filePath
-    return callback createNotFoundError(asarPath, filePath) unless files
+    return notFoundError asarPath, filePath, callback unless files
 
     process.nextTick -> callback null, files
 
@@ -296,10 +308,10 @@ exports.wrapFsWithAsar = (fs) ->
     return readdirSync.apply this, arguments unless isAsar
 
     archive = getOrCreateArchive asarPath
-    throw new Error("Invalid package #{asarPath}") unless archive
+    invalidArchiveError asarPath unless archive
 
     files = archive.readdir filePath
-    throw createNotFoundError(asarPath, filePath) unless files
+    notFoundError asarPath, filePath unless files
 
     files
 
index 625f269..d78ab43 100644 (file)
@@ -36,6 +36,14 @@ describe 'asar package', ->
         throws = -> fs.readFileSync p
         assert.throws throws, /ENOENT/
 
+      it 'passes ENOENT error to callback when can not find file', ->
+        p = path.join fixtures, 'asar', 'a.asar', 'not-exist'
+        async = false
+        fs.readFile p, (e) ->
+          assert async
+          assert /ENOENT/.test e
+        async = true
+
     describe 'fs.readFile', ->
       it 'reads a normal file', (done) ->
         p = path.join fixtures, 'asar', 'a.asar', 'file1'