commit 2cbd309c2aefdc00202f7b7cc432c30e8cac9184 Author: xion Date: Fri Mar 21 21:34:26 2025 +0800 init query login diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..7446745 --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +//npm.xiongxiao.me/:_authToken=${ME_NPM_TOKEN} +//registry.npmjs.org/:_authToken=${NPM_TOKEN} \ No newline at end of file diff --git a/dist/query-login.d.ts b/dist/query-login.d.ts new file mode 100644 index 0000000..639b05f --- /dev/null +++ b/dist/query-login.d.ts @@ -0,0 +1,200 @@ +import { Query } from '@kevisual/query'; +import { DataOpts, Result } from '@kevisual/query/query'; + +type CacheLoginUser = { + user?: any; + id?: string; + accessToken?: string; + refreshToken?: string; +}; +type CacheLogin = { + loginUsers: CacheLoginUser[]; +} & CacheLoginUser; +interface CacheStore { + name: string; + cacheData: CacheLogin; + cache: T; + /** + * @update 获取缓存 + */ + get(key: string): Promise; + /** + * @update 设置缓存 + */ + set(key: string, value: CacheLogin): Promise; + /** + * @update 删除缓存 + */ + del(): Promise; + /** + * 设置当前用户 + */ + setLoginUser(user: CacheLoginUser): Promise; + /** + * 获取当前用户 + */ + getCurrentUser(): Promise; + /** + * 获取当前用户列表 + */ + getCurrentUserList(): Promise; + /** + * 获取缓存的refreshToken + */ + getRefreshToken(): Promise; + /** + * 获取缓存的accessToken + */ + getAccessToken(): Promise; + /** + * 初始化 + */ + init(): Promise; + /** + * 清除当前用户 + */ + clearCurrentUser(): Promise; + /** + * 清除所有用户 + */ + clearAll(): Promise; +} + +type QueryLoginOpts = { + query?: Query; + isBrowser?: boolean; + onLoad?: () => void; + storage?: Storage; +}; +type QueryLoginData = { + username?: string; + password: string; + email?: string; +}; +type QueryLoginResult = { + accessToken: string; + refreshToken: string; +}; +declare class QueryLogin { + query: Query; + cache: CacheStore; + isBrowser: boolean; + load?: boolean; + storage: Storage; + onLoad?: () => void; + constructor(opts?: QueryLoginOpts); + setQuery(query: Query): void; + init(): Promise; + post(data: any, opts?: DataOpts): Promise<{ + code: number; + data?: T; + message?: string; + success: boolean; + noMsg?: boolean; + showError: (fn?: () => void) => void; + }>; + /** + * 登录, + * @param data + * @returns + */ + login(data: QueryLoginData): Promise<{ + code: number; + data?: QueryLoginResult; + message?: string; + success: boolean; + noMsg?: boolean; + showError: (fn?: () => void) => void; + }>; + /** + * 登陆成功,需要获取用户信息进行缓存 + * @param param0 + */ + beforeSetLoginUser({ accessToken, refreshToken, check401 }: { + accessToken?: string; + refreshToken?: string; + check401?: boolean; + }): Promise; + queryRefreshToken(refreshToken?: string): Promise<{ + code: number; + data?: any; + message?: string; + success: boolean; + noMsg?: boolean; + showError: (fn?: () => void) => void; + } | { + code: number; + message: string; + data: any; + }>; + /** + * 检查401错误,并刷新token, 如果refreshToken存在,则刷新token, 否则返回401 + * @param response + * @param ctx + * @param refetch + * @returns + */ + afterCheck401ToRefreshToken(response: Result, ctx?: { + req?: any; + res?: any; + fetch?: any; + }, refetch?: boolean): Promise; + /** + * 获取用户信息 + * @param token + * @returns + */ + getMe(token?: string, check401?: boolean): Promise<{ + code: number; + data?: any; + message?: string; + success: boolean; + noMsg?: boolean; + showError: (fn?: () => void) => void; + }>; + /** + * 请求更新,切换用户, 使用switchUser + * @param username + * @returns + */ + private postSwitchUser; + /** + * 切换用户 + * @param username + * @returns + */ + switchUser(username: string): Promise<{ + code: number; + data?: any; + message?: string; + success: boolean; + noMsg?: boolean; + showError: (fn?: () => void) => void; + } | { + code: number; + data: { + accessToken: string; + refreshToken: string; + }; + success: boolean; + message: string; + }>; + logout(): Promise<{ + code: number; + data?: Result; + message?: string; + success: boolean; + noMsg?: boolean; + showError: (fn?: () => void) => void; + }>; + hasUser(username: string): Promise<{ + code: number; + data?: Result; + message?: string; + success: boolean; + noMsg?: boolean; + showError: (fn?: () => void) => void; + }>; +} + +export { QueryLogin, type QueryLoginData, type QueryLoginResult }; diff --git a/dist/query-login.js b/dist/query-login.js new file mode 100644 index 0000000..e6065d2 --- /dev/null +++ b/dist/query-login.js @@ -0,0 +1,318 @@ +// src/query-login.ts +import { Query } from "@kevisual/query"; +import { setBaseResponse } from "@kevisual/query/query"; + +// src/login-cache.ts +import { MyCache } from "@kevisual/cache"; +var LoginCacheStore = class { + cache; + name; + cacheData; + constructor(name) { + this.cache = new MyCache(name); + this.cacheData = { + loginUsers: [], + user: void 0, + id: void 0, + accessToken: void 0, + refreshToken: void 0 + }; + this.name = name; + } + /** + * 设置缓存 + * @param key + * @param value + * @returns + */ + async set(key, value) { + await this.cache.set(key, value); + return value; + } + /** + * 删除缓存 + */ + async del() { + await this.cache.del(); + } + get(key) { + return this.cache.get(key); + } + async init() { + this.cacheData = await this.get(this.name) || { + loginUsers: [], + user: null, + id: null, + accessToken: null, + refreshToken: null + }; + } + /** + * 设置当前用户 + * @param user + */ + async setLoginUser(user) { + const has = this.cacheData.loginUsers.find((u) => u.id === user.id); + if (has) { + this.cacheData.loginUsers = this.cacheData?.loginUsers?.filter((u) => u?.id && u.id !== user.id); + } + this.cacheData.loginUsers.push(user); + this.cacheData.user = user.user; + this.cacheData.id = user.id; + this.cacheData.accessToken = user.accessToken; + this.cacheData.refreshToken = user.refreshToken; + await this.set(this.name, this.cacheData); + } + getCurrentUser() { + const cacheData = this.cacheData; + return Promise.resolve(cacheData.user); + } + getCurrentUserList() { + return Promise.resolve(this.cacheData.loginUsers.filter((u) => u?.id)); + } + getRefreshToken() { + const cacheData = this.cacheData; + return Promise.resolve(cacheData.refreshToken || ""); + } + getAccessToken() { + const cacheData = this.cacheData; + return Promise.resolve(cacheData.accessToken || ""); + } + async clearCurrentUser() { + const user = await this.getCurrentUser(); + const has = this.cacheData.loginUsers.find((u) => u.id === user.id); + if (has) { + this.cacheData.loginUsers = this.cacheData?.loginUsers?.filter((u) => u?.id && u.id !== user.id); + } + this.cacheData.user = void 0; + this.cacheData.id = void 0; + this.cacheData.accessToken = void 0; + this.cacheData.refreshToken = void 0; + await this.set(this.name, this.cacheData); + } + async clearAll() { + this.cacheData.loginUsers = []; + this.cacheData.user = void 0; + this.cacheData.id = void 0; + this.cacheData.accessToken = void 0; + this.cacheData.refreshToken = void 0; + await this.set(this.name, this.cacheData); + } +}; + +// src/query-login.ts +var QueryLogin = class { + query; + cache; + isBrowser; + load; + storage; + onLoad; + constructor(opts) { + this.query = opts?.query || new Query(); + this.cache = new LoginCacheStore("login"); + this.isBrowser = opts?.isBrowser ?? true; + this.init(); + this.onLoad = opts?.onLoad; + this.storage = opts?.storage || localStorage; + } + setQuery(query) { + this.query = query; + } + async init() { + await this.cache.init(); + this.load = true; + this.onLoad?.(); + } + async post(data, opts) { + return this.query.post({ path: "user", ...data }, opts); + } + /** + * 登录, + * @param data + * @returns + */ + async login(data) { + const res = await this.post({ key: "login", ...data }); + if (res.code === 200) { + const { accessToken, refreshToken } = res?.data || {}; + this.storage.setItem("token", accessToken || ""); + await this.beforeSetLoginUser({ accessToken, refreshToken }); + } + return res; + } + /** + * 登陆成功,需要获取用户信息进行缓存 + * @param param0 + */ + async beforeSetLoginUser({ accessToken, refreshToken, check401 }) { + if (accessToken && refreshToken) { + const resUser = await this.getMe(accessToken, check401); + if (resUser.code === 200) { + const user = resUser.data; + if (user) { + this.cache.setLoginUser({ + user, + id: user.id, + accessToken, + refreshToken + }); + } else { + console.error("\u767B\u5F55\u5931\u8D25"); + } + } + } + } + async queryRefreshToken(refreshToken) { + const _refreshToken = refreshToken || this.cache.getRefreshToken(); + let data = { refreshToken: _refreshToken }; + if (!_refreshToken) { + await this.cache.clearCurrentUser(); + return { + code: 401, + message: "\u8BF7\u5148\u767B\u5F55", + data: {} + }; + } + return this.post( + { key: "refreshToken", data }, + { + afterResponse: async (response, ctx) => { + setBaseResponse(response); + return response; + } + } + ); + } + /** + * 检查401错误,并刷新token, 如果refreshToken存在,则刷新token, 否则返回401 + * @param response + * @param ctx + * @param refetch + * @returns + */ + async afterCheck401ToRefreshToken(response, ctx, refetch) { + const that = this; + if (response?.code === 401) { + const hasRefreshToken = await that.cache.getRefreshToken(); + if (hasRefreshToken) { + const res = await that.queryRefreshToken(hasRefreshToken); + if (res.code === 200) { + const { accessToken, refreshToken } = res?.data || {}; + that.storage.setItem("token", accessToken || ""); + await that.beforeSetLoginUser({ accessToken, refreshToken, check401: false }); + if (refetch && ctx && ctx.req && ctx.req.url && ctx.fetch) { + await new Promise((resolve) => setTimeout(resolve, 1500)); + const url = ctx.req?.url; + const body = ctx.req?.body; + const headers = ctx.req?.headers; + const res2 = await ctx.fetch(url, { + method: "POST", + body, + headers: { ...headers, Authorization: `Bearer ${accessToken}` } + }); + setBaseResponse(res2); + return res2; + } + } else { + that.storage.removeItem("token"); + await that.cache.clearCurrentUser(); + } + return res; + } + } + return response; + } + /** + * 获取用户信息 + * @param token + * @returns + */ + async getMe(token, check401 = true) { + const _token = token || this.storage.getItem("token"); + const that = this; + return that.post( + { key: "me" }, + { + beforeRequest: async (config) => { + if (config.headers) { + config.headers["Authorization"] = `Bearer ${_token}`; + } + return config; + }, + afterResponse: async (response, ctx) => { + if (response?.code === 401 && check401) { + return await that.afterCheck401ToRefreshToken(response, ctx); + } + return response; + } + } + ); + } + /** + * 请求更新,切换用户, 使用switchUser + * @param username + * @returns + */ + async postSwitchUser(username) { + return this.post({ key: "switchCheck", data: { username } }); + } + /** + * 切换用户 + * @param username + * @returns + */ + async switchUser(username) { + const localUserList = await this.cache.getCurrentUserList(); + const user = localUserList.find((userItem) => userItem.user.username === username); + if (user) { + this.storage.setItem("token", user.accessToken || ""); + await this.beforeSetLoginUser({ accessToken: user.accessToken, refreshToken: user.refreshToken }); + return { + code: 200, + data: { + accessToken: user.accessToken, + refreshToken: user.refreshToken + }, + success: true, + message: "\u5207\u6362\u7528\u6237\u6210\u529F" + }; + } + const res = await this.postSwitchUser(username); + if (res.code === 200) { + const { accessToken, refreshToken } = res?.data || {}; + this.storage.setItem("token", accessToken || ""); + await this.beforeSetLoginUser({ accessToken, refreshToken }); + } + return res; + } + async logout() { + this.storage.removeItem("token"); + this.cache.del(); + return this.post({ key: "logout" }); + } + async hasUser(username) { + const that = this; + return this.post( + { + path: "org", + key: "hasUser", + data: { + username + } + }, + { + afterResponse: async (response, ctx) => { + if (response?.code === 401) { + const res = await that.afterCheck401ToRefreshToken(response, ctx, true); + return res; + } + return response; + } + } + ); + } +}; +export { + QueryLogin +}; diff --git a/index.html b/index.html new file mode 100644 index 0000000..f530cbb --- /dev/null +++ b/index.html @@ -0,0 +1,11 @@ + + + + Query Login + + + + + + + \ No newline at end of file diff --git a/node_modules/.bin/jiti b/node_modules/.bin/jiti new file mode 100755 index 0000000..93e73e5 --- /dev/null +++ b/node_modules/.bin/jiti @@ -0,0 +1,17 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/home/ubuntu/kevisual/center/node_modules/.pnpm/jiti@2.4.2/node_modules/jiti/lib/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/jiti@2.4.2/node_modules/jiti/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/jiti@2.4.2/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/home/ubuntu/kevisual/center/node_modules/.pnpm/jiti@2.4.2/node_modules/jiti/lib/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/jiti@2.4.2/node_modules/jiti/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/jiti@2.4.2/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../../../../node_modules/.pnpm/jiti@2.4.2/node_modules/jiti/lib/jiti-cli.mjs" "$@" +else + exec node "$basedir/../../../../node_modules/.pnpm/jiti@2.4.2/node_modules/jiti/lib/jiti-cli.mjs" "$@" +fi diff --git a/node_modules/.bin/rollup b/node_modules/.bin/rollup new file mode 100755 index 0000000..5f0169c --- /dev/null +++ b/node_modules/.bin/rollup @@ -0,0 +1,17 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/home/ubuntu/kevisual/center/node_modules/.pnpm/rollup@4.36.0/node_modules/rollup/dist/bin/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/rollup@4.36.0/node_modules/rollup/dist/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/rollup@4.36.0/node_modules/rollup/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/rollup@4.36.0/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/home/ubuntu/kevisual/center/node_modules/.pnpm/rollup@4.36.0/node_modules/rollup/dist/bin/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/rollup@4.36.0/node_modules/rollup/dist/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/rollup@4.36.0/node_modules/rollup/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/rollup@4.36.0/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../../../../node_modules/.pnpm/rollup@4.36.0/node_modules/rollup/dist/bin/rollup" "$@" +else + exec node "$basedir/../../../../node_modules/.pnpm/rollup@4.36.0/node_modules/rollup/dist/bin/rollup" "$@" +fi diff --git a/node_modules/.bin/tsc b/node_modules/.bin/tsc new file mode 100755 index 0000000..2076bdb --- /dev/null +++ b/node_modules/.bin/tsc @@ -0,0 +1,17 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/home/ubuntu/kevisual/center/node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/bin/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/typescript@5.8.2/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/home/ubuntu/kevisual/center/node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/bin/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/typescript@5.8.2/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../../../../node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/bin/tsc" "$@" +else + exec node "$basedir/../../../../node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/bin/tsc" "$@" +fi diff --git a/node_modules/.bin/tsserver b/node_modules/.bin/tsserver new file mode 100755 index 0000000..51b2951 --- /dev/null +++ b/node_modules/.bin/tsserver @@ -0,0 +1,17 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/home/ubuntu/kevisual/center/node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/bin/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/typescript@5.8.2/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/home/ubuntu/kevisual/center/node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/bin/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/typescript@5.8.2/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../../../../node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/bin/tsserver" "$@" +else + exec node "$basedir/../../../../node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/bin/tsserver" "$@" +fi diff --git a/node_modules/.bin/tsup b/node_modules/.bin/tsup new file mode 100755 index 0000000..01f820d --- /dev/null +++ b/node_modules/.bin/tsup @@ -0,0 +1,17 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/home/ubuntu/kevisual/center/node_modules/.pnpm/tsup@8.4.0_jiti@2.4.2_postcss@8.5.3_typescript@5.8.2_yaml@2.5.1/node_modules/tsup/dist/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/tsup@8.4.0_jiti@2.4.2_postcss@8.5.3_typescript@5.8.2_yaml@2.5.1/node_modules/tsup/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/tsup@8.4.0_jiti@2.4.2_postcss@8.5.3_typescript@5.8.2_yaml@2.5.1/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/home/ubuntu/kevisual/center/node_modules/.pnpm/tsup@8.4.0_jiti@2.4.2_postcss@8.5.3_typescript@5.8.2_yaml@2.5.1/node_modules/tsup/dist/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/tsup@8.4.0_jiti@2.4.2_postcss@8.5.3_typescript@5.8.2_yaml@2.5.1/node_modules/tsup/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/tsup@8.4.0_jiti@2.4.2_postcss@8.5.3_typescript@5.8.2_yaml@2.5.1/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../tsup/dist/cli-default.js" "$@" +else + exec node "$basedir/../tsup/dist/cli-default.js" "$@" +fi diff --git a/node_modules/.bin/tsup-node b/node_modules/.bin/tsup-node new file mode 100755 index 0000000..e5fa428 --- /dev/null +++ b/node_modules/.bin/tsup-node @@ -0,0 +1,17 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/home/ubuntu/kevisual/center/node_modules/.pnpm/tsup@8.4.0_jiti@2.4.2_postcss@8.5.3_typescript@5.8.2_yaml@2.5.1/node_modules/tsup/dist/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/tsup@8.4.0_jiti@2.4.2_postcss@8.5.3_typescript@5.8.2_yaml@2.5.1/node_modules/tsup/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/tsup@8.4.0_jiti@2.4.2_postcss@8.5.3_typescript@5.8.2_yaml@2.5.1/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/home/ubuntu/kevisual/center/node_modules/.pnpm/tsup@8.4.0_jiti@2.4.2_postcss@8.5.3_typescript@5.8.2_yaml@2.5.1/node_modules/tsup/dist/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/tsup@8.4.0_jiti@2.4.2_postcss@8.5.3_typescript@5.8.2_yaml@2.5.1/node_modules/tsup/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/tsup@8.4.0_jiti@2.4.2_postcss@8.5.3_typescript@5.8.2_yaml@2.5.1/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../tsup/dist/cli-node.js" "$@" +else + exec node "$basedir/../tsup/dist/cli-node.js" "$@" +fi diff --git a/node_modules/.bin/yaml b/node_modules/.bin/yaml new file mode 100755 index 0000000..1e2be03 --- /dev/null +++ b/node_modules/.bin/yaml @@ -0,0 +1,17 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/home/ubuntu/kevisual/center/node_modules/.pnpm/yaml@2.5.1/node_modules/yaml/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/yaml@2.5.1/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/home/ubuntu/kevisual/center/node_modules/.pnpm/yaml@2.5.1/node_modules/yaml/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/yaml@2.5.1/node_modules:/home/ubuntu/kevisual/center/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../../../../node_modules/.pnpm/yaml@2.5.1/node_modules/yaml/bin.mjs" "$@" +else + exec node "$basedir/../../../../node_modules/.pnpm/yaml@2.5.1/node_modules/yaml/bin.mjs" "$@" +fi diff --git a/node_modules/.vite/deps/@kevisual_cache.js b/node_modules/.vite/deps/@kevisual_cache.js new file mode 100644 index 0000000..cc8bd2a --- /dev/null +++ b/node_modules/.vite/deps/@kevisual_cache.js @@ -0,0 +1,199 @@ +import { + __publicField +} from "./chunk-V6TY7KAL.js"; + +// ../../node_modules/.pnpm/@kevisual+cache@0.0.1_rollup@4.36.0_tslib@2.8.1_typescript@5.8.2/node_modules/@kevisual/cache/dist/cache.js +function promisifyRequest(request) { + return new Promise((resolve, reject) => { + request.oncomplete = request.onsuccess = () => resolve(request.result); + request.onabort = request.onerror = () => reject(request.error); + }); +} +function createStore(dbName, storeName) { + const request = indexedDB.open(dbName); + request.onupgradeneeded = () => request.result.createObjectStore(storeName); + const dbp = promisifyRequest(request); + return (txMode, callback) => dbp.then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName))); +} +var defaultGetStoreFunc; +function defaultGetStore() { + if (!defaultGetStoreFunc) { + defaultGetStoreFunc = createStore("keyval-store", "keyval"); + } + return defaultGetStoreFunc; +} +function get(key, customStore = defaultGetStore()) { + return customStore("readonly", (store) => promisifyRequest(store.get(key))); +} +function set(key, value, customStore = defaultGetStore()) { + return customStore("readwrite", (store) => { + store.put(value, key); + return promisifyRequest(store.transaction); + }); +} +function setMany(entries2, customStore = defaultGetStore()) { + return customStore("readwrite", (store) => { + entries2.forEach((entry) => store.put(entry[1], entry[0])); + return promisifyRequest(store.transaction); + }); +} +function getMany(keys2, customStore = defaultGetStore()) { + return customStore("readonly", (store) => Promise.all(keys2.map((key) => promisifyRequest(store.get(key))))); +} +function update(key, updater, customStore = defaultGetStore()) { + return customStore("readwrite", (store) => ( + // Need to create the promise manually. + // If I try to chain promises, the transaction closes in browsers + // that use a promise polyfill (IE10/11). + new Promise((resolve, reject) => { + store.get(key).onsuccess = function() { + try { + store.put(updater(this.result), key); + resolve(promisifyRequest(store.transaction)); + } catch (err) { + reject(err); + } + }; + }) + )); +} +function del(key, customStore = defaultGetStore()) { + return customStore("readwrite", (store) => { + store.delete(key); + return promisifyRequest(store.transaction); + }); +} +function delMany(keys2, customStore = defaultGetStore()) { + return customStore("readwrite", (store) => { + keys2.forEach((key) => store.delete(key)); + return promisifyRequest(store.transaction); + }); +} +function clear(customStore = defaultGetStore()) { + return customStore("readwrite", (store) => { + store.clear(); + return promisifyRequest(store.transaction); + }); +} +function eachCursor(store, callback) { + store.openCursor().onsuccess = function() { + if (!this.result) + return; + callback(this.result); + this.result.continue(); + }; + return promisifyRequest(store.transaction); +} +function keys(customStore = defaultGetStore()) { + return customStore("readonly", (store) => { + if (store.getAllKeys) { + return promisifyRequest(store.getAllKeys()); + } + const items = []; + return eachCursor(store, (cursor) => items.push(cursor.key)).then(() => items); + }); +} +function values(customStore = defaultGetStore()) { + return customStore("readonly", (store) => { + if (store.getAll) { + return promisifyRequest(store.getAll()); + } + const items = []; + return eachCursor(store, (cursor) => items.push(cursor.value)).then(() => items); + }); +} +function entries(customStore = defaultGetStore()) { + return customStore("readonly", (store) => { + if (store.getAll && store.getAllKeys) { + return Promise.all([ + promisifyRequest(store.getAllKeys()), + promisifyRequest(store.getAll()) + ]).then(([keys2, values2]) => keys2.map((key, i) => [key, values2[i]])); + } + const items = []; + return customStore("readonly", (store2) => eachCursor(store2, (cursor) => items.push([cursor.key, cursor.value])).then(() => items)); + }); +} +var idb = Object.freeze({ + __proto__: null, + clear, + createStore, + del, + delMany, + entries, + get, + getMany, + keys, + promisifyRequest, + set, + setMany, + update, + values +}); +var CacheWorkspace = class { + constructor() { + __publicField(this, "storage"); + __publicField(this, "data", null); + this.storage = idb; + } + async get(name) { + const data = await get(name); + this.data = data; + return data; + } + async set(name, data) { + this.data = data; + await set(name, data); + } + async del(name) { + this.data = null; + await del(name); + } + /** + * Clear all values in the store. + */ + async clear() { + await clear(); + } +}; +var MyCache = class extends CacheWorkspace { + constructor(name) { + super(); + __publicField(this, "name"); + __publicField(this, "updatedAt"); + this.name = name || "my-cache"; + } + async getData() { + const cache = await super.get(this.name); + this.updatedAt = cache.updatedAt; + if (cache.expireTime && cache.expireTime < Date.now()) { + await super.del(this.name); + return {}; + } + return cache.data; + } + /** + * 设置缓存数据,默认过期时间为10天 + * @param data + * @param opts + */ + async setData(data, opts) { + const now = Date.now(); + const expireTime = now + ((opts == null ? void 0 : opts.expireTime) || 1e3 * 60 * 60 * 24 * 10); + const newData = { + data, + updatedAt: Date.now(), + expireTime + }; + await super.set(this.name, newData); + this.updatedAt = newData.updatedAt; + } + async del() { + await super.del(this.name); + } +}; +export { + CacheWorkspace, + MyCache +}; +//# sourceMappingURL=@kevisual_cache.js.map diff --git a/node_modules/.vite/deps/@kevisual_cache.js.map b/node_modules/.vite/deps/@kevisual_cache.js.map new file mode 100644 index 0000000..c58cdf7 --- /dev/null +++ b/node_modules/.vite/deps/@kevisual_cache.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../../../node_modules/.pnpm/@kevisual+cache@0.0.1_rollup@4.36.0_tslib@2.8.1_typescript@5.8.2/node_modules/@kevisual/cache/dist/cache.js"], + "sourcesContent": ["function promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = () => resolve(request.result);\n // @ts-ignore - file size hacks\n request.onabort = request.onerror = () => reject(request.error);\n });\n}\nfunction createStore(dbName, storeName) {\n const request = indexedDB.open(dbName);\n request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n const dbp = promisifyRequest(request);\n return (txMode, callback) => dbp.then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic – if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n entries.forEach((entry) => store.put(entry[1], entry[0]));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => \n // Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise((resolve, reject) => {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n }\n catch (err) {\n reject(err);\n }\n };\n }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction delMany(keys, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n keys.forEach((key) => store.delete(key));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\nfunction eachCursor(store, callback) {\n store.openCursor().onsuccess = function () {\n if (!this.result)\n return;\n callback(this.result);\n this.result.continue();\n };\n return promisifyRequest(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAllKeys) {\n return promisifyRequest(store.getAllKeys());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.key)).then(() => items);\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAll) {\n return promisifyRequest(store.getAll());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.value)).then(() => items);\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) {\n return Promise.all([\n promisifyRequest(store.getAllKeys()),\n promisifyRequest(store.getAll()),\n ]).then(([keys, values]) => keys.map((key, i) => [key, values[i]]));\n }\n const items = [];\n return customStore('readonly', (store) => eachCursor(store, (cursor) => items.push([cursor.key, cursor.value])).then(() => items));\n });\n}\n\nvar idb = /*#__PURE__*/Object.freeze({\n __proto__: null,\n clear: clear,\n createStore: createStore,\n del: del,\n delMany: delMany,\n entries: entries,\n get: get,\n getMany: getMany,\n keys: keys,\n promisifyRequest: promisifyRequest,\n set: set,\n setMany: setMany,\n update: update,\n values: values\n});\n\n/**\n * 简单的封装一下idb-keyval的API,提供一个更易用的接口。\n */\nclass CacheWorkspace {\n storage;\n data = null;\n constructor() {\n this.storage = idb;\n }\n async get(name) {\n const data = await get(name);\n this.data = data;\n return data;\n }\n async set(name, data) {\n this.data = data;\n await set(name, data);\n }\n async del(name) {\n this.data = null;\n await del(name);\n }\n /**\n * Clear all values in the store.\n */\n async clear() {\n await clear();\n }\n}\n/**\n * 一个简单的缓存类,用于存储字符串。\n * 对数据进行添加对比内容。\n */\nclass MyCache extends CacheWorkspace {\n name;\n updatedAt;\n constructor(name) {\n super();\n this.name = name || 'my-cache';\n }\n async getData() {\n const cache = await super.get(this.name);\n this.updatedAt = cache.updatedAt;\n if (cache.expireTime && cache.expireTime < Date.now()) {\n await super.del(this.name);\n return {};\n }\n return cache.data;\n }\n /**\n * 设置缓存数据,默认过期时间为10天\n * @param data\n * @param opts\n */\n async setData(data, opts) {\n const now = Date.now();\n const expireTime = now + (opts?.expireTime || 1000 * 60 * 60 * 24 * 10);\n const newData = {\n data,\n updatedAt: Date.now(),\n expireTime,\n };\n await super.set(this.name, newData);\n this.updatedAt = newData.updatedAt;\n }\n async del() {\n await super.del(this.name);\n }\n}\n\nexport { CacheWorkspace, MyCache };\n"], + "mappings": "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", + "names": ["entries", "keys", "values", "store"] +} diff --git a/node_modules/.vite/deps/@kevisual_query.js b/node_modules/.vite/deps/@kevisual_query.js new file mode 100644 index 0000000..59a6c7a --- /dev/null +++ b/node_modules/.vite/deps/@kevisual_query.js @@ -0,0 +1,357 @@ +import { + __publicField +} from "./chunk-V6TY7KAL.js"; + +// ../../node_modules/.pnpm/@kevisual+query@0.0.12_ws@8.18.1/node_modules/@kevisual/query/dist/query-browser.js +var adapter = async (opts, overloadOpts) => { + const controller = new AbortController(); + const signal = controller.signal; + const timeout = opts.timeout || 6e4 * 3; + const timer = setTimeout(() => { + controller.abort(); + }, timeout); + return fetch(opts.url, { + method: "POST", + headers: { + "Content-Type": "application/json", + ...opts.headers + }, + body: JSON.stringify(opts.body), + signal, + ...overloadOpts + }).then((response) => { + const contentType = response.headers.get("Content-Type"); + if (contentType && contentType.includes("application/json")) { + return response.json(); + } else { + return response.text(); + } + }).catch((err) => { + if (err.name === "AbortError") { + console.log("Request timed out and was aborted"); + } + console.error(err); + return { + code: 500 + }; + }).finally(() => { + clearTimeout(timer); + }); +}; +var createStoreImpl = (createState) => { + let state; + const listeners = /* @__PURE__ */ new Set(); + const setState = (partial, replace) => { + const nextState = typeof partial === "function" ? partial(state) : partial; + if (!Object.is(nextState, state)) { + const previousState = state; + state = (replace != null ? replace : typeof nextState !== "object" || nextState === null) ? nextState : Object.assign({}, state, nextState); + listeners.forEach((listener) => listener(state, previousState)); + } + }; + const getState = () => state; + const getInitialState = () => initialState; + const subscribe = (listener) => { + listeners.add(listener); + return () => listeners.delete(listener); + }; + const api = { setState, getState, getInitialState, subscribe }; + const initialState = state = createState(setState, getState, api); + return api; +}; +var createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl; +var parseWsUrl = (url) => { + try { + new URL(url); + return url; + } catch (e) { + const _url = new URL(url, location.origin); + if (_url.protocol === "http:") { + _url.protocol = "ws:"; + } + if (_url.protocol === "https:") { + _url.protocol = "wss:"; + } + return _url.href; + } +}; +var QueryWs = class { + constructor(opts) { + __publicField(this, "url"); + __publicField(this, "store"); + __publicField(this, "ws"); + const url = (opts == null ? void 0 : opts.url) || "/api/router"; + if (opts == null ? void 0 : opts.store) { + this.store = opts.store; + } else { + const store = createStore((set) => ({ + connected: false, + status: "connecting", + setConnected: (connected) => set({ connected }), + setStatus: (status) => set({ status }) + })); + this.store = store; + } + const wsUrl = parseWsUrl(url); + if ((opts == null ? void 0 : opts.ws) && opts.ws instanceof WebSocket) { + this.ws = opts.ws; + } else { + this.ws = new WebSocket(wsUrl); + } + this.connect(); + } + /** + * 连接 WebSocket + */ + async connect(opts) { + const store = this.store; + const connected = store.getState().connected; + if (connected) { + return Promise.resolve(true); + } + return new Promise((resolve, reject) => { + const ws = this.ws || new WebSocket(this.url); + const timeout = (opts == null ? void 0 : opts.timeout) || 5 * 60 * 1e3; + let timer = setTimeout(() => { + console.error("WebSocket 连接超时"); + reject("timeout"); + }, timeout); + ws.onopen = () => { + store.getState().setConnected(true); + store.getState().setStatus("connected"); + resolve(true); + clearTimeout(timer); + }; + ws.onclose = () => { + store.getState().setConnected(false); + store.getState().setStatus("disconnected"); + this.ws = null; + }; + }); + } + listenConnect(callback) { + const store = this.store; + const { connected } = store.getState(); + if (connected) { + callback(); + return; + } + const subscriptionOne = (selector, listener) => { + const unsubscribe = store.subscribe((newState, oldState) => { + if (selector(newState) !== selector(oldState)) { + listener(newState, oldState); + unsubscribe(); + } + }); + return unsubscribe; + }; + const cancel = subscriptionOne((state) => state.connected, () => { + callback(); + }); + return cancel; + } + onMessage(fn, opts) { + const ws = this.ws; + const isJson = (opts == null ? void 0 : opts.isJson) ?? true; + const selector = opts == null ? void 0 : opts.selector; + const parseIfJson = (data) => { + try { + return JSON.parse(data); + } catch (e) { + return data; + } + }; + const listener = (event) => { + const received = parseIfJson(event.data); + if (typeof received === "string" && !isJson) { + fn(received, event); + } else if (typeof received === "object" && isJson) { + fn(selector ? selector(received) : received, event); + } else ; + }; + ws.addEventListener("message", listener); + return () => { + ws.removeEventListener("message", listener); + }; + } + close() { + var _a; + const ws = this.ws; + const store = this.store; + (_a = ws == null ? void 0 : ws.close) == null ? void 0 : _a.call(ws); + this.ws = null; + store.getState().setConnected(false); + store.getState().setStatus("disconnected"); + } + send(data, opts) { + const ws = this.ws; + const isJson = (opts == null ? void 0 : opts.isJson) ?? true; + const wrapper = opts == null ? void 0 : opts.wrapper; + if (!ws || ws.readyState !== WebSocket.OPEN) { + console.error("WebSocket is not open"); + return; + } + if (isJson) { + ws.send(JSON.stringify(wrapper ? wrapper(data) : data)); + } else { + ws.send(data); + } + } + getOpen() { + if (!this.ws) { + return false; + } + return this.ws.readyState === WebSocket.OPEN; + } +}; +var setBaseResponse = (res) => { + res.success = res.code === 200; + res.showError = (fn) => { + if (!res.success && !res.noMsg) { + fn == null ? void 0 : fn(); + } + }; +}; +var Query = class { + constructor(opts) { + __publicField(this, "adapter"); + __publicField(this, "url"); + __publicField(this, "beforeRequest"); + __publicField(this, "afterResponse"); + __publicField(this, "headers"); + __publicField(this, "timeout"); + this.adapter = (opts == null ? void 0 : opts.adapter) || adapter; + this.url = (opts == null ? void 0 : opts.url) || "/api/router"; + this.headers = (opts == null ? void 0 : opts.headers) || { + "Content-Type": "application/json" + }; + this.timeout = (opts == null ? void 0 : opts.timeout) || 6e4 * 3; + } + /** + * 发送 get 请求,转到 post 请求 + * T是请求类型自定义 + * S是返回类型自定义 + * @param params 请求参数 + * @param options 请求配置 + * @returns 请求结果 + */ + async get(params, options) { + return this.post(params, options); + } + /** + * 发送 post 请求 + * T是请求类型自定义 + * S是返回类型自定义 + * @param body 请求体 + * @param options 请求配置 + * @returns 请求结果 + */ + async post(body, options) { + const url = (options == null ? void 0 : options.url) || this.url; + const headers = { ...this.headers, ...options == null ? void 0 : options.headers }; + const adapter2 = (options == null ? void 0 : options.adapter) || this.adapter; + const beforeRequest = (options == null ? void 0 : options.beforeRequest) || this.beforeRequest; + const afterResponse = (options == null ? void 0 : options.afterResponse) || this.afterResponse; + const timeout = (options == null ? void 0 : options.timeout) || this.timeout; + const req = { + url, + headers, + body, + timeout + }; + try { + if (beforeRequest) { + await beforeRequest(req); + } + } catch (e) { + console.error("request beforeFn error", e, req); + return { + code: 500, + success: false, + message: "api request beforeFn error", + showError: () => { + } + }; + } + return adapter2(req).then(async (res) => { + try { + setBaseResponse(res); + if (afterResponse) { + return await afterResponse(res, { + req, + res, + fetch: adapter2 + }); + } + return res; + } catch (e) { + console.error("request error", e, req); + return { + code: 500, + success: false, + message: "api request afterFn error", + showError: () => { + } + }; + } + }); + } + /** + * 请求前处理,设置请求前处理函数 + * @param fn 处理函数 + */ + before(fn) { + this.beforeRequest = fn; + } + /** + * 请求后处理,设置请求后处理函数 + * @param fn 处理函数 + */ + after(fn) { + this.afterResponse = fn; + } +}; +var QueryClient = class extends Query { + constructor(opts) { + super(opts); + __publicField(this, "tokenName"); + __publicField(this, "storage"); + __publicField(this, "token"); + // 默认不使用ws + __publicField(this, "qws"); + this.tokenName = (opts == null ? void 0 : opts.tokenName) || "token"; + this.storage = (opts == null ? void 0 : opts.storage) || localStorage; + this.beforeRequest = async (opts2) => { + const token = this.token || this.getToken(); + if (token) { + opts2.headers = { + ...opts2.headers, + Authorization: `Bearer ${token}` + }; + } + return opts2; + }; + if (opts == null ? void 0 : opts.io) { + this.createWs(); + } + } + createWs(opts) { + this.qws = new QueryWs({ url: this.url, ...opts }); + } + getToken() { + return this.storage.getItem(this.tokenName); + } + saveToken(token) { + this.storage.setItem(this.tokenName, token); + } + removeToken() { + this.storage.removeItem(this.tokenName); + } +}; +export { + Query, + QueryClient, + QueryWs, + adapter +}; +//# sourceMappingURL=@kevisual_query.js.map diff --git a/node_modules/.vite/deps/@kevisual_query.js.map b/node_modules/.vite/deps/@kevisual_query.js.map new file mode 100644 index 0000000..af1d95a --- /dev/null +++ b/node_modules/.vite/deps/@kevisual_query.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../../../node_modules/.pnpm/@kevisual+query@0.0.12_ws@8.18.1/node_modules/@kevisual/query/dist/query-browser.js"], + "sourcesContent": ["/**\n *\n * @param opts\n * @param overloadOpts 覆盖fetch的默认配置\n * @returns\n */\nconst adapter = async (opts, overloadOpts) => {\n const controller = new AbortController();\n const signal = controller.signal;\n const timeout = opts.timeout || 60000 * 3; // 默认超时时间为 60s * 3\n const timer = setTimeout(() => {\n controller.abort();\n }, timeout);\n return fetch(opts.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...opts.headers,\n },\n body: JSON.stringify(opts.body),\n signal,\n ...overloadOpts,\n })\n .then((response) => {\n // 获取 Content-Type 头部信息\n const contentType = response.headers.get('Content-Type');\n // 判断返回的数据类型\n if (contentType && contentType.includes('application/json')) {\n return response.json(); // 解析为 JSON\n }\n else {\n return response.text(); // 解析为文本\n }\n })\n .catch((err) => {\n if (err.name === 'AbortError') {\n console.log('Request timed out and was aborted');\n }\n console.error(err);\n return {\n code: 500,\n };\n })\n .finally(() => {\n clearTimeout(timer);\n });\n};\n\nconst createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const api = { setState, getState, getInitialState, subscribe };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;\n\nconst parseWsUrl = (url) => {\n try {\n new URL(url);\n return url;\n }\n catch (e) {\n const _url = new URL(url, location.origin);\n if (_url.protocol === 'http:') {\n _url.protocol = 'ws:';\n }\n if (_url.protocol === 'https:') {\n _url.protocol = 'wss:';\n }\n return _url.href;\n }\n};\n\nclass QueryWs {\n url;\n store;\n ws;\n constructor(opts) {\n const url = opts?.url || '/api/router';\n if (opts?.store) {\n this.store = opts.store;\n }\n else {\n const store = createStore((set) => ({\n connected: false,\n status: 'connecting',\n setConnected: (connected) => set({ connected }),\n setStatus: (status) => set({ status }),\n }));\n this.store = store;\n }\n const wsUrl = parseWsUrl(url);\n if (opts?.ws && opts.ws instanceof WebSocket) {\n this.ws = opts.ws;\n }\n else {\n this.ws = new WebSocket(wsUrl);\n }\n this.connect();\n }\n /**\n * 连接 WebSocket\n */\n async connect(opts) {\n const store = this.store;\n const connected = store.getState().connected;\n if (connected) {\n return Promise.resolve(true);\n }\n return new Promise((resolve, reject) => {\n const ws = this.ws || new WebSocket(this.url);\n const timeout = opts?.timeout || 5 * 60 * 1000; // 默认 2 分钟\n let timer = setTimeout(() => {\n console.error('WebSocket 连接超时');\n reject('timeout');\n }, timeout);\n ws.onopen = () => {\n store.getState().setConnected(true);\n store.getState().setStatus('connected');\n resolve(true);\n clearTimeout(timer);\n };\n ws.onclose = () => {\n store.getState().setConnected(false);\n store.getState().setStatus('disconnected');\n this.ws = null;\n };\n });\n }\n listenConnect(callback) {\n const store = this.store;\n const { connected } = store.getState();\n if (connected) {\n callback();\n return;\n }\n const subscriptionOne = (selector, listener) => {\n const unsubscribe = store.subscribe((newState, oldState) => {\n if (selector(newState) !== selector(oldState)) {\n listener(newState, oldState);\n unsubscribe();\n }\n });\n return unsubscribe;\n };\n const cancel = subscriptionOne((state) => state.connected, () => {\n callback();\n });\n return cancel;\n }\n onMessage(fn, opts) {\n const ws = this.ws;\n const isJson = opts?.isJson ?? true;\n const selector = opts?.selector;\n const parseIfJson = (data) => {\n try {\n return JSON.parse(data);\n }\n catch (e) {\n return data;\n }\n };\n const listener = (event) => {\n const received = parseIfJson(event.data);\n if (typeof received === 'string' && !isJson) {\n fn(received, event);\n }\n else if (typeof received === 'object' && isJson) {\n fn(selector ? selector(received) : received, event);\n }\n else ;\n };\n ws.addEventListener('message', listener);\n return () => {\n ws.removeEventListener('message', listener);\n };\n }\n close() {\n const ws = this.ws;\n const store = this.store;\n ws?.close?.();\n this.ws = null;\n store.getState().setConnected(false);\n store.getState().setStatus('disconnected');\n }\n send(data, opts) {\n const ws = this.ws;\n const isJson = opts?.isJson ?? true;\n const wrapper = opts?.wrapper;\n if (!ws || ws.readyState !== WebSocket.OPEN) {\n console.error('WebSocket is not open');\n return;\n }\n if (isJson) {\n ws.send(JSON.stringify(wrapper ? wrapper(data) : data));\n }\n else {\n ws.send(data);\n }\n }\n getOpen() {\n if (!this.ws) {\n return false;\n }\n return this.ws.readyState === WebSocket.OPEN;\n }\n}\n\n/**\n * 设置基础响应, 设置 success 和 showError,\n * success 是 code 是否等于 200\n * showError 是 如果 success 为 false 且 noMsg 为 false, 则调用 showError\n * @param res 响应\n */\nconst setBaseResponse = (res) => {\n res.success = res.code === 200;\n /**\n * 显示错误\n * @param fn 错误处理函数\n */\n res.showError = (fn) => {\n if (!res.success && !res.noMsg) {\n fn?.();\n }\n };\n};\n/**\n * const query = new Query();\n * const res = await query.post({\n * path: 'demo',\n * key: '1',\n * });\n *\n * U是参数 V是返回值\n */\nclass Query {\n adapter;\n url;\n beforeRequest;\n afterResponse;\n headers;\n timeout;\n constructor(opts) {\n this.adapter = opts?.adapter || adapter;\n this.url = opts?.url || '/api/router';\n this.headers = opts?.headers || {\n 'Content-Type': 'application/json',\n };\n this.timeout = opts?.timeout || 60000 * 3; // 默认超时时间为 60s * 3\n }\n /**\n * 发送 get 请求,转到 post 请求\n * T是请求类型自定义\n * S是返回类型自定义\n * @param params 请求参数\n * @param options 请求配置\n * @returns 请求结果\n */\n async get(params, options) {\n return this.post(params, options);\n }\n /**\n * 发送 post 请求\n * T是请求类型自定义\n * S是返回类型自定义\n * @param body 请求体\n * @param options 请求配置\n * @returns 请求结果\n */\n async post(body, options) {\n const url = options?.url || this.url;\n const headers = { ...this.headers, ...options?.headers };\n const adapter = options?.adapter || this.adapter;\n const beforeRequest = options?.beforeRequest || this.beforeRequest;\n const afterResponse = options?.afterResponse || this.afterResponse;\n const timeout = options?.timeout || this.timeout;\n const req = {\n url: url,\n headers: headers,\n body,\n timeout,\n };\n try {\n if (beforeRequest) {\n await beforeRequest(req);\n }\n }\n catch (e) {\n console.error('request beforeFn error', e, req);\n return {\n code: 500,\n success: false,\n message: 'api request beforeFn error',\n showError: () => { },\n };\n }\n return adapter(req).then(async (res) => {\n try {\n setBaseResponse(res);\n if (afterResponse) {\n return await afterResponse(res, {\n req,\n res,\n fetch: adapter,\n });\n }\n return res;\n }\n catch (e) {\n console.error('request error', e, req);\n return {\n code: 500,\n success: false,\n message: 'api request afterFn error',\n showError: () => { },\n };\n }\n });\n }\n /**\n * 请求前处理,设置请求前处理函数\n * @param fn 处理函数\n */\n before(fn) {\n this.beforeRequest = fn;\n }\n /**\n * 请求后处理,设置请求后处理函数\n * @param fn 处理函数\n */\n after(fn) {\n this.afterResponse = fn;\n }\n}\n\n/**\n * 前端调用后端QueryRouter\n */\nclass QueryClient extends Query {\n tokenName;\n storage;\n token;\n // 默认不使用ws\n qws;\n constructor(opts) {\n super(opts);\n this.tokenName = opts?.tokenName || 'token';\n this.storage = opts?.storage || localStorage;\n this.beforeRequest = async (opts) => {\n const token = this.token || this.getToken();\n if (token) {\n opts.headers = {\n ...opts.headers,\n Authorization: `Bearer ${token}`,\n };\n }\n return opts;\n };\n if (opts?.io) {\n this.createWs();\n }\n }\n createWs(opts) {\n this.qws = new QueryWs({ url: this.url, ...opts });\n }\n getToken() {\n return this.storage.getItem(this.tokenName);\n }\n saveToken(token) {\n this.storage.setItem(this.tokenName, token);\n }\n removeToken() {\n this.storage.removeItem(this.tokenName);\n }\n}\n// 移除默认生成的实例\n// export const client = new QueryClient();\n\nexport { Query, QueryClient, QueryWs, adapter };\n"], + "mappings": "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", + "names": ["adapter", "opts"] +} diff --git a/node_modules/.vite/deps/@kevisual_query_query.js b/node_modules/.vite/deps/@kevisual_query_query.js new file mode 100644 index 0000000..658b530 --- /dev/null +++ b/node_modules/.vite/deps/@kevisual_query_query.js @@ -0,0 +1,153 @@ +import { + __publicField +} from "./chunk-V6TY7KAL.js"; + +// ../../node_modules/.pnpm/@kevisual+query@0.0.12_ws@8.18.1/node_modules/@kevisual/query/dist/query.js +var adapter = async (opts, overloadOpts) => { + const controller = new AbortController(); + const signal = controller.signal; + const timeout = opts.timeout || 6e4 * 3; + const timer = setTimeout(() => { + controller.abort(); + }, timeout); + return fetch(opts.url, { + method: "POST", + headers: { + "Content-Type": "application/json", + ...opts.headers + }, + body: JSON.stringify(opts.body), + signal, + ...overloadOpts + }).then((response) => { + const contentType = response.headers.get("Content-Type"); + if (contentType && contentType.includes("application/json")) { + return response.json(); + } else { + return response.text(); + } + }).catch((err) => { + if (err.name === "AbortError") { + console.log("Request timed out and was aborted"); + } + console.error(err); + return { + code: 500 + }; + }).finally(() => { + clearTimeout(timer); + }); +}; +var setBaseResponse = (res) => { + res.success = res.code === 200; + res.showError = (fn) => { + if (!res.success && !res.noMsg) { + fn == null ? void 0 : fn(); + } + }; +}; +var Query = class { + constructor(opts) { + __publicField(this, "adapter"); + __publicField(this, "url"); + __publicField(this, "beforeRequest"); + __publicField(this, "afterResponse"); + __publicField(this, "headers"); + __publicField(this, "timeout"); + this.adapter = (opts == null ? void 0 : opts.adapter) || adapter; + this.url = (opts == null ? void 0 : opts.url) || "/api/router"; + this.headers = (opts == null ? void 0 : opts.headers) || { + "Content-Type": "application/json" + }; + this.timeout = (opts == null ? void 0 : opts.timeout) || 6e4 * 3; + } + /** + * 发送 get 请求,转到 post 请求 + * T是请求类型自定义 + * S是返回类型自定义 + * @param params 请求参数 + * @param options 请求配置 + * @returns 请求结果 + */ + async get(params, options) { + return this.post(params, options); + } + /** + * 发送 post 请求 + * T是请求类型自定义 + * S是返回类型自定义 + * @param body 请求体 + * @param options 请求配置 + * @returns 请求结果 + */ + async post(body, options) { + const url = (options == null ? void 0 : options.url) || this.url; + const headers = { ...this.headers, ...options == null ? void 0 : options.headers }; + const adapter2 = (options == null ? void 0 : options.adapter) || this.adapter; + const beforeRequest = (options == null ? void 0 : options.beforeRequest) || this.beforeRequest; + const afterResponse = (options == null ? void 0 : options.afterResponse) || this.afterResponse; + const timeout = (options == null ? void 0 : options.timeout) || this.timeout; + const req = { + url, + headers, + body, + timeout + }; + try { + if (beforeRequest) { + await beforeRequest(req); + } + } catch (e) { + console.error("request beforeFn error", e, req); + return { + code: 500, + success: false, + message: "api request beforeFn error", + showError: () => { + } + }; + } + return adapter2(req).then(async (res) => { + try { + setBaseResponse(res); + if (afterResponse) { + return await afterResponse(res, { + req, + res, + fetch: adapter2 + }); + } + return res; + } catch (e) { + console.error("request error", e, req); + return { + code: 500, + success: false, + message: "api request afterFn error", + showError: () => { + } + }; + } + }); + } + /** + * 请求前处理,设置请求前处理函数 + * @param fn 处理函数 + */ + before(fn) { + this.beforeRequest = fn; + } + /** + * 请求后处理,设置请求后处理函数 + * @param fn 处理函数 + */ + after(fn) { + this.afterResponse = fn; + } +}; +export { + Query, + adapter, + setBaseResponse +}; +//# sourceMappingURL=@kevisual_query_query.js.map diff --git a/node_modules/.vite/deps/@kevisual_query_query.js.map b/node_modules/.vite/deps/@kevisual_query_query.js.map new file mode 100644 index 0000000..149d726 --- /dev/null +++ b/node_modules/.vite/deps/@kevisual_query_query.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../../../../node_modules/.pnpm/@kevisual+query@0.0.12_ws@8.18.1/node_modules/@kevisual/query/dist/query.js"], + "sourcesContent": ["/**\n *\n * @param opts\n * @param overloadOpts 覆盖fetch的默认配置\n * @returns\n */\nconst adapter = async (opts, overloadOpts) => {\n const controller = new AbortController();\n const signal = controller.signal;\n const timeout = opts.timeout || 60000 * 3; // 默认超时时间为 60s * 3\n const timer = setTimeout(() => {\n controller.abort();\n }, timeout);\n return fetch(opts.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...opts.headers,\n },\n body: JSON.stringify(opts.body),\n signal,\n ...overloadOpts,\n })\n .then((response) => {\n // 获取 Content-Type 头部信息\n const contentType = response.headers.get('Content-Type');\n // 判断返回的数据类型\n if (contentType && contentType.includes('application/json')) {\n return response.json(); // 解析为 JSON\n }\n else {\n return response.text(); // 解析为文本\n }\n })\n .catch((err) => {\n if (err.name === 'AbortError') {\n console.log('Request timed out and was aborted');\n }\n console.error(err);\n return {\n code: 500,\n };\n })\n .finally(() => {\n clearTimeout(timer);\n });\n};\n\n/**\n * 设置基础响应, 设置 success 和 showError,\n * success 是 code 是否等于 200\n * showError 是 如果 success 为 false 且 noMsg 为 false, 则调用 showError\n * @param res 响应\n */\nconst setBaseResponse = (res) => {\n res.success = res.code === 200;\n /**\n * 显示错误\n * @param fn 错误处理函数\n */\n res.showError = (fn) => {\n if (!res.success && !res.noMsg) {\n fn?.();\n }\n };\n};\n/**\n * const query = new Query();\n * const res = await query.post({\n * path: 'demo',\n * key: '1',\n * });\n *\n * U是参数 V是返回值\n */\nclass Query {\n adapter;\n url;\n beforeRequest;\n afterResponse;\n headers;\n timeout;\n constructor(opts) {\n this.adapter = opts?.adapter || adapter;\n this.url = opts?.url || '/api/router';\n this.headers = opts?.headers || {\n 'Content-Type': 'application/json',\n };\n this.timeout = opts?.timeout || 60000 * 3; // 默认超时时间为 60s * 3\n }\n /**\n * 发送 get 请求,转到 post 请求\n * T是请求类型自定义\n * S是返回类型自定义\n * @param params 请求参数\n * @param options 请求配置\n * @returns 请求结果\n */\n async get(params, options) {\n return this.post(params, options);\n }\n /**\n * 发送 post 请求\n * T是请求类型自定义\n * S是返回类型自定义\n * @param body 请求体\n * @param options 请求配置\n * @returns 请求结果\n */\n async post(body, options) {\n const url = options?.url || this.url;\n const headers = { ...this.headers, ...options?.headers };\n const adapter = options?.adapter || this.adapter;\n const beforeRequest = options?.beforeRequest || this.beforeRequest;\n const afterResponse = options?.afterResponse || this.afterResponse;\n const timeout = options?.timeout || this.timeout;\n const req = {\n url: url,\n headers: headers,\n body,\n timeout,\n };\n try {\n if (beforeRequest) {\n await beforeRequest(req);\n }\n }\n catch (e) {\n console.error('request beforeFn error', e, req);\n return {\n code: 500,\n success: false,\n message: 'api request beforeFn error',\n showError: () => { },\n };\n }\n return adapter(req).then(async (res) => {\n try {\n setBaseResponse(res);\n if (afterResponse) {\n return await afterResponse(res, {\n req,\n res,\n fetch: adapter,\n });\n }\n return res;\n }\n catch (e) {\n console.error('request error', e, req);\n return {\n code: 500,\n success: false,\n message: 'api request afterFn error',\n showError: () => { },\n };\n }\n });\n }\n /**\n * 请求前处理,设置请求前处理函数\n * @param fn 处理函数\n */\n before(fn) {\n this.beforeRequest = fn;\n }\n /**\n * 请求后处理,设置请求后处理函数\n * @param fn 处理函数\n */\n after(fn) {\n this.afterResponse = fn;\n }\n}\n\nexport { Query, adapter, setBaseResponse };\n"], + "mappings": "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", + "names": ["adapter"] +} diff --git a/node_modules/.vite/deps/_metadata.json b/node_modules/.vite/deps/_metadata.json new file mode 100644 index 0000000..e376be2 --- /dev/null +++ b/node_modules/.vite/deps/_metadata.json @@ -0,0 +1,31 @@ +{ + "hash": "7676c9c1", + "configHash": "073ff67a", + "lockfileHash": "7b5b51fa", + "browserHash": "6d161b56", + "optimized": { + "@kevisual/cache": { + "src": "../../../../../node_modules/.pnpm/@kevisual+cache@0.0.1_rollup@4.36.0_tslib@2.8.1_typescript@5.8.2/node_modules/@kevisual/cache/dist/cache.js", + "file": "@kevisual_cache.js", + "fileHash": "c8f5b09b", + "needsInterop": false + }, + "@kevisual/query": { + "src": "../../../../../node_modules/.pnpm/@kevisual+query@0.0.12_ws@8.18.1/node_modules/@kevisual/query/dist/query-browser.js", + "file": "@kevisual_query.js", + "fileHash": "54f36b5c", + "needsInterop": false + }, + "@kevisual/query/query": { + "src": "../../../../../node_modules/.pnpm/@kevisual+query@0.0.12_ws@8.18.1/node_modules/@kevisual/query/dist/query.js", + "file": "@kevisual_query_query.js", + "fileHash": "d243262a", + "needsInterop": false + } + }, + "chunks": { + "chunk-V6TY7KAL": { + "file": "chunk-V6TY7KAL.js" + } + } +} \ No newline at end of file diff --git a/node_modules/.vite/deps/chunk-V6TY7KAL.js b/node_modules/.vite/deps/chunk-V6TY7KAL.js new file mode 100644 index 0000000..a0b7249 --- /dev/null +++ b/node_modules/.vite/deps/chunk-V6TY7KAL.js @@ -0,0 +1,8 @@ +var __defProp = Object.defineProperty; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + +export { + __publicField +}; +//# sourceMappingURL=chunk-V6TY7KAL.js.map diff --git a/node_modules/.vite/deps/chunk-V6TY7KAL.js.map b/node_modules/.vite/deps/chunk-V6TY7KAL.js.map new file mode 100644 index 0000000..9865211 --- /dev/null +++ b/node_modules/.vite/deps/chunk-V6TY7KAL.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": [], + "sourcesContent": [], + "mappings": "", + "names": [] +} diff --git a/node_modules/.vite/deps/package.json b/node_modules/.vite/deps/package.json new file mode 100644 index 0000000..3dbc1ca --- /dev/null +++ b/node_modules/.vite/deps/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/node_modules/@kevisual/cache b/node_modules/@kevisual/cache new file mode 120000 index 0000000..6be6954 --- /dev/null +++ b/node_modules/@kevisual/cache @@ -0,0 +1 @@ +../../../../node_modules/.pnpm/@kevisual+cache@0.0.1_rollup@4.36.0_tslib@2.8.1_typescript@5.8.2/node_modules/@kevisual/cache \ No newline at end of file diff --git a/node_modules/@kevisual/query b/node_modules/@kevisual/query new file mode 120000 index 0000000..ab956b2 --- /dev/null +++ b/node_modules/@kevisual/query @@ -0,0 +1 @@ +../../../../node_modules/.pnpm/@kevisual+query@0.0.12_ws@8.18.1/node_modules/@kevisual/query \ No newline at end of file diff --git a/node_modules/@types/node b/node_modules/@types/node new file mode 120000 index 0000000..5b62ff3 --- /dev/null +++ b/node_modules/@types/node @@ -0,0 +1 @@ +../../../../node_modules/.pnpm/@types+node@22.13.11/node_modules/@types/node \ No newline at end of file diff --git a/node_modules/tsup b/node_modules/tsup new file mode 120000 index 0000000..cb7b29f --- /dev/null +++ b/node_modules/tsup @@ -0,0 +1 @@ +../../../node_modules/.pnpm/tsup@8.4.0_jiti@2.4.2_postcss@8.5.3_typescript@5.8.2_yaml@2.5.1/node_modules/tsup \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..b7dbb76 --- /dev/null +++ b/package.json @@ -0,0 +1,31 @@ +{ + "name": "@kevisual/query-login", + "version": "0.0.1", + "description": "", + "main": "dist/query-login.js", + "types": "dist/query-login.d.ts", + "scripts": { + "build": "tsup", + "watch": "tsup --watch" + }, + "keywords": [], + "author": "abearxiong ", + "license": "MIT", + "type": "module", + "publishConfig": { + "access": "public" + }, + "peerDependencies": { + "@kevisual/query": "^0.0.12" + }, + "devDependencies": { + "@types/node": "^22.13.11", + "tsup": "^8.4.0" + }, + "exports": { + ".": "./dist/query-login.js" + }, + "dependencies": { + "@kevisual/cache": "^0.0.1" + } +} \ No newline at end of file diff --git a/src/login-cache.ts b/src/login-cache.ts new file mode 100644 index 0000000..a6da843 --- /dev/null +++ b/src/login-cache.ts @@ -0,0 +1,159 @@ +import { MyCache } from '@kevisual/cache'; + +export type CacheLoginUser = { + user?: any; + id?: string; + accessToken?: string; + refreshToken?: string; +}; +type CacheLogin = { + loginUsers: CacheLoginUser[]; +} & CacheLoginUser; + +export interface CacheStore { + name: string; + cacheData: CacheLogin; + cache: T; + /** + * @update 获取缓存 + */ + get(key: string): Promise; + /** + * @update 设置缓存 + */ + set(key: string, value: CacheLogin): Promise; + /** + * @update 删除缓存 + */ + del(): Promise; + /** + * 设置当前用户 + */ + setLoginUser(user: CacheLoginUser): Promise; + /** + * 获取当前用户 + */ + getCurrentUser(): Promise; + /** + * 获取当前用户列表 + */ + getCurrentUserList(): Promise; + /** + * 获取缓存的refreshToken + */ + getRefreshToken(): Promise; + /** + * 获取缓存的accessToken + */ + getAccessToken(): Promise; + /** + * 初始化 + */ + init(): Promise; + /** + * 清除当前用户 + */ + clearCurrentUser(): Promise; + /** + * 清除所有用户 + */ + clearAll(): Promise; +} +export class LoginCacheStore implements CacheStore> { + cache: MyCache; + name: string; + cacheData: CacheLogin; + constructor(name: string) { + this.cache = new MyCache(name); + this.cacheData = { + loginUsers: [], + user: undefined, + id: undefined, + accessToken: undefined, + refreshToken: undefined, + }; + this.name = name; + } + /** + * 设置缓存 + * @param key + * @param value + * @returns + */ + async set(key: string, value: CacheLogin) { + await this.cache.set(key, value); + return value; + } + /** + * 删除缓存 + */ + async del() { + await this.cache.del(); + } + get(key: string): Promise { + return this.cache.get(key); + } + + async init() { + this.cacheData = (await this.get(this.name)) || { + loginUsers: [], + user: null, + id: null, + accessToken: null, + refreshToken: null, + }; + } + /** + * 设置当前用户 + * @param user + */ + async setLoginUser(user: CacheLoginUser) { + const has = this.cacheData.loginUsers.find((u) => u.id === user.id); + if (has) { + this.cacheData.loginUsers = this.cacheData?.loginUsers?.filter((u) => u?.id && u.id !== user.id); + } + this.cacheData.loginUsers.push(user); + this.cacheData.user = user.user; + this.cacheData.id = user.id; + this.cacheData.accessToken = user.accessToken; + this.cacheData.refreshToken = user.refreshToken; + await this.set(this.name, this.cacheData); + } + + getCurrentUser(): Promise { + const cacheData = this.cacheData; + return Promise.resolve(cacheData.user); + } + getCurrentUserList(): Promise { + return Promise.resolve(this.cacheData.loginUsers.filter((u) => u?.id)); + } + getRefreshToken(): Promise { + const cacheData = this.cacheData; + return Promise.resolve(cacheData.refreshToken || ''); + } + getAccessToken(): Promise { + const cacheData = this.cacheData; + return Promise.resolve(cacheData.accessToken || ''); + } + + async clearCurrentUser() { + const user = await this.getCurrentUser(); + const has = this.cacheData.loginUsers.find((u) => u.id === user.id); + if (has) { + this.cacheData.loginUsers = this.cacheData?.loginUsers?.filter((u) => u?.id && u.id !== user.id); + } + this.cacheData.user = undefined; + this.cacheData.id = undefined; + this.cacheData.accessToken = undefined; + this.cacheData.refreshToken = undefined; + await this.set(this.name, this.cacheData); + } + async clearAll() { + this.cacheData.loginUsers = []; + this.cacheData.user = undefined; + this.cacheData.id = undefined; + this.cacheData.accessToken = undefined; + this.cacheData.refreshToken = undefined; + await this.set(this.name, this.cacheData); + } +} diff --git a/src/query-login.ts b/src/query-login.ts new file mode 100644 index 0000000..8257edd --- /dev/null +++ b/src/query-login.ts @@ -0,0 +1,236 @@ +import { Query } from '@kevisual/query'; +import type { Result, DataOpts } from '@kevisual/query/query'; +import { setBaseResponse } from '@kevisual/query/query'; +import { LoginCacheStore, CacheStore } from './login-cache.ts'; + +type QueryLoginOpts = { + query?: Query; + isBrowser?: boolean; + onLoad?: () => void; + storage?: Storage; +}; +export type QueryLoginData = { + username?: string; + password: string; + email?: string; +}; +export type QueryLoginResult = { + accessToken: string; + refreshToken: string; +}; + +export class QueryLogin { + query: Query; + cache: CacheStore; + isBrowser: boolean; + load?: boolean; + storage: Storage; + onLoad?: () => void; + + constructor(opts?: QueryLoginOpts) { + this.query = opts?.query || new Query(); + this.cache = new LoginCacheStore('login'); + this.isBrowser = opts?.isBrowser ?? true; + this.init(); + this.onLoad = opts?.onLoad; + this.storage = opts?.storage || localStorage; + } + setQuery(query: Query) { + this.query = query; + } + async init() { + await this.cache.init(); + this.load = true; + this.onLoad?.(); + } + async post(data: any, opts?: DataOpts) { + return this.query.post({ path: 'user', ...data }, opts); + } + /** + * 登录, + * @param data + * @returns + */ + async login(data: QueryLoginData) { + const res = await this.post({ key: 'login', ...data }); + if (res.code === 200) { + const { accessToken, refreshToken } = res?.data || {}; + this.storage.setItem('token', accessToken || ''); + await this.beforeSetLoginUser({ accessToken, refreshToken }); + } + return res; + } + /** + * 登陆成功,需要获取用户信息进行缓存 + * @param param0 + */ + async beforeSetLoginUser({ accessToken, refreshToken, check401 }: { accessToken?: string; refreshToken?: string; check401?: boolean }) { + if (accessToken && refreshToken) { + const resUser = await this.getMe(accessToken, check401); + if (resUser.code === 200) { + const user = resUser.data; + if (user) { + this.cache.setLoginUser({ + user, + id: user.id, + accessToken, + refreshToken, + }); + } else { + console.error('登录失败'); + } + } + } + } + async queryRefreshToken(refreshToken?: string) { + const _refreshToken = refreshToken || this.cache.getRefreshToken(); + let data = { refreshToken: _refreshToken }; + if (!_refreshToken) { + await this.cache.clearCurrentUser(); + return { + code: 401, + message: '请先登录', + data: {} as any, + }; + } + return this.post( + { key: 'refreshToken', data }, + { + afterResponse: async (response, ctx) => { + setBaseResponse(response); + return response as any; + }, + }, + ); + } + /** + * 检查401错误,并刷新token, 如果refreshToken存在,则刷新token, 否则返回401 + * @param response + * @param ctx + * @param refetch + * @returns + */ + async afterCheck401ToRefreshToken(response: Result, ctx?: { req?: any; res?: any; fetch?: any }, refetch?: boolean) { + const that = this; + if (response?.code === 401) { + const hasRefreshToken = await that.cache.getRefreshToken(); + if (hasRefreshToken) { + const res = await that.queryRefreshToken(hasRefreshToken); + if (res.code === 200) { + const { accessToken, refreshToken } = res?.data || {}; + that.storage.setItem('token', accessToken || ''); + await that.beforeSetLoginUser({ accessToken, refreshToken, check401: false }); + if (refetch && ctx && ctx.req && ctx.req.url && ctx.fetch) { + await new Promise((resolve) => setTimeout(resolve, 1500)); + const url = ctx.req?.url; + const body = ctx.req?.body; + const headers = ctx.req?.headers; + const res = await ctx.fetch(url, { + method: 'POST', + body: body, + headers: { ...headers, Authorization: `Bearer ${accessToken}` }, + }); + setBaseResponse(res); + return res; + } + } else { + that.storage.removeItem('token'); + await that.cache.clearCurrentUser(); + } + return res; + } + } + return response as any; + } + /** + * 获取用户信息 + * @param token + * @returns + */ + async getMe(token?: string, check401: boolean = true) { + const _token = token || this.storage.getItem('token'); + const that = this; + return that.post( + { key: 'me' }, + { + beforeRequest: async (config) => { + if (config.headers) { + config.headers['Authorization'] = `Bearer ${_token}`; + } + return config; + }, + afterResponse: async (response, ctx) => { + if (response?.code === 401 && check401) { + return await that.afterCheck401ToRefreshToken(response, ctx); + } + return response as any; + }, + }, + ); + } + /** + * 请求更新,切换用户, 使用switchUser + * @param username + * @returns + */ + private async postSwitchUser(username: string) { + return this.post({ key: 'switchCheck', data: { username } }); + } + /** + * 切换用户 + * @param username + * @returns + */ + async switchUser(username: string) { + const localUserList = await this.cache.getCurrentUserList(); + const user = localUserList.find((userItem) => userItem.user.username === username); + if (user) { + this.storage.setItem('token', user.accessToken || ''); + await this.beforeSetLoginUser({ accessToken: user.accessToken, refreshToken: user.refreshToken }); + return { + code: 200, + data: { + accessToken: user.accessToken, + refreshToken: user.refreshToken, + }, + success: true, + message: '切换用户成功', + }; + } + const res = await this.postSwitchUser(username); + + if (res.code === 200) { + const { accessToken, refreshToken } = res?.data || {}; + this.storage.setItem('token', accessToken || ''); + await this.beforeSetLoginUser({ accessToken, refreshToken }); + } + return res; + } + + async logout() { + this.storage.removeItem('token'); + this.cache.del(); + return this.post({ key: 'logout' }); + } + async hasUser(username: string) { + const that = this; + return this.post( + { + path: 'org', + key: 'hasUser', + data: { + username, + }, + }, + { + afterResponse: async (response, ctx) => { + if (response?.code === 401) { + const res = await that.afterCheck401ToRefreshToken(response, ctx, true); + return res; + } + return response as any; + }, + }, + ); + } +} diff --git a/src/test/login.ts b/src/test/login.ts new file mode 100644 index 0000000..283a7c6 --- /dev/null +++ b/src/test/login.ts @@ -0,0 +1,22 @@ +import { QueryLogin } from '../query-login.ts'; +import { Query } from '@kevisual/query'; +const query = new Query({ + url: 'https://kevisual.silkyai.cn/api/router', +}); +query.before(async (options) => { + console.log('before', options); + const token = localStorage.getItem('token'); + if (token) { + options.headers = { + ...options.headers, + Authorization: `Bearer ${token}`, + }; + } + return options; +}); +const queryLogin = new QueryLogin({ + query, + isBrowser: true, +}); +// @ts-ignore +window.queryLogin = queryLogin; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..8f70d0f --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "module": "nodenext", + "target": "esnext", + "noImplicitAny": false, + "outDir": "./dist", + "sourceMap": false, + "allowJs": true, + "newLine": "LF", + "baseUrl": "./", + "typeRoots": [ + "node_modules/@types", + ], + "declaration": true, + "noEmit": false, + "allowImportingTsExtensions": true, + "emitDeclarationOnly": true, + "moduleResolution": "NodeNext", + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "esModuleInterop": true, + "paths": { + "@/*": [ + "src/*" + ] + } + }, +} \ No newline at end of file diff --git a/tsup.config.ts b/tsup.config.ts new file mode 100644 index 0000000..94872f4 --- /dev/null +++ b/tsup.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from 'tsup'; + +export default defineConfig({ + entry: ['src/query-login.ts'], + + splitting: false, + sourcemap: false, + clean: true, + format: 'esm', + dts: true, + outDir: 'dist', + tsconfig: 'tsconfig.json', +});