1 | 'use strict'
|
2 | const chokidar = require('chokidar')
|
3 | const path = require('path')
|
4 | const socketsConnected = []
|
5 |
|
6 | module.exports = (opts, cb) => {
|
7 | let baseURL
|
8 | let pjson
|
9 | let error
|
10 | try {
|
11 | pjson = require(path.join(opts.dir || path.dirname(require.main.filename), 'package.json'))
|
12 | } catch (err) {
|
13 | error = err
|
14 | }
|
15 | if (!error) {
|
16 | baseURL = pjson.jspm && pjson.jspm.directories && pjson.jspm.directories.baseURL || pjson.directories && pjson.directories.baseURL
|
17 | }
|
18 |
|
19 | let app = opts.app
|
20 | if (!app) {
|
21 | app = require('http').createServer()
|
22 | }
|
23 |
|
24 | var io = require('socket.io')(app)
|
25 | if (!opts.app) {
|
26 | let port = opts.port || 9111
|
27 | app.listen(port, () => {
|
28 | console.log('chokidar-socket-emitter listening on ' + port)
|
29 | cb && cb()
|
30 | })
|
31 | }
|
32 | const pathToWatch = opts.path || baseURL || '.'
|
33 | let ignoredPaths = [
|
34 | /[\/\\]\./,
|
35 |
|
36 | /^\.[^\/\\]/,
|
37 | 'node_modules/**',
|
38 | (baseURL ? baseURL + '/' : '') + 'jspm_packages/**',
|
39 | '.git/**'
|
40 | ]
|
41 | let chokidarOpts = Object.assign({
|
42 | ignored: ignoredPaths,
|
43 | ignoreInitial: true
|
44 | }, opts.chokidar)
|
45 | console.log('chokidar watching ', path.resolve(pathToWatch))
|
46 | var watcher = chokidar.watch(pathToWatch, chokidarOpts).on('all', (event, onPath) => {
|
47 | let absolutePath = path.join(process.cwd(), onPath)
|
48 | if (opts.relativeTo) {
|
49 | onPath = path.relative(opts.relativeTo, onPath)
|
50 | } else if (baseURL) {
|
51 | onPath = path.relative(baseURL, onPath)
|
52 | }
|
53 | if (path.sep === '\\') {
|
54 | onPath = onPath.replace(/\\/g, '/')
|
55 | } else {
|
56 |
|
57 | }
|
58 | console.log('File ', onPath, ' emitted: ' + event)
|
59 | socketsConnected.forEach((socket) => {
|
60 | socket.emit(event, {path: onPath, absolutePath})
|
61 | })
|
62 | })
|
63 | io.on('connection', (socket) => {
|
64 | let index = socketsConnected.push(socket)
|
65 | socket.on('disconnect', () => {
|
66 | socketsConnected.splice(index - 1, 1)
|
67 | })
|
68 |
|
69 | socket.on('identification', (name) => {
|
70 | console.log('connected client: ' + name)
|
71 | })
|
72 | if (pjson) {
|
73 | socket.on('package.json', function (fn) {
|
74 | fn(pjson)
|
75 | })
|
76 | }
|
77 | })
|
78 |
|
79 | return {
|
80 | io: io,
|
81 | app: app,
|
82 | watcher: watcher,
|
83 | close: (callback) => {
|
84 | watcher.close()
|
85 | console.log('closing chokidar-socket-emitter')
|
86 | socketsConnected.forEach((socket) => {
|
87 | socket.disconnect()
|
88 | })
|
89 | io.httpServer.close(callback)
|
90 | }
|
91 | }
|
92 | }
|