UNPKG

1.35 kBJavaScriptView Raw
1var trackDir = require('./track-dir')
2var path = require('path')
3
4var dirs = [
5 'assets',
6 'content',
7 'public'
8]
9
10// This module handles all static assets. It only ever links to files, and
11// always reads them from disk. Else files might make Node run out of memory
12// (e.g. video files). The following steps are taken
13//
14// 1. Read out all files in the directory lists.
15// 2. Write all file names to a list, and emit `list`.
16// 3. Estimate total size of all files combined, and emit `size`.
17//
18// TODO: optimize assets (on the fly); e.g. convert images to webp, etc.
19
20module.exports = node
21
22function node (state, createEdge) {
23 var basedir = state.metadata.dirname
24 var self = this
25
26 if (state.tracker) return
27 var tracker = state.tracker = trackDir()
28
29 tracker.start(basedir, dirs, { watch: state.metadata.watch })
30 state.metadata.assets = tracker.files
31
32 tracker.on('error', function (err) {
33 self.emit('error', 'assets', 'tracker', err)
34 })
35
36 tracker.on('change', function () {
37 var list = tracker.list().map(function (file) {
38 return path.posix.format(path.parse(path.relative(basedir, file)))
39 })
40 createEdge('list', Buffer.from(list.join(',')))
41 })
42
43 tracker.on('progress', function (progress) {
44 self.emit('progress', 'assets', progress)
45 })
46
47 this.on('close', function () {
48 tracker.unwatch()
49 })
50}