Add asar-supported fs.accessSync implementation

This commit is contained in:
Kevin Sawicki 2016-07-25 11:05:18 -07:00
parent 3ad5504194
commit 30fbe92970
2 changed files with 53 additions and 0 deletions

View file

@ -409,6 +409,36 @@
})
}
const {accessSync} = fs
fs.accessSync = function (p, mode) {
const [isAsar, asarPath, filePath] = splitPath(p)
if (!isAsar) {
return accessSync.apply(this, arguments)
}
if (mode == null) {
mode = fs.constants.F_OK
}
const archive = getOrCreateArchive(asarPath)
if (!archive) {
invalidArchiveError(asarPath)
}
const info = archive.getFileInfo(filePath)
if (!info) {
notFoundError(asarPath, filePath)
}
if (info.unpacked) {
const realPath = archive.copyFileOut(filePath)
return fs.accessSync(realPath, mode)
}
const stats = getOrCreateArchive(asarPath).stat(filePath)
if (!stats) {
notFoundError(asarPath, filePath)
}
if (mode & fs.constants.W_OK) {
accessError(asarPath, filePath)
}
}
const {readFile} = fs
fs.readFile = function (p, options, callback) {
const [isAsar, asarPath, filePath] = splitPath(p)

View file

@ -560,6 +560,29 @@ describe('asar package', function () {
})
})
describe('fs.accessSync', function () {
it('throws an error when called with write mode', function () {
var p = path.join(fixtures, 'asar', 'a.asar', 'file1')
assert.throws(function () {
fs.accessSync(p, fs.constants.R_OK | fs.constants.W_OK)
}, /EACCES/)
})
it('throws an error when called on non-existent file', function () {
var p = path.join(fixtures, 'asar', 'a.asar', 'not-exist')
assert.throws(function () {
fs.accessSync(p)
}, /ENOENT/)
})
it('allows write mode for unpacked files', function () {
var p = path.join(fixtures, 'asar', 'unpack.asar', 'a.txt')
assert.doesNotThrow(function () {
fs.accessSync(p, fs.constants.R_OK | fs.constants.W_OK)
})
})
})
describe('child_process.fork', function () {
it('opens a normal js file', function (done) {
var child = ChildProcess.fork(path.join(fixtures, 'asar', 'a.asar', 'ping.js'))