{"_id":"@gmod/shared-read-cache","_rev":"12-5fa2e1ae73401cf88194afdadce5192e","name":"@gmod/shared-read-cache","dist-tags":{"latest":"1.7.2"},"versions":{"1.0.0":{"name":"@gmod/shared-read-cache","version":"1.0.0","keywords":["abort","abortsignal","cache","lru","promise"],"author":{"url":"https://github.com/cmdcolin","name":"Colin Diesh","email":"colin.diesh@gmail.com"},"license":"MIT","_id":"@gmod/shared-read-cache@1.0.0","maintainers":[{"name":"rbuels","email":"rbuels@gmail.com"},{"name":"cmdcolin","email":"colin.diesh@gmail.com"},{"name":"garrettjstevens","email":"stevens.garrett.j@gmail.com"}],"homepage":"https://github.com/GMOD/shared-read-cache#readme","bugs":{"url":"https://github.com/GMOD/shared-read-cache/issues"},"dist":{"shasum":"e938900c9718898de2c719edafc2292546f5b6f2","tarball":"https://registry.npmjs.org/@gmod/shared-read-cache/-/shared-read-cache-1.0.0.tgz","fileCount":25,"integrity":"sha512-fn5FaQdvcL9fpB77HDWLYeOqbaZFmmJzArq4SzUdQQP45rPMUY69diXucBAOp/aJJrSN+qxYvnd5tXbpG/gCRw==","signatures":[{"sig":"MEUCIQDoc6BTfO9B3aYz1BqimGcyVk6wG+0fmvtRBIZecFRioAIgS49aT11dRBjiEWkWNxfNP9GsLUrPxuxJPyNlwRHSC9M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":63903},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{"import":"./esm/index.js","require":"./dist/index.js"},"gitHead":"4a297496895f86dbccc8e239c0ae1bbc2e095fc7","scripts":{"lint":"eslint --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"pnpm build:esm && pnpm build:es5","clean":"rimraf dist esm","format":"prettier --write .","version":"git-cliff --tag v$npm_package_version --unreleased --prepend CHANGELOG.md && git add CHANGELOG.md","prebuild":"pnpm clean","build:es5":"tsc --module commonjs --moduleResolution bundler --outDir dist","build:esm":"tsc --outDir esm","typecheck":"tsc --noEmit -p tsconfig.lint.json","preversion":"pnpm lint && pnpm test --run && pnpm build","postversion":"git push --follow-tags","format:check":"prettier --check .","postbuild:es5":"echo '{\"type\": \"commonjs\"}' > dist/package.json"},"_npmUser":{"name":"cmdcolin","email":"colin.diesh@gmail.com"},"repository":{"url":"git+https://github.com/GMOD/shared-read-cache.git","type":"git"},"_npmVersion":"11.12.1","description":"A promise cache whose shared reads are cancelled only once every caller has given up","directories":{"lib":"dist"},"sideEffects":false,"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.15.1","devDependencies":{"eslint":"^10.2.1","rimraf":"^6.1.3","vitest":"^4.1.5","prettier":"^3.8.3","git-cliff":"^2.13.1","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^25.6.0","typescript-eslint":"^8.59.0","@vitest/coverage-v8":"^4.1.5","eslint-plugin-import-x":"^4.16.2"},"_npmOperationalInternal":{"tmp":"tmp/shared-read-cache_1.0.0_1785986882748_0.3286260967324086","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@gmod/shared-read-cache","version":"1.3.0","keywords":["abort","abortsignal","cache","lru","promise"],"author":{"url":"https://github.com/cmdcolin","name":"Colin Diesh","email":"colin.diesh@gmail.com"},"license":"MIT","_id":"@gmod/shared-read-cache@1.3.0","maintainers":[{"name":"rbuels","email":"rbuels@gmail.com"},{"name":"cmdcolin","email":"colin.diesh@gmail.com"},{"name":"garrettjstevens","email":"stevens.garrett.j@gmail.com"}],"homepage":"https://github.com/GMOD/shared-read-cache#readme","bugs":{"url":"https://github.com/GMOD/shared-read-cache/issues"},"dist":{"shasum":"f584561fb6d79e7e86895a56b71f6765729717ca","tarball":"https://registry.npmjs.org/@gmod/shared-read-cache/-/shared-read-cache-1.3.0.tgz","fileCount":25,"integrity":"sha512-tiq+TDrDyd4aKnePr5xqKvieok9kYZ6TCbfXZ9RKDucRjyT8awn0HZxMyjVfm0/J02eNiD0Q2400GgpcSUEnAw==","signatures":[{"sig":"MEQCIF3Qr2gMUHq8iOfF/OYewG/XteY+596koz1QZKlYYit6AiAoPA3n8X6G3v0wTo5XEcDPriLtnqaJYF+AmQUIG3FEsQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":84418},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{"import":"./esm/index.js","require":"./dist/index.js"},"gitHead":"f10922916752baa7f2b13fa0a0e7ea60d467d7f8","scripts":{"lint":"eslint --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"pnpm build:esm && pnpm build:es5","clean":"rimraf dist esm","format":"prettier --write .","version":"git-cliff --tag v$npm_package_version --unreleased --prepend CHANGELOG.md && git add CHANGELOG.md","prebuild":"pnpm clean","build:es5":"tsc --module commonjs --moduleResolution bundler --outDir dist","build:esm":"tsc --outDir esm","typecheck":"tsc --noEmit -p tsconfig.lint.json","preversion":"pnpm lint && pnpm test --run && pnpm build","postversion":"git push --follow-tags","format:check":"prettier --check .","postbuild:es5":"echo '{\"type\": \"commonjs\"}' > dist/package.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d4ae2469-7683-4417-b571-95fbc5167f99"}},"repository":{"url":"git+https://github.com/GMOD/shared-read-cache.git","type":"git"},"_npmVersion":"11.16.0","description":"A promise cache whose shared reads are cancelled only once every caller has given up","directories":{"lib":"dist"},"sideEffects":false,"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.15.1","devDependencies":{"eslint":"^10.2.1","rimraf":"^6.1.3","vitest":"^4.1.5","prettier":"^3.8.3","git-cliff":"^2.13.1","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^25.6.0","typescript-eslint":"^8.59.0","@vitest/coverage-v8":"^4.1.5","eslint-plugin-import-x":"^4.16.2"},"_npmOperationalInternal":{"tmp":"tmp/shared-read-cache_1.3.0_1785990380897_0.1710533574921358","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@gmod/shared-read-cache","version":"1.4.0","keywords":["abort","abortsignal","cache","lru","promise"],"author":{"url":"https://github.com/cmdcolin","name":"Colin Diesh","email":"colin.diesh@gmail.com"},"license":"MIT","_id":"@gmod/shared-read-cache@1.4.0","maintainers":[{"name":"rbuels","email":"rbuels@gmail.com"},{"name":"cmdcolin","email":"colin.diesh@gmail.com"},{"name":"garrettjstevens","email":"stevens.garrett.j@gmail.com"}],"homepage":"https://github.com/GMOD/shared-read-cache#readme","bugs":{"url":"https://github.com/GMOD/shared-read-cache/issues"},"dist":{"shasum":"e89af55c90d7e111588da6e87056d5d5dceaf8c8","tarball":"https://registry.npmjs.org/@gmod/shared-read-cache/-/shared-read-cache-1.4.0.tgz","fileCount":25,"integrity":"sha512-OfYfK2CTijetH3l0qrkAeHNVbrb7bU/s3wQa47Sd/avQA7kyA2X18DI+KEr12UEkyW+QWQ5/t4T9EFBETAUQ5w==","signatures":[{"sig":"MEYCIQCmURVyiVyITRNW1PHJbg9EMQHY/5tZt3YROKLN4LCDwAIhAINR4GxRMVKW/zf7uYb9lpIyDQQNhCMmKaiZ0zZt9S5H","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@gmod%2fshared-read-cache@1.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":104228},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{"import":"./esm/index.js","require":"./dist/index.js"},"gitHead":"0b9fde20ee9fa834107a2a485e70663f12a598b4","scripts":{"lint":"eslint --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"pnpm build:esm && pnpm build:es5","clean":"rimraf dist esm","format":"prettier --write .","version":"git-cliff --tag v$npm_package_version --unreleased --prepend CHANGELOG.md && git add CHANGELOG.md","prebuild":"pnpm clean","build:es5":"tsc --module commonjs --moduleResolution bundler --outDir dist","build:esm":"tsc --outDir esm","typecheck":"tsc --noEmit -p tsconfig.lint.json","preversion":"pnpm lint && pnpm test --run && pnpm build","postversion":"git push --follow-tags","format:check":"prettier --check .","postbuild:es5":"echo '{\"type\": \"commonjs\"}' > dist/package.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d4ae2469-7683-4417-b571-95fbc5167f99"}},"repository":{"url":"git+https://github.com/GMOD/shared-read-cache.git","type":"git"},"_npmVersion":"11.16.0","description":"A promise cache whose shared reads are cancelled only once every caller has given up","directories":{"lib":"dist"},"sideEffects":false,"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.15.1","devDependencies":{"eslint":"^10.8.0","rimraf":"^6.1.3","vitest":"^4.1.10","prettier":"^3.9.6","git-cliff":"^2.13.1","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^25.9.5","typescript-eslint":"^8.65.0","@vitest/coverage-v8":"^4.1.10","eslint-plugin-import-x":"^4.17.1"},"_npmOperationalInternal":{"tmp":"tmp/shared-read-cache_1.4.0_1785996031447_0.38043335308144743","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"name":"@gmod/shared-read-cache","version":"1.4.1","keywords":["abort","abortsignal","cache","lru","promise"],"author":{"url":"https://github.com/cmdcolin","name":"Colin Diesh","email":"colin.diesh@gmail.com"},"license":"MIT","_id":"@gmod/shared-read-cache@1.4.1","maintainers":[{"name":"rbuels","email":"rbuels@gmail.com"},{"name":"cmdcolin","email":"colin.diesh@gmail.com"},{"name":"garrettjstevens","email":"stevens.garrett.j@gmail.com"}],"homepage":"https://github.com/GMOD/shared-read-cache#readme","bugs":{"url":"https://github.com/GMOD/shared-read-cache/issues"},"dist":{"shasum":"7cfaf66791603ff1e302df35e2d9f135e91c6a9c","tarball":"https://registry.npmjs.org/@gmod/shared-read-cache/-/shared-read-cache-1.4.1.tgz","fileCount":25,"integrity":"sha512-1UG3NtGKCyz1t3RJ9uIrYYroFVsf9Gc6Y6coejyr74enogQ3dLRvia8TLCV/uf+XTzkuNAvEV2AT+aN1qOo+bQ==","signatures":[{"sig":"MEYCIQDAwDeK+OylACKOAMCWmEAg5pYtTxkSuMKMrwc7LUY8WAIhAO2FHCS+s/5QgdEpVlt3uYhzmbq78Z0XFyhenr7LqbUt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@gmod%2fshared-read-cache@1.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":104941},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{"import":"./esm/index.js","require":"./dist/index.js"},"gitHead":"51275598eebbeb6b8c79d1034afab81b8d128879","scripts":{"lint":"eslint --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"pnpm build:esm && pnpm build:es5","clean":"rimraf dist esm","format":"prettier --write .","version":"git-cliff --tag v$npm_package_version --unreleased --prepend CHANGELOG.md && git add CHANGELOG.md","prebuild":"pnpm clean","build:es5":"tsc --module commonjs --moduleResolution bundler --outDir dist","build:esm":"tsc --outDir esm","typecheck":"tsc --noEmit -p tsconfig.lint.json","preversion":"pnpm lint && pnpm test --run && pnpm build","postversion":"git push --follow-tags","format:check":"prettier --check .","postbuild:es5":"echo '{\"type\": \"commonjs\"}' > dist/package.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d4ae2469-7683-4417-b571-95fbc5167f99"}},"repository":{"url":"git+https://github.com/GMOD/shared-read-cache.git","type":"git"},"_npmVersion":"11.16.0","description":"A promise cache whose shared reads are cancelled only once every caller has given up","directories":{"lib":"dist"},"sideEffects":false,"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.15.1","devDependencies":{"eslint":"^10.8.0","rimraf":"^6.1.3","vitest":"^4.1.10","prettier":"^3.9.6","git-cliff":"^2.13.1","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^25.9.5","typescript-eslint":"^8.65.0","@vitest/coverage-v8":"^4.1.10","eslint-plugin-import-x":"^4.17.1"},"_npmOperationalInternal":{"tmp":"tmp/shared-read-cache_1.4.1_1785996485984_0.09591701164839739","host":"s3://npm-registry-packages-npm-production"}},"1.4.2":{"name":"@gmod/shared-read-cache","version":"1.4.2","keywords":["abort","abortsignal","cache","lru","promise"],"author":{"url":"https://github.com/cmdcolin","name":"Colin Diesh","email":"colin.diesh@gmail.com"},"license":"MIT","_id":"@gmod/shared-read-cache@1.4.2","maintainers":[{"name":"rbuels","email":"rbuels@gmail.com"},{"name":"cmdcolin","email":"colin.diesh@gmail.com"},{"name":"garrettjstevens","email":"stevens.garrett.j@gmail.com"}],"homepage":"https://github.com/GMOD/shared-read-cache#readme","bugs":{"url":"https://github.com/GMOD/shared-read-cache/issues"},"dist":{"shasum":"4f7193d0f319403e7ad50690c5dffdb4f29ce722","tarball":"https://registry.npmjs.org/@gmod/shared-read-cache/-/shared-read-cache-1.4.2.tgz","fileCount":25,"integrity":"sha512-oRR61ThcE3YWKapJi8tEbPE+qnkfup8/0kINwE/wWa0S/urWsmJGxiIw0a9N6z7SpyaaKlfG3HpTwJQYkfzq0A==","signatures":[{"sig":"MEQCICAWyYbd7dmEoZdtbi/2J/ecZEmwoc6xOT45pKmkaZKmAiAjX0M7hRzJ2OWiE1pvqzqg0dPDl1aQEhBzgLkC5Qw19w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@gmod%2fshared-read-cache@1.4.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":108460},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{"import":"./esm/index.js","require":"./dist/index.js"},"gitHead":"8aedd875f98b4e304a46939c8b671af6b812d2ce","scripts":{"lint":"eslint --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"pnpm build:esm && pnpm build:es5","clean":"rimraf dist esm","format":"prettier --write .","version":"git-cliff --tag v$npm_package_version --unreleased --prepend CHANGELOG.md && git add CHANGELOG.md","prebuild":"pnpm clean","build:es5":"tsc --module commonjs --moduleResolution bundler --outDir dist","build:esm":"tsc --outDir esm","typecheck":"tsc --noEmit -p tsconfig.lint.json","preversion":"pnpm lint && pnpm test --run && pnpm build","postversion":"git push --follow-tags","format:check":"prettier --check .","postbuild:es5":"echo '{\"type\": \"commonjs\"}' > dist/package.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d4ae2469-7683-4417-b571-95fbc5167f99"}},"repository":{"url":"git+https://github.com/GMOD/shared-read-cache.git","type":"git"},"_npmVersion":"11.16.0","description":"A promise cache whose shared reads are cancelled only once every caller has given up","directories":{"lib":"dist"},"sideEffects":false,"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.15.1","devDependencies":{"eslint":"^10.8.0","rimraf":"^6.1.3","vitest":"^4.1.10","prettier":"^3.9.6","git-cliff":"^2.13.1","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^25.9.5","typescript-eslint":"^8.65.0","@vitest/coverage-v8":"^4.1.10","eslint-plugin-import-x":"^4.17.1"},"_npmOperationalInternal":{"tmp":"tmp/shared-read-cache_1.4.2_1785999138474_0.9662975476701556","host":"s3://npm-registry-packages-npm-production"}},"1.4.4":{"name":"@gmod/shared-read-cache","version":"1.4.4","keywords":["abort","abortsignal","cache","lru","promise"],"author":{"url":"https://github.com/cmdcolin","name":"Colin Diesh","email":"colin.diesh@gmail.com"},"license":"MIT","_id":"@gmod/shared-read-cache@1.4.4","maintainers":[{"name":"rbuels","email":"rbuels@gmail.com"},{"name":"cmdcolin","email":"colin.diesh@gmail.com"},{"name":"garrettjstevens","email":"stevens.garrett.j@gmail.com"}],"homepage":"https://github.com/GMOD/shared-read-cache#readme","bugs":{"url":"https://github.com/GMOD/shared-read-cache/issues"},"dist":{"shasum":"ac6a4d8bfd6bab159da72cd27b3a3b3160f34a31","tarball":"https://registry.npmjs.org/@gmod/shared-read-cache/-/shared-read-cache-1.4.4.tgz","fileCount":25,"integrity":"sha512-K8YhHkibBm/b8AMs+t35nGgbE2jlhsQ2+MqDv7b1hWDcGoSudyLwVmLLiPMlWrIwxXCzM4ROZF7cY3RamC7kDQ==","signatures":[{"sig":"MEQCIHYuOow+2FQfPAZrWwVkOU2RmPzX3uAYSn2omUElgEsiAiBKTPAL8F3oxvja5/wW+3oiOkCaMkkECfxoV6XSqblFuw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@gmod%2fshared-read-cache@1.4.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":113505},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{"import":"./esm/index.js","require":"./dist/index.js"},"gitHead":"64b860a0410d83a6da92aa177392ab66ba325be8","scripts":{"lint":"eslint --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"pnpm build:esm && pnpm build:es5","clean":"rimraf dist esm","format":"prettier --write .","version":"git-cliff --tag v$npm_package_version --unreleased --prepend CHANGELOG.md && git add CHANGELOG.md","prebuild":"pnpm clean","build:es5":"tsc --module commonjs --moduleResolution bundler --outDir dist","build:esm":"tsc --outDir esm","typecheck":"tsc --noEmit -p tsconfig.lint.json","preversion":"pnpm lint && pnpm test --run && pnpm build","postversion":"git push --follow-tags","format:check":"prettier --check .","postbuild:es5":"echo '{\"type\": \"commonjs\"}' > dist/package.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d4ae2469-7683-4417-b571-95fbc5167f99"}},"repository":{"url":"git+https://github.com/GMOD/shared-read-cache.git","type":"git"},"_npmVersion":"11.16.0","description":"A promise cache whose shared reads are cancelled only once every caller has given up","directories":{"lib":"dist"},"sideEffects":false,"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.15.1","devDependencies":{"eslint":"^10.8.0","rimraf":"^6.1.3","vitest":"^4.1.10","prettier":"^3.9.6","git-cliff":"^2.13.1","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^25.9.5","typescript-eslint":"^8.65.0","@vitest/coverage-v8":"^4.1.10","eslint-plugin-import-x":"^4.17.1"},"_npmOperationalInternal":{"tmp":"tmp/shared-read-cache_1.4.4_1786312401351_0.5201303108906277","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@gmod/shared-read-cache","version":"1.5.0","keywords":["abort","abortsignal","cache","lru","promise"],"author":{"url":"https://github.com/cmdcolin","name":"Colin Diesh","email":"colin.diesh@gmail.com"},"license":"MIT","_id":"@gmod/shared-read-cache@1.5.0","maintainers":[{"name":"rbuels","email":"rbuels@gmail.com"},{"name":"cmdcolin","email":"colin.diesh@gmail.com"},{"name":"garrettjstevens","email":"stevens.garrett.j@gmail.com"}],"homepage":"https://github.com/GMOD/shared-read-cache#readme","bugs":{"url":"https://github.com/GMOD/shared-read-cache/issues"},"dist":{"shasum":"92845757a97772240dc893d713c319d521f48d7d","tarball":"https://registry.npmjs.org/@gmod/shared-read-cache/-/shared-read-cache-1.5.0.tgz","fileCount":32,"integrity":"sha512-6bbUEcv9a/D/P5zWrscnwyCvmh2Yvo1e3NYv+V1xZyXe+bqb7tKAu5zXJoEUADlEnkkY2dpps+A5/vQrFRYrkw==","signatures":[{"sig":"MEUCICSyrW4x/Wi0pIu22PKMsRHI4/eto/JpZjzww56zC8x/AiEA6oi3OpYpwYoVTBX0VzHnFnRgw2sfLf11Z0g9S+O7fO4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@gmod%2fshared-read-cache@1.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":168137},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{"import":"./esm/index.js","require":"./dist/index.js"},"gitHead":"041914eb7f78d73bfa97184b76f41f00ac6fd8c9","scripts":{"lint":"eslint --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"pnpm build:esm && pnpm build:es5","clean":"rimraf dist esm","format":"prettier --write .","version":"git-cliff --tag v$npm_package_version --unreleased --prepend CHANGELOG.md && git add CHANGELOG.md","prebuild":"pnpm clean","build:es5":"tsc --module commonjs --moduleResolution bundler --outDir dist","build:esm":"tsc --outDir esm","typecheck":"tsc --noEmit -p tsconfig.lint.json","preversion":"pnpm lint && pnpm test --run && pnpm build","postversion":"git push --follow-tags","format:check":"prettier --check .","postbuild:es5":"echo '{\"type\": \"commonjs\"}' > dist/package.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d4ae2469-7683-4417-b571-95fbc5167f99"}},"repository":{"url":"git+https://github.com/GMOD/shared-read-cache.git","type":"git"},"_npmVersion":"11.16.0","description":"A promise cache whose shared reads are cancelled only once every caller has given up","directories":{"lib":"dist"},"sideEffects":false,"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.15.1","devDependencies":{"eslint":"^10.8.0","rimraf":"^6.1.3","vitest":"^4.1.10","prettier":"^3.9.6","git-cliff":"^2.13.1","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^25.9.5","typescript-eslint":"^8.65.0","@vitest/coverage-v8":"^4.1.10","eslint-plugin-import-x":"^4.17.1"},"_npmOperationalInternal":{"tmp":"tmp/shared-read-cache_1.5.0_1786375465426_0.8986087252321713","host":"s3://npm-registry-packages-npm-production"}},"1.5.1":{"name":"@gmod/shared-read-cache","version":"1.5.1","keywords":["abort","abortsignal","cache","lru","promise"],"author":{"url":"https://github.com/cmdcolin","name":"Colin Diesh","email":"colin.diesh@gmail.com"},"license":"MIT","_id":"@gmod/shared-read-cache@1.5.1","maintainers":[{"name":"rbuels","email":"rbuels@gmail.com"},{"name":"cmdcolin","email":"colin.diesh@gmail.com"},{"name":"garrettjstevens","email":"stevens.garrett.j@gmail.com"}],"homepage":"https://github.com/GMOD/shared-read-cache#readme","bugs":{"url":"https://github.com/GMOD/shared-read-cache/issues"},"dist":{"shasum":"710f58d190f2601dc51124a22059d2467fc4a7d2","tarball":"https://registry.npmjs.org/@gmod/shared-read-cache/-/shared-read-cache-1.5.1.tgz","fileCount":32,"integrity":"sha512-2Me6eOJhBrZzYruG1t73trs29ovAMSNnn6JzzzYcL4t1/bxK3EToyDBPslcoebTrg5zDeocA+yzgwsQ2mHe0eA==","signatures":[{"sig":"MEQCIHBc72nDklFraYRS4iXfFY0Ex0I4QESBpVhVYCeN6yQhAiATuyjH+98u1jJq4qhQ+2nbE5U7gDq0Wu4bOvSb/c914w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@gmod%2fshared-read-cache@1.5.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":168176},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{"import":"./esm/index.js","require":"./dist/index.js"},"gitHead":"a1c338938543c56d4a0d2761bca74d8e6ce0f558","scripts":{"lint":"eslint --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"pnpm build:esm && pnpm build:es5","clean":"rimraf dist esm","format":"prettier --write .","version":"git-cliff --tag v$npm_package_version --unreleased --prepend CHANGELOG.md && git add CHANGELOG.md","prebuild":"pnpm clean","build:es5":"tsc --module commonjs --moduleResolution bundler --outDir dist","build:esm":"tsc --outDir esm","typecheck":"tsc --noEmit -p tsconfig.lint.json","preversion":"pnpm lint && pnpm format:check && pnpm typecheck && pnpm test --run && pnpm build","postversion":"git push --follow-tags","format:check":"prettier --check .","postbuild:es5":"echo '{\"type\": \"commonjs\"}' > dist/package.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d4ae2469-7683-4417-b571-95fbc5167f99"}},"repository":{"url":"git+https://github.com/GMOD/shared-read-cache.git","type":"git"},"_npmVersion":"11.16.0","description":"A promise cache whose shared reads are cancelled only once every caller has given up","directories":{"lib":"dist"},"sideEffects":false,"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.15.1","devDependencies":{"eslint":"^10.8.0","rimraf":"^6.1.3","vitest":"^4.1.10","prettier":"^3.9.6","git-cliff":"^2.13.1","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^25.9.5","typescript-eslint":"^8.65.0","@vitest/coverage-v8":"^4.1.10","eslint-plugin-import-x":"^4.17.1"},"_npmOperationalInternal":{"tmp":"tmp/shared-read-cache_1.5.1_1786380128034_0.2876829052936125","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"@gmod/shared-read-cache","version":"1.6.0","keywords":["abort","abortsignal","cache","lru","promise"],"author":{"url":"https://github.com/cmdcolin","name":"Colin Diesh","email":"colin.diesh@gmail.com"},"license":"MIT","_id":"@gmod/shared-read-cache@1.6.0","maintainers":[{"name":"rbuels","email":"rbuels@gmail.com"},{"name":"cmdcolin","email":"colin.diesh@gmail.com"},{"name":"garrettjstevens","email":"stevens.garrett.j@gmail.com"}],"homepage":"https://github.com/GMOD/shared-read-cache#readme","bugs":{"url":"https://github.com/GMOD/shared-read-cache/issues"},"dist":{"shasum":"d035b925880b7e7731c7f7d924b53fb1328693c6","tarball":"https://registry.npmjs.org/@gmod/shared-read-cache/-/shared-read-cache-1.6.0.tgz","fileCount":32,"integrity":"sha512-RrkbPdTFcKgtapYTCt8nwP4B/wzFlSLpPC4f5OfNAciC9o/Hxa1oW5qBVLk/4BEV61gp5x3sLjYHIXvMwklHDQ==","signatures":[{"sig":"MEUCIGDDf2WbJXdWXiPTjneDA5ZEx5LOHn0L8d+1hoMp/BUmAiEAjPc1fc7F1ztCRC1VGfnakspsXdxleg6HT+tykvKXiYU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@gmod%2fshared-read-cache@1.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":184055},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{"import":"./esm/index.js","require":"./dist/index.js"},"gitHead":"80953ba4d650af116e5f1d3feaf6ee14667df7fc","scripts":{"lint":"eslint --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"pnpm build:esm && pnpm build:es5","clean":"rimraf dist esm","format":"prettier --write .","version":"git-cliff --tag v$npm_package_version --unreleased --prepend CHANGELOG.md && git add CHANGELOG.md","prebuild":"pnpm clean","build:es5":"tsc --module commonjs --moduleResolution bundler --outDir dist","build:esm":"tsc --outDir esm","typecheck":"tsc --noEmit -p tsconfig.lint.json","preversion":"pnpm lint && pnpm format:check && pnpm typecheck && pnpm test --run && pnpm build","postversion":"git push --follow-tags","format:check":"prettier --check .","postbuild:es5":"echo '{\"type\": \"commonjs\"}' > dist/package.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d4ae2469-7683-4417-b571-95fbc5167f99"}},"repository":{"url":"git+https://github.com/GMOD/shared-read-cache.git","type":"git"},"_npmVersion":"11.17.0","description":"A promise cache whose shared reads are cancelled only once every caller has given up","directories":{"lib":"dist"},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.15.1","devDependencies":{"eslint":"^10.8.0","rimraf":"^6.1.3","vitest":"^4.1.10","prettier":"^3.9.6","git-cliff":"^2.13.1","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^25.9.5","typescript-eslint":"^8.65.0","@vitest/coverage-v8":"^4.1.10","eslint-plugin-import-x":"^4.17.1"},"_npmOperationalInternal":{"tmp":"tmp/shared-read-cache_1.6.0_1786715063556_0.49710547551225215","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"@gmod/shared-read-cache","version":"1.7.0","keywords":["abort","abortsignal","cache","lru","promise"],"author":{"url":"https://github.com/cmdcolin","name":"Colin Diesh","email":"colin.diesh@gmail.com"},"license":"MIT","_id":"@gmod/shared-read-cache@1.7.0","maintainers":[{"name":"rbuels","email":"rbuels@gmail.com"},{"name":"cmdcolin","email":"colin.diesh@gmail.com"},{"name":"garrettjstevens","email":"stevens.garrett.j@gmail.com"}],"homepage":"https://github.com/GMOD/shared-read-cache#readme","bugs":{"url":"https://github.com/GMOD/shared-read-cache/issues"},"dist":{"shasum":"280bf4623da868a7ac84dcb65bb15c8dada9e599","tarball":"https://registry.npmjs.org/@gmod/shared-read-cache/-/shared-read-cache-1.7.0.tgz","fileCount":32,"integrity":"sha512-TAhDVn5T3QEGJ5EKUQBvffNpdmNxj08X3kah8DCoZLUkon9rRp54R7LkR8oR43ZkNeLpWi6SBX8OBwEaivsrjQ==","signatures":[{"sig":"MEQCIF60trzSkdFYhjCuNpe/V7UoWXbwPO5WOc0YC8POOnYXAiB+dEjCBxy22yO9Gjf8biuA8PPlVfEaH4F5JhXBZhZdrw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDaHUuOZjH6vbyMD2pnHONGSn3med+XD0B7Rwuv2DUvMwIhAISiNwVa2jsPhyVIF/medjnRhVIhxr1nXHsY3BIY9PL5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@gmod%2fshared-read-cache@1.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":227475},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{"import":"./esm/index.js","require":"./dist/index.js"},"gitHead":"80db290a9b5b83c0c105decaead48fc336a98b71","scripts":{"lint":"eslint --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"pnpm build:esm && pnpm build:es5","clean":"rimraf dist esm","format":"prettier --write .","version":"git-cliff --tag v$npm_package_version --unreleased --prepend CHANGELOG.md && git add CHANGELOG.md","prebuild":"pnpm clean","build:es5":"tsc --module commonjs --moduleResolution bundler --outDir dist","build:esm":"tsc --outDir esm","typecheck":"tsc --noEmit -p tsconfig.lint.json","preversion":"pnpm lint && pnpm format:check && pnpm typecheck && pnpm test --run && pnpm build","postversion":"git push --follow-tags","format:check":"prettier --check .","postbuild:es5":"echo '{\"type\": \"commonjs\"}' > dist/package.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d4ae2469-7683-4417-b571-95fbc5167f99"}},"repository":{"url":"git+https://github.com/GMOD/shared-read-cache.git","type":"git"},"_npmVersion":"11.17.0","description":"A promise cache whose shared reads are cancelled only once every caller has given up","directories":{"lib":"dist"},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.15.1","devDependencies":{"eslint":"^10.8.0","rimraf":"^6.1.3","vitest":"^4.1.10","prettier":"^3.9.6","git-cliff":"^2.13.1","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^25.9.5","typescript-eslint":"^8.65.0","@vitest/coverage-v8":"^4.1.10","eslint-plugin-import-x":"^4.17.1"},"_npmOperationalInternal":{"tmp":"tmp/shared-read-cache_1.7.0_1787340028514_0.2656184825083916","host":"s3://npm-registry-packages-npm-production"}},"1.7.1":{"name":"@gmod/shared-read-cache","version":"1.7.1","keywords":["abort","abortsignal","cache","lru","promise"],"author":{"url":"https://github.com/cmdcolin","name":"Colin Diesh","email":"colin.diesh@gmail.com"},"license":"MIT","_id":"@gmod/shared-read-cache@1.7.1","maintainers":[{"name":"rbuels","email":"rbuels@gmail.com"},{"name":"cmdcolin","email":"colin.diesh@gmail.com"},{"name":"garrettjstevens","email":"stevens.garrett.j@gmail.com"}],"homepage":"https://github.com/GMOD/shared-read-cache#readme","bugs":{"url":"https://github.com/GMOD/shared-read-cache/issues"},"dist":{"shasum":"ac3bbeee198ebdf2239c3b81b08c24363e06ab65","tarball":"https://registry.npmjs.org/@gmod/shared-read-cache/-/shared-read-cache-1.7.1.tgz","fileCount":32,"integrity":"sha512-x67voqM7ADGj8o4HmwXobzSJ0+vB36AWUKHJkb7nL1AQSoZHzsTFEbDPik4hmUMqyp4QHPmXIGHgRuUVVQ2mvQ==","signatures":[{"sig":"MEQCIGG6/hfo8SLcDj5YlveVnzwl5kClpvJuQV76daGPHWxEAiBIAzZBIK1+o/K8BZJFM7Nw8po7UVSAVT5DbGHbkCsrEA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCR00ensYkXlZvk1/uGjegKZaNf5b01r4mkX4AIfCthHgIhAJiTbkYK7PWSMlrwUUR3MI8EbdzadPOxiN6VEyBuzWb+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@gmod%2fshared-read-cache@1.7.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":231123},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{"import":"./esm/index.js","require":"./dist/index.js"},"gitHead":"99807d0fd09fe7253b4e07f517679475ac5657e4","scripts":{"lint":"eslint --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"pnpm build:esm && pnpm build:es5","clean":"rimraf dist esm","format":"prettier --write .","version":"git-cliff --tag v$npm_package_version --unreleased --prepend CHANGELOG.md && git add CHANGELOG.md","prebuild":"pnpm clean","build:es5":"tsc --module commonjs --moduleResolution bundler --outDir dist","build:esm":"tsc --outDir esm","typecheck":"tsc --noEmit -p tsconfig.lint.json","preversion":"pnpm lint && pnpm format:check && pnpm typecheck && pnpm test --run && pnpm build","postversion":"git push --follow-tags","format:check":"prettier --check .","postbuild:es5":"echo '{\"type\": \"commonjs\"}' > dist/package.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d4ae2469-7683-4417-b571-95fbc5167f99"}},"repository":{"url":"git+https://github.com/GMOD/shared-read-cache.git","type":"git"},"_npmVersion":"11.17.0","description":"A promise cache whose shared reads are cancelled only once every caller has given up","directories":{"lib":"dist"},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.15.1","devDependencies":{"eslint":"^10.8.0","rimraf":"^6.1.3","vitest":"^4.1.10","prettier":"^3.9.6","git-cliff":"^2.13.1","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^25.9.5","typescript-eslint":"^8.65.0","@vitest/coverage-v8":"^4.1.10","eslint-plugin-import-x":"^4.17.1"},"_npmOperationalInternal":{"tmp":"tmp/shared-read-cache_1.7.1_1787341362779_0.365252796038678","host":"s3://npm-registry-packages-npm-production"}},"1.7.2":{"_id":"@gmod/shared-read-cache@1.7.2","bugs":{"url":"https://github.com/GMOD/shared-read-cache/issues"},"dist":{"shasum":"cf0dbeb27a01c307a92c7c1c4a15f27a6d2b5980","tarball":"https://registry.npmjs.org/@gmod/shared-read-cache/-/shared-read-cache-1.7.2.tgz","fileCount":32,"integrity":"sha512-N71dzJHYYSEAZYQCl38QGZ8cx468lFZE9VdS29N2DhRbKMf/X7Qb+cJsuIt1MeVDmpvKui5wDiNILgkQREpwlw==","signatures":[{"sig":"MEUCIF0tNfrITSvO9McPGLYJRRqqffminnptzoFrABGJYl7iAiEA8CJ9I0W5SqZO3S4Ca8VimAKK3BrVGJ8V67yR9K3gDOA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHGneXmWROT2AAKJHEE/3nySlM84T6zbgTxiJrfyoEMrAiAIZs2ZT+Dd5+Z46izG0kBbztItzmlG+Htk8G0+aU4y0A=="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@gmod%2fshared-read-cache@1.7.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":232935},"main":"dist/index.js","name":"@gmod/shared-read-cache","type":"module","types":"./dist/index.d.ts","author":{"url":"https://github.com/cmdcolin","name":"Colin Diesh","email":"colin.diesh@gmail.com"},"exports":{"import":"./esm/index.js","require":"./dist/index.js"},"gitHead":"7e1d5138b5ebf01ec7115eed323853fa621f435c","license":"MIT","scripts":{"lint":"eslint --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"pnpm build:esm && pnpm build:es5","clean":"rimraf dist esm","format":"prettier --write .","version":"git-cliff --tag v$npm_package_version --unreleased --prepend CHANGELOG.md && git add CHANGELOG.md","prebuild":"pnpm clean","build:es5":"tsc --module commonjs --moduleResolution bundler --outDir dist","build:esm":"tsc --outDir esm","typecheck":"tsc --noEmit -p tsconfig.lint.json","preversion":"pnpm lint && pnpm format:check && pnpm typecheck && pnpm test --run && pnpm build","postversion":"git push --follow-tags","format:check":"prettier --check .","postbuild:es5":"echo '{\"type\": \"commonjs\"}' > dist/package.json"},"version":"1.7.2","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d4ae2469-7683-4417-b571-95fbc5167f99"}},"homepage":"https://github.com/GMOD/shared-read-cache#readme","keywords":["abort","abortsignal","cache","lru","promise"],"repository":{"url":"git+https://github.com/GMOD/shared-read-cache.git","type":"git"},"_npmVersion":"11.17.0","description":"A promise cache whose shared reads are cancelled only once every caller has given up","directories":{"lib":"dist"},"maintainers":[{"name":"rbuels","email":"rbuels@gmail.com"},{"name":"cmdcolin","email":"colin.diesh@gmail.com"},{"name":"garrettjstevens","email":"stevens.garrett.j@gmail.com"}],"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.15.1","devDependencies":{"eslint":"^10.8.0","rimraf":"^6.1.3","vitest":"^4.1.10","prettier":"^3.9.6","git-cliff":"^2.13.1","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^25.9.5","typescript-eslint":"^8.65.0","@vitest/coverage-v8":"^4.1.10","eslint-plugin-import-x":"^4.17.1"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/shared-read-cache_1.7.2_1787344814448_0.9507068209782532"}}},"time":{"created":"2026-08-06T03:28:02.619Z","modified":"2026-08-21T20:40:14.879Z","1.0.0":"2026-08-06T03:28:02.881Z","1.3.0":"2026-08-06T04:26:21.070Z","1.4.0":"2026-08-06T06:00:31.582Z","1.4.1":"2026-08-06T06:08:06.170Z","1.4.2":"2026-08-06T06:52:18.613Z","1.4.4":"2026-08-09T21:53:21.497Z","1.5.0":"2026-08-10T15:24:25.557Z","1.5.1":"2026-08-10T16:42:08.224Z","1.6.0":"2026-08-14T13:44:23.727Z","1.7.0":"2026-08-21T19:20:28.622Z","1.7.1":"2026-08-21T19:42:42.858Z","1.7.2":"2026-08-21T20:40:14.535Z"},"bugs":{"url":"https://github.com/GMOD/shared-read-cache/issues"},"author":{"url":"https://github.com/cmdcolin","name":"Colin Diesh","email":"colin.diesh@gmail.com"},"license":"MIT","homepage":"https://github.com/GMOD/shared-read-cache#readme","keywords":["abort","abortsignal","cache","lru","promise"],"repository":{"url":"git+https://github.com/GMOD/shared-read-cache.git","type":"git"},"description":"A promise cache whose shared reads are cancelled only once every caller has given up","maintainers":[{"name":"rbuels","email":"rbuels@gmail.com"},{"name":"cmdcolin","email":"colin.diesh@gmail.com"},{"name":"garrettjstevens","email":"stevens.garrett.j@gmail.com"}],"readme":"# @gmod/shared-read-cache\n\nA promise cache for reads that several callers want at once. One read per key,\nshared by everyone who asks for it while it is in flight, cancelled only once\n**every** one of them has given up.\n\n## Why\n\nMemoizing a bare promise built from the first caller's signal makes that\ncaller's abort reject everyone else awaiting it. In a genome browser, panning\naway from one block then fails its still-wanted siblings.\n\n```js\nimport { SharedReadCache } from '@gmod/shared-read-cache'\n\nconst cache = new SharedReadCache({\n  cacheKey: chunk => chunk.toString(),\n  fill: (chunk, signal) => readChunk(chunk, { signal }),\n})\n\nconst data = await cache.get(chunk, opts.signal)\n```\n\nThis caches what a read produced. For the bytes underneath it,\n[`@gmod/range-cache-filehandle`](https://github.com/GMOD/range-cache-filehandle)\ndoes the same job one layer down, over HTTP range requests.\n\n## Docs\n\n- [docs/dataflow.md](docs/dataflow.md) — how one `get()` flows, with a diagram:\n  where a caller's signal is checked, what `join` does with it, and what\n  settling an entry costs\n- [docs/memory.md](docs/memory.md) — the four ways an entry leaves the cache,\n  and what each of `maxSize`, `idleTimeoutMs`, `evictionPolicy` and\n  `SharedBudget` measured\n- [docs/api.md](docs/api.md) — every option and method\n- [docs/consumers.md](docs/consumers.md) — which gmod package uses this for\n  what, which of them can share a budget, and where each measurement above was\n  taken\n\n## Budgets are opt-in\n\nThere is no default limit. What a sensible one is depends entirely on what you\nare caching, so the package does not prescribe one:\n\n```js\nconst cache = new SharedReadCache({\n  maxSize: 100 * 2 ** 20,\n  sizeOf: chunk => chunk.byteLength,\n  cacheKey: chunk => chunk.toString(),\n  fill: (chunk, signal) => readChunk(chunk, { signal }),\n})\n```\n\nA budget bounds _retained_ memory, not request size. The cache never turns a\nvalue away for being too large: one bigger than the whole budget still goes in,\neviction never touches a read in flight, and it only discards values it has\nalready handed back once — so the worst a budget can cost is a re-read.\n\nUnbounded is the permissive default, not the safe one. With no budget the cache\ngrows for the life of the object; `@gmod/tabix` measured 2GB RSS panning a dense\nVCF before it bounded this. Pass one if the values are large or the object is\nlong-lived. `cache.maxSize = n` later evicts immediately, which is how a\nconsumer sheds memory under pressure.\n\n## `idleTimeoutMs` — reclaiming while nothing is happening\n\nThe cache checks `maxSize` when a read settles, so an idle one sits at whatever\nlevel it reached and never gives it back. For an object that lives as long as\nits UI — a genome browser parked on a region, times every open track — that\nresting level is the memory that matters, and no budget alone will lower it.\n\n```js\nconst cache = new SharedReadCache({\n  maxSize: 1024 * 2 ** 20, // the ceiling under load\n  idleTimeoutMs: 180_000, // ...but only while it is being used\n  sizeOf: chunk => chunk.byteLength,\n  fill: (chunk, signal) => readChunk(chunk, { signal }),\n})\n```\n\nThe two answer different questions, and they work best together. `maxSize` wants\nto be **generous**: set below one request's working set it does not cache less,\nit caches _nothing_ — each value falls out before the next request can reuse it,\nwhile the ones in flight hold their memory anyway. `idleTimeoutMs` is what makes\na generous ceiling affordable, by turning it into a peak rather than a resting\nlevel.\n\nThe clock runs from the last **read** of an entry, or from its fill settling if\nnothing has read it since, so something fetched once and used every second never\nexpires — and a slow read still gets the full timeout to be reused in, rather\nthan spending it on its own download. The sweep skips reads in flight.\n`cache.sweepIdle()` reclaims on demand — on a tab going hidden, say — rather\nthan waiting for the interval.\n\nThe sweep runs only while it has something to reclaim: the first read to settle\narms it, and the first sweep that finds no settled entry stops it, which is why\nthere is no `dispose()` to forget to call. It `unref`s itself where that exists,\nso it will never hold a Node process open.\n\n## One budget across several caches\n\nA per-cache ceiling is not a bound on a consumer that scales the number of\ncaches — one cache per open file, sized so that a single one never thrashes,\nmultiplies. `SharedBudget` bounds them in aggregate, evicting whatever is\nglobally least-recently-used, so an idle cache hands its space to a busy one:\n\n```js\nconst budget = new SharedBudget(1024 * 2 ** 20)\nconst cache = new SharedReadCache({ budget, sizeOf, fill })\n```\n\nIt composes with `maxSize` rather than replacing it, it holds its members weakly\nso there is no `unregister` to forget, and every member must weigh in the same\nunit — a budget adding one cache's bytes to another's record counts bounds\nneither. [docs/memory.md](docs/memory.md) has what dividing a ceiling by the\nfile count measured instead.\n\n## `sizeOf` is the point\n\nThis package exists because four gmod packages each hand-rolled the same cache,\nidentical except for how they weighed an entry: `@gmod/bam` and `@gmod/tabix`\nweigh decompressed bytes, `@gmod/bbi` weighs entries, `@gmod/cram` weighs\ndecoded records. Nothing can weigh a value until its read settles, so a cache\nthat budgets this way has to own its entries — which is why a plain-LRU-backed\npackage could not serve them and each wrote its own.\n\nOmit `sizeOf` and the budget counts entries.\n\n## Behaviour worth knowing\n\n- **A caller with no signal pins the read.** It cannot give up, so no set of\n  aborts should stop the read it joined. One signal-free consumer therefore\n  makes that read uncancellable for everyone joined to it.\n- **A rejection drops rather than caching**, so one transient failure does not\n  poison the key for the life of the cache.\n- **The last settled entry survives any budget.** A value larger than the whole\n  budget is still worth holding; dropping it only buys an immediate re-read.\n- **Eviction never touches a read in flight.** It is not a result yet, and\n  dropping one loses the de-duplication its callers are relying on.\n\n## Relationship to `@gmod/abortable-promise-cache`\n\n`@gmod/abortable-promise-cache` was this module's earlier inspiration. This\nreplaces it, and fixes two things that package got wrong:\n\n- it never took a listener back off a caller's signal, so a long-lived signal\n  accumulated one per key it ever touched\n- it registered a caller that arrived already aborted as a waiter, and an abort\n  listener never fires on an already-aborted signal — so the count could never\n  reach zero and the read turned uncancellable for everyone joined to it\n","readmeFilename":"README.md"}