11import { ExternalMessage , ExtVersion , ExtServer } from "@App/app/const" ;
22import IoC from "@App/app/ioc" ;
3+ import { v5 as uuidv5 } from "uuid" ;
34import { MessageHander } from "@App/app/message/message" ;
45import { ScriptDAO } from "@App/app/repo/scripts" ;
56import { SystemConfig } from "@App/pkg/config/config" ;
7+ import { prepareScriptByCode } from "@App/pkg/utils/script" ;
68import semver from "semver" ;
79import Manager from "../manager" ;
10+ import ScriptManager from "../script/manager" ;
811
912// value管理器,负责value等更新获取等操作
1013@IoC . Singleton ( MessageHander , SystemConfig )
@@ -13,10 +16,15 @@ export class SystemManager extends Manager {
1316
1417 scriptDAO : ScriptDAO ;
1518
19+ scriptManager : ScriptManager ;
20+
21+ wsVscode ?: WebSocket ;
22+
1623 constructor ( message : MessageHander , systemConfig : SystemConfig ) {
1724 super ( message , "system" ) ;
1825 this . scriptDAO = new ScriptDAO ( ) ;
1926 this . systemConfig = systemConfig ;
27+ this . scriptManager = IoC . instance ( ScriptManager ) as ScriptManager ;
2028 }
2129
2230 init ( ) {
@@ -92,6 +100,75 @@ export class SystemManager extends Manager {
92100 return Promise . resolve ( false ) ;
93101 }
94102 ) ;
103+ this . listenEvent ( "connectVSCode" , this . connectVSCode . bind ( this ) ) ;
104+
105+ this . reconnectVSCode ( ) ;
106+ }
107+
108+ reconnectVSCode ( ) {
109+ let connectVSCodeTimer : any ;
110+ const handler = ( ) => {
111+ if ( ! this . wsVscode ) {
112+ this . connectVSCode ( ) ;
113+ }
114+ } ;
115+ if ( this . systemConfig . vscodeReconnect ) {
116+ connectVSCodeTimer = setInterval ( ( ) => {
117+ handler ( ) ;
118+ } , 30 * 1000 ) ;
119+ }
120+
121+ SystemConfig . hook . addListener ( "update" , ( key , val ) => {
122+ if ( key === "vscodeReconnect" ) {
123+ if ( val ) {
124+ connectVSCodeTimer = setInterval ( ( ) => {
125+ handler ( ) ;
126+ } , 30 * 1000 ) ;
127+ } else {
128+ clearInterval ( connectVSCodeTimer ) ;
129+ }
130+ }
131+ } ) ;
132+ }
133+
134+ connectVSCode ( ) {
135+ return new Promise < void > ( ( resolve , reject ) => {
136+ // 与vsc扩展建立连接
137+ if ( this . wsVscode ) {
138+ this . wsVscode . close ( ) ;
139+ }
140+ try {
141+ this . wsVscode = new WebSocket ( this . systemConfig . vscodeUrl ) ;
142+ } catch ( e : any ) {
143+ reject ( e ) ;
144+ return ;
145+ }
146+ this . wsVscode . addEventListener ( "open" , ( ) => {
147+ this . wsVscode ! . send ( '{"action":"hello"}' ) ;
148+ resolve ( ) ;
149+ } ) ;
150+ this . wsVscode . addEventListener ( "message" , async ( ev ) => {
151+ const data = JSON . parse ( ev . data ) ;
152+ switch ( data . action ) {
153+ case "onchange" : {
154+ const code = data . data . script ;
155+ const script = await prepareScriptByCode (
156+ code ,
157+ "" ,
158+ uuidv5 ( code . data . uri , uuidv5 . URL )
159+ ) ;
160+ this . scriptManager . event . upsertHandler ( script , "vscode" ) ;
161+ break ;
162+ }
163+ default :
164+ }
165+ } ) ;
166+
167+ this . wsVscode . addEventListener ( "error" , ( ) => {
168+ reject ( new Error ( "VSCode连接失败" ) ) ;
169+ this . wsVscode = undefined ;
170+ } ) ;
171+ } ) ;
95172 }
96173
97174 getNotice ( ) : Promise < { notice : string ; isRead : boolean } > {
0 commit comments