Skip to content

Commit 5588157

Browse files
committed
Simplify caching and use permanent cache for pnpvfs
1 parent 8cbd23d commit 5588157

File tree

1 file changed

+6
-37
lines changed

1 file changed

+6
-37
lines changed

internal/vfs/pnpvfs/pnpvfs.go

Lines changed: 6 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,9 @@ import (
1414
"github.com/microsoft/typescript-go/internal/vfs/iovfs"
1515
)
1616

17-
type cachedZipReader struct {
18-
reader *zip.ReadCloser
19-
lastUsed time.Time
20-
zipMTime time.Time
21-
}
22-
2317
type pnpFS struct {
2418
fs vfs.FS
25-
maxOpenReaders int
26-
cachedZipReadersMap map[string]*cachedZipReader
19+
cachedZipReadersMap map[string]*zip.ReadCloser
2720
cacheReaderMutex sync.Mutex
2821
}
2922

@@ -32,8 +25,7 @@ var _ vfs.FS = (*pnpFS)(nil)
3225
func From(fs vfs.FS) *pnpFS {
3326
pnpFS := &pnpFS{
3427
fs: fs,
35-
maxOpenReaders: 80, // Max number of zip files that can be open at the same time
36-
cachedZipReadersMap: make(map[string]*cachedZipReader),
28+
cachedZipReadersMap: make(map[string]*zip.ReadCloser),
3729
cacheReaderMutex: sync.Mutex{},
3830
}
3931

@@ -164,48 +156,25 @@ func getMatchingFS(pnpFS *pnpFS, path string) (vfs.FS, string, string) {
164156
return pnpFS.fs, path, ""
165157
}
166158

167-
var usedReader *cachedZipReader
159+
var usedReader *zip.ReadCloser
168160

169161
pnpFS.cacheReaderMutex.Lock()
170162
defer pnpFS.cacheReaderMutex.Unlock()
171163

172-
zipMTime := zipStat.ModTime()
173-
174164
cachedReader, ok := pnpFS.cachedZipReadersMap[zipPath]
175-
if ok && cachedReader.zipMTime.Equal(zipMTime) {
176-
cachedReader.lastUsed = time.Now()
165+
if ok {
177166
usedReader = cachedReader
178167
} else {
179168
zipReader, err := zip.OpenReader(zipPath)
180169
if err != nil {
181170
return pnpFS.fs, path, ""
182171
}
183172

184-
if len(pnpFS.cachedZipReadersMap) >= pnpFS.maxOpenReaders {
185-
pnpFS.deleteOldestReader()
186-
}
187-
188-
usedReader = &cachedZipReader{reader: zipReader, lastUsed: time.Now(), zipMTime: zipMTime}
173+
usedReader = zipReader
189174
pnpFS.cachedZipReadersMap[zipPath] = usedReader
190175
}
191176

192-
return iovfs.From(usedReader.reader, pnpFS.fs.UseCaseSensitiveFileNames()), internalPath, zipPath
193-
}
194-
195-
func (pnpFS *pnpFS) deleteOldestReader() {
196-
var oldestReader *cachedZipReader
197-
var oldestReaderPath string
198-
for path, reader := range pnpFS.cachedZipReadersMap {
199-
if oldestReader == nil || reader.lastUsed.Before(oldestReader.lastUsed) {
200-
oldestReader = reader
201-
oldestReaderPath = path
202-
}
203-
}
204-
205-
if oldestReader != nil {
206-
oldestReader.reader.Close()
207-
delete(pnpFS.cachedZipReadersMap, oldestReaderPath)
208-
}
177+
return iovfs.From(usedReader, pnpFS.fs.UseCaseSensitiveFileNames()), internalPath, zipPath
209178
}
210179

211180
// Virtual paths are used to make different paths resolve to the same real file or folder, which is necessary in some cases when PnP is enabled

0 commit comments

Comments
 (0)