1- import {
2- fetchScriptInfo ,
3- parseMetadata ,
4- prepareScriptByCode ,
5- } from "@App/pkg/utils/script" ;
1+ import { fetchScriptInfo , prepareScriptByCode } from "@App/pkg/utils/script" ;
62import Cache from "@App/app/cache" ;
7- import semver from "semver" ;
83import CacheKey from "@App/pkg/utils/cache_key" ;
94import { MessageHander } from "@App/app/message/message" ;
105import IoC from "@App/app/ioc" ;
11- import axios from "axios" ;
126import LoggerCore from "@App/app/logger/core" ;
137import Logger from "@App/app/logger/logger" ;
148import { SystemConfig } from "@App/pkg/config/config" ;
9+ import { checkSilenceUpdate , ltever } from "@App/pkg/utils/utils" ;
1510import Manager from "../manager" ;
16- import {
17- Metadata ,
18- Script ,
19- SCRIPT_STATUS_DISABLE ,
20- ScriptDAO ,
21- } from "../../repo/scripts" ;
11+ import { Script , SCRIPT_STATUS_DISABLE , ScriptDAO } from "../../repo/scripts" ;
2212import ScriptEventListener from "./event" ;
2313import Hook from "../hook" ;
2414
15+ export type InstallSource = "user" | "system" | "sync" | "subscribe" ;
16+
2517// 脚本管理器,负责脚本实际的安装、卸载、更新等操作
2618@IoC . Singleton ( MessageHander , SystemConfig )
2719export class ScriptManager extends Manager {
@@ -76,10 +68,6 @@ export class ScriptManager extends Manager {
7668 return ;
7769 }
7870 this . checkUpdate ( script . id , "system" ) ;
79- // 更新检查时间
80- this . scriptDAO . update ( script . id , {
81- checktime : new Date ( ) . getTime ( ) ,
82- } ) ;
8371 } ) ;
8472 } ) ;
8573 } , 600 * 1000 ) ;
@@ -121,7 +109,7 @@ export class ScriptManager extends Manager {
121109 Cache . getInstance ( ) . del ( CacheKey . scriptInfo ( info . uuid ) ) ;
122110 } , 60 * 1000 ) ;
123111 chrome . tabs . create ( {
124- url : `src/install.html?uuid=${ info . uuid } ` ,
112+ url : `/ src/install.html?uuid=${ info . uuid } ` ,
125113 } ) ;
126114 } )
127115 . catch ( ( ) => {
@@ -137,26 +125,17 @@ export class ScriptManager extends Manager {
137125 if ( ! script ) {
138126 return Promise . resolve ( false ) ;
139127 }
128+ this . scriptDAO . update ( id , { checktime : new Date ( ) . getTime ( ) } ) ;
140129 if ( ! script . checkUpdateUrl ) {
141130 return Promise . resolve ( false ) ;
142131 }
143132 const logger = LoggerCore . getLogger ( {
144133 scriptId : id ,
145134 name : script . name ,
146135 } ) ;
147- this . scriptDAO . update ( id , { checktime : new Date ( ) . getTime ( ) } ) ;
148136 try {
149- const resp = await axios . get ( script . checkUpdateUrl , {
150- responseType : "text" ,
151- headers : {
152- "Cache-Control" : "no-cache" ,
153- } ,
154- } ) ;
155- if ( resp . status !== 200 ) {
156- logger . error ( "check update failed" , { status : resp . status } ) ;
157- return Promise . resolve ( false ) ;
158- }
159- const metadata = parseMetadata ( resp . data ) ;
137+ const info = await fetchScriptInfo ( script . checkUpdateUrl , source , false ) ;
138+ const { metadata } = info ;
160139 if ( ! metadata ) {
161140 logger . error ( "parse metadata failed" ) ;
162141 return Promise . resolve ( false ) ;
@@ -171,7 +150,7 @@ export class ScriptManager extends Manager {
171150 oldVersion = "0.0.0" ;
172151 }
173152 // 对比版本大小
174- if ( semver . lte ( newVersion , oldVersion ) ) {
153+ if ( ltever ( newVersion , oldVersion , logger ) ) {
175154 return Promise . resolve ( false ) ;
176155 }
177156 // 进行更新
@@ -202,51 +181,40 @@ export class ScriptManager extends Manager {
202181 script . uuid
203182 ) ;
204183 if (
205- this . checkUpdateRule (
184+ checkSilenceUpdate (
206185 newScript . oldScript ! . metadata ,
207186 newScript . metadata
208187 )
209188 ) {
210189 logger . info ( "silence update script" ) ;
211190 this . event . upsertHandler ( newScript ) ;
191+ return ;
212192 }
213193 } catch ( e ) {
214194 logger . error ( "prepare script failed" , Logger . E ( e ) ) ;
215195 }
216- } else {
217- Cache . getInstance ( ) . set ( CacheKey . scriptInfo ( info . uuid ) , info ) ;
218- chrome . tabs . create ( {
219- url : `src/install.html?uuid=${ info . uuid } ` ,
220- } ) ;
221196 }
197+ Cache . getInstance ( ) . set ( CacheKey . scriptInfo ( info . uuid ) , info ) ;
198+ chrome . tabs . create ( {
199+ url : `src/install.html?uuid=${ info . uuid } ` ,
200+ } ) ;
222201 } )
223202 . catch ( ( e ) => {
224203 logger . error ( "fetch script info failed" , Logger . E ( e ) ) ;
225204 } ) ;
226205 }
227206
228- // 检查订阅规则是否改变,是否能够静默更新
229- public checkUpdateRule ( oldMeta : Metadata , newMeta : Metadata ) : boolean {
230- // 判断connect是否改变
231- const oldConnect = new Map ( ) ;
232- const newConnect = new Map ( ) ;
233- oldMeta . connect &&
234- oldMeta . connect . forEach ( ( val ) => {
235- oldConnect . set ( val , 1 ) ;
236- } ) ;
237- newMeta . connect &&
238- newMeta . connect . forEach ( ( val ) => {
239- newConnect . set ( val , 1 ) ;
240- } ) ;
241- // 老的里面没有新的就需要用户确认了
242- const keys = Object . keys ( newConnect ) ;
243- for ( let i = 0 ; i < keys . length ; i += 1 ) {
244- const key = keys [ i ] ;
245- if ( ! oldConnect . has ( key ) ) {
246- return false ;
247- }
248- }
249- return true ;
207+ // 直接通过url静默安装脚本
208+ async installByUrl (
209+ url : string ,
210+ source : InstallSource ,
211+ subscribeUrl ?: string
212+ ) {
213+ const info = await fetchScriptInfo ( url , "system" , false ) ;
214+ const script = await prepareScriptByCode ( info . code , url , info . uuid ) ;
215+ script . subscribeUrl = subscribeUrl ;
216+ await this . event . upsertHandler ( script , "system" ) ;
217+ return Promise . resolve ( script ) ;
250218 }
251219}
252220
0 commit comments