nav tabs on admin dashboard
This commit is contained in:
127
node_modules/cacache/lib/entry-index.js
generated
vendored
127
node_modules/cacache/lib/entry-index.js
generated
vendored
@@ -4,6 +4,7 @@ const BB = require('bluebird')
|
||||
|
||||
const contentPath = require('./content/path')
|
||||
const crypto = require('crypto')
|
||||
const figgyPudding = require('figgy-pudding')
|
||||
const fixOwner = require('./util/fix-owner')
|
||||
const fs = require('graceful-fs')
|
||||
const hashToSegments = require('./util/hash-to-segments')
|
||||
@@ -29,9 +30,16 @@ module.exports.NotFoundError = class NotFoundError extends Error {
|
||||
}
|
||||
}
|
||||
|
||||
const IndexOpts = figgyPudding({
|
||||
metadata: {},
|
||||
size: {},
|
||||
uid: {},
|
||||
gid: {}
|
||||
})
|
||||
|
||||
module.exports.insert = insert
|
||||
function insert (cache, key, integrity, opts) {
|
||||
opts = opts || {}
|
||||
opts = IndexOpts(opts)
|
||||
const bucket = bucketPath(cache, key)
|
||||
const entry = {
|
||||
key,
|
||||
@@ -67,10 +75,36 @@ function insert (cache, key, integrity, opts) {
|
||||
})
|
||||
}
|
||||
|
||||
module.exports.insert.sync = insertSync
|
||||
function insertSync (cache, key, integrity, opts) {
|
||||
opts = IndexOpts(opts)
|
||||
const bucket = bucketPath(cache, key)
|
||||
const entry = {
|
||||
key,
|
||||
integrity: integrity && ssri.stringify(integrity),
|
||||
time: Date.now(),
|
||||
size: opts.size,
|
||||
metadata: opts.metadata
|
||||
}
|
||||
fixOwner.mkdirfix.sync(path.dirname(bucket), opts.uid, opts.gid)
|
||||
const stringified = JSON.stringify(entry)
|
||||
fs.appendFileSync(
|
||||
bucket, `\n${hashEntry(stringified)}\t${stringified}`
|
||||
)
|
||||
try {
|
||||
fixOwner.chownr.sync(bucket, opts.uid, opts.gid)
|
||||
} catch (err) {
|
||||
if (err.code !== 'ENOENT') {
|
||||
throw err
|
||||
}
|
||||
}
|
||||
return formatEntry(cache, entry)
|
||||
}
|
||||
|
||||
module.exports.find = find
|
||||
function find (cache, key) {
|
||||
const bucket = bucketPath(cache, key)
|
||||
return bucketEntries(cache, bucket).then(entries => {
|
||||
return bucketEntries(bucket).then(entries => {
|
||||
return entries.reduce((latest, next) => {
|
||||
if (next && next.key === key) {
|
||||
return formatEntry(cache, next)
|
||||
@@ -87,11 +121,36 @@ function find (cache, key) {
|
||||
})
|
||||
}
|
||||
|
||||
module.exports.find.sync = findSync
|
||||
function findSync (cache, key) {
|
||||
const bucket = bucketPath(cache, key)
|
||||
try {
|
||||
return bucketEntriesSync(bucket).reduce((latest, next) => {
|
||||
if (next && next.key === key) {
|
||||
return formatEntry(cache, next)
|
||||
} else {
|
||||
return latest
|
||||
}
|
||||
}, null)
|
||||
} catch (err) {
|
||||
if (err.code === 'ENOENT') {
|
||||
return null
|
||||
} else {
|
||||
throw err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports.delete = del
|
||||
function del (cache, key, opts) {
|
||||
return insert(cache, key, null, opts)
|
||||
}
|
||||
|
||||
module.exports.delete.sync = delSync
|
||||
function delSync (cache, key, opts) {
|
||||
return insertSync(cache, key, null, opts)
|
||||
}
|
||||
|
||||
module.exports.lsStream = lsStream
|
||||
function lsStream (cache) {
|
||||
const indexDir = bucketDir(cache)
|
||||
@@ -108,7 +167,6 @@ function lsStream (cache) {
|
||||
// "/cachename/<bucket 0xFF>/<bucket 0xFF>/*"
|
||||
return readdirOrEmpty(subbucketPath).map(entry => {
|
||||
const getKeyToEntry = bucketEntries(
|
||||
cache,
|
||||
path.join(subbucketPath, entry)
|
||||
).reduce((acc, entry) => {
|
||||
acc.set(entry.key, entry)
|
||||
@@ -144,32 +202,39 @@ function ls (cache) {
|
||||
})
|
||||
}
|
||||
|
||||
function bucketEntries (cache, bucket, filter) {
|
||||
function bucketEntries (bucket, filter) {
|
||||
return readFileAsync(
|
||||
bucket, 'utf8'
|
||||
).then(data => {
|
||||
let entries = []
|
||||
data.split('\n').forEach(entry => {
|
||||
if (!entry) { return }
|
||||
const pieces = entry.split('\t')
|
||||
if (!pieces[1] || hashEntry(pieces[1]) !== pieces[0]) {
|
||||
// Hash is no good! Corruption or malice? Doesn't matter!
|
||||
// EJECT EJECT
|
||||
return
|
||||
}
|
||||
let obj
|
||||
try {
|
||||
obj = JSON.parse(pieces[1])
|
||||
} catch (e) {
|
||||
// Entry is corrupted!
|
||||
return
|
||||
}
|
||||
if (obj) {
|
||||
entries.push(obj)
|
||||
}
|
||||
})
|
||||
return entries
|
||||
).then(data => _bucketEntries(data, filter))
|
||||
}
|
||||
|
||||
function bucketEntriesSync (bucket, filter) {
|
||||
const data = fs.readFileSync(bucket, 'utf8')
|
||||
return _bucketEntries(data, filter)
|
||||
}
|
||||
|
||||
function _bucketEntries (data, filter) {
|
||||
let entries = []
|
||||
data.split('\n').forEach(entry => {
|
||||
if (!entry) { return }
|
||||
const pieces = entry.split('\t')
|
||||
if (!pieces[1] || hashEntry(pieces[1]) !== pieces[0]) {
|
||||
// Hash is no good! Corruption or malice? Doesn't matter!
|
||||
// EJECT EJECT
|
||||
return
|
||||
}
|
||||
let obj
|
||||
try {
|
||||
obj = JSON.parse(pieces[1])
|
||||
} catch (e) {
|
||||
// Entry is corrupted!
|
||||
return
|
||||
}
|
||||
if (obj) {
|
||||
entries.push(obj)
|
||||
}
|
||||
})
|
||||
return entries
|
||||
}
|
||||
|
||||
module.exports._bucketDir = bucketDir
|
||||
@@ -197,9 +262,9 @@ function hashEntry (str) {
|
||||
|
||||
function hash (str, digest) {
|
||||
return crypto
|
||||
.createHash(digest)
|
||||
.update(str)
|
||||
.digest('hex')
|
||||
.createHash(digest)
|
||||
.update(str)
|
||||
.digest('hex')
|
||||
}
|
||||
|
||||
function formatEntry (cache, entry) {
|
||||
@@ -217,8 +282,8 @@ function formatEntry (cache, entry) {
|
||||
|
||||
function readdirOrEmpty (dir) {
|
||||
return readdirAsync(dir)
|
||||
.catch({code: 'ENOENT'}, () => [])
|
||||
.catch({code: 'ENOTDIR'}, () => [])
|
||||
.catch({code: 'ENOENT'}, () => [])
|
||||
.catch({code: 'ENOTDIR'}, () => [])
|
||||
}
|
||||
|
||||
function nop () {
|
||||
|
||||
Reference in New Issue
Block a user