This repository was archived by the owner on Jun 28, 2019. It is now read-only.
Repository navigation
Expand file tree
/
Copy pathmanaged-folder.js
More file actions
85 lines (64 loc) · 2 KB
/
Copy pathmanaged-folder.js
File metadata and controls
85 lines (64 loc) · 2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
var assert = require('assert')
var nanobus = require('nanobus')
var path = require('path')
var mkdirp = require('mkdirp')
var chokidar = require('chokidar')
const IGNORED = '.DS_Store'
module.exports = ManagedFolder
function ManagedFolder (opts = {}) {
if (!(this instanceof ManagedFolder)) return new ManagedFolder(opts)
assert.ok(opts.appdir, 'appdir was not specified')
nanobus.call(this)
this.appdir = opts.appdir
this._subfolders = opts.subfolders || { inbox: 'Inbox' }
this.watchers = {}
this.createSubfolders()
}
ManagedFolder.prototype = Object.create(nanobus.prototype)
ManagedFolder.prototype.constructor = ManagedFolder
ManagedFolder.prototype.subfolder = function (key) {
var dir = this._subfolders[key]
return path.join(this.appdir, dir)
}
ManagedFolder.prototype.createSubfolders = function () {
mkdirp.sync(this.appdir)
Object.entries(this._subfolders).forEach(([namespace, folderName]) => {
var dirname = path.join(this.appdir, folderName)
mkdirp.sync(dirname)
})
var opts = {
ignored: IGNORED
}
this.watcher = chokidar.watch(this.appdir, opts)
this.watcher.on('ready', () => {
this.emit('ready')
})
this.watcher.on('all', this.handleFolderEvent.bind(this))
}
ManagedFolder.prototype.handleFolderEvent = function (eventName, filepath) {
var namespace = this.getNamespace(filepath)
if (!namespace) return
switch (eventName) {
case 'add':
this.emit(`${namespace}:add`, filepath)
break
case 'change':
this.emit(`${namespace}:change`, filepath)
break
case 'unlink':
this.emit(`${namespace}:remove`, filepath)
break
default:
break
}
}
ManagedFolder.prototype.getNamespace = function (filepath) {
var dirname = path.dirname(filepath)
var tuple = Object.entries(this._subfolders).find(([namespace, folderName]) => {
return dirname === path.join(this.appdir, folderName)
})
return tuple && tuple.length ? tuple[0] : null
}
ManagedFolder.prototype.close = function () {
this.watcher.close()
}