Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/license-testing' into license-te…
Browse files Browse the repository at this point in the history
…sting
  • Loading branch information
GarfieldDai committed Nov 14, 2024
2 parents 1560db7 + 96f6c32 commit c939fb1
Show file tree
Hide file tree
Showing 4 changed files with 121 additions and 52 deletions.
2 changes: 1 addition & 1 deletion web/i18n/en-US/login.ts
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ const translation = {
licenseExpired: 'License Expired',
licenseExpiredTip: 'The Dify Enterprise license for your workspace has expired. Please contact your administrator to continue using Dify.',
licenseLost: 'License Lost',
licenseLostTip: 'The Dify Enterprise license server for your workspace lost. Please contact your administrator to continue using Dify.',
licenseLostTip: 'Failed to connect Dify license server. Please contact your administrator to continue using Dify.',
licenseInactive: 'License Inactive',
licenseInactiveTip: 'The Dify Enterprise license for your workspace is inactive. Please contact your administrator to continue using Dify.',
}
Expand Down
4 changes: 2 additions & 2 deletions web/i18n/zh-Hans/login.ts
Original file line number Diff line number Diff line change
Expand Up @@ -101,8 +101,8 @@ const translation = {
noLoginMethodTip: '请联系系统管理员添加身份认证方式',
licenseExpired: '许可证已过期',
licenseExpiredTip: '您所在空间的 Dify Enterprise 许可证已过期,请联系管理员以继续使用 Dify。',
licenseLost: '认证服务器丢失',
licenseLostTip: '您所在空间的 Dify Enterprise 认证服务器已丢失,请联系管理员以继续使用 Dify。',
licenseLost: '许可证丢失',
licenseLostTip: '无法连接 Dify 许可证服务器,请联系管理员以继续使用 Dify。',
licenseInactive: '许可证未激活',
licenseInactiveTip: '您所在空间的 Dify Enterprise 许可证尚未激活,请联系管理员以继续使用 Dify。',
}
Expand Down
161 changes: 116 additions & 45 deletions web/service/base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import type {
WorkflowStartedResponse,
} from '@/types/workflow'
import { removeAccessToken } from '@/app/components/share/utils'
import { asyncRunSafe } from '@/utils'
const TIME_OUT = 100000

const ContentType = {
Expand Down Expand Up @@ -550,55 +551,125 @@ export const ssePost = (
}

// base request
export const request = <T>(url: string, options = {}, otherOptions?: IOtherOptions) => {
return new Promise<T>((resolve, reject) => {
export const request = async<T>(url: string, options = {}, otherOptions?: IOtherOptions) => {
try {
const otherOptionsForBaseFetch = otherOptions || {}
baseFetch<T>(url, options, otherOptionsForBaseFetch).then(resolve).catch((errResp) => {
if (errResp?.status === 401) {
return refreshAccessTokenOrRelogin(TIME_OUT).then(() => {
baseFetch<T>(url, options, otherOptionsForBaseFetch).then(resolve).catch(reject)
}).catch(() => {
const {
isPublicAPI = false,
silent,
} = otherOptionsForBaseFetch
const bodyJson = errResp.json()
if (isPublicAPI) {
return bodyJson.then((data: ResponseError) => {
if (data.code === 'web_sso_auth_required')
requiredWebSSOLogin()

if (data.code === 'unauthorized') {
removeAccessToken()
globalThis.location.reload()
}
const [err, resp] = await asyncRunSafe<T>(baseFetch(url, options, otherOptionsForBaseFetch))
if (err === null)
return resp
const errResp: Response = err as any
if (errResp.status === 401) {
const [parseErr, errRespData] = await asyncRunSafe<ResponseError>(errResp.json())
const loginUrl = `${globalThis.location.origin}/signin`
if (parseErr) {
globalThis.location.href = loginUrl
return Promise.reject(err)
}
// special code
const { code, message } = errRespData
// webapp sso
if (code === 'web_sso_auth_required') {
requiredWebSSOLogin()
return Promise.reject(err)
}
// force logout
if (code === 'unauthorized_and_force_logout') {
removeAccessToken()
globalThis.location.reload()
return Promise.reject(err)
}
const {
isPublicAPI = false,
silent,
} = otherOptionsForBaseFetch
if (isPublicAPI && code === 'unauthorized') {
removeAccessToken()
globalThis.location.reload()
return Promise.reject(err)
}
if (code === 'init_validate_failed' && IS_CE_EDITION && !silent) {
Toast.notify({ type: 'error', message, duration: 4000 })
return Promise.reject(err)
}
if (code === 'not_init_validated' && IS_CE_EDITION) {
globalThis.location.href = `${globalThis.location.origin}/init`
return Promise.reject(err)
}
if (code === 'not_setup' && IS_CE_EDITION) {
globalThis.location.href = `${globalThis.location.origin}/install`
return Promise.reject(err)
}

return Promise.reject(data)
})
}
const loginUrl = `${globalThis.location.origin}/signin`
bodyJson.then((data: ResponseError) => {
if (data.code === 'init_validate_failed' && IS_CE_EDITION && !silent)
Toast.notify({ type: 'error', message: data.message, duration: 4000 })
else if (data.code === 'not_init_validated' && IS_CE_EDITION)
globalThis.location.href = `${globalThis.location.origin}/init`
else if (data.code === 'not_setup' && IS_CE_EDITION)
globalThis.location.href = `${globalThis.location.origin}/install`
else if (location.pathname !== '/signin' || !IS_CE_EDITION)
globalThis.location.href = loginUrl
else if (!silent)
Toast.notify({ type: 'error', message: data.message })
}).catch(() => {
// Handle any other errors
globalThis.location.href = loginUrl
})
})
// refresh token
const [refreshErr] = await asyncRunSafe(refreshAccessTokenOrRelogin(TIME_OUT))
if (refreshErr === null)
return baseFetch<T>(url, options, otherOptionsForBaseFetch)
if (location.pathname !== '/signin' || !IS_CE_EDITION) {
globalThis.location.href = loginUrl
return Promise.reject(err)
}
else {
reject(errResp)
if (!silent) {
Toast.notify({ type: 'error', message })
return Promise.reject(err)
}
})
})
globalThis.location.href = loginUrl
return Promise.reject(err)
}
else {
return Promise.reject(err)
}
}
catch (error) {
console.error(error)
return Promise.reject(error)
}
// return new Promise<T>((resolve, reject) => {
// baseFetch<T>(url, options, otherOptionsForBaseFetch).then(resolve).catch((errResp) => {
// if (errResp?.status === 401) {
// return refreshAccessTokenOrRelogin(TIME_OUT).then(() => {
// baseFetch<T>(url, options, otherOptionsForBaseFetch).then(resolve).catch(reject)
// }).catch(() => {
// const {
// isPublicAPI = false,
// silent,
// } = otherOptionsForBaseFetch
// const bodyJson = errResp.json()
// if (isPublicAPI) {
// return bodyJson.then((data: ResponseError) => {
// if (data.code === 'web_sso_auth_required')
// requiredWebSSOLogin()

// if (data.code === 'unauthorized') {
// removeAccessToken()
// globalThis.location.reload()
// }

// return Promise.reject(data)
// })
// }
// const loginUrl = `${globalThis.location.origin}/signin`
// bodyJson.then((data: ResponseError) => {
// if (data.code === 'init_validate_failed' && IS_CE_EDITION && !silent)
// Toast.notify({ type: 'error', message: data.message, duration: 4000 })
// else if (data.code === 'not_init_validated' && IS_CE_EDITION)
// globalThis.location.href = `${globalThis.location.origin}/init`
// else if (data.code === 'not_setup' && IS_CE_EDITION)
// globalThis.location.href = `${globalThis.location.origin}/install`
// else if (location.pathname !== '/signin' || !IS_CE_EDITION)
// globalThis.location.href = loginUrl
// else if (!silent)
// Toast.notify({ type: 'error', message: data.message })
// }).catch(() => {
// // Handle any other errors
// globalThis.location.href = loginUrl
// })
// })
// }
// else {
// reject(errResp)
// }
// })
// })
}

// request methods
Expand Down
6 changes: 2 additions & 4 deletions web/utils/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,8 @@ export async function asyncRunSafe<T = any>(fn: Promise<T>): Promise<[Error] | [
try {
return [null, await fn]
}
catch (e) {
if (e instanceof Error)
return [e]
return [new Error('unknown error')]
catch (e: any) {
return [e || new Error('unknown error')]
}
}

Expand Down

0 comments on commit c939fb1

Please sign in to comment.