]> gerrit.simantics Code Review - simantics/district.git/blob - org.simantics.maps.server/node/node-v4.8.0-win-x64/node_modules/npm/lib/utils/locker.js
Adding integrated tile server
[simantics/district.git] / org.simantics.maps.server / node / node-v4.8.0-win-x64 / node_modules / npm / lib / utils / locker.js
1 var crypto = require("crypto")
2 var resolve = require("path").resolve
3
4 var lockfile = require("lockfile")
5 var log = require("npmlog")
6 var mkdirp = require("mkdirp")
7
8 var npm = require("../npm.js")
9 var correctMkdir = require('../utils/correct-mkdir.js')
10
11 var installLocks = {}
12
13 function lockFileName (base, name) {
14   var c = name.replace(/[^a-zA-Z0-9]+/g, "-").replace(/^-+|-+$/g, "")
15     , p = resolve(base, name)
16     , h = crypto.createHash("sha1").update(p).digest("hex")
17     , l = resolve(npm.cache, "_locks")
18
19   return resolve(l, c.substr(0, 24)+"-"+h.substr(0, 16)+".lock")
20 }
21
22 function lock (base, name, cb) {
23   var lockDir = resolve(npm.cache, "_locks")
24   correctMkdir(lockDir, function (er) {
25     if (er) return cb(er)
26
27     var opts = { stale:   npm.config.get("cache-lock-stale")
28                , retries: npm.config.get("cache-lock-retries")
29                , wait:    npm.config.get("cache-lock-wait") }
30     var lf = lockFileName(base, name)
31     lockfile.lock(lf, opts, function (er) {
32       if (er) log.warn("locking", lf, "failed", er)
33
34       if (!er) {
35         log.verbose("lock", "using", lf, "for", resolve(base, name))
36         installLocks[lf] = true
37       }
38
39       cb(er)
40     })
41   })
42 }
43
44 function unlock (base, name, cb) {
45   var lf = lockFileName(base, name)
46     , locked = installLocks[lf]
47   if (locked === false) {
48     return process.nextTick(cb)
49   }
50   else if (locked === true) {
51     lockfile.unlock(lf, function (er) {
52       if (er) {
53         log.warn("unlocking", lf, "failed", er)
54       }
55       else {
56         installLocks[lf] = false
57         log.verbose("unlock", "done using", lf, "for", resolve(base, name))
58       }
59
60       cb(er)
61     })
62   }
63   else {
64     throw new Error(
65       "Attempt to unlock " + resolve(base, name) + ", which hasn't been locked"
66     )
67   }
68 }
69
70 module.exports = {
71   lock   : lock,
72   unlock : unlock
73 }