refactor: wait for extension load

This commit is contained in:
Louis 2025-07-02 10:56:54 +07:00
parent 66bae2adb8
commit 0dbfde4c80
No known key found for this signature in database
GPG Key ID: 44FA9F4D33C37DE2
2 changed files with 22 additions and 25 deletions

View File

@ -117,10 +117,8 @@ export class ExtensionManager {
/** /**
* Loads all registered extension. * Loads all registered extension.
*/ */
load() { async load() {
this.listExtensions().forEach((ext) => { await Promise.all(this.listExtensions().map((ext) => ext.onLoad()))
ext.onLoad()
})
} }
/** /**
@ -169,25 +167,27 @@ export class ExtensionManager {
async activateExtension(extension: Extension) { async activateExtension(extension: Extension) {
// Import class // Import class
const extensionUrl = extension.url const extensionUrl = extension.url
await import(/* @vite-ignore */convertFileSrc(extensionUrl)).then((extensionClass) => { await import(/* @vite-ignore */ convertFileSrc(extensionUrl)).then(
// Register class if it has a default export (extensionClass) => {
if ( // Register class if it has a default export
typeof extensionClass.default === 'function' && if (
extensionClass.default.prototype typeof extensionClass.default === 'function' &&
) { extensionClass.default.prototype
this.register( ) {
extension.name, this.register(
new extensionClass.default(
extension.url,
extension.name, extension.name,
extension.productName, new extensionClass.default(
extension.active, extension.url,
extension.description, extension.name,
extension.version extension.productName,
extension.active,
extension.description,
extension.version
)
) )
) }
} }
}) )
} }
/** /**

View File

@ -10,7 +10,6 @@ import { fetchModels } from './models'
import { ExtensionManager } from '@/lib/extension' import { ExtensionManager } from '@/lib/extension'
import { fetch as fetchTauri } from '@tauri-apps/plugin-http' import { fetch as fetchTauri } from '@tauri-apps/plugin-http'
export const getProviders = async (): Promise<ModelProvider[]> => { export const getProviders = async (): Promise<ModelProvider[]> => {
const builtinProviders = predefinedProviders.map((provider) => { const builtinProviders = predefinedProviders.map((provider) => {
let models = provider.models as Model[] let models = provider.models as Model[]
@ -48,7 +47,6 @@ export const getProviders = async (): Promise<ModelProvider[]> => {
const runtimeProviders: ModelProvider[] = [] const runtimeProviders: ModelProvider[] = []
for (const [providerName, value] of EngineManager.instance().engines) { for (const [providerName, value] of EngineManager.instance().engines) {
const models = (await fetchModels()) ?? [] const models = (await fetchModels()) ?? []
const provider: ModelProvider = { const provider: ModelProvider = {
active: false, active: false,
persist: true, persist: true,
@ -119,7 +117,6 @@ export const getProviders = async (): Promise<ModelProvider[]> => {
return runtimeProviders.concat(builtinProviders as ModelProvider[]) return runtimeProviders.concat(builtinProviders as ModelProvider[])
} }
/** /**
* Fetches models from a provider's API endpoint * Fetches models from a provider's API endpoint
* Always uses Tauri's HTTP client to bypass CORS issues * Always uses Tauri's HTTP client to bypass CORS issues
@ -178,14 +175,14 @@ export const fetchModelsFromProvider = async (
} }
} catch (error) { } catch (error) {
console.error('Error fetching models from provider:', error) console.error('Error fetching models from provider:', error)
// Provide helpful error message // Provide helpful error message
if (error instanceof Error && error.message.includes('fetch')) { if (error instanceof Error && error.message.includes('fetch')) {
throw new Error( throw new Error(
`Cannot connect to ${provider.provider} at ${provider.base_url}. Please check that the service is running and accessible.` `Cannot connect to ${provider.provider} at ${provider.base_url}. Please check that the service is running and accessible.`
) )
} }
throw error throw error
} }
} }