@web4/bitdrive-schemas
Version:
Protobuf schemas for Bitdrive and its daemon.
91 lines (80 loc) • 2.36 kB
JavaScript
const { Stat: StatEncoder } = require('./messages')
// http://man7.org/linux/man-pages/man2/stat.2.html
var DEFAULT_FMODE = (4 | 2 | 0) << 6 | ((4 | 0 | 0) << 3) | (4 | 0 | 0) // rw-r--r--
var DEFAULT_DMODE = (4 | 2 | 1) << 6 | ((4 | 0 | 1) << 3) | (4 | 0 | 1) // rwxr-xr-x
class Stat {
constructor (data) {
this.dev = 0
this.nlink = 1
this.rdev = 0
this.blksize = 0
this.ino = 0
this.mode = (data && data.mode) || 0
this.uid = (data && data.uid) || 0
this.gid = (data && data.gid) || 0
this.size = (data && data.size) || 0
this.offset = (data && data.offset) || 0
this.byteOffset = (data && data.byteOffset) || 0
this.blocks = (data && data.blocks) || 0
this.atime = data && data.atime ? new Date(data.atime) : new Date() // we just set this to mtime ...
this.mtime = data && data.mtime ? new Date(data.mtime) : new Date()
this.ctime = data && data.ctime ? new Date(data.ctime) : new Date()
this.linkname = (data && data.linkname) || null
this.mount = (data && data.mount) || null
this.metadata = (data && data.metadata) || null
}
_check (mask) {
return (mask & this.mode) === mask
}
encode () {
return StatEncoder.encode(this)
}
isSocket () {
return this._check(Stat.IFSOCK)
}
isSymbolicLink () {
return this._check(Stat.IFLNK)
}
isFile () {
return this._check(Stat.IFREG)
}
isBlockDevice () {
return this._check(Stat.IFBLK)
}
isDirectory () {
return this._check(Stat.IFDIR)
}
isCharacterDevice () {
return this._check(Stat.IFCHR)
}
isFIFO () {
return this._check(Stat.IFIFO)
}
}
Stat.file = function (data) {
data = data || {}
data.mode = (data.mode || DEFAULT_FMODE) | Stat.IFREG
return new Stat(data)
}
Stat.directory = function (data) {
data = data || {}
data.mode = (data.mode || DEFAULT_DMODE) | Stat.IFDIR
return new Stat(data)
}
Stat.symlink = function (data) {
data = data || {}
data.mode = (data.mode || DEFAULT_FMODE) | Stat.IFLNK
return new Stat(data)
}
Stat.decode = function (encodedStat) {
const st = StatEncoder.decode(encodedStat)
return new Stat(st)
}
Stat.IFSOCK = 0b1100 << 12
Stat.IFLNK = 0b1010 << 12
Stat.IFREG = 0b1000 << 12
Stat.IFBLK = 0b0110 << 12
Stat.IFDIR = 0b0100 << 12
Stat.IFCHR = 0b0010 << 12
Stat.IFIFO = 0b0001 << 12
module.exports = Stat