///
export interface CacheObject {
/** Subresource Integrity hash for the content this entry refers to. */
integrity: string;
/** Key the entry was looked up under. Matches the key argument. */
key: string;
/** User-assigned metadata associated with the entry/content. */
metadata?: any;
/** Filesystem path where content is stored, joined with cache argument. */
path: string;
/** Timestamp the entry was first added on. */
time: number;
}
export interface GetCacheObject {
metadata?: any;
integrity: string;
data: Buffer;
size: number;
}
export namespace get {
interface HasContentObject {
size: number;
sri: {
algorithm: string;
digest: string;
options: any[];
source: string;
};
}
interface Options {
/**
* If present, the pre-calculated digest for the inserted content. If
* this option is provided and does not match the post-insertion digest,
* insertion will fail with an `EINTEGRITY` error.
*
* `algorithms` has no effect if this option is present.
*/
integrity?: string | undefined;
/**
* Default: `null`
*
* If provided, cacache will memoize the given cache insertion in
* memory, bypassing any filesystem checks for that key or digest in
* future cache fetches. Nothing will be written to the in-memory cache
* unless this option is explicitly truthy.
*
* If `opts.memoize` is an object or a `Map`-like (that is, an object
* with `get` and `set` methods), it will be written to instead of the
* global memoization cache.
*
* Reading from disk data can be forced by explicitly passing
* `memoize: false` to the reader functions, but their default will be
* to read from memory.
*/
memoize?: null | boolean | undefined;
/**
* If provided, the data stream will be verified to check that enough
* data was passed through. If there's more or less data than expected,
* insertion will fail with an `EBADSIZE` error.
*/
size?: number | undefined;
}
namespace copy {
function byDigest(cachePath: string, hash: string, dest: string, opts?: Options): Promise;
}
namespace stream {
function byDigest(cachePath: string, hash: string, opts?: Options): NodeJS.ReadableStream;
}
function byDigest(cachePath: string, hash: string, opts?: Options): Promise;
function copy(cachePath: string, key: string, dest: string, opts?: Options): Promise;
/**
* Looks up a Subresource Integrity hash in the cache. If content exists
* for this `integrity`, it will return an object, with the specific single
* integrity hash that was found in sri key, and the size of the found
* content as size. If no content exists for this integrity, it will return
* `false`.
*/
function hasContent(cachePath: string, hash: string): Promise;
function hasContentnc(cachePath: string, hash: string): HasContentObject | false;
/**
* Looks up `key` in the cache index, returning information about the entry
* if one exists.
*/
function info(cachePath: string, key: string): Promise;
/**
* Returns a Readable Stream of the cached data identified by `key`.
*
* If there is no content identified by `key`, or if the locally-stored data
* does not pass the validity checksum, an error will be emitted.
*
* `metadata` and `integrity` events will be emitted before the stream
* closes, if you need to collect that extra data about the cached entry.
*
* A sub-function, `get.stream.byDigest` may be used for identical behavior,
* except lookup will happen by integrity hash, bypassing the index
* entirely. This version does not emit the `metadata` and `integrity`
* events at all.
*/
function stream(cachePath: string, key: string, opts?: Options): NodeJS.ReadableStream;
}
export namespace ls {
type Cache = Record;
/**
* Lists info for all entries currently in the cache as a single large
* object.
*
* This works just like `ls`, except `get.info` entries are returned as
* `'data'` events on the returned stream.
*/
function stream(cachePath: string): NodeJS.ReadableStream;
}
export namespace put {
interface Options {
/**
* Default: `['sha512']`
*
* Hashing algorithms to use when calculating the subresource integrity
* digest for inserted data. Can use any algorithm listed in
* `crypto.getHashes()` or `'omakase'`/`'お任せします'` to pick a random
* hash algorithm on each insertion. You may also use any anagram of
* `'modnar'` to use this feature.
*
* Currently only supports one algorithm at a time (i.e., an array
* length of exactly `1`). Has no effect if `opts.integrity` is present.
*/
algorithms?: string[] | undefined;
/**
* If present, the pre-calculated digest for the inserted content. If
* this option is provided and does not match the post-insertion digest,
* insertion will fail with an `EINTEGRITY` error.
*
* `algorithms` has no effect if this option is present.
*/
integrity?: string | undefined;
/** Arbitrary metadata to be attached to the inserted key. */
metadata?: any;
/**
* Default: `null`
*
* If provided, cacache will memoize the given cache insertion in
* memory, bypassing any filesystem checks for that key or digest in
* future cache fetches. Nothing will be written to the in-memory cache
* unless this option is explicitly truthy.
*
* If `opts.memoize` is an object or a `Map`-like (that is, an object
* with `get` and `set` methods), it will be written to instead of the
* global memoization cache.
*
* Reading from disk data can be forced by explicitly passing
* `memoize: false` to the reader functions, but their default will be
* to read from memory.
*/
memoize?: null | boolean | undefined;
/**
* If provided, the data stream will be verified to check that enough
* data was passed through. If there's more or less data than expected,
* insertion will fail with an `EBADSIZE` error.
*/
size?: number | undefined;
/**
* Default: `null`
*
* Prefix to append on the temporary directory name inside the cache's tmp dir.
*/
tmpPrefix?: null | string | undefined;
}
/**
* Returns a Writable Stream that inserts data written to it into the cache.
* Emits an `integrity` event with the digest of written contents when it
* succeeds.
*/
function stream(cachePath: string, key: string, opts?: Options): NodeJS.WritableStream;
}
export namespace rm {
/**
* Clears the entire cache. Mainly by blowing away the cache directory
* itself.
*/
function all(cachePath: string): Promise;
/**
* Removes the index entry for `key`. Content will still be accessible if
* requested directly by content address (`get.stream.byDigest`).
*
* To remove the content itself (which might still be used by other
* entries), use `rm.content`. Or, to safely vacuum any unused content,
* use `verify`.
*/
function entry(cachePath: string, key: string): Promise;
/**
* Removes the content identified by `integrity`. Any index entries
* referring to it will not be usable again until the content is re-added
* to the cache with an identical digest.
*/
function content(cachePath: string, hash: string): Promise;
}
export namespace tmp {
type Callback = (dir: string) => void;
interface Options {
/**
* Default: 20
*
* Number of concurrently read files in the filesystem while doing clean up.
*/
concurrency?: number | undefined;
/**
* Receives a formatted entry. Return `false` to remove it.
*
* Note: might be called more than once on the same entry.
*/
filter?: string | false | undefined;
/**
* Custom logger function:
* ```
* log: { silly () {} }
* log.silly('verify', 'verifying cache at', cache)
* ```
*/
log?: Record any> | undefined;
/**
* Default: `null`
*
* Prefix to append on the temporary directory name inside the cache's tmp dir.
*/
tmpPrefix?: null | string | undefined;
}
/**
* Sets the `uid` and `gid` properties on all files and folders within the
* tmp folder to match the rest of the cache.
*
* Use this after manually writing files into `tmp.mkdir` or `tmp.withTmp`.
*/
function fix(cachePath: string): Promise;
/**
* Returns a unique temporary directory inside the cache's `tmp` dir. This
* directory will use the same safe user assignment that all the other stuff
* use.
*
* Once the directory is made, it's the user's responsibility that all files
* within are given the appropriate `gid`/`uid` ownership settings to match
* the rest of the cache. If not, you can ask cacache to do it for you by
* calling `tmp.fix()`, which will fix all tmp directory permissions.
*
* If you want automatic cleanup of this directory, use `tmp.withTmp()`
*/
function mkdir(cachePath: string, opts?: Options): Promise;
/**
* Creates a temporary directory with `tmp.mkdir()` and calls `cb` with it.
* The created temporary directory will be removed when the return value of
* `cb()` resolves, the tmp directory will be automatically deleted once that
* promise completes.
*
* The same caveats apply when it comes to managing permissions for the tmp dir's contents.
*/
function withTmp(cachePath: string, opts: Options, cb: Callback): void;
function withTmp(cachePath: string, cb: Callback): void;
}
export namespace verify {
interface Options {
/**
* Default: 20
*
* Number of concurrently read files in the filesystem while doing clean up.
*/
concurrency?: number | undefined;
/**
* Receives a formatted entry. Return `false` to remove it.
*
* Note: might be called more than once on the same entry.
*/
filter?: string | false | undefined;
/**
* Custom logger function:
* ```
* log: { silly () {} }
* log.silly('verify', 'verifying cache at', cache)
* ```
*/
log?: Record any> | undefined;
}
/**
* Returns a Date representing the last time `cacache.verify` was run on
* `cache`.
*/
function lastRun(cachePath: string): Promise;
}
export function clearMemoized(): Record;
/**
* Returns an object with the cached data, digest, and metadata identified by
* `key`. The `data` property of this object will be a Buffer instance that
* presumably holds some data that means something to you. I'm sure you know
* what to do with it! cacache just won't care.
*
* `integrity` is a Subresource Integrity string. That is, a string that can be
* used to verify `data`, which looks like
* `-`.
*
* If there is no content identified by key, or if the locally-stored data does
* not pass the validity checksum, the promise will be rejected.
*
* A sub-function, `get.byDigest` may be used for identical behavior, except
* lookup will happen by integrity hash, bypassing the index entirely. This
* version of the function only returns data itself, without any wrapper.
*
* **Note**
*
* This function loads the entire cache entry into memory before returning it.
* If you're dealing with Very Large data, consider using `get.stream` instead.
*/
export function get(cachePath: string, key: string, options?: get.Options): Promise;
/**
* Lists info for all entries currently in the cache as a single large object.
* Each entry in the object will be keyed by the unique index key, with
* corresponding `get.info` objects as the values.
*/
export function ls(cachePath: string): Promise;
/**
* Inserts data passed to it into the cache. The returned Promise resolves with
* a digest (generated according to `opts.algorithms`) after the cache entry has
* been successfully written.
*/
export function put(cachePath: string, key: string, data: any, opts?: put.Options): Promise;
/**
* Removes the index entry for `key`. Content will still be accessible if
* requested directly by content address (`get.stream.byDigest`).
*
* To remove the content itself (which might still be used by other
* entries), use `rm.content`. Or, to safely vacuum any unused content,
* use `verify`.
*/
export function rm(cachePath: string, key: string): Promise;
/**
* Checks out and fixes up your cache:
*
* - Cleans up corrupted or invalid index entries
* - Custom entry filtering options
* - Garbage collects any content entries not referenced by the index
* - Checks integrity for all content entries and removes invalid content
* - Fixes cache ownership
* - Removes the `tmp` directory in the cache and all its contents.
*
* When it's done, it'll return an object with various stats about the
* verification process, including amount of storage reclaimed, number of valid
* entries, number of entries removed, etc.
*/
export function verify(cachePath: string, opts?: verify.Options): Promise;