@@ -163,6 +163,138 @@ export class ResourceManager extends Manager {
163
163
return Promise . resolve ( ret ) ;
164
164
}
165
165
166
+ // 更新资源
167
+ async checkScriptResource ( script : Script ) {
168
+ return Promise . resolve ( {
169
+ ...( ( await this . checkRequireResource ( script ) ) || { } ) ,
170
+ ...( ( await this . checkRequireCssResource ( script ) ) || { } ) ,
171
+ ...( ( await this . checkResourceResource ( script ) ) || { } ) ,
172
+ } ) ;
173
+ }
174
+
175
+ async checkRequireResource ( script : Script ) {
176
+ if ( ! script . metadata . require ) {
177
+ return Promise . resolve ( { } ) ;
178
+ }
179
+ const ret : { [ key : string ] : Resource } = { } ;
180
+ await Promise . allSettled (
181
+ script . metadata . require . map ( async ( u ) => {
182
+ const res = await this . checkResource ( script . id , u , "require" ) ;
183
+ if ( res ) {
184
+ ret [ u ] = res ;
185
+ }
186
+ } )
187
+ ) ;
188
+ return Promise . resolve ( ret ) ;
189
+ }
190
+
191
+ async checkRequireCssResource ( script : Script ) {
192
+ if ( ! script . metadata [ "require-css" ] ) {
193
+ return Promise . resolve ( { } ) ;
194
+ }
195
+ const ret : { [ key : string ] : Resource } = { } ;
196
+ await Promise . allSettled (
197
+ script . metadata . require . map ( async ( u ) => {
198
+ const res = await this . checkResource ( script . id , u , "require-css" ) ;
199
+ if ( res ) {
200
+ ret [ u ] = res ;
201
+ }
202
+ } )
203
+ ) ;
204
+ return Promise . resolve ( ret ) ;
205
+ }
206
+
207
+ async checkResourceResource ( script : Script ) {
208
+ if ( ! script . metadata . resource ) {
209
+ return Promise . resolve ( { } ) ;
210
+ }
211
+ const ret : { [ key : string ] : Resource } = { } ;
212
+ await Promise . allSettled (
213
+ script . metadata . resource . map ( async ( u ) => {
214
+ const split = u . split ( / \s + / ) ;
215
+ if ( split . length === 2 ) {
216
+ const res = await this . checkResource ( script . id , split [ 1 ] , "resource" ) ;
217
+ if ( res ) {
218
+ ret [ split [ 0 ] ] = res ;
219
+ }
220
+ }
221
+ } )
222
+ ) ;
223
+ return Promise . resolve ( ret ) ;
224
+ }
225
+
226
+ async checkResource ( id : number , url : string , type : ResourceType ) {
227
+ let res = await this . getResourceModel ( url ) ;
228
+ if ( res ) {
229
+ // 判断1分钟过期
230
+ if ( ( res . updatetime || 0 ) > new Date ( ) . getTime ( ) - 1000 * 60 ) {
231
+ return Promise . resolve ( res ) ;
232
+ }
233
+ }
234
+ try {
235
+ res = await this . updateResource ( url , id , type ) ;
236
+ if ( res ) {
237
+ return Promise . resolve ( res ) ;
238
+ }
239
+ } catch ( e ) {
240
+ // ignore
241
+ // this.logger.error("get resource failed", { id, url }, Logger.E(e));
242
+ }
243
+ return Promise . resolve ( undefined ) ;
244
+ }
245
+
246
+ async updateResource ( url : string , scriptId : number , type : ResourceType ) {
247
+ // 重新加载
248
+ const u = this . parseUrl ( url ) ;
249
+ let result = await this . getResourceModel ( u . url ) ;
250
+ try {
251
+ const resource = await this . loadByUrl ( u . url , type ) ;
252
+ resource . updatetime = new Date ( ) . getTime ( ) ;
253
+ Cache . getInstance ( ) . set ( CacheKey . resourceByUrl ( u . url ) , resource ) ;
254
+ if ( ! result ) {
255
+ // 资源不存在,保存
256
+ resource . createtime = new Date ( ) . getTime ( ) ;
257
+ const id = await this . resourceDAO . save ( resource ) ;
258
+ result = resource ;
259
+ this . logger . info ( "reload new resource success" , { url : u . url , id } ) ;
260
+ } else {
261
+ result . base64 = resource . base64 ;
262
+ result . content = resource . content ;
263
+ result . contentType = resource . contentType ;
264
+ result . hash = resource . hash ;
265
+ result . updatetime = resource . updatetime ;
266
+ await this . resourceDAO . update ( result . id , result ) ;
267
+ this . logger . info ( "reload resource success" , {
268
+ url : u . url ,
269
+ id : result . id ,
270
+ } ) ;
271
+ }
272
+ } catch ( e ) {
273
+ this . logger . error ( "load resource error" , { url : u . url } , Logger . E ( e ) ) ;
274
+ throw e ;
275
+ }
276
+
277
+ const link = await this . resourceLinkDAO . findOne ( {
278
+ url : u . url ,
279
+ scriptId,
280
+ } ) ;
281
+ if ( link ) {
282
+ return Promise . resolve ( result ) ;
283
+ }
284
+ const id = await this . resourceLinkDAO . save ( {
285
+ id : 0 ,
286
+ url : u . url ,
287
+ scriptId,
288
+ createtime : new Date ( ) . getTime ( ) ,
289
+ } ) ;
290
+ this . logger . debug ( "resource link" , {
291
+ url : u . url ,
292
+ resourceID : result . id ,
293
+ id,
294
+ } ) ;
295
+ return Promise . resolve ( result ) ;
296
+ }
297
+
166
298
public async addResource (
167
299
url : string ,
168
300
scriptId : number ,
0 commit comments