fix service worker

This commit is contained in:
Zhang Minghan 2023-11-04 20:46:59 +08:00
parent a22f14a123
commit 47da8009aa
8 changed files with 23 additions and 59 deletions

View File

@ -8,7 +8,7 @@ import {
} from "@/utils/env.ts"; } from "@/utils/env.ts";
import { getMemory } from "@/utils/memory.ts"; import { getMemory } from "@/utils/memory.ts";
export const version = "3.6.9rc"; export const version = "3.6.10";
export const dev: boolean = getDev(); export const dev: boolean = getDev();
export const deploy: boolean = true; export const deploy: boolean = true;
export let rest_api: string = getRestApi(deploy); export let rest_api: string = getRestApi(deploy);
@ -25,7 +25,7 @@ export const supportModels: Model[] = [
{ id: "gpt-4-dalle", name: "DALLE3", free: false, auth: true }, { id: "gpt-4-dalle", name: "DALLE3", free: false, auth: true },
// anthropic models // anthropic models
{ id: "claude-2", name: "Claude-2", free: true, auth: false }, { id: "claude-2", name: "Claude-2", free: true, auth: true },
{ id: "claude-2-100k", name: "Claude-2-100k", free: false, auth: true }, { id: "claude-2-100k", name: "Claude-2-100k", free: false, auth: true },
// spark desk // spark desk

View File

@ -19,8 +19,7 @@ const resources = {
"invalid-token": "Invalid token", "invalid-token": "Invalid token",
"invalid-token-prompt": "Please try again.", "invalid-token-prompt": "Please try again.",
"login-failed": "Login failed", "login-failed": "Login failed",
"login-failed-prompt": "login-failed-prompt": "Login failed! Reason: {{reason}}",
"Login failed! Please check your token expiration and try again.",
"login-success": "Login successful", "login-success": "Login successful",
"login-success-prompt": "You have been logged in successfully.", "login-success-prompt": "You have been logged in successfully.",
"server-error": "Server error", "server-error": "Server error",
@ -271,7 +270,7 @@ const resources = {
"invalid-token": "无效的令牌", "invalid-token": "无效的令牌",
"invalid-token-prompt": "请重试。", "invalid-token-prompt": "请重试。",
"login-failed": "登录失败", "login-failed": "登录失败",
"login-failed-prompt": "登录失败!请检查您的令牌过期时间并重试。", "login-failed-prompt": "登录失败!原因: {{reason}}",
"login-success": "登录成功", "login-success": "登录成功",
"login-success-prompt": "您已成功登录。", "login-success-prompt": "您已成功登录。",
"server-error": "服务器错误", "server-error": "服务器错误",
@ -507,8 +506,7 @@ const resources = {
"invalid-token": "Неверный токен", "invalid-token": "Неверный токен",
"invalid-token-prompt": "Пожалуйста, попробуйте еще раз.", "invalid-token-prompt": "Пожалуйста, попробуйте еще раз.",
"login-failed": "Ошибка входа", "login-failed": "Ошибка входа",
"login-failed-prompt": "login-failed-prompt": "Ошибка входа! Причина: {{reason}}",
"Ошибка входа! Пожалуйста, проверьте срок действия вашего токена и попробуйте еще раз.",
"login-success": "Успешный вход", "login-success": "Успешный вход",
"login-success-prompt": "Вы успешно вошли в систему.", "login-success-prompt": "Вы успешно вошли в систему.",
"server-error": "Ошибка сервера", "server-error": "Ошибка сервера",

View File

@ -42,7 +42,7 @@ function Auth() {
if (!data.status) { if (!data.status) {
toast({ toast({
title: t("login-failed"), title: t("login-failed"),
description: t("login-failed-prompt"), description: t("login-failed-prompt", { reason: data.error }),
action: ( action: (
<ToastAction altText={t("try-again")} onClick={login}> <ToastAction altText={t("try-again")} onClick={login}>
{t("try-again")} {t("try-again")}

View File

@ -2,7 +2,7 @@ import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react-swc' import react from '@vitejs/plugin-react-swc'
import path from "path" import path from "path"
import { createHtmlPlugin } from 'vite-plugin-html' import { createHtmlPlugin } from 'vite-plugin-html'
import {VitePWA} from "vite-plugin-pwa"; import { VitePWA } from "vite-plugin-pwa";
// https://vitejs.dev/config/ // https://vitejs.dev/config/
export default defineConfig({ export default defineConfig({
@ -26,41 +26,6 @@ export default defineConfig({
}], }],
start_url: "/", start_url: "/",
}, },
devOptions: {
enabled: true,
},
workbox: {
globPatterns: [
// except for sw.js, which is precached by workbox itself
'**/*.{js,css,html,png,svg,ico,webp}',
],
globDirectory: 'dist',
swDest: 'dist/sw.js',
skipWaiting: true,
clientsClaim: true,
runtimeCaching: [
{
urlPattern: /\.(?:png|gif|jpg|jpeg|svg|webp)$/,
handler: 'CacheFirst',
options: {
cacheName: 'images',
expiration: {
maxEntries: 7200,
}
}
}, {
urlPattern: new RegExp('^https://open.lightxi.com/'),
handler: 'CacheFirst',
options: {
cacheName: 'lightxi-cdn',
expiration: {
maxEntries: 7200,
maxAgeSeconds: 60 * 60 * 24 * 30,
}
}
}
],
}
}), }),
], ],
resolve: { resolve: {

View File

@ -9,8 +9,7 @@ import (
// CanEnableModel returns whether the model can be enabled (without subscription) // CanEnableModel returns whether the model can be enabled (without subscription)
func CanEnableModel(db *sql.DB, user *User, model string) bool { func CanEnableModel(db *sql.DB, user *User, model string) bool {
switch model { switch model {
case globals.GPT3Turbo, globals.GPT3TurboInstruct, globals.GPT3Turbo0301, globals.GPT3Turbo0613, case globals.GPT3Turbo, globals.GPT3TurboInstruct, globals.GPT3Turbo0301, globals.GPT3Turbo0613:
globals.Claude2:
return true return true
case globals.GPT4, globals.GPT40613, globals.GPT40314: case globals.GPT4, globals.GPT40613, globals.GPT40314:
return user != nil && user.GetQuota(db) >= 5 return user != nil && user.GetQuota(db) >= 5

View File

@ -4,6 +4,7 @@ import (
"chat/globals" "chat/globals"
"chat/utils" "chat/utils"
"database/sql" "database/sql"
"errors"
"fmt" "fmt"
"github.com/dgrijalva/jwt-go" "github.com/dgrijalva/jwt-go"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
@ -63,7 +64,7 @@ func (u *User) Validate(c *gin.Context) bool {
return true return true
} }
func (u *User) GenerateToken() string { func (u *User) GenerateToken() (string, error) {
instance := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ instance := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"username": u.Username, "username": u.Username,
"password": u.Password, "password": u.Password,
@ -71,9 +72,9 @@ func (u *User) GenerateToken() string {
}) })
token, err := instance.SignedString([]byte(viper.GetString("secret"))) token, err := instance.SignedString([]byte(viper.GetString("secret")))
if err != nil { if err != nil {
return "" return "", err
} }
return token return token, nil
} }
func (u *User) GetID(db *sql.DB) int64 { func (u *User) GetID(db *sql.DB) int64 {
@ -273,11 +274,11 @@ func ParseApiKey(c *gin.Context, key string) *User {
return &user return &user
} }
func Login(c *gin.Context, token string) (bool, string) { func Login(c *gin.Context, token string) (string, error) {
// DeepTrain Token Validation // DeepTrain Token Validation
user := Validate(token) user := Validate(token)
if user == nil { if user == nil {
return false, "" return "", errors.New("cannot validate access token")
} }
db := utils.GetDBFromContext(c) db := utils.GetDBFromContext(c)
@ -290,7 +291,7 @@ func Login(c *gin.Context, token string) (bool, string) {
Username: user.Username, Username: user.Username,
Password: password, Password: password,
} }
return true, u.GenerateToken() return u.GenerateToken()
} }
// login // login
@ -298,13 +299,13 @@ func Login(c *gin.Context, token string) (bool, string) {
var password string var password string
err := db.QueryRow("SELECT password FROM auth WHERE username = ?", user.Username).Scan(&password) err := db.QueryRow("SELECT password FROM auth WHERE username = ?", user.Username).Scan(&password)
if err != nil { if err != nil {
return false, "" return "", err
} }
u := &User{ u := &User{
Username: user.Username, Username: user.Username,
Password: password, Password: password,
} }
return true, u.GenerateToken() return u.GenerateToken()
} }
func LoginAPI(c *gin.Context) { func LoginAPI(c *gin.Context) {
@ -317,14 +318,15 @@ func LoginAPI(c *gin.Context) {
return return
} }
state, token := Login(c, form.Token) token, err := Login(c, form.Token)
if !state { if err != nil {
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{
"status": false, "status": false,
"error": "user not found", "error": err.Error(),
}) })
return return
} }
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{
"status": true, "status": true,
"token": token, "token": token,

View File

@ -13,7 +13,7 @@ import (
) )
const defaultMessage = "Sorry, I don't understand. Please try again." const defaultMessage = "Sorry, I don't understand. Please try again."
const defaultQuotaMessage = "You don't have enough quota to use this model. please [buy](/buy) or [subscribe](/subscribe) to get more." const defaultQuotaMessage = "You don't have enough quota to use this model. please [buy](/buy) or [subscribe](/subscribe) to get more. (or please check if you are logged in)"
func GetErrorQuota(model string) float32 { func GetErrorQuota(model string) float32 {
return utils.Multi[float32](globals.IsGPT4Model(model), -0xe, 0) // special value for error return utils.Multi[float32](globals.IsGPT4Model(model), -0xe, 0) // special value for error

View File

@ -27,7 +27,7 @@ func (l *Limiter) RateLimit(ctx *gin.Context, rds *redis.Client, ip string, path
} }
var limits = map[string]Limiter{ var limits = map[string]Limiter{
"/login": {Duration: 10, Count: 5}, "/login": {Duration: 10, Count: 20},
"/apikey": {Duration: 1, Count: 2}, "/apikey": {Duration: 1, Count: 2},
"/package": {Duration: 1, Count: 2}, "/package": {Duration: 1, Count: 2},
"/quota": {Duration: 1, Count: 2}, "/quota": {Duration: 1, Count: 2},