m2m-components 7.1.9-alpha-1762316709646-e42c9b7.0 → 7.1.9-alpha-1762403555939-2eec8f0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/storage/useM2mAuth.tsx","../../src/storage/api/login.ts","../../src/endpoints/m2m-users.v1.ts","../../src/storage/jwt.tsx","../../src/storage/client.ts","../../src/storage/persistenceDatabase.ts","../../src/storage/clearAuth.tsx","../../src/storage/api/getToken.ts","../../src/storage/refreshAuth.tsx"],"sourcesContent":["import React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { LoginInput, requestLogin } from \"./api/login\";\nimport { checkJwtExpiration } from \"./jwt\";\nimport { clearAuth } from \"./clearAuth\";\nimport { m2mAuthTokenApi } from \"./client\";\nimport { persistenceDatabase } from \"./persistenceDatabase\";\nimport { refreshAuth } from \"./refreshAuth\";\n\ninterface AuthenticationState {\n token: string;\n authenticated: boolean;\n login: (input: LoginInput) => Promise<{ token?: string; error?: Error }>;\n logout: () => void;\n updateToken: (token: string) => Promise<{ error?: Error }>;\n revalidating: boolean;\n isLoginRequired: boolean;\n}\n\nconst AuthenticationContext = createContext<AuthenticationState | undefined>(\n undefined,\n);\n\nexport const M2mAuthenticationProvider = ({\n children,\n}: {\n children: React.ReactNode;\n}) => {\n const [token, setToken] = useState(m2mAuthTokenApi.getCache() ?? \"\");\n\n const authenticated = useMemo(() => !!token, [token]);\n\n const tryCheckAuth = useCallback(async () => {\n const authToken = await m2mAuthTokenApi.get();\n if (!(authToken !== null && checkJwtExpiration(authToken))) {\n void m2mAuthTokenApi.clear();\n setToken(\"\");\n } else {\n void m2mAuthTokenApi.set(authToken);\n setToken(authToken);\n }\n }, []);\n\n useEffect(() => {\n void tryCheckAuth();\n }, [tryCheckAuth]);\n\n const login = useCallback(async (input: LoginInput) => {\n const { data: auth, error } = await requestLogin(input);\n if (auth) {\n const authToken = auth.accessToken;\n\n setToken(authToken);\n await m2mAuthTokenApi.set(authToken);\n await persistenceDatabase.set(\"auth\", auth);\n }\n return {\n error,\n token: auth ? auth.accessToken : undefined,\n };\n }, []);\n\n const [revalidating, setRevalidating] = useState(true);\n\n useEffect(() => {\n const callback = async () => {\n const authToken = await refreshAuth();\n if (authToken !== null) {\n setToken(authToken);\n }\n setRevalidating(false);\n };\n void callback();\n // Update auth every 3 hours\n const timer = setInterval(callback, 3 * 60 * 60 * 1000);\n return () => clearInterval(timer);\n }, []);\n\n const logout = useCallback(async () => {\n await clearAuth();\n window.location.reload();\n }, []);\n\n const updateToken = useCallback(async (token: string) => {\n if (checkJwtExpiration(token)) {\n return {\n error: new Error(\"M2MAuthToken is expired\"),\n };\n }\n await m2mAuthTokenApi.set(token);\n setToken(token);\n return { error: undefined };\n }, []);\n\n const state = useMemo(() => {\n return {\n login,\n logout,\n token,\n authenticated,\n updateToken,\n revalidating,\n isLoginRequired: authenticated === false && revalidating === false,\n } satisfies AuthenticationState;\n }, [authenticated, login, logout, revalidating, token, updateToken]);\n return (\n <AuthenticationContext.Provider value={state}>\n {children}\n </AuthenticationContext.Provider>\n );\n};\n\nexport const useAuth = () => {\n const ctx = useContext(AuthenticationContext);\n if (!ctx) {\n throw new Error(\"AuthenticationProvider is not found\");\n }\n return ctx;\n};\n","import { fetcher } from \"matsuri-hooks\";\nimport { login as m2mUsers_v1_login } from \"../../endpoints/m2m-users.v1\";\n\nexport interface LoginInput {\n email: string;\n password: string;\n}\n// @see https://github.com/matsuri-tech/m2m-users/blob/master/domain/model/common/accessToken.go#L7\nexport interface LoginResponse {\n accessToken: string;\n expiresAt: number;\n refreshToken: {\n refreshToken: string;\n refreshTokenExpiresAt: number;\n };\n}\nexport const requestLogin = async (input: LoginInput) => {\n return await fetcher<LoginResponse>(m2mUsers_v1_login(), {\n method: \"POST\",\n body: JSON.stringify(input),\n });\n};\n","/* eslint-disable */\n/**\n * A function that returns the URL part common to the endpoints.\n */\nexport const root = () => {\n let __root = \"\";\n\n if (globalThis.M2M_COMPONENTS_ENV === \"local\") {\n __root = \"http://localhost:8080\";\n }\n\n if (globalThis.M2M_COMPONENTS_ENV === \"localDev\") {\n __root = \"https://api-users.dev.m2msystems.cloud\";\n }\n\n if (globalThis.M2M_COMPONENTS_ENV === \"development\") {\n __root = \"https://api-users.dev.m2msystems.cloud\";\n }\n\n if (globalThis.M2M_COMPONENTS_ENV === \"production\") {\n __root = \"https://api.m2msystems.cloud\";\n }\n\n return __root;\n};\n/**\n * ヘルスチェック\n *\n */\nexport const healthCheck = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`health_check`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 会社を作成する\n *\n */\nexport const createCompany = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 会社情報を取得する\n *\n */\nexport const getCompany = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 会社情報を更新する\n *\n */\nexport const updateCompany = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 会社情報を更新する\n *\n */\nexport const updateCompanyPatch = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * idを指定して複数の会社情報を取得する\n * @param {string} company_ids a,b,c\n */\nexport const findCompaniesByIds = ({\n company_ids,\n}: {\n company_ids?: string;\n}) => {\n const __root = root();\n const __queries = Object.entries({ company_ids })\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/find_by_ids`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを作成する\n *\n */\nexport const createUser = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを取得する\n *\n */\nexport const findUserById = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを更新する\n *\n */\nexport const updateUser = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを更新する\n *\n */\nexport const updateUserPatch = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを強制的に有効化する\n *\n */\nexport const activateUserByAdmin = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}/admin_activate`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを無効化する\n *\n */\nexport const deactivateUser = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}/deactivate`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * パスワードリセットのメールを送信する\n *\n */\nexport const sendResetPasswordEmail = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/reset_password_email`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * パスワードをリセットする\n *\n */\nexport const resetPassword = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/reset_password`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * アクティベーションメールを送信する\n *\n */\nexport const sendActivationEmail = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/activation_email`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを有効化する\n *\n */\nexport const activateUser = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/activate`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 認可スコープを設定する\n *\n */\nexport const setAuthorityScope = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/scope`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * メールを指定してユーザーを取得する\n *\n */\nexport const findUserByEmail = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/find_by_email`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーの権限を更新する\n *\n */\nexport const updateAuthority = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/authority/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * companyIdからユーザーを取得する\n * @param {string} statuses BeforeVerification,Active,Deactivated\n */\nexport const findUsersByCompanyId = ({ statuses }: { statuses?: string }) => {\n const __root = root();\n const __queries = Object.entries({ statuses })\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/find_by_company_id`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザー情報をAdminが変更する\n *\n */\nexport const updateUserByAdmin = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}/admin_update`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーの会社を移動する\n *\n */\nexport const transferUserCompany = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/transfer_company`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ログインする\n *\n */\nexport const login = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ログインする\n *\n */\nexport const loginWithSlash = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * JWKを取得する\n *\n */\nexport const getJwks = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/jwks`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 公開鍵を取得する\n *\n */\nexport const getPublicKeys = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/public_keys`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * MFAのコードを発行する\n *\n */\nexport const publishMFACode = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/publish_mfa_code`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * MFAを使ってログインする\n *\n */\nexport const loginWithMFA = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/mfa_login`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * トークンを取得する\n *\n */\nexport const getToken = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/token`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * usersに存在しないアカウントのトークンを作成する(deprecated)\n *\n */\nexport const generateToken = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`guest/token`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * usersに存在しないアカウントのトークンを作成する\n *\n */\nexport const generateUserToken = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`generate/token`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\nexport const m2mUsers_v1 = {\n healthCheck,\n createCompany,\n getCompany,\n updateCompany,\n updateCompanyPatch,\n findCompaniesByIds,\n createUser,\n findUserById,\n updateUser,\n updateUserPatch,\n activateUserByAdmin,\n deactivateUser,\n sendResetPasswordEmail,\n resetPassword,\n sendActivationEmail,\n activateUser,\n setAuthorityScope,\n findUserByEmail,\n updateAuthority,\n findUsersByCompanyId,\n updateUserByAdmin,\n transferUserCompany,\n login,\n loginWithSlash,\n getJwks,\n getPublicKeys,\n publishMFACode,\n loginWithMFA,\n getToken,\n generateToken,\n generateUserToken,\n};\n","interface JwtPayload {\n aud: string;\n authority: string;\n companyId: string;\n exp: number;\n iss: string;\n loginType: string;\n scope: Record<string, string>;\n userId: string;\n}\n\nconst isObject = (value: unknown): value is Record<string, unknown> => {\n return typeof value === \"object\" && value !== null;\n};\n/**\n * 利用するパラメータが存在するかどうかを確認する\n */\nconst validateJwtPayload = (payload: unknown): JwtPayload => {\n if (isObject(payload) === false) {\n throw new Error(\"JWT payload is not an object\");\n }\n\n if (typeof payload?.exp !== \"number\" || typeof payload?.userId !== \"string\") {\n throw new Error(\"JWT payload is missing required fields\");\n }\n\n return payload as unknown as JwtPayload;\n};\n\nexport const parseJwtPayload = (jwt: string): JwtPayload | null => {\n try {\n const splitted = jwt.split(\".\");\n if (splitted.length !== 3) {\n throw new Error(\"Invalid JWT\");\n }\n const [, payload] = splitted;\n return validateJwtPayload(JSON.parse(atob(payload)));\n } catch (error: unknown) {\n console.error(error);\n return null;\n }\n};\n\nexport const checkJwtExpiration = (jwt: string): boolean => {\n const payload = parseJwtPayload(jwt);\n if (!payload) {\n return false;\n }\n return new Date() < new Date(payload.exp * 1000);\n};\n","import { StorageClient } from \"./lib/client\";\n\nclass M2mStorageClient extends StorageClient {}\n\nexport type { M2mStorageClient };\n\n/**\n * Get the connected storage client.\n * @param timeout\n * @default 5000\n */\nconst getStorage = async (timeout = 5000) => {\n const storage = await new Promise<M2mStorageClient>((resolve, reject) => {\n const rejectTimer = globalThis.setTimeout(function () {\n reject(\n new Error(\n \"Timeout: M2mStorageClient could not connect. Please call m2mStorageClient.init() before using m2mStorageClient.\",\n ),\n );\n }, timeout);\n\n const storage = globalThis.M2M_STORAGE;\n if (storage) {\n globalThis.clearTimeout(rejectTimer);\n resolve(storage);\n }\n\n const timer = globalThis.setInterval(() => {\n const storage = globalThis.M2M_STORAGE;\n if (storage) {\n globalThis.clearTimeout(rejectTimer);\n globalThis.clearInterval(timer);\n resolve(storage);\n }\n }, 200);\n });\n\n await storage.onConnect();\n\n return storage;\n};\n\nconst M2M_STORAGE_HUB_URL = \"https://hub.m2msystems.cloud/\";\n\nconst M2M_STORAGE_HUB_URL_DEV =\n \"https://m2m-components-storage-hub-dev.netlify.app/\";\n\nconst initStorageClient = (options?: {\n env?: \"development\" | \"production\";\n}) => {\n if (globalThis.M2M_STORAGE) {\n throw new Error(\n \"M2mStorageClient already initialized. Do not call m2mStorageClient.init multiple times.\",\n );\n }\n const storage = new M2mStorageClient(\n options?.env === \"production\"\n ? M2M_STORAGE_HUB_URL\n : M2M_STORAGE_HUB_URL_DEV,\n );\n globalThis.M2M_STORAGE = storage;\n};\n\nexport const m2mStorageClient = {\n init: initStorageClient,\n getStorage: getStorage,\n};\n\nexport const M2M_AUTH_TOKEN_KEY = \"M2M_APP_AUTH_TOKEN\";\n\nconst getAuthTokenCache = () => {\n return globalThis.localStorage.getItem(M2M_AUTH_TOKEN_KEY);\n};\n\nconst getAuthToken = async () => {\n try {\n const storage = await getStorage();\n const autuToken = (await storage.get(M2M_AUTH_TOKEN_KEY)) as string;\n return autuToken || getAuthTokenCache();\n } catch (error) {\n console.warn(error);\n return getAuthTokenCache();\n }\n};\n\nconst setAuthToken = async (token: string) => {\n globalThis.localStorage.setItem(M2M_AUTH_TOKEN_KEY, token);\n try {\n const storage = await getStorage();\n await storage.set(M2M_AUTH_TOKEN_KEY, token);\n } catch (error) {\n console.warn(error);\n }\n};\n\nconst clearAuthToken = async () => {\n globalThis.localStorage.removeItem(M2M_AUTH_TOKEN_KEY);\n try {\n const storage = await getStorage();\n await storage.del(M2M_AUTH_TOKEN_KEY);\n } catch (error) {\n console.warn(error);\n }\n};\n\nexport const m2mAuthTokenApi = {\n get: getAuthToken,\n getCache: getAuthTokenCache,\n set: setAuthToken,\n clear: clearAuthToken,\n};\n","import { DBSchema, openDB } from \"idb\";\nimport { LoginResponse } from \"./api/login\";\n\ninterface PersistenceDatabase extends DBSchema {\n persistence: {\n value: LoginResponse;\n key: \"auth\";\n };\n}\n\nconst dbPromise = openDB<PersistenceDatabase>(\"persistence-store\", 1, {\n upgrade(db) {\n db.createObjectStore(\"persistence\");\n },\n});\n\nconst get = async (key: \"auth\") => {\n return (await dbPromise).get(\"persistence\", key);\n};\nconst set = async (key: \"auth\", val: LoginResponse) => {\n return (await dbPromise).put(\"persistence\", val, key);\n};\nconst clear = async (key: \"auth\") => {\n return (await dbPromise).delete(\"persistence\", key);\n};\n\nexport const persistenceDatabase = {\n get,\n set,\n clear,\n};\n","import { m2mAuthTokenApi } from \"./client\";\nimport { persistenceDatabase } from \"./persistenceDatabase\";\n\nexport const clearAuth = async () => {\n await persistenceDatabase.clear(\"auth\");\n await m2mAuthTokenApi.clear();\n};\n","import { fetcher } from \"matsuri-hooks\";\nimport { getToken as m2mUsers_v1_getToken } from \"../../endpoints/m2m-users.v1\";\nimport { LoginResponse } from \"./login\";\n\n// @see https://github.com/matsuri-tech/m2m-users/blob/master/web/request/login.go#L10-L13\ninterface GetTokenInput {\n userId: string;\n refreshToken: string;\n}\ntype GetTokenResponse = LoginResponse;\nexport const requestGetToken = async (input: GetTokenInput) => {\n return await fetcher<GetTokenResponse>(m2mUsers_v1_getToken(), {\n method: \"POST\",\n body: JSON.stringify(input),\n });\n};\n","import { m2mAuthTokenApi } from \"./client\";\nimport { parseJwtPayload } from \"./jwt\";\nimport { persistenceDatabase } from \"./persistenceDatabase\";\nimport { requestGetToken } from \"./api/getToken\";\n\nexport const refreshAuth = async () => {\n const auth = await persistenceDatabase.get(\"auth\");\n if (!auth) return null;\n\n const payload = parseJwtPayload(auth.accessToken);\n if (!payload) {\n return null;\n }\n\n const { data: newAuth } = await requestGetToken({\n refreshToken: auth.refreshToken.refreshToken,\n userId: payload.userId,\n });\n\n if (newAuth) {\n const authToken = newAuth.accessToken;\n await m2mAuthTokenApi.set(authToken);\n await persistenceDatabase.set(\"auth\", newAuth);\n return authToken;\n }\n return null;\n};\n"],"mappings":"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","names":["storage","import_matsuri_hooks","login","token"]}
|
|
1
|
+
{"version":3,"sources":["../../src/storage/useM2mAuth.tsx","../../src/storage/api/login.ts","../../src/endpoints/m2m-users.v1.ts","../../src/storage/jwt.tsx","../../src/storage/client.ts","../../src/storage/persistenceDatabase.ts","../../src/storage/clearAuth.tsx","../../src/storage/api/getToken.ts","../../src/storage/refreshAuth.tsx"],"sourcesContent":["import React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { LoginInput, requestLogin } from \"./api/login\";\nimport { checkJwtExpiration } from \"./jwt\";\nimport { clearAuth } from \"./clearAuth\";\nimport { m2mAuthTokenApi } from \"./client\";\nimport { persistenceDatabase } from \"./persistenceDatabase\";\nimport { refreshAuth } from \"./refreshAuth\";\n\ninterface AuthenticationState {\n token: string;\n authenticated: boolean;\n login: (input: LoginInput) => Promise<{ token?: string; error?: Error }>;\n logout: () => void;\n updateToken: (token: string) => Promise<{ error?: Error }>;\n revalidating: boolean;\n isLoginRequired: boolean;\n}\n\nconst AuthenticationContext = createContext<AuthenticationState | undefined>(\n undefined,\n);\n\nexport const M2mAuthenticationProvider = ({\n children,\n}: {\n children: React.ReactNode;\n}) => {\n const [token, setToken] = useState(m2mAuthTokenApi.getCache() ?? \"\");\n\n const authenticated = useMemo(() => !!token, [token]);\n\n const tryCheckAuth = useCallback(async () => {\n const authToken = await m2mAuthTokenApi.get();\n if (!(authToken !== null && checkJwtExpiration(authToken))) {\n void m2mAuthTokenApi.clear();\n setToken(\"\");\n } else {\n void m2mAuthTokenApi.set(authToken);\n setToken(authToken);\n }\n }, []);\n\n useEffect(() => {\n // tryCheckAuthは依存配列が空のuseCallbackで定義されているため、\n // 常に同じ関数参照を返し、このuseEffectは初回レンダリング後のみ実行される。\n // レンダリング後に一度認証状態を確認する意図的な動作のため、このルールを無効化。\n // eslint-disable-next-line react-hooks/set-state-in-effect\n void tryCheckAuth();\n }, [tryCheckAuth]);\n\n const login = useCallback(async (input: LoginInput) => {\n const { data: auth, error } = await requestLogin(input);\n if (auth) {\n const authToken = auth.accessToken;\n\n setToken(authToken);\n await m2mAuthTokenApi.set(authToken);\n await persistenceDatabase.set(\"auth\", auth);\n }\n return {\n error,\n token: auth ? auth.accessToken : undefined,\n };\n }, []);\n\n const [revalidating, setRevalidating] = useState(true);\n\n useEffect(() => {\n const callback = async () => {\n const authToken = await refreshAuth();\n if (authToken !== null) {\n setToken(authToken);\n }\n setRevalidating(false);\n };\n void callback();\n // Update auth every 3 hours\n const timer = setInterval(callback, 3 * 60 * 60 * 1000);\n return () => clearInterval(timer);\n }, []);\n\n const logout = useCallback(async () => {\n await clearAuth();\n window.location.reload();\n }, []);\n\n const updateToken = useCallback(async (token: string) => {\n if (checkJwtExpiration(token)) {\n return {\n error: new Error(\"M2MAuthToken is expired\"),\n };\n }\n await m2mAuthTokenApi.set(token);\n setToken(token);\n return { error: undefined };\n }, []);\n\n const state = useMemo(() => {\n return {\n login,\n logout,\n token,\n authenticated,\n updateToken,\n revalidating,\n isLoginRequired: authenticated === false && revalidating === false,\n } satisfies AuthenticationState;\n }, [authenticated, login, logout, revalidating, token, updateToken]);\n return (\n <AuthenticationContext.Provider value={state}>\n {children}\n </AuthenticationContext.Provider>\n );\n};\n\nexport const useAuth = () => {\n const ctx = useContext(AuthenticationContext);\n if (!ctx) {\n throw new Error(\"AuthenticationProvider is not found\");\n }\n return ctx;\n};\n","import { fetcher } from \"matsuri-hooks\";\nimport { login as m2mUsers_v1_login } from \"../../endpoints/m2m-users.v1\";\n\nexport interface LoginInput {\n email: string;\n password: string;\n}\n// @see https://github.com/matsuri-tech/m2m-users/blob/master/domain/model/common/accessToken.go#L7\nexport interface LoginResponse {\n accessToken: string;\n expiresAt: number;\n refreshToken: {\n refreshToken: string;\n refreshTokenExpiresAt: number;\n };\n}\nexport const requestLogin = async (input: LoginInput) => {\n return await fetcher<LoginResponse>(m2mUsers_v1_login(), {\n method: \"POST\",\n body: JSON.stringify(input),\n });\n};\n","/* eslint-disable */\n/**\n * A function that returns the URL part common to the endpoints.\n */\nexport const root = () => {\n let __root = \"\";\n\n if (globalThis.M2M_COMPONENTS_ENV === \"local\") {\n __root = \"http://localhost:8080\";\n }\n\n if (globalThis.M2M_COMPONENTS_ENV === \"localDev\") {\n __root = \"https://api-users.dev.m2msystems.cloud\";\n }\n\n if (globalThis.M2M_COMPONENTS_ENV === \"development\") {\n __root = \"https://api-users.dev.m2msystems.cloud\";\n }\n\n if (globalThis.M2M_COMPONENTS_ENV === \"production\") {\n __root = \"https://api.m2msystems.cloud\";\n }\n\n return __root;\n};\n/**\n * ヘルスチェック\n *\n */\nexport const healthCheck = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`health_check`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 会社を作成する\n *\n */\nexport const createCompany = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 会社情報を取得する\n *\n */\nexport const getCompany = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 会社情報を更新する\n *\n */\nexport const updateCompany = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 会社情報を更新する\n *\n */\nexport const updateCompanyPatch = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * idを指定して複数の会社情報を取得する\n * @param {string} company_ids a,b,c\n */\nexport const findCompaniesByIds = ({\n company_ids,\n}: {\n company_ids?: string;\n}) => {\n const __root = root();\n const __queries = Object.entries({ company_ids })\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/find_by_ids`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを作成する\n *\n */\nexport const createUser = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを取得する\n *\n */\nexport const findUserById = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを更新する\n *\n */\nexport const updateUser = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを更新する\n *\n */\nexport const updateUserPatch = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを強制的に有効化する\n *\n */\nexport const activateUserByAdmin = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}/admin_activate`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを無効化する\n *\n */\nexport const deactivateUser = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}/deactivate`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * パスワードリセットのメールを送信する\n *\n */\nexport const sendResetPasswordEmail = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/reset_password_email`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * パスワードをリセットする\n *\n */\nexport const resetPassword = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/reset_password`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * アクティベーションメールを送信する\n *\n */\nexport const sendActivationEmail = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/activation_email`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを有効化する\n *\n */\nexport const activateUser = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/activate`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 認可スコープを設定する\n *\n */\nexport const setAuthorityScope = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/scope`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * メールを指定してユーザーを取得する\n *\n */\nexport const findUserByEmail = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/find_by_email`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーの権限を更新する\n *\n */\nexport const updateAuthority = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/authority/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * companyIdからユーザーを取得する\n * @param {string} statuses BeforeVerification,Active,Deactivated\n */\nexport const findUsersByCompanyId = ({ statuses }: { statuses?: string }) => {\n const __root = root();\n const __queries = Object.entries({ statuses })\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/find_by_company_id`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザー情報をAdminが変更する\n *\n */\nexport const updateUserByAdmin = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}/admin_update`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーの会社を移動する\n *\n */\nexport const transferUserCompany = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/transfer_company`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ログインする\n *\n */\nexport const login = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ログインする\n *\n */\nexport const loginWithSlash = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * JWKを取得する\n *\n */\nexport const getJwks = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/jwks`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 公開鍵を取得する\n *\n */\nexport const getPublicKeys = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/public_keys`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * MFAのコードを発行する\n *\n */\nexport const publishMFACode = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/publish_mfa_code`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * MFAを使ってログインする\n *\n */\nexport const loginWithMFA = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/mfa_login`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * トークンを取得する\n *\n */\nexport const getToken = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/token`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * usersに存在しないアカウントのトークンを作成する(deprecated)\n *\n */\nexport const generateToken = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`guest/token`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * usersに存在しないアカウントのトークンを作成する\n *\n */\nexport const generateUserToken = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`generate/token`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\nexport const m2mUsers_v1 = {\n healthCheck,\n createCompany,\n getCompany,\n updateCompany,\n updateCompanyPatch,\n findCompaniesByIds,\n createUser,\n findUserById,\n updateUser,\n updateUserPatch,\n activateUserByAdmin,\n deactivateUser,\n sendResetPasswordEmail,\n resetPassword,\n sendActivationEmail,\n activateUser,\n setAuthorityScope,\n findUserByEmail,\n updateAuthority,\n findUsersByCompanyId,\n updateUserByAdmin,\n transferUserCompany,\n login,\n loginWithSlash,\n getJwks,\n getPublicKeys,\n publishMFACode,\n loginWithMFA,\n getToken,\n generateToken,\n generateUserToken,\n};\n","interface JwtPayload {\n aud: string;\n authority: string;\n companyId: string;\n exp: number;\n iss: string;\n loginType: string;\n scope: Record<string, string>;\n userId: string;\n}\n\nconst isObject = (value: unknown): value is Record<string, unknown> => {\n return typeof value === \"object\" && value !== null;\n};\n/**\n * 利用するパラメータが存在するかどうかを確認する\n */\nconst validateJwtPayload = (payload: unknown): JwtPayload => {\n if (isObject(payload) === false) {\n throw new Error(\"JWT payload is not an object\");\n }\n\n if (typeof payload?.exp !== \"number\" || typeof payload?.userId !== \"string\") {\n throw new Error(\"JWT payload is missing required fields\");\n }\n\n return payload as unknown as JwtPayload;\n};\n\nexport const parseJwtPayload = (jwt: string): JwtPayload | null => {\n try {\n const splitted = jwt.split(\".\");\n if (splitted.length !== 3) {\n throw new Error(\"Invalid JWT\");\n }\n const [, payload] = splitted;\n return validateJwtPayload(JSON.parse(atob(payload)));\n } catch (error: unknown) {\n console.error(error);\n return null;\n }\n};\n\nexport const checkJwtExpiration = (jwt: string): boolean => {\n const payload = parseJwtPayload(jwt);\n if (!payload) {\n return false;\n }\n return new Date() < new Date(payload.exp * 1000);\n};\n","import { StorageClient } from \"./lib/client\";\n\nclass M2mStorageClient extends StorageClient {}\n\nexport type { M2mStorageClient };\n\n/**\n * Get the connected storage client.\n * @param timeout\n * @default 5000\n */\nconst getStorage = async (timeout = 5000) => {\n const storage = await new Promise<M2mStorageClient>((resolve, reject) => {\n const rejectTimer = globalThis.setTimeout(function () {\n reject(\n new Error(\n \"Timeout: M2mStorageClient could not connect. Please call m2mStorageClient.init() before using m2mStorageClient.\",\n ),\n );\n }, timeout);\n\n const storage = globalThis.M2M_STORAGE;\n if (storage) {\n globalThis.clearTimeout(rejectTimer);\n resolve(storage);\n }\n\n const timer = globalThis.setInterval(() => {\n const storage = globalThis.M2M_STORAGE;\n if (storage) {\n globalThis.clearTimeout(rejectTimer);\n globalThis.clearInterval(timer);\n resolve(storage);\n }\n }, 200);\n });\n\n await storage.onConnect();\n\n return storage;\n};\n\nconst M2M_STORAGE_HUB_URL = \"https://hub.m2msystems.cloud/\";\n\nconst M2M_STORAGE_HUB_URL_DEV =\n \"https://m2m-components-storage-hub-dev.netlify.app/\";\n\nconst initStorageClient = (options?: {\n env?: \"development\" | \"production\";\n}) => {\n if (globalThis.M2M_STORAGE) {\n throw new Error(\n \"M2mStorageClient already initialized. Do not call m2mStorageClient.init multiple times.\",\n );\n }\n const storage = new M2mStorageClient(\n options?.env === \"production\"\n ? M2M_STORAGE_HUB_URL\n : M2M_STORAGE_HUB_URL_DEV,\n );\n globalThis.M2M_STORAGE = storage;\n};\n\nexport const m2mStorageClient = {\n init: initStorageClient,\n getStorage: getStorage,\n};\n\nexport const M2M_AUTH_TOKEN_KEY = \"M2M_APP_AUTH_TOKEN\";\n\nconst getAuthTokenCache = () => {\n return globalThis.localStorage.getItem(M2M_AUTH_TOKEN_KEY);\n};\n\nconst getAuthToken = async () => {\n try {\n const storage = await getStorage();\n const autuToken = (await storage.get(M2M_AUTH_TOKEN_KEY)) as string;\n return autuToken || getAuthTokenCache();\n } catch (error) {\n console.warn(error);\n return getAuthTokenCache();\n }\n};\n\nconst setAuthToken = async (token: string) => {\n globalThis.localStorage.setItem(M2M_AUTH_TOKEN_KEY, token);\n try {\n const storage = await getStorage();\n await storage.set(M2M_AUTH_TOKEN_KEY, token);\n } catch (error) {\n console.warn(error);\n }\n};\n\nconst clearAuthToken = async () => {\n globalThis.localStorage.removeItem(M2M_AUTH_TOKEN_KEY);\n try {\n const storage = await getStorage();\n await storage.del(M2M_AUTH_TOKEN_KEY);\n } catch (error) {\n console.warn(error);\n }\n};\n\nexport const m2mAuthTokenApi = {\n get: getAuthToken,\n getCache: getAuthTokenCache,\n set: setAuthToken,\n clear: clearAuthToken,\n};\n","import { DBSchema, openDB } from \"idb\";\nimport { LoginResponse } from \"./api/login\";\n\ninterface PersistenceDatabase extends DBSchema {\n persistence: {\n value: LoginResponse;\n key: \"auth\";\n };\n}\n\nconst dbPromise = openDB<PersistenceDatabase>(\"persistence-store\", 1, {\n upgrade(db) {\n db.createObjectStore(\"persistence\");\n },\n});\n\nconst get = async (key: \"auth\") => {\n return (await dbPromise).get(\"persistence\", key);\n};\nconst set = async (key: \"auth\", val: LoginResponse) => {\n return (await dbPromise).put(\"persistence\", val, key);\n};\nconst clear = async (key: \"auth\") => {\n return (await dbPromise).delete(\"persistence\", key);\n};\n\nexport const persistenceDatabase = {\n get,\n set,\n clear,\n};\n","import { m2mAuthTokenApi } from \"./client\";\nimport { persistenceDatabase } from \"./persistenceDatabase\";\n\nexport const clearAuth = async () => {\n await persistenceDatabase.clear(\"auth\");\n await m2mAuthTokenApi.clear();\n};\n","import { fetcher } from \"matsuri-hooks\";\nimport { getToken as m2mUsers_v1_getToken } from \"../../endpoints/m2m-users.v1\";\nimport { LoginResponse } from \"./login\";\n\n// @see https://github.com/matsuri-tech/m2m-users/blob/master/web/request/login.go#L10-L13\ninterface GetTokenInput {\n userId: string;\n refreshToken: string;\n}\ntype GetTokenResponse = LoginResponse;\nexport const requestGetToken = async (input: GetTokenInput) => {\n return await fetcher<GetTokenResponse>(m2mUsers_v1_getToken(), {\n method: \"POST\",\n body: JSON.stringify(input),\n });\n};\n","import { m2mAuthTokenApi } from \"./client\";\nimport { parseJwtPayload } from \"./jwt\";\nimport { persistenceDatabase } from \"./persistenceDatabase\";\nimport { requestGetToken } from \"./api/getToken\";\n\nexport const refreshAuth = async () => {\n const auth = await persistenceDatabase.get(\"auth\");\n if (!auth) return null;\n\n const payload = parseJwtPayload(auth.accessToken);\n if (!payload) {\n return null;\n }\n\n const { data: newAuth } = await requestGetToken({\n refreshToken: auth.refreshToken.refreshToken,\n userId: payload.userId,\n });\n\n if (newAuth) {\n const authToken = newAuth.accessToken;\n await m2mAuthTokenApi.set(authToken);\n await persistenceDatabase.set(\"auth\", newAuth);\n return authToken;\n }\n return null;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAOO;;;ACPP,2BAAwB;;;ACIjB,IAAM,OAAO,MAAM;AACxB,MAAI,SAAS;AAEb,MAAI,WAAW,uBAAuB,SAAS;AAC7C,aAAS;AAAA,EACX;AAEA,MAAI,WAAW,uBAAuB,YAAY;AAChD,aAAS;AAAA,EACX;AAEA,MAAI,WAAW,uBAAuB,eAAe;AACnD,aAAS;AAAA,EACX;AAEA,MAAI,WAAW,uBAAuB,cAAc;AAClD,aAAS;AAAA,EACX;AAEA,SAAO;AACT;AA+XO,IAAM,QAAQ,MAAM;AACzB,QAAM,SAAS,KAAK;AACpB,QAAM,YAAY,OAAO,QAAQ,CAAC,CAAC,EAChC,OAAO,CAAC,CAAC,GAAG,KAAK,MAAM;AACtB,WAAO,UAAU;AAAA,EACnB,CAAC,EACA,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AACrB,WAAO,GAAG,GAAG,IAAI,KAAK;AAAA,EACxB,CAAC,EACA,KAAK,GAAG;AACX,QAAM,SAAS,GAAG,MAAM,IAAI,OAAO;AACnC,SAAO,YAAY,GAAG,MAAM,IAAI,SAAS,KAAK;AAChD;AA0FO,IAAM,WAAW,MAAM;AAC5B,QAAM,SAAS,KAAK;AACpB,QAAM,YAAY,OAAO,QAAQ,CAAC,CAAC,EAChC,OAAO,CAAC,CAAC,GAAG,KAAK,MAAM;AACtB,WAAO,UAAU;AAAA,EACnB,CAAC,EACA,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AACrB,WAAO,GAAG,GAAG,IAAI,KAAK;AAAA,EACxB,CAAC,EACA,KAAK,GAAG;AACX,QAAM,SAAS,GAAG,MAAM,IAAI,aAAa;AACzC,SAAO,YAAY,GAAG,MAAM,IAAI,SAAS,KAAK;AAChD;;;ADzfO,IAAM,eAAe,OAAO,UAAsB;AACvD,SAAO,UAAM,8BAAuB,MAAkB,GAAG;AAAA,IACvD,QAAQ;AAAA,IACR,MAAM,KAAK,UAAU,KAAK;AAAA,EAC5B,CAAC;AACH;;;AEVA,IAAM,WAAW,CAAC,UAAqD;AACrE,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAIA,IAAM,qBAAqB,CAAC,YAAiC;AAC3D,MAAI,SAAS,OAAO,MAAM,OAAO;AAC/B,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAChD;AAEA,MAAI,QAAO,mCAAS,SAAQ,YAAY,QAAO,mCAAS,YAAW,UAAU;AAC3E,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC1D;AAEA,SAAO;AACT;AAEO,IAAM,kBAAkB,CAAC,QAAmC;AACjE,MAAI;AACF,UAAM,WAAW,IAAI,MAAM,GAAG;AAC9B,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM,IAAI,MAAM,aAAa;AAAA,IAC/B;AACA,UAAM,CAAC,EAAE,OAAO,IAAI;AACpB,WAAO,mBAAmB,KAAK,MAAM,KAAK,OAAO,CAAC,CAAC;AAAA,EACrD,SAAS,OAAgB;AACvB,YAAQ,MAAM,KAAK;AACnB,WAAO;AAAA,EACT;AACF;AAEO,IAAM,qBAAqB,CAAC,QAAyB;AAC1D,QAAM,UAAU,gBAAgB,GAAG;AACnC,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,SAAO,oBAAI,KAAK,IAAI,IAAI,KAAK,QAAQ,MAAM,GAAI;AACjD;;;ACtCA,IAAM,aAAa,OAAO,UAAU,QAAS;AAC3C,QAAM,UAAU,MAAM,IAAI,QAA0B,CAAC,SAAS,WAAW;AACvE,UAAM,cAAc,WAAW,WAAW,WAAY;AACpD;AAAA,QACE,IAAI;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,GAAG,OAAO;AAEV,UAAMA,WAAU,WAAW;AAC3B,QAAIA,UAAS;AACX,iBAAW,aAAa,WAAW;AACnC,cAAQA,QAAO;AAAA,IACjB;AAEA,UAAM,QAAQ,WAAW,YAAY,MAAM;AACzC,YAAMA,WAAU,WAAW;AAC3B,UAAIA,UAAS;AACX,mBAAW,aAAa,WAAW;AACnC,mBAAW,cAAc,KAAK;AAC9B,gBAAQA,QAAO;AAAA,MACjB;AAAA,IACF,GAAG,GAAG;AAAA,EACR,CAAC;AAED,QAAM,QAAQ,UAAU;AAExB,SAAO;AACT;AA4BO,IAAM,qBAAqB;AAElC,IAAM,oBAAoB,MAAM;AAC9B,SAAO,WAAW,aAAa,QAAQ,kBAAkB;AAC3D;AAEA,IAAM,eAAe,YAAY;AAC/B,MAAI;AACF,UAAM,UAAU,MAAM,WAAW;AACjC,UAAM,YAAa,MAAM,QAAQ,IAAI,kBAAkB;AACvD,WAAO,aAAa,kBAAkB;AAAA,EACxC,SAAS,OAAO;AACd,YAAQ,KAAK,KAAK;AAClB,WAAO,kBAAkB;AAAA,EAC3B;AACF;AAEA,IAAM,eAAe,OAAO,UAAkB;AAC5C,aAAW,aAAa,QAAQ,oBAAoB,KAAK;AACzD,MAAI;AACF,UAAM,UAAU,MAAM,WAAW;AACjC,UAAM,QAAQ,IAAI,oBAAoB,KAAK;AAAA,EAC7C,SAAS,OAAO;AACd,YAAQ,KAAK,KAAK;AAAA,EACpB;AACF;AAEA,IAAM,iBAAiB,YAAY;AACjC,aAAW,aAAa,WAAW,kBAAkB;AACrD,MAAI;AACF,UAAM,UAAU,MAAM,WAAW;AACjC,UAAM,QAAQ,IAAI,kBAAkB;AAAA,EACtC,SAAS,OAAO;AACd,YAAQ,KAAK,KAAK;AAAA,EACpB;AACF;AAEO,IAAM,kBAAkB;AAAA,EAC7B,KAAK;AAAA,EACL,UAAU;AAAA,EACV,KAAK;AAAA,EACL,OAAO;AACT;;;AC9GA,iBAAiC;AAUjC,IAAM,gBAAY,mBAA4B,qBAAqB,GAAG;AAAA,EACpE,QAAQ,IAAI;AACV,OAAG,kBAAkB,aAAa;AAAA,EACpC;AACF,CAAC;AAED,IAAM,MAAM,OAAO,QAAgB;AACjC,UAAQ,MAAM,WAAW,IAAI,eAAe,GAAG;AACjD;AACA,IAAM,MAAM,OAAO,KAAa,QAAuB;AACrD,UAAQ,MAAM,WAAW,IAAI,eAAe,KAAK,GAAG;AACtD;AACA,IAAM,QAAQ,OAAO,QAAgB;AACnC,UAAQ,MAAM,WAAW,OAAO,eAAe,GAAG;AACpD;AAEO,IAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AACF;;;AC3BO,IAAM,YAAY,YAAY;AACnC,QAAM,oBAAoB,MAAM,MAAM;AACtC,QAAM,gBAAgB,MAAM;AAC9B;;;ACNA,IAAAC,wBAAwB;AAUjB,IAAM,kBAAkB,OAAO,UAAyB;AAC7D,SAAO,UAAM,+BAA0B,SAAqB,GAAG;AAAA,IAC7D,QAAQ;AAAA,IACR,MAAM,KAAK,UAAU,KAAK;AAAA,EAC5B,CAAC;AACH;;;ACVO,IAAM,cAAc,YAAY;AACrC,QAAM,OAAO,MAAM,oBAAoB,IAAI,MAAM;AACjD,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,UAAU,gBAAgB,KAAK,WAAW;AAChD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,MAAM,QAAQ,IAAI,MAAM,gBAAgB;AAAA,IAC9C,cAAc,KAAK,aAAa;AAAA,IAChC,QAAQ,QAAQ;AAAA,EAClB,CAAC;AAED,MAAI,SAAS;AACX,UAAM,YAAY,QAAQ;AAC1B,UAAM,gBAAgB,IAAI,SAAS;AACnC,UAAM,oBAAoB,IAAI,QAAQ,OAAO;AAC7C,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;AR0FI;AA3FJ,IAAM,4BAAwB;AAAA,EAC5B;AACF;AAEO,IAAM,4BAA4B,CAAC;AAAA,EACxC;AACF,MAEM;AAjCN;AAkCE,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAS,qBAAgB,SAAS,MAAzB,YAA8B,EAAE;AAEnE,QAAM,oBAAgB,sBAAQ,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;AAEpD,QAAM,mBAAe,0BAAY,YAAY;AAC3C,UAAM,YAAY,MAAM,gBAAgB,IAAI;AAC5C,QAAI,EAAE,cAAc,QAAQ,mBAAmB,SAAS,IAAI;AAC1D,WAAK,gBAAgB,MAAM;AAC3B,eAAS,EAAE;AAAA,IACb,OAAO;AACL,WAAK,gBAAgB,IAAI,SAAS;AAClC,eAAS,SAAS;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,8BAAU,MAAM;AAKd,SAAK,aAAa;AAAA,EACpB,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAMC,aAAQ,0BAAY,OAAO,UAAsB;AACrD,UAAM,EAAE,MAAM,MAAM,MAAM,IAAI,MAAM,aAAa,KAAK;AACtD,QAAI,MAAM;AACR,YAAM,YAAY,KAAK;AAEvB,eAAS,SAAS;AAClB,YAAM,gBAAgB,IAAI,SAAS;AACnC,YAAM,oBAAoB,IAAI,QAAQ,IAAI;AAAA,IAC5C;AACA,WAAO;AAAA,MACL;AAAA,MACA,OAAO,OAAO,KAAK,cAAc;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,CAAC,cAAc,eAAe,QAAI,uBAAS,IAAI;AAErD,8BAAU,MAAM;AACd,UAAM,WAAW,YAAY;AAC3B,YAAM,YAAY,MAAM,YAAY;AACpC,UAAI,cAAc,MAAM;AACtB,iBAAS,SAAS;AAAA,MACpB;AACA,sBAAgB,KAAK;AAAA,IACvB;AACA,SAAK,SAAS;AAEd,UAAM,QAAQ,YAAY,UAAU,IAAI,KAAK,KAAK,GAAI;AACtD,WAAO,MAAM,cAAc,KAAK;AAAA,EAClC,GAAG,CAAC,CAAC;AAEL,QAAM,aAAS,0BAAY,YAAY;AACrC,UAAM,UAAU;AAChB,WAAO,SAAS,OAAO;AAAA,EACzB,GAAG,CAAC,CAAC;AAEL,QAAM,kBAAc,0BAAY,OAAOC,WAAkB;AACvD,QAAI,mBAAmBA,MAAK,GAAG;AAC7B,aAAO;AAAA,QACL,OAAO,IAAI,MAAM,yBAAyB;AAAA,MAC5C;AAAA,IACF;AACA,UAAM,gBAAgB,IAAIA,MAAK;AAC/B,aAASA,MAAK;AACd,WAAO,EAAE,OAAO,OAAU;AAAA,EAC5B,GAAG,CAAC,CAAC;AAEL,QAAM,YAAQ,sBAAQ,MAAM;AAC1B,WAAO;AAAA,MACL,OAAAD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB,kBAAkB,SAAS,iBAAiB;AAAA,IAC/D;AAAA,EACF,GAAG,CAAC,eAAeA,QAAO,QAAQ,cAAc,OAAO,WAAW,CAAC;AACnE,SACE,4CAAC,sBAAsB,UAAtB,EAA+B,OAAO,OACpC,UACH;AAEJ;AAEO,IAAM,UAAU,MAAM;AAC3B,QAAM,UAAM,yBAAW,qBAAqB;AAC5C,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACvD;AACA,SAAO;AACT;","names":["storage","import_matsuri_hooks","login","token"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/storage/useM2mAuth.tsx"],"sourcesContent":["import React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { LoginInput, requestLogin } from \"./api/login\";\nimport { checkJwtExpiration } from \"./jwt\";\nimport { clearAuth } from \"./clearAuth\";\nimport { m2mAuthTokenApi } from \"./client\";\nimport { persistenceDatabase } from \"./persistenceDatabase\";\nimport { refreshAuth } from \"./refreshAuth\";\n\ninterface AuthenticationState {\n token: string;\n authenticated: boolean;\n login: (input: LoginInput) => Promise<{ token?: string; error?: Error }>;\n logout: () => void;\n updateToken: (token: string) => Promise<{ error?: Error }>;\n revalidating: boolean;\n isLoginRequired: boolean;\n}\n\nconst AuthenticationContext = createContext<AuthenticationState | undefined>(\n undefined,\n);\n\nexport const M2mAuthenticationProvider = ({\n children,\n}: {\n children: React.ReactNode;\n}) => {\n const [token, setToken] = useState(m2mAuthTokenApi.getCache() ?? \"\");\n\n const authenticated = useMemo(() => !!token, [token]);\n\n const tryCheckAuth = useCallback(async () => {\n const authToken = await m2mAuthTokenApi.get();\n if (!(authToken !== null && checkJwtExpiration(authToken))) {\n void m2mAuthTokenApi.clear();\n setToken(\"\");\n } else {\n void m2mAuthTokenApi.set(authToken);\n setToken(authToken);\n }\n }, []);\n\n useEffect(() => {\n void tryCheckAuth();\n }, [tryCheckAuth]);\n\n const login = useCallback(async (input: LoginInput) => {\n const { data: auth, error } = await requestLogin(input);\n if (auth) {\n const authToken = auth.accessToken;\n\n setToken(authToken);\n await m2mAuthTokenApi.set(authToken);\n await persistenceDatabase.set(\"auth\", auth);\n }\n return {\n error,\n token: auth ? auth.accessToken : undefined,\n };\n }, []);\n\n const [revalidating, setRevalidating] = useState(true);\n\n useEffect(() => {\n const callback = async () => {\n const authToken = await refreshAuth();\n if (authToken !== null) {\n setToken(authToken);\n }\n setRevalidating(false);\n };\n void callback();\n // Update auth every 3 hours\n const timer = setInterval(callback, 3 * 60 * 60 * 1000);\n return () => clearInterval(timer);\n }, []);\n\n const logout = useCallback(async () => {\n await clearAuth();\n window.location.reload();\n }, []);\n\n const updateToken = useCallback(async (token: string) => {\n if (checkJwtExpiration(token)) {\n return {\n error: new Error(\"M2MAuthToken is expired\"),\n };\n }\n await m2mAuthTokenApi.set(token);\n setToken(token);\n return { error: undefined };\n }, []);\n\n const state = useMemo(() => {\n return {\n login,\n logout,\n token,\n authenticated,\n updateToken,\n revalidating,\n isLoginRequired: authenticated === false && revalidating === false,\n } satisfies AuthenticationState;\n }, [authenticated, login, logout, revalidating, token, updateToken]);\n return (\n <AuthenticationContext.Provider value={state}>\n {children}\n </AuthenticationContext.Provider>\n );\n};\n\nexport const useAuth = () => {\n const ctx = useContext(AuthenticationContext);\n if (!ctx) {\n throw new Error(\"AuthenticationProvider is not found\");\n }\n return ctx;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;
|
|
1
|
+
{"version":3,"sources":["../../src/storage/useM2mAuth.tsx"],"sourcesContent":["import React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { LoginInput, requestLogin } from \"./api/login\";\nimport { checkJwtExpiration } from \"./jwt\";\nimport { clearAuth } from \"./clearAuth\";\nimport { m2mAuthTokenApi } from \"./client\";\nimport { persistenceDatabase } from \"./persistenceDatabase\";\nimport { refreshAuth } from \"./refreshAuth\";\n\ninterface AuthenticationState {\n token: string;\n authenticated: boolean;\n login: (input: LoginInput) => Promise<{ token?: string; error?: Error }>;\n logout: () => void;\n updateToken: (token: string) => Promise<{ error?: Error }>;\n revalidating: boolean;\n isLoginRequired: boolean;\n}\n\nconst AuthenticationContext = createContext<AuthenticationState | undefined>(\n undefined,\n);\n\nexport const M2mAuthenticationProvider = ({\n children,\n}: {\n children: React.ReactNode;\n}) => {\n const [token, setToken] = useState(m2mAuthTokenApi.getCache() ?? \"\");\n\n const authenticated = useMemo(() => !!token, [token]);\n\n const tryCheckAuth = useCallback(async () => {\n const authToken = await m2mAuthTokenApi.get();\n if (!(authToken !== null && checkJwtExpiration(authToken))) {\n void m2mAuthTokenApi.clear();\n setToken(\"\");\n } else {\n void m2mAuthTokenApi.set(authToken);\n setToken(authToken);\n }\n }, []);\n\n useEffect(() => {\n // tryCheckAuthは依存配列が空のuseCallbackで定義されているため、\n // 常に同じ関数参照を返し、このuseEffectは初回レンダリング後のみ実行される。\n // レンダリング後に一度認証状態を確認する意図的な動作のため、このルールを無効化。\n // eslint-disable-next-line react-hooks/set-state-in-effect\n void tryCheckAuth();\n }, [tryCheckAuth]);\n\n const login = useCallback(async (input: LoginInput) => {\n const { data: auth, error } = await requestLogin(input);\n if (auth) {\n const authToken = auth.accessToken;\n\n setToken(authToken);\n await m2mAuthTokenApi.set(authToken);\n await persistenceDatabase.set(\"auth\", auth);\n }\n return {\n error,\n token: auth ? auth.accessToken : undefined,\n };\n }, []);\n\n const [revalidating, setRevalidating] = useState(true);\n\n useEffect(() => {\n const callback = async () => {\n const authToken = await refreshAuth();\n if (authToken !== null) {\n setToken(authToken);\n }\n setRevalidating(false);\n };\n void callback();\n // Update auth every 3 hours\n const timer = setInterval(callback, 3 * 60 * 60 * 1000);\n return () => clearInterval(timer);\n }, []);\n\n const logout = useCallback(async () => {\n await clearAuth();\n window.location.reload();\n }, []);\n\n const updateToken = useCallback(async (token: string) => {\n if (checkJwtExpiration(token)) {\n return {\n error: new Error(\"M2MAuthToken is expired\"),\n };\n }\n await m2mAuthTokenApi.set(token);\n setToken(token);\n return { error: undefined };\n }, []);\n\n const state = useMemo(() => {\n return {\n login,\n logout,\n token,\n authenticated,\n updateToken,\n revalidating,\n isLoginRequired: authenticated === false && revalidating === false,\n } satisfies AuthenticationState;\n }, [authenticated, login, logout, revalidating, token, updateToken]);\n return (\n <AuthenticationContext.Provider value={state}>\n {children}\n </AuthenticationContext.Provider>\n );\n};\n\nexport const useAuth = () => {\n const ctx = useContext(AuthenticationContext);\n if (!ctx) {\n throw new Error(\"AuthenticationProvider is not found\");\n }\n return ctx;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AA6GH;AA3FJ,IAAM,wBAAwB;AAAA,EAC5B;AACF;AAEO,IAAM,4BAA4B,CAAC;AAAA,EACxC;AACF,MAEM;AAjCN;AAkCE,QAAM,CAAC,OAAO,QAAQ,IAAI,UAAS,qBAAgB,SAAS,MAAzB,YAA8B,EAAE;AAEnE,QAAM,gBAAgB,QAAQ,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;AAEpD,QAAM,eAAe,YAAY,YAAY;AAC3C,UAAM,YAAY,MAAM,gBAAgB,IAAI;AAC5C,QAAI,EAAE,cAAc,QAAQ,mBAAmB,SAAS,IAAI;AAC1D,WAAK,gBAAgB,MAAM;AAC3B,eAAS,EAAE;AAAA,IACb,OAAO;AACL,WAAK,gBAAgB,IAAI,SAAS;AAClC,eAAS,SAAS;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AAKd,SAAK,aAAa;AAAA,EACpB,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,QAAQ,YAAY,OAAO,UAAsB;AACrD,UAAM,EAAE,MAAM,MAAM,MAAM,IAAI,MAAM,aAAa,KAAK;AACtD,QAAI,MAAM;AACR,YAAM,YAAY,KAAK;AAEvB,eAAS,SAAS;AAClB,YAAM,gBAAgB,IAAI,SAAS;AACnC,YAAM,oBAAoB,IAAI,QAAQ,IAAI;AAAA,IAC5C;AACA,WAAO;AAAA,MACL;AAAA,MACA,OAAO,OAAO,KAAK,cAAc;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,IAAI;AAErD,YAAU,MAAM;AACd,UAAM,WAAW,YAAY;AAC3B,YAAM,YAAY,MAAM,YAAY;AACpC,UAAI,cAAc,MAAM;AACtB,iBAAS,SAAS;AAAA,MACpB;AACA,sBAAgB,KAAK;AAAA,IACvB;AACA,SAAK,SAAS;AAEd,UAAM,QAAQ,YAAY,UAAU,IAAI,KAAK,KAAK,GAAI;AACtD,WAAO,MAAM,cAAc,KAAK;AAAA,EAClC,GAAG,CAAC,CAAC;AAEL,QAAM,SAAS,YAAY,YAAY;AACrC,UAAM,UAAU;AAChB,WAAO,SAAS,OAAO;AAAA,EACzB,GAAG,CAAC,CAAC;AAEL,QAAM,cAAc,YAAY,OAAOA,WAAkB;AACvD,QAAI,mBAAmBA,MAAK,GAAG;AAC7B,aAAO;AAAA,QACL,OAAO,IAAI,MAAM,yBAAyB;AAAA,MAC5C;AAAA,IACF;AACA,UAAM,gBAAgB,IAAIA,MAAK;AAC/B,aAASA,MAAK;AACd,WAAO,EAAE,OAAO,OAAU;AAAA,EAC5B,GAAG,CAAC,CAAC;AAEL,QAAM,QAAQ,QAAQ,MAAM;AAC1B,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB,kBAAkB,SAAS,iBAAiB;AAAA,IAC/D;AAAA,EACF,GAAG,CAAC,eAAe,OAAO,QAAQ,cAAc,OAAO,WAAW,CAAC;AACnE,SACE,oBAAC,sBAAsB,UAAtB,EAA+B,OAAO,OACpC,UACH;AAEJ;AAEO,IAAM,UAAU,MAAM;AAC3B,QAAM,MAAM,WAAW,qBAAqB;AAC5C,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACvD;AACA,SAAO;AACT;","names":["token"]}
|