Skip to content

Commit 17778f5

Browse files
committed
refactor: services
1 parent 9b157ff commit 17778f5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+273
-270
lines changed

src/background/commands.mjs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import Browser from 'webextension-polyfill'
2+
import { config as menuConfig } from '../content-script/menu-tools/index.mjs'
3+
4+
export function registerCommands() {
5+
Browser.commands.onCommand.addListener(async (command) => {
6+
const message = {
7+
itemId: command,
8+
selectionText: '',
9+
useMenuPosition: false,
10+
}
11+
console.debug('command triggered', message)
12+
13+
if (command in menuConfig) {
14+
if (menuConfig[command].action) {
15+
menuConfig[command].action()
16+
}
17+
18+
if (menuConfig[command].genPrompt) {
19+
const currentTab = (await Browser.tabs.query({ active: true, currentWindow: true }))[0]
20+
Browser.tabs.sendMessage(currentTab.id, {
21+
type: 'CREATE_CHAT',
22+
data: message,
23+
})
24+
}
25+
}
26+
})
27+
}

src/background/index.mjs

Lines changed: 62 additions & 232 deletions
Original file line numberDiff line numberDiff line change
@@ -4,161 +4,85 @@ import {
44
deleteConversation,
55
generateAnswersWithChatgptWebApi,
66
sendMessageFeedback,
7-
} from './apis/chatgpt-web'
8-
import { generateAnswersWithBingWebApi } from './apis/bing-web.mjs'
7+
} from '../services/apis/chatgpt-web'
8+
import { generateAnswersWithBingWebApi } from '../services/apis/bing-web.mjs'
99
import {
1010
generateAnswersWithChatgptApi,
1111
generateAnswersWithGptCompletionApi,
12-
} from './apis/openai-api'
13-
import { generateAnswersWithCustomApi } from './apis/custom-api.mjs'
14-
import { generateAnswersWithAzureOpenaiApi } from './apis/azure-openai-api.mjs'
15-
import { generateAnswersWithWaylaidwandererApi } from './apis/waylaidwanderer-api.mjs'
16-
import { generateAnswersWithPoeWebApi } from './apis/poe-web.mjs'
12+
} from '../services/apis/openai-api'
13+
import { generateAnswersWithCustomApi } from '../services/apis/custom-api.mjs'
14+
import { generateAnswersWithAzureOpenaiApi } from '../services/apis/azure-openai-api.mjs'
15+
import { generateAnswersWithWaylaidwandererApi } from '../services/apis/waylaidwanderer-api.mjs'
16+
import { generateAnswersWithPoeWebApi } from '../services/apis/poe-web.mjs'
1717
import {
1818
azureOpenAiApiModelKeys,
1919
bingWebModelKeys,
2020
chatgptApiModelKeys,
2121
chatgptWebModelKeys,
22-
clearOldAccessToken,
2322
customApiModelKeys,
24-
defaultConfig,
25-
getPreferredLanguageKey,
26-
getUserConfig,
2723
githubThirdPartyApiModelKeys,
2824
gptApiModelKeys,
2925
Models,
3026
poeWebModelKeys,
31-
setAccessToken,
3227
} from '../config/index.mjs'
33-
import { config as menuConfig } from '../content-script/menu-tools'
34-
import { t, changeLanguage } from 'i18next'
3528
import '../_locales/i18n'
3629
import { openUrl } from '../utils/open-url'
37-
38-
async function getChatGptAccessToken() {
39-
await clearOldAccessToken()
40-
const userConfig = await getUserConfig()
41-
if (userConfig.accessToken) {
42-
return userConfig.accessToken
43-
} else {
44-
const cookie = (await Browser.cookies.getAll({ url: 'https://chat.openai.com/' }))
45-
.map((cookie) => {
46-
return `${cookie.name}=${cookie.value}`
47-
})
48-
.join('; ')
49-
const resp = await fetch('https://chat.openai.com/api/auth/session', {
50-
headers: {
51-
Cookie: cookie,
52-
},
53-
})
54-
if (resp.status === 403) {
55-
throw new Error('CLOUDFLARE')
56-
}
57-
const data = await resp.json().catch(() => ({}))
58-
if (!data.accessToken) {
59-
throw new Error('UNAUTHORIZED')
30+
import {
31+
getBingAccessToken,
32+
getChatGptAccessToken,
33+
registerPortListener,
34+
} from '../services/wrappers.mjs'
35+
import { refreshMenu } from './menus.mjs'
36+
import { registerCommands } from './commands.mjs'
37+
38+
async function executeApi(session, port, config) {
39+
if (chatgptWebModelKeys.includes(session.modelName)) {
40+
const accessToken = await getChatGptAccessToken()
41+
session.messageId = uuidv4()
42+
if (session.parentMessageId == null) {
43+
session.parentMessageId = uuidv4()
6044
}
61-
await setAccessToken(data.accessToken)
62-
return data.accessToken
45+
await generateAnswersWithChatgptWebApi(port, session.question, session, accessToken)
46+
} else if (bingWebModelKeys.includes(session.modelName)) {
47+
const accessToken = await getBingAccessToken()
48+
if (session.modelName === 'bingFreeSydney')
49+
await generateAnswersWithBingWebApi(port, session.question, session, accessToken, true)
50+
else await generateAnswersWithBingWebApi(port, session.question, session, accessToken)
51+
} else if (gptApiModelKeys.includes(session.modelName)) {
52+
await generateAnswersWithGptCompletionApi(
53+
port,
54+
session.question,
55+
session,
56+
config.apiKey,
57+
session.modelName,
58+
)
59+
} else if (chatgptApiModelKeys.includes(session.modelName)) {
60+
await generateAnswersWithChatgptApi(
61+
port,
62+
session.question,
63+
session,
64+
config.apiKey,
65+
session.modelName,
66+
)
67+
} else if (customApiModelKeys.includes(session.modelName)) {
68+
await generateAnswersWithCustomApi(port, session.question, session, '', config.customModelName)
69+
} else if (azureOpenAiApiModelKeys.includes(session.modelName)) {
70+
await generateAnswersWithAzureOpenaiApi(port, session.question, session)
71+
} else if (githubThirdPartyApiModelKeys.includes(session.modelName)) {
72+
await generateAnswersWithWaylaidwandererApi(port, session.question, session)
73+
} else if (poeWebModelKeys.includes(session.modelName)) {
74+
if (session.modelName === 'poeAiWebCustom')
75+
await generateAnswersWithPoeWebApi(port, session.question, session, config.poeCustomBotName)
76+
else
77+
await generateAnswersWithPoeWebApi(
78+
port,
79+
session.question,
80+
session,
81+
Models[session.modelName].value,
82+
)
6383
}
6484
}
6585

66-
async function getBingAccessToken() {
67-
return (await Browser.cookies.get({ url: 'https://bing.com/', name: '_U' }))?.value
68-
}
69-
70-
Browser.runtime.onConnect.addListener((port) => {
71-
console.debug('connected')
72-
const onMessage = async (msg) => {
73-
console.debug('received msg', msg)
74-
const session = msg.session
75-
if (!session) return
76-
const config = await getUserConfig()
77-
if (!session.modelName) session.modelName = config.modelName
78-
if (!session.aiName) session.aiName = Models[session.modelName].desc
79-
port.postMessage({ session })
80-
81-
try {
82-
if (chatgptWebModelKeys.includes(session.modelName)) {
83-
const accessToken = await getChatGptAccessToken()
84-
session.messageId = uuidv4()
85-
if (session.parentMessageId == null) {
86-
session.parentMessageId = uuidv4()
87-
}
88-
await generateAnswersWithChatgptWebApi(port, session.question, session, accessToken)
89-
} else if (bingWebModelKeys.includes(session.modelName)) {
90-
const accessToken = await getBingAccessToken()
91-
if (session.modelName === 'bingFreeSydney')
92-
await generateAnswersWithBingWebApi(port, session.question, session, accessToken, true)
93-
else await generateAnswersWithBingWebApi(port, session.question, session, accessToken)
94-
} else if (gptApiModelKeys.includes(session.modelName)) {
95-
await generateAnswersWithGptCompletionApi(
96-
port,
97-
session.question,
98-
session,
99-
config.apiKey,
100-
session.modelName,
101-
)
102-
} else if (chatgptApiModelKeys.includes(session.modelName)) {
103-
await generateAnswersWithChatgptApi(
104-
port,
105-
session.question,
106-
session,
107-
config.apiKey,
108-
session.modelName,
109-
)
110-
} else if (customApiModelKeys.includes(session.modelName)) {
111-
await generateAnswersWithCustomApi(
112-
port,
113-
session.question,
114-
session,
115-
'',
116-
config.customModelName,
117-
)
118-
} else if (azureOpenAiApiModelKeys.includes(session.modelName)) {
119-
await generateAnswersWithAzureOpenaiApi(port, session.question, session)
120-
} else if (githubThirdPartyApiModelKeys.includes(session.modelName)) {
121-
await generateAnswersWithWaylaidwandererApi(port, session.question, session)
122-
} else if (poeWebModelKeys.includes(session.modelName)) {
123-
if (session.modelName === 'poeAiWebCustom')
124-
await generateAnswersWithPoeWebApi(
125-
port,
126-
session.question,
127-
session,
128-
config.poeCustomBotName,
129-
)
130-
else
131-
await generateAnswersWithPoeWebApi(
132-
port,
133-
session.question,
134-
session,
135-
Models[session.modelName].value,
136-
)
137-
}
138-
} catch (err) {
139-
console.error(err)
140-
if (!err.message.includes('aborted')) {
141-
if (
142-
['message you submitted was too long', 'maximum context length'].some((m) =>
143-
err.message.includes(m),
144-
)
145-
)
146-
port.postMessage({ error: t('Exceeded maximum context length') + '\n' + err.message })
147-
else port.postMessage({ error: err.message })
148-
}
149-
}
150-
}
151-
152-
const onDisconnect = () => {
153-
console.debug('port disconnected, remove listener')
154-
port.onMessage.removeListener(onMessage)
155-
port.onDisconnect.removeListener(onDisconnect)
156-
}
157-
158-
port.onMessage.addListener(onMessage)
159-
port.onDisconnect.addListener(onDisconnect)
160-
})
161-
16286
Browser.runtime.onMessage.addListener(async (message) => {
16387
if (message.type === 'FEEDBACK') {
16488
const token = await getChatGptAccessToken()
@@ -170,105 +94,11 @@ Browser.runtime.onMessage.addListener(async (message) => {
17094
} else if (message.type === 'OPEN_URL') {
17195
const data = message.data
17296
openUrl(data.url)
173-
}
174-
})
175-
176-
Browser.commands.onCommand.addListener(async (command) => {
177-
const message = {
178-
itemId: command,
179-
selectionText: '',
180-
useMenuPosition: false,
181-
}
182-
console.debug('command triggered', message)
183-
184-
if (command in menuConfig) {
185-
if (menuConfig[command].action) {
186-
menuConfig[command].action()
187-
}
188-
189-
if (menuConfig[command].genPrompt) {
190-
const currentTab = (await Browser.tabs.query({ active: true, currentWindow: true }))[0]
191-
Browser.tabs.sendMessage(currentTab.id, {
192-
type: 'CREATE_CHAT',
193-
data: message,
194-
})
195-
}
196-
}
197-
})
198-
199-
function refreshMenu() {
200-
Browser.contextMenus.removeAll().then(async () => {
201-
await getPreferredLanguageKey().then((lang) => {
202-
changeLanguage(lang)
203-
})
204-
const menuId = 'ChatGPTBox-Menu'
205-
Browser.contextMenus.create({
206-
id: menuId,
207-
title: 'ChatGPTBox',
208-
contexts: ['all'],
209-
})
210-
211-
for (const [k, v] of Object.entries(menuConfig)) {
212-
Browser.contextMenus.create({
213-
id: menuId + k,
214-
parentId: menuId,
215-
title: t(v.label),
216-
contexts: ['all'],
217-
})
218-
}
219-
Browser.contextMenus.create({
220-
id: menuId + 'separator1',
221-
parentId: menuId,
222-
contexts: ['selection'],
223-
type: 'separator',
224-
})
225-
for (const index in defaultConfig.selectionTools) {
226-
const key = defaultConfig.selectionTools[index]
227-
const desc = defaultConfig.selectionToolsDesc[index]
228-
Browser.contextMenus.create({
229-
id: menuId + key,
230-
parentId: menuId,
231-
title: t(desc),
232-
contexts: ['selection'],
233-
})
234-
}
235-
236-
Browser.contextMenus.onClicked.addListener((info, tab) => {
237-
Browser.tabs.query({ active: true, currentWindow: true }).then((tabs) => {
238-
const currentTab = tabs[0]
239-
const message = {
240-
itemId: info.menuItemId.replace(menuId, ''),
241-
selectionText: info.selectionText,
242-
useMenuPosition: tab.id === currentTab.id,
243-
}
244-
console.debug('menu clicked', message)
245-
246-
if (defaultConfig.selectionTools.includes(message.itemId)) {
247-
Browser.tabs.sendMessage(currentTab.id, {
248-
type: 'CREATE_CHAT',
249-
data: message,
250-
})
251-
} else if (message.itemId in menuConfig) {
252-
if (menuConfig[message.itemId].action) {
253-
menuConfig[message.itemId].action()
254-
}
255-
256-
if (menuConfig[message.itemId].genPrompt) {
257-
Browser.tabs.sendMessage(currentTab.id, {
258-
type: 'CREATE_CHAT',
259-
data: message,
260-
})
261-
}
262-
}
263-
})
264-
})
265-
})
266-
}
267-
268-
Browser.runtime.onMessage.addListener(async (message) => {
269-
if (message.type === 'REFRESH_MENU') {
97+
} else if (message.type === 'REFRESH_MENU') {
27098
refreshMenu()
27199
}
272100
})
273101

102+
registerPortListener(async (session, port, config) => await executeApi(session, port, config))
103+
registerCommands()
274104
refreshMenu()

0 commit comments

Comments
 (0)