@@ -163,6 +163,138 @@ export class ResourceManager extends Manager {
163163 return Promise . resolve ( ret ) ;
164164 }
165165
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+
166298 public async addResource (
167299 url : string ,
168300 scriptId : number ,
0 commit comments