@lage-run/cache 1.4.12 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/backfillWrapper.js +4 -0
- package/lib/backfillWrapper.js.map +1 -1
- package/lib/getCacheDirectory.js +6 -0
- package/lib/getCacheDirectory.js.map +1 -1
- package/lib/index.js +7 -0
- package/lib/index.js.map +1 -1
- package/lib/providers/RemoteFallbackCacheProvider.js +10 -3
- package/lib/providers/RemoteFallbackCacheProvider.js.map +1 -1
- package/package.json +7 -7
package/lib/backfillWrapper.js
CHANGED
|
@@ -4,6 +4,10 @@
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
+
0 && (module.exports = {
|
|
8
|
+
createBackfillCacheConfig: null,
|
|
9
|
+
createBackfillLogger: null
|
|
10
|
+
});
|
|
7
11
|
function _export(target, all) {
|
|
8
12
|
for(var name in all)Object.defineProperty(target, name, {
|
|
9
13
|
enumerable: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/backfillWrapper.ts"],"sourcesContent":["/**\n * Backfill wrappers: some functions that uses the `backfill` library that doesn't require them to be inside a class\n */\n\nimport * as os from \"os\";\nimport { type Config, createDefaultConfig, getEnvConfig } from \"backfill-config\";\nimport { makeLogger } from \"backfill-logger\";\nimport type { Logger as BackfillLogger } from \"backfill-logger\";\nimport type { CacheOptions } from \"@lage-run/config\";\nimport type { AzureCredentialName } from \"@lage-run/config\";\nimport { CredentialCache } from \"./CredentialCache.js\";\n\nexport function createBackfillLogger(): BackfillLogger {\n const stdout = process.stdout;\n const stderr = process.stderr;\n return makeLogger(\"error\", {\n console: {\n info(...args) {\n stdout.write(args.join(\" \") + os.EOL);\n },\n warn(...args) {\n stderr.write(args.join(\" \") + os.EOL);\n },\n error(...args) {\n stderr.write(args.join(\" \") + os.EOL);\n },\n },\n });\n}\n\nexport function createBackfillCacheConfig(\n cwd: string,\n cacheOptions: Partial<CacheOptions> | undefined = {},\n backfillLogger: BackfillLogger\n): Config {\n const envConfig = getEnvConfig(backfillLogger);\n const mergedConfig = {\n ...createDefaultConfig(cwd),\n ...cacheOptions,\n ...envConfig,\n } as Config;\n\n if (mergedConfig.cacheStorageConfig.provider === \"azure-blob\") {\n const azureOptions = mergedConfig.cacheStorageConfig.options;\n if (\"connectionString\" in azureOptions && !isTokenConnectionString(azureOptions.connectionString)) {\n /** Pass through optional credentialName from config to select a specific credential implementation\n * Type assertion: only the connection-string variant is augmented with credentialName in @lage-run/config\n */\n const name = (azureOptions as { credentialName?: AzureCredentialName }).credentialName as string | undefined;\n if (name != null) {\n if (!CredentialCache.credentialNames.includes(name as AzureCredentialName)) {\n throw new Error(\n `Invalid cacheStorageConfig.options.credentialName: \"${name}\". Allowed values: ${CredentialCache.credentialNames.join(\", \")}`\n );\n }\n azureOptions.credential = CredentialCache.getInstance(name as AzureCredentialName);\n } else {\n /** No name provided in config: if env var AZURE_IDENTITY_CREDENTIAL_NAME is set, honor it; otherwise default to EnvironmentCredential\n */\n const envName = process.env.AZURE_IDENTITY_CREDENTIAL_NAME as string | undefined;\n if (envName != null) {\n if (!CredentialCache.credentialNames.includes(envName as AzureCredentialName)) {\n throw new Error(\n `Invalid AZURE_IDENTITY_CREDENTIAL_NAME: \"${envName}\". Allowed values: ${CredentialCache.credentialNames.join(\", \")}`\n );\n }\n azureOptions.credential = CredentialCache.getInstance(envName as AzureCredentialName);\n } else {\n // Fall back to EnvironmentCredential\n azureOptions.credential = CredentialCache.getInstance();\n }\n }\n }\n }\n\n return mergedConfig;\n}\n\nfunction isTokenConnectionString(connectionString: string) {\n return connectionString.includes(\"SharedAccessSignature\") || connectionString.includes(\"AccountKey\");\n}\n"],"names":["createBackfillCacheConfig","createBackfillLogger","stdout","process","stderr","makeLogger","console","info","args","write","join","os","EOL","warn","error","cwd","cacheOptions","backfillLogger","envConfig","getEnvConfig","mergedConfig","createDefaultConfig","cacheStorageConfig","provider","azureOptions","options","isTokenConnectionString","connectionString","name","credentialName","CredentialCache","credentialNames","includes","Error","credential","getInstance","envName","env","AZURE_IDENTITY_CREDENTIAL_NAME"],"mappings":"AAAA;;CAEC
|
|
1
|
+
{"version":3,"sources":["../src/backfillWrapper.ts"],"sourcesContent":["/**\n * Backfill wrappers: some functions that uses the `backfill` library that doesn't require them to be inside a class\n */\n\nimport * as os from \"os\";\nimport { type Config, createDefaultConfig, getEnvConfig } from \"backfill-config\";\nimport { makeLogger } from \"backfill-logger\";\nimport type { Logger as BackfillLogger } from \"backfill-logger\";\nimport type { CacheOptions } from \"@lage-run/config\";\nimport type { AzureCredentialName } from \"@lage-run/config\";\nimport { CredentialCache } from \"./CredentialCache.js\";\n\nexport function createBackfillLogger(): BackfillLogger {\n const stdout = process.stdout;\n const stderr = process.stderr;\n return makeLogger(\"error\", {\n console: {\n info(...args) {\n stdout.write(args.join(\" \") + os.EOL);\n },\n warn(...args) {\n stderr.write(args.join(\" \") + os.EOL);\n },\n error(...args) {\n stderr.write(args.join(\" \") + os.EOL);\n },\n },\n });\n}\n\nexport function createBackfillCacheConfig(\n cwd: string,\n cacheOptions: Partial<CacheOptions> | undefined = {},\n backfillLogger: BackfillLogger\n): Config {\n const envConfig = getEnvConfig(backfillLogger);\n const mergedConfig = {\n ...createDefaultConfig(cwd),\n ...cacheOptions,\n ...envConfig,\n } as Config;\n\n if (mergedConfig.cacheStorageConfig.provider === \"azure-blob\") {\n const azureOptions = mergedConfig.cacheStorageConfig.options;\n if (\"connectionString\" in azureOptions && !isTokenConnectionString(azureOptions.connectionString)) {\n /** Pass through optional credentialName from config to select a specific credential implementation\n * Type assertion: only the connection-string variant is augmented with credentialName in @lage-run/config\n */\n const name = (azureOptions as { credentialName?: AzureCredentialName }).credentialName as string | undefined;\n if (name != null) {\n if (!CredentialCache.credentialNames.includes(name as AzureCredentialName)) {\n throw new Error(\n `Invalid cacheStorageConfig.options.credentialName: \"${name}\". Allowed values: ${CredentialCache.credentialNames.join(\", \")}`\n );\n }\n azureOptions.credential = CredentialCache.getInstance(name as AzureCredentialName);\n } else {\n /** No name provided in config: if env var AZURE_IDENTITY_CREDENTIAL_NAME is set, honor it; otherwise default to EnvironmentCredential\n */\n const envName = process.env.AZURE_IDENTITY_CREDENTIAL_NAME as string | undefined;\n if (envName != null) {\n if (!CredentialCache.credentialNames.includes(envName as AzureCredentialName)) {\n throw new Error(\n `Invalid AZURE_IDENTITY_CREDENTIAL_NAME: \"${envName}\". Allowed values: ${CredentialCache.credentialNames.join(\", \")}`\n );\n }\n azureOptions.credential = CredentialCache.getInstance(envName as AzureCredentialName);\n } else {\n // Fall back to EnvironmentCredential\n azureOptions.credential = CredentialCache.getInstance();\n }\n }\n }\n }\n\n return mergedConfig;\n}\n\nfunction isTokenConnectionString(connectionString: string) {\n return connectionString.includes(\"SharedAccessSignature\") || connectionString.includes(\"AccountKey\");\n}\n"],"names":["createBackfillCacheConfig","createBackfillLogger","stdout","process","stderr","makeLogger","console","info","args","write","join","os","EOL","warn","error","cwd","cacheOptions","backfillLogger","envConfig","getEnvConfig","mergedConfig","createDefaultConfig","cacheStorageConfig","provider","azureOptions","options","isTokenConnectionString","connectionString","name","credentialName","CredentialCache","credentialNames","includes","Error","credential","getInstance","envName","env","AZURE_IDENTITY_CREDENTIAL_NAME"],"mappings":"AAAA;;CAEC;;;;;;;;;;;;;;;QA4BeA;eAAAA;;QAlBAC;eAAAA;;;4DARI;gCAC2C;gCACpC;iCAIK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEzB,SAASA;IACd,MAAMC,SAASC,QAAQD,MAAM;IAC7B,MAAME,SAASD,QAAQC,MAAM;IAC7B,OAAOC,IAAAA,0BAAU,EAAC,SAAS;QACzBC,SAAS;YACPC,MAAK,GAAGC,IAAI;gBACVN,OAAOO,KAAK,CAACD,KAAKE,IAAI,CAAC,OAAOC,IAAGC,GAAG;YACtC;YACAC,MAAK,GAAGL,IAAI;gBACVJ,OAAOK,KAAK,CAACD,KAAKE,IAAI,CAAC,OAAOC,IAAGC,GAAG;YACtC;YACAE,OAAM,GAAGN,IAAI;gBACXJ,OAAOK,KAAK,CAACD,KAAKE,IAAI,CAAC,OAAOC,IAAGC,GAAG;YACtC;QACF;IACF;AACF;AAEO,SAASZ,0BACde,GAAW,EACXC,eAAkD,CAAC,CAAC,EACpDC,cAA8B;IAE9B,MAAMC,YAAYC,IAAAA,4BAAY,EAACF;IAC/B,MAAMG,eAAe;QACnB,GAAGC,IAAAA,mCAAmB,EAACN,IAAI;QAC3B,GAAGC,YAAY;QACf,GAAGE,SAAS;IACd;IAEA,IAAIE,aAAaE,kBAAkB,CAACC,QAAQ,KAAK,cAAc;QAC7D,MAAMC,eAAeJ,aAAaE,kBAAkB,CAACG,OAAO;QAC5D,IAAI,sBAAsBD,gBAAgB,CAACE,wBAAwBF,aAAaG,gBAAgB,GAAG;YACjG;;OAEC,GACD,MAAMC,OAAO,AAACJ,aAA0DK,cAAc;YACtF,IAAID,QAAQ,MAAM;gBAChB,IAAI,CAACE,gCAAe,CAACC,eAAe,CAACC,QAAQ,CAACJ,OAA8B;oBAC1E,MAAM,IAAIK,MACR,CAAC,oDAAoD,EAAEL,KAAK,mBAAmB,EAAEE,gCAAe,CAACC,eAAe,CAACrB,IAAI,CAAC,OAAO;gBAEjI;gBACAc,aAAaU,UAAU,GAAGJ,gCAAe,CAACK,WAAW,CAACP;YACxD,OAAO;gBACL;SACC,GACD,MAAMQ,UAAUjC,QAAQkC,GAAG,CAACC,8BAA8B;gBAC1D,IAAIF,WAAW,MAAM;oBACnB,IAAI,CAACN,gCAAe,CAACC,eAAe,CAACC,QAAQ,CAACI,UAAiC;wBAC7E,MAAM,IAAIH,MACR,CAAC,yCAAyC,EAAEG,QAAQ,mBAAmB,EAAEN,gCAAe,CAACC,eAAe,CAACrB,IAAI,CAAC,OAAO;oBAEzH;oBACAc,aAAaU,UAAU,GAAGJ,gCAAe,CAACK,WAAW,CAACC;gBACxD,OAAO;oBACL,qCAAqC;oBACrCZ,aAAaU,UAAU,GAAGJ,gCAAe,CAACK,WAAW;gBACvD;YACF;QACF;IACF;IAEA,OAAOf;AACT;AAEA,SAASM,wBAAwBC,gBAAwB;IACvD,OAAOA,iBAAiBK,QAAQ,CAAC,4BAA4BL,iBAAiBK,QAAQ,CAAC;AACzF"}
|
package/lib/getCacheDirectory.js
CHANGED
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
|
+
0 && (module.exports = {
|
|
6
|
+
getCacheDirectory: null,
|
|
7
|
+
getCacheDirectoryRoot: null,
|
|
8
|
+
getHashCacheDirectories: null,
|
|
9
|
+
getLogsCacheDirectory: null
|
|
10
|
+
});
|
|
5
11
|
function _export(target, all) {
|
|
6
12
|
for(var name in all)Object.defineProperty(target, name, {
|
|
7
13
|
enumerable: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/getCacheDirectory.ts"],"sourcesContent":["import path from \"path\";\n\n/**\n * Get the root cache directory: `<root>/node_modules/.cache/lage`\n */\nexport function getCacheDirectoryRoot(root: string): string {\n return path.join(root, \"node_modules\", \".cache\", \"lage\");\n}\n\n/**\n * Get the cache subdirectory for a hash: `<root>/node_modules/.cache/lage/cache/ab12`\n * for a hash that starts with `ab12`\n */\nexport function getCacheDirectory(root: string, hash: string): string {\n return path.join(getHashCacheDirectories(root).cache, hash.substring(0, 4));\n}\n\n/**\n * Get the logs subdirectory for a hash: `<root>/node_modules/.cache/lage/logs/ab12`\n * for a hash that starts with `ab12`\n */\nexport function getLogsCacheDirectory(root: string, hash: string): string {\n return path.join(getHashCacheDirectories(root).logs, hash.substring(0, 4));\n}\n\n/**\n * Get the parent `cache` and `logs` directories that contain subfolders with hash prefixes.\n */\nexport function getHashCacheDirectories(root: string): {\n /** `<root>/node_modules/.cache/lage/cache` */\n cache: string;\n /** `<root>/node_modules/.cache/lage/logs` */\n logs: string;\n} {\n return {\n cache: path.join(getCacheDirectoryRoot(root), \"cache\"),\n logs: path.join(getCacheDirectoryRoot(root), \"logs\"),\n };\n}\n"],"names":["getCacheDirectory","getCacheDirectoryRoot","getHashCacheDirectories","getLogsCacheDirectory","root","path","join","hash","cache","substring","logs"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/getCacheDirectory.ts"],"sourcesContent":["import path from \"path\";\n\n/**\n * Get the root cache directory: `<root>/node_modules/.cache/lage`\n */\nexport function getCacheDirectoryRoot(root: string): string {\n return path.join(root, \"node_modules\", \".cache\", \"lage\");\n}\n\n/**\n * Get the cache subdirectory for a hash: `<root>/node_modules/.cache/lage/cache/ab12`\n * for a hash that starts with `ab12`\n */\nexport function getCacheDirectory(root: string, hash: string): string {\n return path.join(getHashCacheDirectories(root).cache, hash.substring(0, 4));\n}\n\n/**\n * Get the logs subdirectory for a hash: `<root>/node_modules/.cache/lage/logs/ab12`\n * for a hash that starts with `ab12`\n */\nexport function getLogsCacheDirectory(root: string, hash: string): string {\n return path.join(getHashCacheDirectories(root).logs, hash.substring(0, 4));\n}\n\n/**\n * Get the parent `cache` and `logs` directories that contain subfolders with hash prefixes.\n */\nexport function getHashCacheDirectories(root: string): {\n /** `<root>/node_modules/.cache/lage/cache` */\n cache: string;\n /** `<root>/node_modules/.cache/lage/logs` */\n logs: string;\n} {\n return {\n cache: path.join(getCacheDirectoryRoot(root), \"cache\"),\n logs: path.join(getCacheDirectoryRoot(root), \"logs\"),\n };\n}\n"],"names":["getCacheDirectory","getCacheDirectoryRoot","getHashCacheDirectories","getLogsCacheDirectory","root","path","join","hash","cache","substring","logs"],"mappings":";;;;;;;;;;;;;;;;;QAagBA;eAAAA;;QARAC;eAAAA;;QAuBAC;eAAAA;;QAPAC;eAAAA;;;6DArBC;;;;;;AAKV,SAASF,sBAAsBG,IAAY;IAChD,OAAOC,aAAI,CAACC,IAAI,CAACF,MAAM,gBAAgB,UAAU;AACnD;AAMO,SAASJ,kBAAkBI,IAAY,EAAEG,IAAY;IAC1D,OAAOF,aAAI,CAACC,IAAI,CAACJ,wBAAwBE,MAAMI,KAAK,EAAED,KAAKE,SAAS,CAAC,GAAG;AAC1E;AAMO,SAASN,sBAAsBC,IAAY,EAAEG,IAAY;IAC9D,OAAOF,aAAI,CAACC,IAAI,CAACJ,wBAAwBE,MAAMM,IAAI,EAAEH,KAAKE,SAAS,CAAC,GAAG;AACzE;AAKO,SAASP,wBAAwBE,IAAY;IAMlD,OAAO;QACLI,OAAOH,aAAI,CAACC,IAAI,CAACL,sBAAsBG,OAAO;QAC9CM,MAAML,aAAI,CAACC,IAAI,CAACL,sBAAsBG,OAAO;IAC/C;AACF"}
|
package/lib/index.js
CHANGED
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
|
+
0 && (module.exports = {
|
|
6
|
+
BackfillCacheProvider: null,
|
|
7
|
+
RemoteFallbackCacheProvider: null,
|
|
8
|
+
getCacheDirectory: null,
|
|
9
|
+
getCacheDirectoryRoot: null,
|
|
10
|
+
getLogsCacheDirectory: null
|
|
11
|
+
});
|
|
5
12
|
function _export(target, all) {
|
|
6
13
|
for(var name in all)Object.defineProperty(target, name, {
|
|
7
14
|
enumerable: true,
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { BackfillCacheProvider } from \"./providers/BackfillCacheProvider.js\";\nexport { RemoteFallbackCacheProvider } from \"./providers/RemoteFallbackCacheProvider.js\";\nexport type { CacheOptions } from \"@lage-run/config\";\nexport type { CacheProvider } from \"./types/CacheProvider.js\";\n\nexport { getCacheDirectory, getLogsCacheDirectory, getCacheDirectoryRoot } from \"./getCacheDirectory.js\";\n"],"names":["BackfillCacheProvider","RemoteFallbackCacheProvider","getCacheDirectory","getCacheDirectoryRoot","getLogsCacheDirectory"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { BackfillCacheProvider } from \"./providers/BackfillCacheProvider.js\";\nexport { RemoteFallbackCacheProvider } from \"./providers/RemoteFallbackCacheProvider.js\";\nexport type { CacheOptions } from \"@lage-run/config\";\nexport type { CacheProvider } from \"./types/CacheProvider.js\";\n\nexport { getCacheDirectory, getLogsCacheDirectory, getCacheDirectoryRoot } from \"./getCacheDirectory.js\";\n"],"names":["BackfillCacheProvider","RemoteFallbackCacheProvider","getCacheDirectory","getCacheDirectoryRoot","getLogsCacheDirectory"],"mappings":";;;;;;;;;;;;;;;;;;QAASA;eAAAA,4CAAqB;;QACrBC;eAAAA,wDAA2B;;QAI3BC;eAAAA,oCAAiB;;QAAyBC;eAAAA,wCAAqB;;QAA5CC;eAAAA,wCAAqB;;;uCALX;6CACM;mCAIoC"}
|
|
@@ -24,11 +24,12 @@ function _define_property(obj, key, value) {
|
|
|
24
24
|
class RemoteFallbackCacheProvider {
|
|
25
25
|
async fetch(hash, target) {
|
|
26
26
|
const { logger, remoteCacheProvider, localCacheProvider } = this.options;
|
|
27
|
+
const skipRemoteCacheForTarget = target.skipRemoteCache === true;
|
|
27
28
|
if (localCacheProvider) {
|
|
28
29
|
RemoteFallbackCacheProvider.localHits[hash] = await localCacheProvider.fetch(hash, target);
|
|
29
30
|
logger.silly(`local cache fetch: ${hash} ${RemoteFallbackCacheProvider.localHits[hash]}`);
|
|
30
31
|
}
|
|
31
|
-
if (!RemoteFallbackCacheProvider.localHits[hash] && remoteCacheProvider) {
|
|
32
|
+
if (!skipRemoteCacheForTarget && !RemoteFallbackCacheProvider.localHits[hash] && remoteCacheProvider) {
|
|
32
33
|
RemoteFallbackCacheProvider.remoteHits[hash] = await remoteCacheProvider.fetch(hash, target);
|
|
33
34
|
logger.silly(`remote fallback fetch: ${hash} ${RemoteFallbackCacheProvider.remoteHits[hash]}`);
|
|
34
35
|
// now save this into the localCacheProvider, if available
|
|
@@ -49,8 +50,14 @@ class RemoteFallbackCacheProvider {
|
|
|
49
50
|
logger.silly(`local cache put: ${hash}`);
|
|
50
51
|
putPromises.push(localCacheProvider.put(hash, target));
|
|
51
52
|
}
|
|
52
|
-
|
|
53
|
-
|
|
53
|
+
/**
|
|
54
|
+
* Write to remote if:
|
|
55
|
+
* - the target has not disabled remote caching
|
|
56
|
+
* - there is no hit in the remote cache
|
|
57
|
+
* - a remote cache storage provider exists
|
|
58
|
+
* - the "writeRemoteCache" config flag is set to true
|
|
59
|
+
*/ const skipRemoteCacheForTarget = target.skipRemoteCache === true;
|
|
60
|
+
const shouldWriteRemoteCache = !skipRemoteCacheForTarget && !this.isRemoteHit(hash) && !!remoteCacheProvider && writeRemoteCache;
|
|
54
61
|
if (shouldWriteRemoteCache) {
|
|
55
62
|
logger.silly(`remote fallback put: ${hash}`);
|
|
56
63
|
const remotePut = remoteCacheProvider.put(hash, target);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/providers/RemoteFallbackCacheProvider.ts"],"sourcesContent":["import type { CacheProvider } from \"../types/CacheProvider.js\";\nimport type { Logger } from \"@lage-run/logger\";\nimport type { Target } from \"@lage-run/target-graph\";\n\nexport interface RemoteFallbackCacheProviderOptions {\n root: string;\n logger: Logger;\n\n localCacheProvider?: CacheProvider;\n remoteCacheProvider?: CacheProvider;\n\n writeRemoteCache?: boolean;\n}\n\n/**\n * Remote Fallback Cache Provider\n *\n * This backfill cache provider will fallback to a remote cache provider if the local cache does not contain the item.\n * It will also automatically populate the local cache with the remote cache.\n */\nexport class RemoteFallbackCacheProvider implements CacheProvider {\n private static localHits: { [hash: string]: boolean } = {};\n private static remoteHits: { [hash: string]: boolean } = {};\n\n constructor(private options: RemoteFallbackCacheProviderOptions) {}\n\n public async fetch(hash: string, target: Target): Promise<boolean> {\n const { logger, remoteCacheProvider, localCacheProvider } = this.options;\n\n if (localCacheProvider) {\n RemoteFallbackCacheProvider.localHits[hash] = await localCacheProvider.fetch(hash, target);\n logger.silly(`local cache fetch: ${hash} ${RemoteFallbackCacheProvider.localHits[hash]}`);\n }\n\n if (!RemoteFallbackCacheProvider.localHits[hash] && remoteCacheProvider) {\n RemoteFallbackCacheProvider.remoteHits[hash] = await remoteCacheProvider.fetch(hash, target);\n logger.silly(`remote fallback fetch: ${hash} ${RemoteFallbackCacheProvider.remoteHits[hash]}`);\n\n // now save this into the localCacheProvider, if available\n if (localCacheProvider && RemoteFallbackCacheProvider.remoteHits[hash]) {\n logger.silly(`local cache put, fetched cache from remote: ${hash}`);\n await localCacheProvider.put(hash, target);\n }\n\n return RemoteFallbackCacheProvider.remoteHits[hash];\n }\n\n return RemoteFallbackCacheProvider.localHits[hash];\n }\n\n public async put(hash: string, target: Target): Promise<void> {\n const { logger, remoteCacheProvider, localCacheProvider, writeRemoteCache } = this.options;\n const putPromises: Promise<void>[] = [];\n\n // Write local cache if it doesn't already exist, or if the the hash isn't in the localHits\n const shouldWriteLocalCache = !this.isLocalHit(hash) && !!localCacheProvider;\n\n if (shouldWriteLocalCache) {\n logger.silly(`local cache put: ${hash}`);\n putPromises.push(localCacheProvider.put(hash, target));\n }\n\n
|
|
1
|
+
{"version":3,"sources":["../../src/providers/RemoteFallbackCacheProvider.ts"],"sourcesContent":["import type { CacheProvider } from \"../types/CacheProvider.js\";\nimport type { Logger } from \"@lage-run/logger\";\nimport type { Target } from \"@lage-run/target-graph\";\n\nexport interface RemoteFallbackCacheProviderOptions {\n root: string;\n logger: Logger;\n\n localCacheProvider?: CacheProvider;\n remoteCacheProvider?: CacheProvider;\n\n writeRemoteCache?: boolean;\n}\n\n/**\n * Remote Fallback Cache Provider\n *\n * This backfill cache provider will fallback to a remote cache provider if the local cache does not contain the item.\n * It will also automatically populate the local cache with the remote cache.\n */\nexport class RemoteFallbackCacheProvider implements CacheProvider {\n private static localHits: { [hash: string]: boolean } = {};\n private static remoteHits: { [hash: string]: boolean } = {};\n\n constructor(private options: RemoteFallbackCacheProviderOptions) {}\n\n public async fetch(hash: string, target: Target): Promise<boolean> {\n const { logger, remoteCacheProvider, localCacheProvider } = this.options;\n const skipRemoteCacheForTarget = target.skipRemoteCache === true;\n\n if (localCacheProvider) {\n RemoteFallbackCacheProvider.localHits[hash] = await localCacheProvider.fetch(hash, target);\n logger.silly(`local cache fetch: ${hash} ${RemoteFallbackCacheProvider.localHits[hash]}`);\n }\n\n if (!skipRemoteCacheForTarget && !RemoteFallbackCacheProvider.localHits[hash] && remoteCacheProvider) {\n RemoteFallbackCacheProvider.remoteHits[hash] = await remoteCacheProvider.fetch(hash, target);\n logger.silly(`remote fallback fetch: ${hash} ${RemoteFallbackCacheProvider.remoteHits[hash]}`);\n\n // now save this into the localCacheProvider, if available\n if (localCacheProvider && RemoteFallbackCacheProvider.remoteHits[hash]) {\n logger.silly(`local cache put, fetched cache from remote: ${hash}`);\n await localCacheProvider.put(hash, target);\n }\n\n return RemoteFallbackCacheProvider.remoteHits[hash];\n }\n\n return RemoteFallbackCacheProvider.localHits[hash];\n }\n\n public async put(hash: string, target: Target): Promise<void> {\n const { logger, remoteCacheProvider, localCacheProvider, writeRemoteCache } = this.options;\n const putPromises: Promise<void>[] = [];\n\n // Write local cache if it doesn't already exist, or if the the hash isn't in the localHits\n const shouldWriteLocalCache = !this.isLocalHit(hash) && !!localCacheProvider;\n\n if (shouldWriteLocalCache) {\n logger.silly(`local cache put: ${hash}`);\n putPromises.push(localCacheProvider.put(hash, target));\n }\n\n /**\n * Write to remote if:\n * - the target has not disabled remote caching\n * - there is no hit in the remote cache\n * - a remote cache storage provider exists\n * - the \"writeRemoteCache\" config flag is set to true\n */\n const skipRemoteCacheForTarget = target.skipRemoteCache === true;\n const shouldWriteRemoteCache = !skipRemoteCacheForTarget && !this.isRemoteHit(hash) && !!remoteCacheProvider && writeRemoteCache;\n\n if (shouldWriteRemoteCache) {\n logger.silly(`remote fallback put: ${hash}`);\n const remotePut = remoteCacheProvider.put(hash, target);\n putPromises.push(remotePut);\n }\n\n await Promise.all(putPromises);\n }\n\n private isRemoteHit(hash: string) {\n return hash in RemoteFallbackCacheProvider.remoteHits && RemoteFallbackCacheProvider.remoteHits[hash];\n }\n\n private isLocalHit(hash: string) {\n return hash in RemoteFallbackCacheProvider.localHits && RemoteFallbackCacheProvider.localHits[hash];\n }\n\n public async clear(): Promise<void> {\n const { localCacheProvider } = this.options;\n if (localCacheProvider) {\n return localCacheProvider.clear();\n }\n }\n\n public async purge(sinceDays: number): Promise<void> {\n const { localCacheProvider } = this.options;\n if (localCacheProvider) {\n return localCacheProvider.purge(sinceDays);\n }\n }\n}\n"],"names":["RemoteFallbackCacheProvider","fetch","hash","target","logger","remoteCacheProvider","localCacheProvider","options","skipRemoteCacheForTarget","skipRemoteCache","localHits","silly","remoteHits","put","writeRemoteCache","putPromises","shouldWriteLocalCache","isLocalHit","push","shouldWriteRemoteCache","isRemoteHit","remotePut","Promise","all","clear","purge","sinceDays"],"mappings":";;;;+BAoBaA;;;eAAAA;;;;;;;;;;;;;;;;AAAN,MAAMA;IAMX,MAAaC,MAAMC,IAAY,EAAEC,MAAc,EAAoB;QACjE,MAAM,EAAEC,MAAM,EAAEC,mBAAmB,EAAEC,kBAAkB,EAAE,GAAG,IAAI,CAACC,OAAO;QACxE,MAAMC,2BAA2BL,OAAOM,eAAe,KAAK;QAE5D,IAAIH,oBAAoB;YACtBN,4BAA4BU,SAAS,CAACR,KAAK,GAAG,MAAMI,mBAAmBL,KAAK,CAACC,MAAMC;YACnFC,OAAOO,KAAK,CAAC,CAAC,mBAAmB,EAAET,KAAK,CAAC,EAAEF,4BAA4BU,SAAS,CAACR,KAAK,EAAE;QAC1F;QAEA,IAAI,CAACM,4BAA4B,CAACR,4BAA4BU,SAAS,CAACR,KAAK,IAAIG,qBAAqB;YACpGL,4BAA4BY,UAAU,CAACV,KAAK,GAAG,MAAMG,oBAAoBJ,KAAK,CAACC,MAAMC;YACrFC,OAAOO,KAAK,CAAC,CAAC,uBAAuB,EAAET,KAAK,CAAC,EAAEF,4BAA4BY,UAAU,CAACV,KAAK,EAAE;YAE7F,0DAA0D;YAC1D,IAAII,sBAAsBN,4BAA4BY,UAAU,CAACV,KAAK,EAAE;gBACtEE,OAAOO,KAAK,CAAC,CAAC,4CAA4C,EAAET,MAAM;gBAClE,MAAMI,mBAAmBO,GAAG,CAACX,MAAMC;YACrC;YAEA,OAAOH,4BAA4BY,UAAU,CAACV,KAAK;QACrD;QAEA,OAAOF,4BAA4BU,SAAS,CAACR,KAAK;IACpD;IAEA,MAAaW,IAAIX,IAAY,EAAEC,MAAc,EAAiB;QAC5D,MAAM,EAAEC,MAAM,EAAEC,mBAAmB,EAAEC,kBAAkB,EAAEQ,gBAAgB,EAAE,GAAG,IAAI,CAACP,OAAO;QAC1F,MAAMQ,cAA+B,EAAE;QAEvC,2FAA2F;QAC3F,MAAMC,wBAAwB,CAAC,IAAI,CAACC,UAAU,CAACf,SAAS,CAAC,CAACI;QAE1D,IAAIU,uBAAuB;YACzBZ,OAAOO,KAAK,CAAC,CAAC,iBAAiB,EAAET,MAAM;YACvCa,YAAYG,IAAI,CAACZ,mBAAmBO,GAAG,CAACX,MAAMC;QAChD;QAEA;;;;;;KAMC,GACD,MAAMK,2BAA2BL,OAAOM,eAAe,KAAK;QAC5D,MAAMU,yBAAyB,CAACX,4BAA4B,CAAC,IAAI,CAACY,WAAW,CAAClB,SAAS,CAAC,CAACG,uBAAuBS;QAEhH,IAAIK,wBAAwB;YAC1Bf,OAAOO,KAAK,CAAC,CAAC,qBAAqB,EAAET,MAAM;YAC3C,MAAMmB,YAAYhB,oBAAoBQ,GAAG,CAACX,MAAMC;YAChDY,YAAYG,IAAI,CAACG;QACnB;QAEA,MAAMC,QAAQC,GAAG,CAACR;IACpB;IAEQK,YAAYlB,IAAY,EAAE;QAChC,OAAOA,QAAQF,4BAA4BY,UAAU,IAAIZ,4BAA4BY,UAAU,CAACV,KAAK;IACvG;IAEQe,WAAWf,IAAY,EAAE;QAC/B,OAAOA,QAAQF,4BAA4BU,SAAS,IAAIV,4BAA4BU,SAAS,CAACR,KAAK;IACrG;IAEA,MAAasB,QAAuB;QAClC,MAAM,EAAElB,kBAAkB,EAAE,GAAG,IAAI,CAACC,OAAO;QAC3C,IAAID,oBAAoB;YACtB,OAAOA,mBAAmBkB,KAAK;QACjC;IACF;IAEA,MAAaC,MAAMC,SAAiB,EAAiB;QACnD,MAAM,EAAEpB,kBAAkB,EAAE,GAAG,IAAI,CAACC,OAAO;QAC3C,IAAID,oBAAoB;YACtB,OAAOA,mBAAmBmB,KAAK,CAACC;QAClC;IACF;IA9EA,YAAY,AAAQnB,OAA2C,CAAE;;aAA7CA,UAAAA;IAA8C;AA+EpE;AAlFE,iBADWP,6BACIU,aAAyC,CAAC;AACzD,iBAFWV,6BAEIY,cAA0C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lage-run/cache",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.1",
|
|
4
4
|
"description": "Cache for Lage",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -21,12 +21,12 @@
|
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"@azure/core-auth": "^1.9.0",
|
|
23
23
|
"@azure/identity": "^4.9.1",
|
|
24
|
-
"@lage-run/config": "^0.9.
|
|
25
|
-
"@lage-run/logger": "^1.
|
|
26
|
-
"@lage-run/target-graph": "^0.
|
|
27
|
-
"backfill-cache": "^5.12.
|
|
28
|
-
"backfill-config": "^6.7.
|
|
29
|
-
"backfill-logger": "^5.4.
|
|
24
|
+
"@lage-run/config": "^0.9.5",
|
|
25
|
+
"@lage-run/logger": "^1.4.1",
|
|
26
|
+
"@lage-run/target-graph": "^0.15.1",
|
|
27
|
+
"backfill-cache": "^5.12.4",
|
|
28
|
+
"backfill-config": "^6.7.3",
|
|
29
|
+
"backfill-logger": "^5.4.2",
|
|
30
30
|
"glob-hasher": "^1.4.2"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|