Projekt

Obecné

Profil

Stáhnout (20.5 KB) Statistiky
| Větev: | Revize:
1 3a515b92 cagy
# 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
```