({ registry, cache }, integrity, load = false)
| 15 | const EMPTY_BUF = Buffer.from([]); |
| 16 | |
| 17 | async function fetchObject({ registry, cache }, integrity, load = false) { |
| 18 | const parsed = ssri.parse(integrity); |
| 19 | const algo = parsed.pickAlgorithm(); |
| 20 | const [{ digest }] = parsed[algo]; |
| 21 | |
| 22 | if (digest === EMPTY_HASH && algo === 'sha512') { |
| 23 | return load ? { data: EMPTY_BUF } : true; |
| 24 | } |
| 25 | |
| 26 | if (await cacache.get.hasContent(cache, integrity)) { |
| 27 | return load ? cacache.get(cache, integrity) : true; |
| 28 | } |
| 29 | |
| 30 | const response = await fetch( |
| 31 | `${registry}/v1/objects/object/${algo}/${encodeURIComponent(digest)}` |
| 32 | ); |
| 33 | |
| 34 | if (response.status > 399) { |
| 35 | throw new Error('error fetching object'); |
| 36 | } |
| 37 | |
| 38 | let destIntegrity = null; |
| 39 | const dest = cacache.put.stream(cache, integrity); |
| 40 | dest.on('integrity', i => (destIntegrity = i)); |
| 41 | await pipeline(response.body, dest); |
| 42 | |
| 43 | if (!parsed.match(destIntegrity)) { |
| 44 | throw new Error('file integrity mismatch!'); |
| 45 | } |
| 46 | |
| 47 | return load ? cacache.get(cache, integrity) : true; |
| 48 | } |
no test coverage detected