Skip to content

Commit f2bbc86

Browse files
committed
improve 074b6cc
1 parent 9589509 commit f2bbc86

File tree

2 files changed

+59
-10
lines changed

2 files changed

+59
-10
lines changed

src/services/apis/chatgpt-web.mjs

+53-8
Original file line numberDiff line numberDiff line change
@@ -91,18 +91,54 @@ export async function getArkoseToken(config) {
9191
return arkoseToken
9292
}
9393

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+
94135
/**
95136
* @param {Runtime.Port} port
96137
* @param {string} question
97138
* @param {Session} session
98139
* @param {string} accessToken
99140
*/
100141
export async function generateAnswersWithChatgptWebApi(port, question, session, accessToken) {
101-
session.messageId = uuidv4()
102-
if (session.parentMessageId == null) {
103-
session.parentMessageId = uuidv4()
104-
}
105-
106142
let ws
107143
const { controller, cleanController } = setAbortController(
108144
port,
@@ -116,11 +152,16 @@ export async function generateAnswersWithChatgptWebApi(port, question, session,
116152
)
117153

118154
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
121158
getRequirementsToken(accessToken),
122159
getArkoseToken(config),
123-
])
160+
isNeedWebsocket(accessToken).catch(cleanController), // don't throw error here
161+
]).catch((e) => {
162+
cleanController()
163+
throw e
164+
})
124165
console.debug('models', models)
125166
const selectedModel = Models[session.modelName].value
126167
const usedModel =
@@ -149,6 +190,10 @@ export async function generateAnswersWithChatgptWebApi(port, question, session,
149190
let wss_url = ''
150191

151192
const url = `${config.customChatGptWebApiUrl}${config.customChatGptWebApiPath}`
193+
session.messageId = uuidv4()
194+
if (session.parentMessageId == null) {
195+
session.parentMessageId = uuidv4()
196+
}
152197
const options = {
153198
method: 'POST',
154199
signal: controller.signal,

src/services/apis/shared.mjs

+6-2
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,12 @@ export function setAbortController(port, onStop, onDisconnect) {
3737
port.onDisconnect.addListener(disconnectListener)
3838

3939
const cleanController = () => {
40-
port.onMessage.removeListener(messageListener)
41-
port.onDisconnect.removeListener(disconnectListener)
40+
try {
41+
port.onMessage.removeListener(messageListener)
42+
port.onDisconnect.removeListener(disconnectListener)
43+
} catch (e) {
44+
// ignore
45+
}
4246
}
4347

4448
return { controller, cleanController, messageListener, disconnectListener }

0 commit comments

Comments
 (0)