You're Invited:Meet the Socket Team at RSAC and BSidesSF 2026, March 23–26.RSVP
Socket
Book a DemoSign in
Socket

@vltpkg/cache

Package Overview
Dependencies
Maintainers
5
Versions
51
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@vltpkg/cache - npm Package Compare versions

Comparing version
0.0.0-8
to
0.0.0-9
+1
-1
dist/esm/index.d.ts

@@ -70,3 +70,3 @@ import type { Integrity } from '@vltpkg/types';

*/
delete(key: string, fromDisk?: boolean): boolean;
delete(key: string, fromDisk?: boolean, integrity?: Integrity): boolean;
/**

@@ -73,0 +73,0 @@ * Sets an item in the memory cache (like `LRUCache.set`), and schedules a

@@ -1,1 +0,1 @@

{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAa9C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAIpC,MAAM,MAAM,iBAAiB,GACzB;IACE,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB,GACD,SAAS,CAAA;AAEb,MAAM,MAAM,YAAY,GAAG;KACxB,CAAC,IAAI,MAAM,QAAQ,CAAC,OAAO,CAC1B,MAAM,EACN,MAAM,EACN,iBAAiB,CAClB,CAAC,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;CAC5D,GAAG;IACF;;;OAGG;IACH,WAAW,CAAC,EAAE,SAAS,CAAA;IACvB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ;;OAEG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,GAAG,CAAA;IAC9D;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,GAAG,CAAA;CACpE,CAAA;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,IAAI,CAAA;AAK1C,qBAAa,KAAM,SAAQ,QAAQ,CACjC,MAAM,EACN,MAAM,EACN,iBAAiB,CAClB;;IAEC,CAAC,MAAM,CAAC,WAAW,CAAC,SAAwB;IAI5C,WAAW,CAAC,EAAE,YAAY,CAAC,aAAa,CAAC,CAAA;IACzC,YAAY,CAAC,EAAE,YAAY,CAAC,cAAc,CAAC,CAAA;IAE3C;;;;OAIG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED;;OAEG;IACH,IAAI,OAAO,6BAEV;IAED;;;OAGG;IACH,MAAM,KAAK,UAAU,WAEpB;gBAEW,OAAO,EAAE,YAAY;IAiCjC;;;;;OAKG;IACI,IAAI;IAmBX,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,cAAc,CACtC;QAAC,MAAM;QAAE,MAAM;KAAC,EAChB,IAAI,EACJ,IAAI,CACL;IAID;;OAEG;IACF,QAAQ;IAoBT,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC;IAiBtD;;;OAGG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,UAAQ,GAAG,OAAO;IAY9C;;;;;;;;;;;;OAYG;IACH,GAAG,CACD,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,QAAQ,CAAC,UAAU,CAC3B,MAAM,EACN,MAAM,EACN,iBAAiB,CAClB,GAAG;QACF,oDAAoD;QACpD,WAAW,CAAC,EAAE,OAAO,CAAA;QACrB,8BAA8B;QAC9B,SAAS,CAAC,EAAE,SAAS,CAAA;KACtB;IAuBH;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAM9B;;OAEG;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM;IAGjB;;;OAGG;IACH,aAAa,CAAC,SAAS,CAAC,EAAE,SAAS;IAcnC;;;OAGG;IACH,SAAS,CACP,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,iBAAiB,CAAC;CAuFlE"}
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAa9C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAIpC,MAAM,MAAM,iBAAiB,GACzB;IACE,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB,GACD,SAAS,CAAA;AAEb,MAAM,MAAM,YAAY,GAAG;KACxB,CAAC,IAAI,MAAM,QAAQ,CAAC,OAAO,CAC1B,MAAM,EACN,MAAM,EACN,iBAAiB,CAClB,CAAC,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;CAC5D,GAAG;IACF;;;OAGG;IACH,WAAW,CAAC,EAAE,SAAS,CAAA;IACvB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ;;OAEG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,GAAG,CAAA;IAC9D;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,GAAG,CAAA;CACpE,CAAA;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,IAAI,CAAA;AAK1C,qBAAa,KAAM,SAAQ,QAAQ,CACjC,MAAM,EACN,MAAM,EACN,iBAAiB,CAClB;;IAEC,CAAC,MAAM,CAAC,WAAW,CAAC,SAAwB;IAI5C,WAAW,CAAC,EAAE,YAAY,CAAC,aAAa,CAAC,CAAA;IACzC,YAAY,CAAC,EAAE,YAAY,CAAC,cAAc,CAAC,CAAA;IAE3C;;;;OAIG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED;;OAEG;IACH,IAAI,OAAO,6BAEV;IAED;;;OAGG;IACH,MAAM,KAAK,UAAU,WAEpB;gBAEW,OAAO,EAAE,YAAY;IAiCjC;;;;;OAKG;IACI,IAAI;IAmBX,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,cAAc,CACtC;QAAC,MAAM;QAAE,MAAM;KAAC,EAChB,IAAI,EACJ,IAAI,CACL;IAID;;OAEG;IACF,QAAQ;IAoBT,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC;IAiBtD;;;OAGG;IACH,MAAM,CACJ,GAAG,EAAE,MAAM,EACX,QAAQ,UAAQ,EAChB,SAAS,CAAC,EAAE,SAAS,GACpB,OAAO;IAaV;;;;;;;;;;;;OAYG;IACH,GAAG,CACD,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,QAAQ,CAAC,UAAU,CAC3B,MAAM,EACN,MAAM,EACN,iBAAiB,CAClB,GAAG;QACF,oDAAoD;QACpD,WAAW,CAAC,EAAE,OAAO,CAAA;QACrB,8BAA8B;QAC9B,SAAS,CAAC,EAAE,SAAS,CAAA;KACtB;IAuBH;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAM9B;;OAEG;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM;IAGjB;;;OAGG;IACH,aAAa,CAAC,SAAS,CAAC,EAAE,SAAS;IAcnC;;;OAGG;IACH,SAAS,CACP,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,iBAAiB,CAAC;CA6FlE"}

@@ -118,7 +118,7 @@ import { error } from '@vltpkg/error-cause';

*/
delete(key, fromDisk = false) {
delete(key, fromDisk = false, integrity) {
const ret = super.delete(key);
if (fromDisk) {
const path = this.path(key);
const p = this.#diskDelete(path).then(deleted => this.#unpend(p, this.onDiskDelete, path, key, deleted));
const p = this.#diskDelete(path, integrity).then(deleted => this.#unpend(p, this.onDiskDelete, path, key, deleted));
this.#pend(p);

@@ -223,4 +223,8 @@ }

*/
async #diskDelete(path) {
return rimraf([path, path + '.key']);
async #diskDelete(path, integrity) {
const intPath = this.#maybeIntegrityPath(integrity);
const paths = [path, path + '.key'];
if (intPath)
paths.push(intPath);
return await rimraf(paths);
}

@@ -227,0 +231,0 @@ #maybeIntegrityPath(i) {

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAE3C,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAEnD,OAAO,EACL,IAAI,EACJ,KAAK,EACL,OAAO,EACP,QAAQ,EACR,MAAM,EACN,SAAS,GACV,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAqC/B,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CACzB,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAE9C,MAAM,OAAO,KAAM,SAAQ,QAI1B;IACC,KAAK,CAAS;IACd,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,qBAAqB,CAAA;IAC5C,OAAO,GAAW,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAChD,EAAE,GAAG,CAAC,CAAA;IACN,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAA;IAC5C,WAAW,CAA8B;IACzC,YAAY,CAA+B;IAE3C;;;;OAIG;IACH,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,GAAG,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IAC/C,CAAC;IAED;;OAEG;IACH,IAAI,OAAO;QACT,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC3B,CAAC;IAED;;;OAGG;IACH,MAAM,KAAK,UAAU;QACnB,OAAO,MAAM,CAAA;IACf,CAAC;IAED,YAAY,OAAqB;QAC/B,MAAM,EACJ,WAAW,EACX,YAAY,EACZ,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAC7B,WAAW,EAAE,CAAC,EACd,eAAe,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;YACzD,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM;YAC/C,CAAC,CAAC,SAAS,EACX,GAAG,OAAO,EACX,GAAG,OAAO,CAAA;QAEX,KAAK,CAAC;YACJ,GAAG,EAAE,KAAK,CAAC,UAAU;YACrB,GAAG,OAAO;YACV,eAAe;YACf,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;gBAChC,8DAA8D;gBAC9D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE;oBAC1B,WAAW,EAAE,IAAI;iBAClB,CAAC,CAAA;gBACF,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;YACtD,CAAC;YACD,0BAA0B,EAAE,IAAI;YAChC,sBAAsB,EAAE,IAAI;YAC5B,UAAU,EAAE,IAAI;YAChB,kBAAkB,EAAE,IAAI;SACzB,CAAC,CAAA;QACF,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC9B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;QAChC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;IACnB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,CAAC,IAAI;QACT,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA;QAC3D,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;YACzC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvB,MAAM,KAAK,GAAqB,MAAM,OAAO,CAAC,GAAG,CAAC;oBAChD,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC;oBACxC,QAAQ,CACN,OAAO,CACL,IAAI,CAAC,KAAK,EACV,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CACzC,CACF;iBACF,CAAC,CAAA;gBACF,MAAM,KAAK,CAAA;YACb,CAAC;QACH,CAAC;IACH,CAAC;IAED,CAAC,MAAM,CAAC,aAAa,CAAC;QAKpB,OAAO,IAAI,CAAC,IAAI,EAAE,CAAA;IACpB,CAAC;IAED;;OAEG;IACH,CAAC,QAAQ;QACP,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA;QACzD,IAAI,KAAK,GAAkB,IAAI,CAAA;QAC/B,OAAO,IAAI,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;YACzC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;YACzC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvB,MAAM,KAAK,GAAqB;oBAC9B,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC;oBAC5C,YAAY,CACV,OAAO,CACL,IAAI,CAAC,KAAK,EACV,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CACzC,CACF;iBACF,CAAA;gBACD,MAAM,KAAK,CAAA;YACb,CAAC;QACH,CAAC;QACD,GAAG,CAAC,SAAS,EAAE,CAAA;IACjB,CAAC;IACD,CAAC,MAAM,CAAC,QAAQ,CAAC;QACf,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAA;IACxB,CAAC;IAED,OAAO,CACL,CAAyB,EACzB,EAAiB,EACjB,GAAG,IAAmB;QAEtB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QACvB,IAAI,EAAE;YAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,CAAyB;QAC7B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IACtB,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,GAAW,EAAE,QAAQ,GAAG,KAAK;QAClC,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC7B,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAC3B,MAAM,CAAC,GAAkB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAC7D,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CACvD,CAAA;YACD,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACf,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,GAAG,CACD,GAAW,EACX,GAAW,EACX,OASC;QAED,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAA;QAC5B,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,OAAO,IAAI,EAAE,CAAA;QAChD,sEAAsE;QACtE,+DAA+D;QAC/D,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACzC,yCAAyC;YACzC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAC3B,MAAM,CAAC,GAAkB,IAAI,CAAC,UAAU,CACtC,IAAI,EACJ,GAAG,EACH,GAAG,EACH,SAAS,CACV;gBACC,oBAAoB;iBACnB,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;iBACf,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;YAChE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACf,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACxD,qCAAqC;QACrC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI;YAAE,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;IAC9C,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,GAAY;QACf,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAA;IAC1D,CAAC;IACD;;;OAGG;IACH,aAAa,CAAC,SAAqB;QACjC,IAAI,CAAC,SAAS;YAAE,OAAO,SAAS,CAAA;QAChC,MAAM,CAAC,GAAG,gCAAgC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC1D,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACnB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,KAAK,CAAC,yBAAyB,EAAE;gBACrC,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,gCAAgC;aACzC,CAAC,CAAA;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACxD,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IAClC,CAAC;IAED;;;OAGG;IACH,SAAS,CACP,GAAW,EACX,IAA+D;QAE/D,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACvB,IAAI,CAAC;YAAE,OAAO,CAAC,CAAA;QACf,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;QAClE,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;gBAC/B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;gBAChD,OAAO,CAAC,CAAA;gBACR,qBAAqB;YACvB,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;QACD,oBAAoB;QACpB,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;YACtC,6DAA6D;YAC7D,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;YAChD,OAAO,CAAC,CAAA;YACR,qBAAqB;QACvB,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IACD,oBAAoB;IAEpB;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,IAAY;QAC5B,OAAO,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC,CAAA;IACtC,CAAC;IAED,mBAAmB,CAAC,CAAa;QAC/B,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAA;QAC9B,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IACD,KAAK,CAAC,UAAU,CACd,IAAY,EACZ,GAAW,EACX,GAAW,EACX,SAAqB;QAErB,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QACzB,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAA;QACnD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC3B,MAAM,OAAO,GAAG,IAAI,GAAG,MAAM,CAAA;QAC7B,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAA;QACjD,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,GAAG,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAA;QACvD,MAAM,SAAS,GACb,OAAO,CAAC,CAAC;YACP,6DAA6D;YAC7D,gEAAgE;YAChE,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACnD,kDAAkD;YACpD,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QACvB,OAAO,OAAO,CAAC,GAAG,CAAC;YACjB,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACvC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAC/B,MAAM,CAAC,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,CAC9B;SACF,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YACX,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;YAC5B,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,SAAS,CACb,CAAS,EACT,CAAqB,EACrB,SAAqB;QAErB,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAA;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACzB,MAAM,CAAC,GACL,OAAO,CAAC,CAAC;YACP,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;gBACjC,sDAAsD;gBACtD,yCAAyC;gBACzC,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAA;gBAClC,MAAM,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;gBACzB,OAAO,KAAK,CAAA;YACd,CAAC,CAAC;YACJ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAClB,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;IACzB,CAAC;CACF","sourcesContent":["import { error } from '@vltpkg/error-cause'\nimport type { Integrity } from '@vltpkg/types'\nimport { XDG } from '@vltpkg/xdg'\nimport { createHash, randomBytes } from 'node:crypto'\nimport { opendirSync, readFileSync } from 'node:fs'\nimport type { Dirent } from 'node:fs'\nimport {\n link,\n mkdir,\n opendir,\n readFile,\n rename,\n writeFile,\n} from 'node:fs/promises'\nimport { LRUCache } from 'lru-cache'\nimport { resolve, basename, dirname } from 'node:path'\nimport { rimraf } from 'rimraf'\n\nexport type CacheFetchContext =\n | {\n integrity?: Integrity\n }\n | undefined\n\nexport type CacheOptions = {\n [k in keyof LRUCache.Options<\n string,\n Buffer,\n CacheFetchContext\n >]?: LRUCache.Options<string, Buffer, CacheFetchContext>[k]\n} & {\n /**\n * fetchMethod may not be provided, because this cache forces its own\n * read-from-disk as the fetchMethod\n */\n fetchMethod?: undefined\n /**\n * folder where items should be stored to disk\n */\n path: string\n /**\n * called whenever an item is written to disk.\n */\n onDiskWrite?: (path: string, key: string, data: Buffer) => any\n /**\n * called whenever an item is deleted with `cache.delete(key, true)`\n * Deletes of the in-memory data do not trigger this method.\n */\n onDiskDelete?: (path: string, key: string, deleted: boolean) => any\n}\n\nexport type BooleanOrVoid = boolean | void\n\nconst hash = (s: string) =>\n createHash('sha512').update(s).digest('hex')\n\nexport class Cache extends LRUCache<\n string,\n Buffer,\n CacheFetchContext\n> {\n #path: string;\n [Symbol.toStringTag] = '@vltpkg/cache.Cache'\n #random: string = randomBytes(6).toString('hex')\n #i = 0\n #pending = new Set<Promise<BooleanOrVoid>>()\n onDiskWrite?: CacheOptions['onDiskWrite']\n onDiskDelete?: CacheOptions['onDiskDelete']\n\n /**\n * ensure we get a different random key for every write,\n * just in case the same file tries to write multiple times,\n * it'll still be atomic.\n */\n get random(): string {\n return this.#random + '.' + String(this.#i++)\n }\n\n /**\n * A list of the actions currently happening in the background\n */\n get pending() {\n return [...this.#pending]\n }\n\n /**\n * By default, cache up to 1000 items in memory.\n * Disk cache is unbounded.\n */\n static get defaultMax() {\n return 10_000\n }\n\n constructor(options: CacheOptions) {\n const {\n onDiskWrite,\n onDiskDelete,\n path = new XDG('vlt').cache(),\n fetchMethod: _,\n sizeCalculation = options.maxSize || options.maxEntrySize ?\n (v: Buffer, k: string) => v.length + k.length\n : undefined,\n ...lruOpts\n } = options\n\n super({\n max: Cache.defaultMax,\n ...lruOpts,\n sizeCalculation,\n fetchMethod: async (k, v, opts) => {\n // do not write back to disk, since we just got it from there.\n Object.assign(opts.options, {\n noDiskWrite: true,\n })\n return this.#diskRead(k, v, opts.context?.integrity)\n },\n allowStaleOnFetchRejection: true,\n allowStaleOnFetchAbort: true,\n allowStale: true,\n noDeleteOnStaleGet: true,\n })\n this.onDiskWrite = onDiskWrite\n this.onDiskDelete = onDiskDelete\n this.#path = path\n }\n\n /**\n * Walk over all the items cached to disk (not just in memory).\n * Useful for cleanup, pruning, etc.\n *\n * Implementation for `for await` to walk over entries.\n */\n async *walk() {\n const dir = await opendir(this.#path, { bufferSize: 1024 })\n for await (const entry of dir) {\n const f = resolve(this.#path, entry.name)\n if (f.endsWith('.key')) {\n const entry: [string, Buffer] = await Promise.all([\n readFile(resolve(this.#path, f), 'utf8'),\n readFile(\n resolve(\n this.#path,\n f.substring(0, f.length - '.key'.length),\n ),\n ),\n ])\n yield entry\n }\n }\n }\n\n [Symbol.asyncIterator](): AsyncGenerator<\n [string, Buffer],\n void,\n void\n > {\n return this.walk()\n }\n\n /**\n * Synchronous form of Cache.walk()\n */\n *walkSync() {\n const dir = opendirSync(this.#path, { bufferSize: 1024 })\n let entry: Dirent | null = null\n while (null !== (entry = dir.readSync())) {\n const f = resolve(this.#path, entry.name)\n if (f.endsWith('.key')) {\n const entry: [string, Buffer] = [\n readFileSync(resolve(this.#path, f), 'utf8'),\n readFileSync(\n resolve(\n this.#path,\n f.substring(0, f.length - '.key'.length),\n ),\n ),\n ]\n yield entry\n }\n }\n dir.closeSync()\n }\n [Symbol.iterator](): Generator<[string, Buffer], void> {\n return this.walkSync()\n }\n\n #unpend<F extends (...a: any[]) => any>(\n p: Promise<BooleanOrVoid>,\n fn: F | undefined,\n ...args: Parameters<F>\n ) {\n this.#pending.delete(p)\n if (fn) fn(...args)\n }\n\n #pend(p: Promise<BooleanOrVoid>) {\n this.#pending.add(p)\n }\n\n /**\n * Pass `true` as second argument to delete not just from the in-memory\n * cache, but the disk backing as well.\n */\n delete(key: string, fromDisk = false): boolean {\n const ret = super.delete(key)\n if (fromDisk) {\n const path = this.path(key)\n const p: Promise<void> = this.#diskDelete(path).then(deleted =>\n this.#unpend(p, this.onDiskDelete, path, key, deleted),\n )\n this.#pend(p)\n }\n return ret\n }\n\n /**\n * Sets an item in the memory cache (like `LRUCache.set`), and schedules a\n * background operation to write it to disk.\n *\n * Use the {@link CacheOptions#onDiskWrite} method to know exactly when this\n * happens, or `await cache.promise()` to defer until all pending actions are\n * completed.\n *\n * The `noDiskWrite` option can be set to prevent it from writing back to the\n * disk cache. This is almost never relevant for consumers, and is used\n * internally to prevent the write at the end of `fetch()` from excessively\n * writing over a file we just read from.\n */\n set(\n key: string,\n val: Buffer,\n options?: LRUCache.SetOptions<\n string,\n Buffer,\n CacheFetchContext\n > & {\n /** set to `true` to prevent writes to disk cache */\n noDiskWrite?: boolean\n /** sha512 integrity string */\n integrity?: Integrity\n },\n ) {\n super.set(key, val, options)\n const { noDiskWrite, integrity } = options ?? {}\n // set/delete also used internally by LRUCache to manage async fetches\n // only write when we're putting an actual value into the cache\n if (Buffer.isBuffer(val) && !noDiskWrite) {\n // best effort, already have it in memory\n const path = this.path(key)\n const p: Promise<void> = this.#diskWrite(\n path,\n key,\n val,\n integrity,\n )\n /* c8 ignore next */\n .catch(() => {})\n .then(() => this.#unpend(p, this.onDiskWrite, path, key, val))\n this.#pend(p)\n }\n return this\n }\n\n /**\n * Resolves when there are no pending writes to the disk cache\n */\n async promise(): Promise<void> {\n if (this.pending.length) await Promise.all(this.pending)\n /* c8 ignore next - race condition */\n if (this.#pending.size) await this.promise()\n }\n\n /**\n * given a key, figure out the path on disk where it lives\n */\n path(key?: string) {\n return key ? resolve(this.#path, hash(key)) : this.#path\n }\n /**\n * given an SRI sha512 integrity string, get the path on disk that\n * is hard-linked to the value.\n */\n integrityPath(integrity?: Integrity) {\n if (!integrity) return undefined\n const m = /^sha512-([a-zA-Z0-9/+]{86}==)$/.exec(integrity)\n const hash = m?.[1]\n if (!hash) {\n throw error('invalid integrity value', {\n found: integrity,\n wanted: /^sha512-([a-zA-Z0-9/+]{86}==)$/,\n })\n }\n const base = Buffer.from(hash, 'base64').toString('hex')\n return resolve(this.#path, base)\n }\n\n /**\n * Read synchronously from the fs cache storage if not already\n * in memory.\n */\n fetchSync(\n key: string,\n opts?: LRUCache.FetchOptions<string, Buffer, CacheFetchContext>,\n ) {\n const v = this.get(key)\n if (v) return v\n const intFile = this.#maybeIntegrityPath(opts?.context?.integrity)\n if (intFile) {\n try {\n const v = readFileSync(intFile)\n this.set(key, v, { ...opts, noDiskWrite: true })\n return v\n /* c8 ignore start */\n } catch {}\n }\n /* c8 ignore stop */\n try {\n const v = readFileSync(this.path(key))\n // suppress the disk write, because we just read it from disk\n this.set(key, v, { ...opts, noDiskWrite: true })\n return v\n /* c8 ignore start */\n } catch {}\n }\n /* c8 ignore stop */\n\n /**\n * Delete path and path + '.key'\n */\n async #diskDelete(path: string): Promise<boolean> {\n return rimraf([path, path + '.key'])\n }\n\n #maybeIntegrityPath(i?: Integrity) {\n try {\n return this.integrityPath(i)\n } catch {}\n }\n async #diskWrite(\n path: string,\n key: string,\n val: Buffer,\n integrity?: Integrity,\n ) {\n const dir = dirname(path)\n await mkdir(dir, { recursive: true })\n const intFile = this.#maybeIntegrityPath(integrity)\n const base = basename(path)\n const keyFile = base + '.key'\n const tmp = dir + '/.' + base + '.' + this.random\n const keyTmp = dir + '/.' + keyFile + '.' + this.random\n const writeData =\n intFile ?\n // try to just link into the temp location, rather than write\n // may fail with ENOENT or EEXIST, in which case, write normally\n link(intFile, tmp).catch(() => writeFile(tmp, val))\n // don't have it by integrity, write the new entry\n : writeFile(tmp, val)\n return Promise.all([\n writeData.then(() => rename(tmp, path)),\n writeFile(keyTmp, key).then(() =>\n rename(keyTmp, path + '.key'),\n ),\n ]).then(() => {\n if (intFile) {\n return link(path, intFile)\n }\n })\n }\n\n async #diskRead(\n k: string,\n v: Buffer | undefined,\n integrity?: Integrity,\n ) {\n const intFile = this.#maybeIntegrityPath(integrity)\n const file = this.path(k)\n const p =\n intFile ?\n readFile(intFile).catch(async () => {\n // if we get the value, but not integrity, link to the\n // integrity file so we get it next time.\n const value = await readFile(file)\n await link(file, intFile)\n return value\n })\n : readFile(file)\n return p.catch(() => v)\n }\n}\n"]}
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { error } from '@vltpkg/error-cause'\nimport type { Integrity } from '@vltpkg/types'\nimport { XDG } from '@vltpkg/xdg'\nimport { createHash, randomBytes } from 'node:crypto'\nimport { opendirSync, readFileSync } from 'node:fs'\nimport type { Dirent } from 'node:fs'\nimport {\n link,\n mkdir,\n opendir,\n readFile,\n rename,\n writeFile,\n} from 'node:fs/promises'\nimport { LRUCache } from 'lru-cache'\nimport { resolve, basename, dirname } from 'node:path'\nimport { rimraf } from 'rimraf'\n\nexport type CacheFetchContext =\n | {\n integrity?: Integrity\n }\n | undefined\n\nexport type CacheOptions = {\n [k in keyof LRUCache.Options<\n string,\n Buffer,\n CacheFetchContext\n >]?: LRUCache.Options<string, Buffer, CacheFetchContext>[k]\n} & {\n /**\n * fetchMethod may not be provided, because this cache forces its own\n * read-from-disk as the fetchMethod\n */\n fetchMethod?: undefined\n /**\n * folder where items should be stored to disk\n */\n path: string\n /**\n * called whenever an item is written to disk.\n */\n onDiskWrite?: (path: string, key: string, data: Buffer) => any\n /**\n * called whenever an item is deleted with `cache.delete(key, true)`\n * Deletes of the in-memory data do not trigger this method.\n */\n onDiskDelete?: (path: string, key: string, deleted: boolean) => any\n}\n\nexport type BooleanOrVoid = boolean | void\n\nconst hash = (s: string) =>\n createHash('sha512').update(s).digest('hex')\n\nexport class Cache extends LRUCache<\n string,\n Buffer,\n CacheFetchContext\n> {\n #path: string;\n [Symbol.toStringTag] = '@vltpkg/cache.Cache'\n #random: string = randomBytes(6).toString('hex')\n #i = 0\n #pending = new Set<Promise<BooleanOrVoid>>()\n onDiskWrite?: CacheOptions['onDiskWrite']\n onDiskDelete?: CacheOptions['onDiskDelete']\n\n /**\n * ensure we get a different random key for every write,\n * just in case the same file tries to write multiple times,\n * it'll still be atomic.\n */\n get random(): string {\n return this.#random + '.' + String(this.#i++)\n }\n\n /**\n * A list of the actions currently happening in the background\n */\n get pending() {\n return [...this.#pending]\n }\n\n /**\n * By default, cache up to 1000 items in memory.\n * Disk cache is unbounded.\n */\n static get defaultMax() {\n return 10_000\n }\n\n constructor(options: CacheOptions) {\n const {\n onDiskWrite,\n onDiskDelete,\n path = new XDG('vlt').cache(),\n fetchMethod: _,\n sizeCalculation = options.maxSize || options.maxEntrySize ?\n (v: Buffer, k: string) => v.length + k.length\n : undefined,\n ...lruOpts\n } = options\n\n super({\n max: Cache.defaultMax,\n ...lruOpts,\n sizeCalculation,\n fetchMethod: async (k, v, opts) => {\n // do not write back to disk, since we just got it from there.\n Object.assign(opts.options, {\n noDiskWrite: true,\n })\n return this.#diskRead(k, v, opts.context?.integrity)\n },\n allowStaleOnFetchRejection: true,\n allowStaleOnFetchAbort: true,\n allowStale: true,\n noDeleteOnStaleGet: true,\n })\n this.onDiskWrite = onDiskWrite\n this.onDiskDelete = onDiskDelete\n this.#path = path\n }\n\n /**\n * Walk over all the items cached to disk (not just in memory).\n * Useful for cleanup, pruning, etc.\n *\n * Implementation for `for await` to walk over entries.\n */\n async *walk() {\n const dir = await opendir(this.#path, { bufferSize: 1024 })\n for await (const entry of dir) {\n const f = resolve(this.#path, entry.name)\n if (f.endsWith('.key')) {\n const entry: [string, Buffer] = await Promise.all([\n readFile(resolve(this.#path, f), 'utf8'),\n readFile(\n resolve(\n this.#path,\n f.substring(0, f.length - '.key'.length),\n ),\n ),\n ])\n yield entry\n }\n }\n }\n\n [Symbol.asyncIterator](): AsyncGenerator<\n [string, Buffer],\n void,\n void\n > {\n return this.walk()\n }\n\n /**\n * Synchronous form of Cache.walk()\n */\n *walkSync() {\n const dir = opendirSync(this.#path, { bufferSize: 1024 })\n let entry: Dirent | null = null\n while (null !== (entry = dir.readSync())) {\n const f = resolve(this.#path, entry.name)\n if (f.endsWith('.key')) {\n const entry: [string, Buffer] = [\n readFileSync(resolve(this.#path, f), 'utf8'),\n readFileSync(\n resolve(\n this.#path,\n f.substring(0, f.length - '.key'.length),\n ),\n ),\n ]\n yield entry\n }\n }\n dir.closeSync()\n }\n [Symbol.iterator](): Generator<[string, Buffer], void> {\n return this.walkSync()\n }\n\n #unpend<F extends (...a: any[]) => any>(\n p: Promise<BooleanOrVoid>,\n fn: F | undefined,\n ...args: Parameters<F>\n ) {\n this.#pending.delete(p)\n if (fn) fn(...args)\n }\n\n #pend(p: Promise<BooleanOrVoid>) {\n this.#pending.add(p)\n }\n\n /**\n * Pass `true` as second argument to delete not just from the in-memory\n * cache, but the disk backing as well.\n */\n delete(\n key: string,\n fromDisk = false,\n integrity?: Integrity,\n ): boolean {\n const ret = super.delete(key)\n if (fromDisk) {\n const path = this.path(key)\n const p: Promise<void> = this.#diskDelete(path, integrity).then(\n deleted =>\n this.#unpend(p, this.onDiskDelete, path, key, deleted),\n )\n this.#pend(p)\n }\n return ret\n }\n\n /**\n * Sets an item in the memory cache (like `LRUCache.set`), and schedules a\n * background operation to write it to disk.\n *\n * Use the {@link CacheOptions#onDiskWrite} method to know exactly when this\n * happens, or `await cache.promise()` to defer until all pending actions are\n * completed.\n *\n * The `noDiskWrite` option can be set to prevent it from writing back to the\n * disk cache. This is almost never relevant for consumers, and is used\n * internally to prevent the write at the end of `fetch()` from excessively\n * writing over a file we just read from.\n */\n set(\n key: string,\n val: Buffer,\n options?: LRUCache.SetOptions<\n string,\n Buffer,\n CacheFetchContext\n > & {\n /** set to `true` to prevent writes to disk cache */\n noDiskWrite?: boolean\n /** sha512 integrity string */\n integrity?: Integrity\n },\n ) {\n super.set(key, val, options)\n const { noDiskWrite, integrity } = options ?? {}\n // set/delete also used internally by LRUCache to manage async fetches\n // only write when we're putting an actual value into the cache\n if (Buffer.isBuffer(val) && !noDiskWrite) {\n // best effort, already have it in memory\n const path = this.path(key)\n const p: Promise<void> = this.#diskWrite(\n path,\n key,\n val,\n integrity,\n )\n /* c8 ignore next */\n .catch(() => {})\n .then(() => this.#unpend(p, this.onDiskWrite, path, key, val))\n this.#pend(p)\n }\n return this\n }\n\n /**\n * Resolves when there are no pending writes to the disk cache\n */\n async promise(): Promise<void> {\n if (this.pending.length) await Promise.all(this.pending)\n /* c8 ignore next - race condition */\n if (this.#pending.size) await this.promise()\n }\n\n /**\n * given a key, figure out the path on disk where it lives\n */\n path(key?: string) {\n return key ? resolve(this.#path, hash(key)) : this.#path\n }\n /**\n * given an SRI sha512 integrity string, get the path on disk that\n * is hard-linked to the value.\n */\n integrityPath(integrity?: Integrity) {\n if (!integrity) return undefined\n const m = /^sha512-([a-zA-Z0-9/+]{86}==)$/.exec(integrity)\n const hash = m?.[1]\n if (!hash) {\n throw error('invalid integrity value', {\n found: integrity,\n wanted: /^sha512-([a-zA-Z0-9/+]{86}==)$/,\n })\n }\n const base = Buffer.from(hash, 'base64').toString('hex')\n return resolve(this.#path, base)\n }\n\n /**\n * Read synchronously from the fs cache storage if not already\n * in memory.\n */\n fetchSync(\n key: string,\n opts?: LRUCache.FetchOptions<string, Buffer, CacheFetchContext>,\n ) {\n const v = this.get(key)\n if (v) return v\n const intFile = this.#maybeIntegrityPath(opts?.context?.integrity)\n if (intFile) {\n try {\n const v = readFileSync(intFile)\n this.set(key, v, { ...opts, noDiskWrite: true })\n return v\n /* c8 ignore start */\n } catch {}\n }\n /* c8 ignore stop */\n try {\n const v = readFileSync(this.path(key))\n // suppress the disk write, because we just read it from disk\n this.set(key, v, { ...opts, noDiskWrite: true })\n return v\n /* c8 ignore start */\n } catch {}\n }\n /* c8 ignore stop */\n\n /**\n * Delete path and path + '.key'\n */\n async #diskDelete(\n path: string,\n integrity?: Integrity,\n ): Promise<boolean> {\n const intPath = this.#maybeIntegrityPath(integrity)\n const paths = [path, path + '.key']\n if (intPath) paths.push(intPath)\n return await rimraf(paths)\n }\n\n #maybeIntegrityPath(i?: Integrity) {\n try {\n return this.integrityPath(i)\n } catch {}\n }\n async #diskWrite(\n path: string,\n key: string,\n val: Buffer,\n integrity?: Integrity,\n ) {\n const dir = dirname(path)\n await mkdir(dir, { recursive: true })\n const intFile = this.#maybeIntegrityPath(integrity)\n const base = basename(path)\n const keyFile = base + '.key'\n const tmp = dir + '/.' + base + '.' + this.random\n const keyTmp = dir + '/.' + keyFile + '.' + this.random\n const writeData =\n intFile ?\n // try to just link into the temp location, rather than write\n // may fail with ENOENT or EEXIST, in which case, write normally\n link(intFile, tmp).catch(() => writeFile(tmp, val))\n // don't have it by integrity, write the new entry\n : writeFile(tmp, val)\n return Promise.all([\n writeData.then(() => rename(tmp, path)),\n writeFile(keyTmp, key).then(() =>\n rename(keyTmp, path + '.key'),\n ),\n ]).then(() => {\n if (intFile) {\n return link(path, intFile)\n }\n })\n }\n\n async #diskRead(\n k: string,\n v: Buffer | undefined,\n integrity?: Integrity,\n ) {\n const intFile = this.#maybeIntegrityPath(integrity)\n const file = this.path(k)\n const p =\n intFile ?\n readFile(intFile).catch(async () => {\n // if we get the value, but not integrity, link to the\n // integrity file so we get it next time.\n const value = await readFile(file)\n await link(file, intFile)\n return value\n })\n : readFile(file)\n return p.catch(() => v)\n }\n}\n"]}
{
"name": "@vltpkg/cache",
"description": "The filesystem cache for `@vlt/registry-client`",
"version": "0.0.0-8",
"version": "0.0.0-9",
"repository": {

@@ -24,5 +24,5 @@ "type": "git",

"rimraf": "^6.0.1",
"@vltpkg/error-cause": "0.0.0-8",
"@vltpkg/xdg": "0.0.0-8",
"@vltpkg/types": "0.0.0-8"
"@vltpkg/error-cause": "0.0.0-9",
"@vltpkg/xdg": "0.0.0-9",
"@vltpkg/types": "0.0.0-9"
},

@@ -29,0 +29,0 @@ "devDependencies": {