source: node_modules/cacache/get.js@ 62b2964

finki-main main
Last change on this file since 62b2964 was 81bc7da, checked in by Klimentina Efremova <klimentina08642@…>, 3 months ago

Initial commit

  • Property mode set to 100644
File size: 6.1 KB
Line 
1'use strict'
2
3const Collect = require('minipass-collect')
4const Minipass = require('minipass')
5const Pipeline = require('minipass-pipeline')
6const fs = require('fs')
7const util = require('util')
8
9const index = require('./lib/entry-index')
10const memo = require('./lib/memoization')
11const read = require('./lib/content/read')
12
13const writeFile = util.promisify(fs.writeFile)
14
15function getData (cache, key, opts = {}) {
16 const { integrity, memoize, size } = opts
17 const memoized = memo.get(cache, key, opts)
18 if (memoized && memoize !== false) {
19 return Promise.resolve({
20 metadata: memoized.entry.metadata,
21 data: memoized.data,
22 integrity: memoized.entry.integrity,
23 size: memoized.entry.size,
24 })
25 }
26
27 return index.find(cache, key, opts).then((entry) => {
28 if (!entry)
29 throw new index.NotFoundError(cache, key)
30
31 return read(cache, entry.integrity, { integrity, size }).then((data) => {
32 if (memoize)
33 memo.put(cache, entry, data, opts)
34
35 return {
36 data,
37 metadata: entry.metadata,
38 size: entry.size,
39 integrity: entry.integrity,
40 }
41 })
42 })
43}
44module.exports = getData
45
46function getDataByDigest (cache, key, opts = {}) {
47 const { integrity, memoize, size } = opts
48 const memoized = memo.get.byDigest(cache, key, opts)
49 if (memoized && memoize !== false)
50 return Promise.resolve(memoized)
51
52 return read(cache, key, { integrity, size }).then((res) => {
53 if (memoize)
54 memo.put.byDigest(cache, key, res, opts)
55 return res
56 })
57}
58module.exports.byDigest = getDataByDigest
59
60function getDataSync (cache, key, opts = {}) {
61 const { integrity, memoize, size } = opts
62 const memoized = memo.get(cache, key, opts)
63
64 if (memoized && memoize !== false) {
65 return {
66 metadata: memoized.entry.metadata,
67 data: memoized.data,
68 integrity: memoized.entry.integrity,
69 size: memoized.entry.size,
70 }
71 }
72 const entry = index.find.sync(cache, key, opts)
73 if (!entry)
74 throw new index.NotFoundError(cache, key)
75 const data = read.sync(cache, entry.integrity, {
76 integrity: integrity,
77 size: size,
78 })
79 const res = {
80 metadata: entry.metadata,
81 data: data,
82 size: entry.size,
83 integrity: entry.integrity,
84 }
85 if (memoize)
86 memo.put(cache, entry, res.data, opts)
87
88 return res
89}
90
91module.exports.sync = getDataSync
92
93function getDataByDigestSync (cache, digest, opts = {}) {
94 const { integrity, memoize, size } = opts
95 const memoized = memo.get.byDigest(cache, digest, opts)
96
97 if (memoized && memoize !== false)
98 return memoized
99
100 const res = read.sync(cache, digest, {
101 integrity: integrity,
102 size: size,
103 })
104 if (memoize)
105 memo.put.byDigest(cache, digest, res, opts)
106
107 return res
108}
109module.exports.sync.byDigest = getDataByDigestSync
110
111const getMemoizedStream = (memoized) => {
112 const stream = new Minipass()
113 stream.on('newListener', function (ev, cb) {
114 ev === 'metadata' && cb(memoized.entry.metadata)
115 ev === 'integrity' && cb(memoized.entry.integrity)
116 ev === 'size' && cb(memoized.entry.size)
117 })
118 stream.end(memoized.data)
119 return stream
120}
121
122function getStream (cache, key, opts = {}) {
123 const { memoize, size } = opts
124 const memoized = memo.get(cache, key, opts)
125 if (memoized && memoize !== false)
126 return getMemoizedStream(memoized)
127
128 const stream = new Pipeline()
129 index
130 .find(cache, key)
131 .then((entry) => {
132 if (!entry)
133 throw new index.NotFoundError(cache, key)
134
135 stream.emit('metadata', entry.metadata)
136 stream.emit('integrity', entry.integrity)
137 stream.emit('size', entry.size)
138 stream.on('newListener', function (ev, cb) {
139 ev === 'metadata' && cb(entry.metadata)
140 ev === 'integrity' && cb(entry.integrity)
141 ev === 'size' && cb(entry.size)
142 })
143
144 const src = read.readStream(
145 cache,
146 entry.integrity,
147 { ...opts, size: typeof size !== 'number' ? entry.size : size }
148 )
149
150 if (memoize) {
151 const memoStream = new Collect.PassThrough()
152 memoStream.on('collect', data => memo.put(cache, entry, data, opts))
153 stream.unshift(memoStream)
154 }
155 stream.unshift(src)
156 })
157 .catch((err) => stream.emit('error', err))
158
159 return stream
160}
161
162module.exports.stream = getStream
163
164function getStreamDigest (cache, integrity, opts = {}) {
165 const { memoize } = opts
166 const memoized = memo.get.byDigest(cache, integrity, opts)
167 if (memoized && memoize !== false) {
168 const stream = new Minipass()
169 stream.end(memoized)
170 return stream
171 } else {
172 const stream = read.readStream(cache, integrity, opts)
173 if (!memoize)
174 return stream
175
176 const memoStream = new Collect.PassThrough()
177 memoStream.on('collect', data => memo.put.byDigest(
178 cache,
179 integrity,
180 data,
181 opts
182 ))
183 return new Pipeline(stream, memoStream)
184 }
185}
186
187module.exports.stream.byDigest = getStreamDigest
188
189function info (cache, key, opts = {}) {
190 const { memoize } = opts
191 const memoized = memo.get(cache, key, opts)
192 if (memoized && memoize !== false)
193 return Promise.resolve(memoized.entry)
194 else
195 return index.find(cache, key)
196}
197module.exports.info = info
198
199function copy (cache, key, dest, opts = {}) {
200 if (read.copy) {
201 return index.find(cache, key, opts).then((entry) => {
202 if (!entry)
203 throw new index.NotFoundError(cache, key)
204 return read.copy(cache, entry.integrity, dest, opts)
205 .then(() => {
206 return {
207 metadata: entry.metadata,
208 size: entry.size,
209 integrity: entry.integrity,
210 }
211 })
212 })
213 }
214
215 return getData(cache, key, opts).then((res) => {
216 return writeFile(dest, res.data).then(() => {
217 return {
218 metadata: res.metadata,
219 size: res.size,
220 integrity: res.integrity,
221 }
222 })
223 })
224}
225module.exports.copy = copy
226
227function copyByDigest (cache, key, dest, opts = {}) {
228 if (read.copy)
229 return read.copy(cache, key, dest, opts).then(() => key)
230
231 return getDataByDigest(cache, key, opts).then((res) => {
232 return writeFile(dest, res).then(() => key)
233 })
234}
235module.exports.copy.byDigest = copyByDigest
236
237module.exports.hasContent = read.hasContent
Note: See TracBrowser for help on using the repository browser.