mirror of
https://github.com/fuse-friends/fuse-native
synced 2024-10-27 18:34:01 +00:00
support auto timeouts
This commit is contained in:
parent
95386bf49c
commit
4163951dc3
22
index.js
22
index.js
@ -11,6 +11,8 @@ const binding = require('node-gyp-build')(__dirname)
|
|||||||
const IS_OSX = os.platform() === 'darwin'
|
const IS_OSX = os.platform() === 'darwin'
|
||||||
const OSX_FOLDER_ICON = '/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/GenericFolderIcon.icns'
|
const OSX_FOLDER_ICON = '/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/GenericFolderIcon.icns'
|
||||||
const HAS_FOLDER_ICON = IS_OSX && fs.existsSync(OSX_FOLDER_ICON)
|
const HAS_FOLDER_ICON = IS_OSX && fs.existsSync(OSX_FOLDER_ICON)
|
||||||
|
const DEFAULT_TIMEOUT = 15 * 1000
|
||||||
|
const TIMEOUT_ERRNO = IS_OSX ? -110 : -60
|
||||||
|
|
||||||
const ENOTCONN = IS_OSX ? -57 : -107
|
const ENOTCONN = IS_OSX ? -57 : -107
|
||||||
|
|
||||||
@ -133,10 +135,12 @@ const OpcodesAndDefaults = new Map([
|
|||||||
class Fuse extends Nanoresource {
|
class Fuse extends Nanoresource {
|
||||||
constructor (mnt, ops, opts = {}) {
|
constructor (mnt, ops, opts = {}) {
|
||||||
super()
|
super()
|
||||||
|
|
||||||
this.opts = opts
|
this.opts = opts
|
||||||
this.mnt = path.resolve(mnt)
|
this.mnt = path.resolve(mnt)
|
||||||
|
|
||||||
this.ops = ops
|
this.ops = ops
|
||||||
|
this.timeout = opts.timeout || DEFAULT_TIMEOUT
|
||||||
|
|
||||||
this._force = !!opts.force
|
this._force = !!opts.force
|
||||||
this._thread = null
|
this._thread = null
|
||||||
this._handlers = this._makeHandlerArray()
|
this._handlers = this._makeHandlerArray()
|
||||||
@ -199,6 +203,7 @@ class Fuse extends Nanoresource {
|
|||||||
_makeHandlerArray () {
|
_makeHandlerArray () {
|
||||||
const self = this
|
const self = this
|
||||||
const handlers = new Array(OpcodesAndDefaults.size)
|
const handlers = new Array(OpcodesAndDefaults.size)
|
||||||
|
const to = this.timeout || DEFAULT_TIMEOUT
|
||||||
|
|
||||||
for (const [name, { op, defaults }] of OpcodesAndDefaults) {
|
for (const [name, { op, defaults }] of OpcodesAndDefaults) {
|
||||||
const nativeSignal = binding[`fuse_native_signal_${name}`]
|
const nativeSignal = binding[`fuse_native_signal_${name}`]
|
||||||
@ -211,7 +216,7 @@ class Fuse extends Nanoresource {
|
|||||||
|
|
||||||
function makeHandler (name, op, defaults, nativeSignal) {
|
function makeHandler (name, op, defaults, nativeSignal) {
|
||||||
return function (nativeHandler, opCode, ...args) {
|
return function (nativeHandler, opCode, ...args) {
|
||||||
const boundSignal = signal.bind(null, nativeHandler)
|
const boundSignal = autoTimeout(signal.bind(null, nativeHandler))
|
||||||
const funcName = `_op_${name}`
|
const funcName = `_op_${name}`
|
||||||
if (!self[funcName] || !self._implemented.has(op)) return boundSignal(-1, ...defaults)
|
if (!self[funcName] || !self._implemented.has(op)) return boundSignal(-1, ...defaults)
|
||||||
return self[funcName].apply(self, [boundSignal, ...args])
|
return self[funcName].apply(self, [boundSignal, ...args])
|
||||||
@ -226,6 +231,19 @@ class Fuse extends Nanoresource {
|
|||||||
return process.nextTick(nativeSignal, ...arr)
|
return process.nextTick(nativeSignal, ...arr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function autoTimeout (cb) {
|
||||||
|
let called = false
|
||||||
|
const timeout = setTimeout(timeoutWrap, to, TIMEOUT_ERRNO)
|
||||||
|
return timeoutWrap
|
||||||
|
|
||||||
|
function timeoutWrap (...args) {
|
||||||
|
if (called) return
|
||||||
|
called = true
|
||||||
|
clearTimeout(timeout)
|
||||||
|
cb(...args)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Static methods
|
// Static methods
|
||||||
|
@ -93,6 +93,7 @@ tape.skip('read timeout does not force unmount', function (t) {
|
|||||||
} else if (path === '/timeout') {
|
} else if (path === '/timeout') {
|
||||||
console.log('read is gonna time out')
|
console.log('read is gonna time out')
|
||||||
// Just let this one timeout
|
// Just let this one timeout
|
||||||
|
setTimeout(cb, 20 * 1000, -2)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
return cb(-2)
|
return cb(-2)
|
||||||
|
Loading…
Reference in New Issue
Block a user