Make building occur through a callback, fixes bug with time before/after build
authorNick Downing <downing.nick@gmail.com>
Mon, 8 Oct 2018 21:21:36 +0000 (08:21 +1100)
committerNick Downing <downing.nick@gmail.com>
Mon, 8 Oct 2018 21:21:36 +0000 (08:21 +1100)
build_cache.js

index bd4b78c..e873043 100644 (file)
@@ -1,39 +1,34 @@
-var fs = require('fs')
-var util = require('util')
+let fs = require('fs')
+let util = require('util')
 
-var statAsync = util.promisify(fs.stat)
+let fs_stat = util.promisify(fs.stat)
 
-var BuildCache = function() {
+let BuildCache = function() {
   if (!this instanceof BuildCache)
     throw Error('BuildCache is a constructor')
   this.map = new Map()
 }
 
-BuildCache.prototype.get = async function(key) {
-  var result = this.map.get(key)
-  if (result === undefined)
-    return undefined
-  var deps = result.deps
-  var time = result.time
-  for (var i = 0; i < deps.length; ++i) {
-    stats = await statAsync(deps[i])
-    if (stats.mtimeMs > time) {
-      this.map.delete(key)
-      return undefined
+BuildCache.prototype.get = async function(key, build_func) {
+  let result = this.map.get(key)
+  if (result !== undefined) {
+    let deps = result.deps
+    let time = result.time
+    for (let i = 0; i < deps.length; ++i) {
+      stats = await fs_stat(deps[i])
+      if (stats.mtimeMs > time) {
+        this.map.delete(key)
+        result = undefined
+        break
+      }
     }
   }
+  if (result === undefined) {
+    result = {deps: [key], time: Date.now()}
+    await build_func(result)
+    this.map.set(key, result)
+  }
   return result.value
 }
 
-BuildCache.prototype.set = function(key, value, deps) {
-  this.map.set(
-    key,
-    {
-      value: value,
-      deps: deps === undefined ? [key] : deps,
-      time: Date.now()
-    }
-  )
-}
-
 module.exports = BuildCache