@@ -91,18 +91,54 @@ export async function getArkoseToken(config) {
91
91
return arkoseToken
92
92
}
93
93
94
+ export async function isNeedWebsocket ( accessToken ) {
95
+ return ( await request ( accessToken , 'GET' , '/accounts/check/v4-2023-04-27' ) ) . responseText . includes (
96
+ 'shared_websocket' ,
97
+ )
98
+ }
99
+
100
+ export async function stopWebsocketConversation ( accessToken , conversationId , wsRequestId ) {
101
+ await request ( accessToken , 'POST' , '/stop_conversation' , {
102
+ conversation_id : conversationId ,
103
+ websocket_request_id : wsRequestId ,
104
+ } )
105
+ }
106
+
107
+ /**
108
+ * @type {WebSocket }
109
+ */
110
+ let websocket
111
+ /**
112
+ * @type {Date }
113
+ */
114
+ let expired_at
115
+ let wsCallbacks = [ ]
116
+
117
+ export async function registerWebsocket ( accessToken ) {
118
+ if ( websocket && new Date ( ) < expired_at - 300000 ) return
119
+
120
+ const response = JSON . parse (
121
+ ( await request ( accessToken , 'POST' , '/register-websocket' ) ) . responseText ,
122
+ )
123
+ if ( response . wss_url ) {
124
+ websocket = new WebSocket ( response . wss_url )
125
+ websocket . onclose = ( ) => {
126
+ websocket = null
127
+ }
128
+ websocket . onmessage = ( event ) => {
129
+ wsCallbacks . forEach ( ( cb ) => cb ( event ) )
130
+ }
131
+ expired_at = new Date ( response . expired_at )
132
+ }
133
+ }
134
+
94
135
/**
95
136
* @param {Runtime.Port } port
96
137
* @param {string } question
97
138
* @param {Session } session
98
139
* @param {string } accessToken
99
140
*/
100
141
export async function generateAnswersWithChatgptWebApi ( port , question , session , accessToken ) {
101
- session . messageId = uuidv4 ( )
102
- if ( session . parentMessageId == null ) {
103
- session . parentMessageId = uuidv4 ( )
104
- }
105
-
106
142
let ws
107
143
const { controller, cleanController } = setAbortController (
108
144
port ,
@@ -116,11 +152,16 @@ export async function generateAnswersWithChatgptWebApi(port, question, session,
116
152
)
117
153
118
154
const config = await getUserConfig ( )
119
- const [ models , requirementsToken , arkoseToken ] = await Promise . all ( [
120
- getModels ( accessToken ) . catch ( cleanController ) ,
155
+ // eslint-disable-next-line no-unused-vars
156
+ const [ models , requirementsToken , arkoseToken , useWebsocket ] = await Promise . all ( [
157
+ getModels ( accessToken ) . catch ( cleanController ) , // don't throw error here
121
158
getRequirementsToken ( accessToken ) ,
122
159
getArkoseToken ( config ) ,
123
- ] )
160
+ isNeedWebsocket ( accessToken ) . catch ( cleanController ) , // don't throw error here
161
+ ] ) . catch ( ( e ) => {
162
+ cleanController ( )
163
+ throw e
164
+ } )
124
165
console . debug ( 'models' , models )
125
166
const selectedModel = Models [ session . modelName ] . value
126
167
const usedModel =
@@ -149,6 +190,10 @@ export async function generateAnswersWithChatgptWebApi(port, question, session,
149
190
let wss_url = ''
150
191
151
192
const url = `${ config . customChatGptWebApiUrl } ${ config . customChatGptWebApiPath } `
193
+ session . messageId = uuidv4 ( )
194
+ if ( session . parentMessageId == null ) {
195
+ session . parentMessageId = uuidv4 ( )
196
+ }
152
197
const options = {
153
198
method : 'POST' ,
154
199
signal : controller . signal ,
0 commit comments