Projekt

Obecné

Profil

Stáhnout (20.5 KB) Statistiky
| Větev: | Revize:
1
# cacache [![npm version](https://img.shields.io/npm/v/cacache.svg)](https://npm.im/cacache) [![license](https://img.shields.io/npm/l/cacache.svg)](https://npm.im/cacache) [![Travis](https://img.shields.io/travis/zkat/cacache.svg)](https://travis-ci.org/zkat/cacache) [![AppVeyor](https://ci.appveyor.com/api/projects/status/github/zkat/cacache?svg=true)](https://ci.appveyor.com/project/zkat/cacache) [![Coverage Status](https://coveralls.io/repos/github/zkat/cacache/badge.svg?branch=latest)](https://coveralls.io/github/zkat/cacache?branch=latest)
2

    
3
[`cacache`](https://github.com/zkat/cacache) es una librería de Node.js para
4
manejar caches locales en disco, con acceso tanto con claves únicas como
5
direcciones de contenido (hashes/hacheos). Es súper rápida, excelente con el
6
acceso concurrente, y jamás te dará datos incorrectos, aún si se corrompen o
7
manipulan directamente los ficheros del cache.
8

    
9
El propósito original era reemplazar el caché local de
10
[npm](https://npm.im/npm), pero se puede usar por su propia cuenta.
11

    
12
_Traducciones: [English](README.md)_
13

    
14
## Instalación
15

    
16
`$ npm install --save cacache`
17

    
18
## Índice
19

    
20
* [Ejemplo](#ejemplo)
21
* [Características](#características)
22
* [Cómo Contribuir](#cómo-contribuir)
23
* [API](#api)
24
  * [Usando el API en español](#localized-api)
25
  * Leer
26
    * [`ls`](#ls)
27
    * [`ls.flujo`](#ls-stream)
28
    * [`saca`](#get-data)
29
    * [`saca.flujo`](#get-stream)
30
    * [`saca.info`](#get-info)
31
    * [`saca.tieneDatos`](#get-hasContent)
32
  * Escribir
33
    * [`mete`](#put-data)
34
    * [`mete.flujo`](#put-stream)
35
    * [opciones para `mete*`](#put-options)
36
    * [`rm.todo`](#rm-all)
37
    * [`rm.entrada`](#rm-entry)
38
    * [`rm.datos`](#rm-content)
39
  * Utilidades
40
    * [`ponLenguaje`](#set-locale)
41
    * [`limpiaMemoizado`](#clear-memoized)
42
    * [`tmp.hazdir`](#tmp-mkdir)
43
    * [`tmp.conTmp`](#with-tmp)
44
  * Integridad
45
    * [Subresource Integrity](#integrity)
46
    * [`verifica`](#verify)
47
    * [`verifica.ultimaVez`](#verify-last-run)
48

    
49
### Ejemplo
50

    
51
```javascript
52
const cacache = require('cacache/es')
53
const fs = require('fs')
54

    
55
const tarbol = '/ruta/a/mi-tar.tgz'
56
const rutaCache = '/tmp/my-toy-cache'
57
const clave = 'mi-clave-única-1234'
58

    
59
// ¡Añádelo al caché! Usa `rutaCache` como raíz del caché.
60
cacache.mete(rutaCache, clave, '10293801983029384').then(integrity => {
61
  console.log(`Saved content to ${rutaCache}.`)
62
})
63

    
64
const destino = '/tmp/mytar.tgz'
65

    
66
// Copia el contenido del caché a otro fichero, pero esta vez con flujos.
67
cacache.saca.flujo(
68
  rutaCache, clave
69
).pipe(
70
  fs.createWriteStream(destino)
71
).on('finish', () => {
72
  console.log('extracción completada')
73
})
74

    
75
// La misma cosa, pero accesando el contenido directamente, sin tocar el índice.
76
cacache.saca.porHacheo(rutaCache, integridad).then(datos => {
77
  fs.writeFile(destino, datos, err => {
78
    console.log('datos del tarbol sacados basado en su sha512, y escrito a otro fichero')
79
  })
80
})
81
```
82

    
83
### Características
84

    
85
* Extracción por clave o por dirección de contenido (shasum, etc)
86
* Usa el estándard de web, [Subresource Integrity](#integrity)
87
* Compatible con multiples algoritmos - usa sha1, sha512, etc, en el mismo caché sin problema
88
* Entradas con contenido idéntico comparten ficheros
89
* Tolerancia de fallas (inmune a corrupción, ficheros parciales, carreras de proceso, etc)
90
* Verificación completa de datos cuando (escribiendo y leyendo)
91
* Concurrencia rápida, segura y "lockless"
92
* Compatible con `stream`s (flujos)
93
* Compatible con `Promise`s (promesas)
94
* Bastante rápida -- acceso, incluyendo verificación, en microsegundos
95
* Almacenaje de metadatos arbitrarios
96
* Colección de basura y verificación adicional fuera de banda
97
* Cobertura rigurosa de pruebas
98
* Probablente hay un "Bloom filter" por ahí en algún lado. Eso le mola a la gente, ¿Verdad? 🤔
99

    
100
### Cómo Contribuir
101

    
102
El equipo de cacache felizmente acepta contribuciones de código y otras maneras de participación. ¡Hay muchas formas diferentes de contribuir! La [Guía de Colaboradores](CONTRIBUTING.md) (en inglés) tiene toda la información que necesitas para cualquier tipo de contribución: todo desde cómo reportar errores hasta cómo someter parches con nuevas características. Con todo y eso, no se preocupe por si lo que haces está exáctamente correcto: no hay ningún problema en hacer preguntas si algo no está claro, o no lo encuentras.
103

    
104
El equipo de cacache tiene miembros hispanohablantes: es completamente aceptable crear `issues` y `pull requests` en español/castellano.
105

    
106
Todos los participantes en este proyecto deben obedecer el [Código de Conducta](CODE_OF_CONDUCT.md) (en inglés), y en general actuar de forma amable y respetuosa mientras participan en esta comunidad.
107

    
108
Por favor refiérase al [Historial de Cambios](CHANGELOG.md) (en inglés) para detalles sobre cambios importantes incluídos en cada versión.
109

    
110
Finalmente, cacache tiene un sistema de localización de lenguaje. Si te interesa añadir lenguajes o mejorar los que existen, mira en el directorio `./locales` para comenzar.
111

    
112
Happy hacking!
113

    
114
### API
115

    
116
#### <a name="localized-api"></a> Usando el API en español
117

    
118
cacache incluye una traducción completa de su API al castellano, con las mismas
119
características. Para usar el API como está documentado en este documento, usa
120
`require('cacache/es')`
121

    
122
cacache también tiene otros lenguajes: encuéntralos bajo `./locales`, y podrás
123
usar el API en ese lenguaje con `require('cacache/<lenguaje>')`
124

    
125
#### <a name="ls"></a> `> cacache.ls(cache) -> Promise<Object>`
126

    
127
Enumera todas las entradas en el caché, dentro de un solo objeto. Cada entrada
128
en el objeto tendrá como clave la clave única usada para el índice, el valor
129
siendo un objeto de [`saca.info`](#get-info).
130

    
131
##### Ejemplo
132

    
133
```javascript
134
cacache.ls(rutaCache).then(console.log)
135
// Salida
136
{
137
  'my-thing': {
138
    key: 'my-thing',
139
    integrity: 'sha512-BaSe64/EnCoDED+HAsh=='
140
    path: '.testcache/content/deadbeef', // unido con `rutaCache`
141
    time: 12345698490,
142
    size: 4023948,
143
    metadata: {
144
      name: 'blah',
145
      version: '1.2.3',
146
      description: 'this was once a package but now it is my-thing'
147
    }
148
  },
149
  'other-thing': {
150
    key: 'other-thing',
151
    integrity: 'sha1-ANothER+hasH=',
152
    path: '.testcache/content/bada55',
153
    time: 11992309289,
154
    size: 111112
155
  }
156
}
157
```
158

    
159
#### <a name="ls-stream"></a> `> cacache.ls.flujo(cache) -> Readable`
160

    
161
Enumera todas las entradas en el caché, emitiendo un objeto de
162
[`saca.info`](#get-info) por cada evento de `data` en el flujo.
163

    
164
##### Ejemplo
165

    
166
```javascript
167
cacache.ls.flujo(rutaCache).on('data', console.log)
168
// Salida
169
{
170
  key: 'my-thing',
171
  integrity: 'sha512-BaSe64HaSh',
172
  path: '.testcache/content/deadbeef', // unido con `rutaCache`
173
  time: 12345698490,
174
  size: 13423,
175
  metadata: {
176
    name: 'blah',
177
    version: '1.2.3',
178
    description: 'this was once a package but now it is my-thing'
179
  }
180
}
181

    
182
{
183
  key: 'other-thing',
184
  integrity: 'whirlpool-WoWSoMuchSupport',
185
  path: '.testcache/content/bada55',
186
  time: 11992309289,
187
  size: 498023984029
188
}
189

    
190
{
191
  ...
192
}
193
```
194

    
195
#### <a name="get-data"></a> `> cacache.saca(cache, clave, [ops]) -> Promise({data, metadata, integrity})`
196

    
197
Devuelve un objeto con los datos, hacheo de integridad y metadatos identificados
198
por la `clave`. La propiedad `data` de este objeto será una instancia de
199
`Buffer` con los datos almacenados en el caché. to do with it! cacache just
200
won't care.
201

    
202
`integrity` es un `string` de [Subresource Integrity](#integrity). Dígase, un
203
`string` que puede ser usado para verificar a la `data`, que tiene como formato
204
`<algoritmo>-<hacheo-integridad-base64>`.
205

    
206
So no existe ninguna entrada identificada por `clave`, o se los datos
207
almacenados localmente fallan verificación, el `Promise` fallará.
208

    
209
Una sub-función, `saca.porHacheo`, tiene casi el mismo comportamiento, excepto
210
que busca entradas usando el hacheo de integridad, sin tocar el índice general.
211
Esta versión *sólo* devuelve `data`, sin ningún objeto conteniéndola.
212

    
213
##### Nota
214

    
215
Esta función lee la entrada completa a la memoria antes de devolverla. Si estás
216
almacenando datos Muy Grandes, es posible que [`saca.flujo`](#get-stream) sea
217
una mejor solución.
218

    
219
##### Ejemplo
220

    
221
```javascript
222
// Busca por clave
223
cache.saca(rutaCache, 'my-thing').then(console.log)
224
// Salida:
225
{
226
  metadata: {
227
    thingName: 'my'
228
  },
229
  integrity: 'sha512-BaSe64HaSh',
230
  data: Buffer#<deadbeef>,
231
  size: 9320
232
}
233

    
234
// Busca por hacheo
235
cache.saca.porHacheo(rutaCache, 'sha512-BaSe64HaSh').then(console.log)
236
// Salida:
237
Buffer#<deadbeef>
238
```
239

    
240
#### <a name="get-stream"></a> `> cacache.saca.flujo(cache, clave, [ops]) -> Readable`
241

    
242
Devuelve un [Readable
243
Stream](https://nodejs.org/api/stream.html#stream_readable_streams) de los datos
244
almacenados bajo `clave`.
245

    
246
So no existe ninguna entrada identificada por `clave`, o se los datos
247
almacenados localmente fallan verificación, el `Promise` fallará.
248

    
249
`metadata` y `integrity` serán emitidos como eventos antes de que el flujo
250
cierre.
251

    
252
Una sub-función, `saca.flujo.porHacheo`, tiene casi el mismo comportamiento,
253
excepto que busca entradas usando el hacheo de integridad, sin tocar el índice
254
general. Esta versión no emite eventos de `metadata` o `integrity`.
255

    
256
##### Ejemplo
257

    
258
```javascript
259
// Busca por clave
260
cache.saca.flujo(
261
  rutaCache, 'my-thing'
262
).on('metadata', metadata => {
263
  console.log('metadata:', metadata)
264
}).on('integrity', integrity => {
265
  console.log('integrity:', integrity)
266
}).pipe(
267
  fs.createWriteStream('./x.tgz')
268
)
269
// Salidas:
270
metadata: { ... }
271
integrity: 'sha512-SoMeDIGest+64=='
272

    
273
// Busca por hacheo
274
cache.saca.flujo.porHacheo(
275
  rutaCache, 'sha512-SoMeDIGest+64=='
276
).pipe(
277
  fs.createWriteStream('./x.tgz')
278
)
279
```
280

    
281
#### <a name="get-info"></a> `> cacache.saca.info(cache, clave) -> Promise`
282

    
283
Busca la `clave` en el índice del caché, devolviendo información sobre la
284
entrada si existe.
285

    
286
##### Campos
287

    
288
* `key` - Clave de la entrada. Igual al argumento `clave`.
289
* `integrity` - [hacheo de Subresource Integrity](#integrity) del contenido al que se refiere esta entrada.
290
* `path` - Dirección del fichero de datos almacenados, unida al argumento `cache`.
291
* `time` - Hora de creación de la entrada
292
* `metadata` - Metadatos asignados a esta entrada por el usuario
293

    
294
##### Ejemplo
295

    
296
```javascript
297
cacache.saca.info(rutaCache, 'my-thing').then(console.log)
298

    
299
// Salida
300
{
301
  key: 'my-thing',
302
  integrity: 'sha256-MUSTVERIFY+ALL/THINGS=='
303
  path: '.testcache/content/deadbeef',
304
  time: 12345698490,
305
  size: 849234,
306
  metadata: {
307
    name: 'blah',
308
    version: '1.2.3',
309
    description: 'this was once a package but now it is my-thing'
310
  }
311
}
312
```
313

    
314
#### <a name="get-hasContent"></a> `> cacache.saca.tieneDatos(cache, integrity) -> Promise`
315

    
316
Busca un [hacheo Subresource Integrity](#integrity) en el caché. Si existe el
317
contenido asociado con `integrity`, devuelve un objeto con dos campos: el hacheo
318
_específico_ que se usó para la búsqueda, `sri`, y el tamaño total del
319
contenido, `size`. Si no existe ningún contenido asociado con `integrity`,
320
devuelve `false`.
321

    
322
##### Ejemplo
323

    
324
```javascript
325
cacache.saca.tieneDatos(rutaCache, 'sha256-MUSTVERIFY+ALL/THINGS==').then(console.log)
326

    
327
// Salida
328
{
329
  sri: {
330
    source: 'sha256-MUSTVERIFY+ALL/THINGS==',
331
    algorithm: 'sha256',
332
    digest: 'MUSTVERIFY+ALL/THINGS==',
333
    options: []
334
  },
335
  size: 9001
336
}
337

    
338
cacache.saca.tieneDatos(rutaCache, 'sha521-NOT+IN/CACHE==').then(console.log)
339

    
340
// Salida
341
false
342
```
343

    
344
#### <a name="put-data"></a> `> cacache.mete(cache, clave, datos, [ops]) -> Promise`
345

    
346
Inserta `datos` en el caché. El `Promise` devuelto se resuelve con un hacheo
347
(generado conforme a [`ops.algorithms`](#optsalgorithms)) después que la entrada
348
haya sido escrita en completo.
349

    
350
##### Ejemplo
351

    
352
```javascript
353
fetch(
354
  'https://registry.npmjs.org/cacache/-/cacache-1.0.0.tgz'
355
).then(datos => {
356
  return cacache.mete(rutaCache, 'registry.npmjs.org|cacache@1.0.0', datos)
357
}).then(integridad => {
358
  console.log('el hacheo de integridad es', integridad)
359
})
360
```
361

    
362
#### <a name="put-stream"></a> `> cacache.mete.flujo(cache, clave, [ops]) -> Writable`
363

    
364
Devuelve un [Writable
365
Stream](https://nodejs.org/api/stream.html#stream_writable_streams) que inserta
366
al caché los datos escritos a él. Emite un evento `integrity` con el hacheo del
367
contenido escrito, cuando completa.
368

    
369
##### Ejemplo
370

    
371
```javascript
372
request.get(
373
  'https://registry.npmjs.org/cacache/-/cacache-1.0.0.tgz'
374
).pipe(
375
  cacache.mete.flujo(
376
    rutaCache, 'registry.npmjs.org|cacache@1.0.0'
377
  ).on('integrity', d => console.log(`integrity digest is ${d}`))
378
)
379
```
380

    
381
#### <a name="put-options"></a> `> opciones para cacache.mete`
382

    
383
La funciones `cacache.mete` tienen un número de opciones en común.
384

    
385
##### `ops.metadata`
386

    
387
Metadatos del usuario que se almacenarán con la entrada.
388

    
389
##### `ops.size`
390

    
391
El tamaño declarado de los datos que se van a insertar. Si es proveído, cacache
392
verificará que los datos escritos sean de ese tamaño, o si no, fallará con un
393
error con código `EBADSIZE`.
394

    
395
##### `ops.integrity`
396

    
397
El hacheo de integridad de los datos siendo escritos.
398

    
399
Si es proveído, y los datos escritos no le corresponden, la operación fallará
400
con un error con código `EINTEGRITY`.
401

    
402
`ops.algorithms` no tiene ningún efecto si esta opción está presente.
403

    
404
##### `ops.algorithms`
405

    
406
Por Defecto: `['sha512']`
407

    
408
Algoritmos que se deben usar cuando se calcule el hacheo de [subresource
409
integrity](#integrity) para los datos insertados. Puede usar cualquier algoritmo
410
enumerado en `crypto.getHashes()`.
411

    
412
Por el momento, sólo se acepta un algoritmo (dígase, un array con exáctamente un
413
valor). No tiene ningún efecto si `ops.integrity` también ha sido proveido.
414

    
415
##### `ops.uid`/`ops.gid`
416

    
417
Si están presentes, cacache hará todo lo posible para asegurarse que todos los
418
ficheros creados en el proceso de sus operaciones en el caché usen esta
419
combinación en particular.
420

    
421
##### `ops.memoize`
422

    
423
Por Defecto: `null`
424

    
425
Si es verdad, cacache tratará de memoizar los datos de la entrada en memoria. La
426
próxima vez que el proceso corriente trate de accesar los datos o entrada,
427
cacache buscará en memoria antes de buscar en disco.
428

    
429
Si `ops.memoize` es un objeto regular o un objeto como `Map` (es decir, un
430
objeto con métodos `get()` y `set()`), este objeto en sí sera usado en vez del
431
caché de memoria global. Esto permite tener lógica específica a tu aplicación
432
encuanto al almacenaje en memoria de tus datos.
433

    
434
Si quieres asegurarte que los datos se lean del disco en vez de memoria, usa
435
`memoize: false` cuando uses funciones de `cacache.saca`.
436

    
437
#### <a name="rm-all"></a> `> cacache.rm.todo(cache) -> Promise`
438

    
439
Borra el caché completo, incluyendo ficheros temporeros, ficheros de datos, y el
440
índice del caché.
441

    
442
##### Ejemplo
443

    
444
```javascript
445
cacache.rm.todo(rutaCache).then(() => {
446
  console.log('THE APOCALYPSE IS UPON US 😱')
447
})
448
```
449

    
450
#### <a name="rm-entry"></a> `> cacache.rm.entrada(cache, clave) -> Promise`
451

    
452
Alias: `cacache.rm`
453

    
454
Borra la entrada `clave` del índuce. El contenido asociado con esta entrada
455
seguirá siendo accesible por hacheo usando
456
[`saca.flujo.porHacheo`](#get-stream).
457

    
458
Para borrar el contenido en sí, usa [`rm.datos`](#rm-content). Si quieres hacer
459
esto de manera más segura (pues ficheros de contenido pueden ser usados por
460
multiples entradas), usa [`verifica`](#verify) para borrar huérfanos.
461

    
462
##### Ejemplo
463

    
464
```javascript
465
cacache.rm.entrada(rutaCache, 'my-thing').then(() => {
466
  console.log('I did not like it anyway')
467
})
468
```
469

    
470
#### <a name="rm-content"></a> `> cacache.rm.datos(cache, integrity) -> Promise`
471

    
472
Borra el contenido identificado por `integrity`. Cualquier entrada que se
473
refiera a este contenido quedarán huérfanas y se invalidarán si se tratan de
474
accesar, al menos que contenido idéntico sea añadido bajo `integrity`.
475

    
476
##### Ejemplo
477

    
478
```javascript
479
cacache.rm.datos(rutaCache, 'sha512-SoMeDIGest/IN+BaSE64==').then(() => {
480
  console.log('los datos para `mi-cosa` se borraron')
481
})
482
```
483

    
484
#### <a name="set-locale"></a> `> cacache.ponLenguaje(locale)`
485

    
486
Configura el lenguaje usado para mensajes y errores de cacache. La lista de
487
lenguajes disponibles está en el directorio `./locales` del proyecto.
488

    
489
_Te interesa añadir más lenguajes? [Somete un PR](CONTRIBUTING.md)!_
490

    
491
#### <a name="clear-memoized"></a> `> cacache.limpiaMemoizado()`
492

    
493
Completamente reinicializa el caché de memoria interno. Si estás usando tu
494
propio objecto con `ops.memoize`, debes hacer esto de manera específica a él.
495

    
496
#### <a name="tmp-mkdir"></a> `> tmp.hazdir(cache, ops) -> Promise<Path>`
497

    
498
Alias: `tmp.mkdir`
499

    
500
Devuelve un directorio único dentro del directorio `tmp` del caché.
501

    
502
Una vez tengas el directorio, es responsabilidad tuya asegurarte que todos los
503
ficheros escrito a él sean creados usando los permisos y `uid`/`gid` concordante
504
con el caché. Si no, puedes pedirle a cacache que lo haga llamando a
505
[`cacache.tmp.fix()`](#tmp-fix). Esta función arreglará todos los permisos en el
506
directorio tmp.
507

    
508
Si quieres que cacache limpie el directorio automáticamente cuando termines, usa
509
[`cacache.tmp.conTmp()`](#with-tpm).
510

    
511
##### Ejemplo
512

    
513
```javascript
514
cacache.tmp.mkdir(cache).then(dir => {
515
  fs.writeFile(path.join(dir, 'blablabla'), Buffer#<1234>, ...)
516
})
517
```
518

    
519
#### <a name="with-tmp"></a> `> tmp.conTmp(cache, ops, cb) -> Promise`
520

    
521
Crea un directorio temporero con [`tmp.mkdir()`](#tmp-mkdir) y ejecuta `cb` con
522
él como primer argumento. El directorio creado será removido automáticamente
523
cuando el valor devolvido por `cb()` se resuelva.
524

    
525
Las mismas advertencias aplican en cuanto a manejando permisos para los ficheros
526
dentro del directorio.
527

    
528
##### Ejemplo
529

    
530
```javascript
531
cacache.tmp.conTmp(cache, dir => {
532
  return fs.writeFileAsync(path.join(dir, 'blablabla'), Buffer#<1234>, ...)
533
}).then(() => {
534
  // `dir` no longer exists
535
})
536
```
537

    
538
#### <a name="integrity"></a> Hacheos de Subresource Integrity
539

    
540
cacache usa strings que siguen la especificación de [Subresource Integrity
541
spec](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity).
542

    
543
Es decir, donde quiera cacache espera un argumento o opción `integrity`, ese
544
string debería usar el formato `<algoritmo>-<hacheo-base64>`.
545

    
546
Una variación importante sobre los hacheos que cacache acepta es que acepta el
547
nombre de cualquier algoritmo aceptado por el proceso de Node.js donde se usa.
548
Puedes usar `crypto.getHashes()` para ver cuales están disponibles.
549

    
550
##### Generando tus propios hacheos
551

    
552
Si tienes un `shasum`, en general va a estar en formato de string hexadecimal
553
(es decir, un `sha1` se vería como algo así:
554
`5f5513f8822fdbe5145af33b64d8d970dcf95c6e`).
555

    
556
Para ser compatible con cacache, necesitas convertir esto a su equivalente en
557
subresource integrity. Por ejemplo, el hacheo correspondiente al ejemplo
558
anterior sería: `sha1-X1UT+IIv2+UUWvM7ZNjZcNz5XG4=`.
559

    
560
Puedes usar código así para generarlo por tu cuenta:
561

    
562
```javascript
563
const crypto = require('crypto')
564
const algoritmo = 'sha512'
565
const datos = 'foobarbaz'
566

    
567
const integrity = (
568
  algorithm +
569
  '-' +
570
  crypto.createHash(algoritmo).update(datos).digest('base64')
571
)
572
```
573

    
574
También puedes usar [`ssri`](https://npm.im/ssri) para deferir el trabajo a otra
575
librería que garantiza que todo esté correcto, pues maneja probablemente todas
576
las operaciones que tendrías que hacer con SRIs, incluyendo convirtiendo entre
577
hexadecimal y el formato SRI.
578

    
579
#### <a name="verify"></a> `> cacache.verifica(cache, ops) -> Promise`
580

    
581
Examina y arregla tu caché:
582

    
583
* Limpia entradas inválidas, huérfanas y corrompidas
584
* Te deja filtrar cuales entradas retener, con tu propio filtro
585
* Reclama cualquier ficheros de contenido sin referencias en el índice
586
* Verifica integridad de todos los ficheros de contenido y remueve los malos
587
* Arregla permisos del caché
588
* Remieve el directorio `tmp` en el caché, y todo su contenido.
589

    
590
Cuando termine, devuelve un objeto con varias estadísticas sobre el proceso de
591
verificación, por ejemplo la cantidad de espacio de disco reclamado, el número
592
de entradas válidas, número de entradas removidas, etc.
593

    
594
##### Opciones
595

    
596
* `ops.uid` - uid para asignarle al caché y su contenido
597
* `ops.gid` - gid para asignarle al caché y su contenido
598
* `ops.filter` - recibe una entrada como argumento. Devuelve falso para removerla. Nota: es posible que esta función sea invocada con la misma entrada más de una vez.
599

    
600
##### Example
601

    
602
```sh
603
echo somegarbage >> $RUTACACHE/content/deadbeef
604
```
605

    
606
```javascript
607
cacache.verifica(rutaCache).then(stats => {
608
  // deadbeef collected, because of invalid checksum.
609
  console.log('cache is much nicer now! stats:', stats)
610
})
611
```
612

    
613
#### <a name="verify-last-run"></a> `> cacache.verifica.ultimaVez(cache) -> Promise`
614

    
615
Alias: `últimaVez`
616

    
617
Devuelve un `Date` que representa la última vez que `cacache.verifica` fue
618
ejecutada en `cache`.
619

    
620
##### Example
621

    
622
```javascript
623
cacache.verifica(rutaCache).then(() => {
624
  cacache.verifica.ultimaVez(rutaCache).then(última => {
625
    console.log('La última vez que se usó cacache.verifica() fue ' + última)
626
  })
627
})
628
```
(3-3/13)