1
1
import { existsSync , mkdirSync , readdirSync , readFileSync , statSync , unlinkSync , writeFileSync } from 'fs' ;
2
- import { join , resolve } from 'path' ;
2
+ import { basename , dirname , join , resolve } from 'path' ;
3
3
import { env } from 'process' ;
4
4
import sanitize from 'sanitize-filename' ;
5
+
6
+
7
+ function * getFiles ( dir : string ) :Generator < string , void , unknown > {
8
+ const dirents = readdirSync ( dir , { withFileTypes : true } ) ;
9
+ for ( const dirent of dirents . filter ( f => f . name !== 'fileserver' ) ) {
10
+ const res = resolve ( dir , dirent . name ) ;
11
+ if ( dirent . isDirectory ( ) ) {
12
+ yield * getFiles ( res ) ;
13
+ } else {
14
+ yield res ;
15
+ }
16
+ }
17
+ }
18
+
19
+
5
20
export class FileServer {
6
21
static #instance: FileServer ;
7
22
folder : string ;
23
+ cacheFolder : string ;
8
24
/** default file's lifetime in seconds */
9
25
#defaultLifeTime = 60 * 60 * 24 ;
10
26
#timeouts: { filename : string , timeout : NodeJS . Timeout } [ ] ;
@@ -15,6 +31,7 @@ export class FileServer {
15
31
constructor ( folder :string ) {
16
32
if ( ! env . USER_DATA ) throw new Error ( 'USER_DATA not set' ) ;
17
33
this . folder = resolve ( env . USER_DATA , '.cache' , folder ) ;
34
+ this . cacheFolder = resolve ( env . USER_DATA , '.cache' ) ;
18
35
this . #timeouts = [ ] ;
19
36
this . setup ( ) ;
20
37
this . empty ( ) ;
@@ -63,6 +80,10 @@ export class FileServer {
63
80
return resolve ( this . folder , sanitize ( filename ) ) ;
64
81
}
65
82
83
+ #resolveFilesFromCache( ) {
84
+ return getFiles ( this . cacheFolder ) ;
85
+ }
86
+
66
87
#resetFile( filename : string , lifetime : number ) {
67
88
const path = this . #resolveFile( filename ) ;
68
89
const fileExist = existsSync ( path ) ;
@@ -101,13 +122,23 @@ export class FileServer {
101
122
}
102
123
}
103
124
125
+ #findFromCache( filename : string ) {
126
+ const files = this . #resolveFilesFromCache( ) ;
127
+ for ( const f of files ) {
128
+ if ( f . includes ( sanitize ( filename ) ) ) return f ;
129
+ }
130
+ }
131
+
104
132
/**
105
133
*
106
134
* @param data the data to serv
107
135
* @param filename its filename
108
136
* @param lifetime how lang is the file available (in seconds)
109
137
*/
110
138
serv ( data : Buffer , filename :string , lifetime = this . #defaultLifeTime) {
139
+ const cached = this . #findFromCache( filename ) ;
140
+ if ( cached ) return `/cache/${ basename ( dirname ( cached ) ) } /${ filename } ` ;
141
+
111
142
const exist = this . #resetFile( filename , lifetime ) ;
112
143
if ( exist ) return `/files/${ filename } ` ;
113
144
0 commit comments