Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
return async function * rm (cids, options) {
options = options || {}
if (!Array.isArray(cids)) {
cids = [cids]
}
// We need to take a write lock here to ensure that adding and removing
// blocks are exclusive operations
const release = await gcLock.writeLock()
try {
yield * pipe(
cids,
parallelMap(BLOCK_RM_CONCURRENCY, async cid => {
cid = cleanCid(cid)
const result = { hash: cid.toString() }
try {
const pinResult = await pinManager.isPinnedWithType(cid, PinTypes.all)
if (pinResult.pinned) {
if (CID.isCID(pinResult.reason)) { // eslint-disable-line max-depth
throw errCode(new Error(`pinned via ${pinResult.reason}`))
}
throw errCode(new Error(`pinned: ${pinResult.reason}`))
}
// remove has check when https://github.com/ipfs/js-ipfs-block-service/pull/88 is merged
options = options || {}
const recursive = options.recursive !== false
if (options.cidBase && !multibase.names.includes(options.cidBase)) {
throw errCode(new Error('invalid multibase'), 'ERR_INVALID_MULTIBASE')
}
const cids = await resolvePath(object, paths)
const release = await gcLock.readLock()
try {
// verify that each hash can be unpinned
const results = await pipe(
cids,
parallelMap(PIN_RM_CONCURRENCY, async cid => {
const res = await pinManager.isPinnedWithType(cid, PinTypes.all)
const { pinned, reason } = res
const key = cid.toBaseEncodedString()
if (!pinned) {
throw new Error(`${key} is not pinned`)
}
if (reason !== PinTypes.recursive && reason !== PinTypes.direct) {
throw new Error(`${key} is pinned indirectly under ${reason}`)
}
if (reason === PinTypes.recursive && !recursive) {
throw new Error(`${key} is pinned recursively`)
}
return key
if (typeof options.type === 'string') {
type = options.type.toLowerCase()
}
const err = PinManager.checkPinType(type)
if (err) {
throw err
}
}
if (paths) {
paths = Array.isArray(paths) ? paths : [paths]
// check the pinned state of specific hashes
const cids = await resolvePath(object, paths)
yield * parallelMap(PIN_LS_CONCURRENCY, async cid => {
const { reason, pinned } = await pinManager.isPinnedWithType(cid, type)
if (!pinned) {
throw new Error(`path '${paths[cids.indexOf(cid)]}' is not pinned`)
}
if (reason === PinTypes.direct || reason === PinTypes.recursive) {
return { cid, type: reason }
}
return { cid, type: `${PinTypes.indirect} through ${reason}` }
}, cids)
return
}