@customafk/lunas-api-sdk 0.0.8 → 0.0.10
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/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +41 -20
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +41 -20
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
let e=require(`@elysiajs/eden`);var t=class t{static{this._getMeTask=null}static{this._refreshTokenTask=null}static{this._logoutTask=null}static{this.
|
|
1
|
+
let e=require(`@elysiajs/eden`);var t=class t{static{this._getMeTask=null}static{this._refreshTokenTask=null}static{this._logoutTask=null}static{this.user=null}static{this.listeners=null}static async _getUser(){if(t.user||!t._client)return;if(t._getMeTask){await t._getMeTask;return}let e=t._client.admin.v1.auth.me.get();t._getMeTask=e;try{let n=await e;n.data&&n.data.data&&n.data.success?t.user=n.data.data:(t.user=null,console.error(`Failed to fetch user data:`,JSON.stringify(n.data)))}catch(e){console.error(`Error fetching user data:`,JSON.stringify(e)),t.user=null}finally{t._getMeTask=null}}static async _refreshToken(){return t._client?t._refreshTokenTask?await t._refreshTokenTask:(t._refreshTokenTask=(async()=>{try{let e=await t._client?.admin.v1.auth[`refresh-token`].get();return e?.data&&e.data.success&&e.data.statusCode===200?{status:`SUCCESS`}:{status:`FAILED`}}catch(e){return console.error(`Error refreshing token:`,JSON.stringify(e)),{status:`FAILED`}}})(),t._refreshTokenTask.finally(()=>{t._refreshTokenTask=null})):{status:`FAILED`}}static async _logout(){if(t._client)try{if(t._logoutTask){await t._logoutTask;return}let e=t._client.admin.v1.auth.logout.delete();t._logoutTask=e,await e}catch(e){console.error(`Error during logout:`,e)}finally{t.user=null,t._logoutTask=null,t.listeners?.onUserChange?.(null),t.listeners?.onLogout?.()}}constructor({baseURL:n,config:r}){t._client||=(0,e.treaty)(n,r),this._onUnauthorized=async()=>{t.user=null,await t.listeners?.onUserChange?.(null),await t.listeners?.onUnauthorized?.()}}async getUser(){return await t._getUser(),await t.listeners?.onGetMe?.(t.user),t.user??null}getClient(){return t._client}async logout(){await t._client?.admin.v1.auth.logout.delete(),await t.listeners?.onLogout?.()}async fetchApi({request:e}){if(!t._client)throw Error(`Client not initialized`);try{t._getMeTask&&(console.log(`Awaiting ongoing _getMeTask before proceeding with fetchApi`),await t._getMeTask),t._refreshTokenTask&&(console.log(`Awaiting ongoing _refreshTokenTask before proceeding with fetchApi`),await t._refreshTokenTask),t._logoutTask&&(console.log(`Awaiting ongoing _logoutTask before proceeding with fetchApi`),await t._logoutTask);let n=await e(t._client);if(!n.data)return console.error(`No response data received from API request`),null;let r=n.data;if(r?.statusCode===401)return await this._onUnauthorized?.(),await t.listeners?.onUnauthorized?.(),null;if(r?.statusCode===4001){let{status:n}=await t._refreshToken();if(await t.listeners?.onRefreshToken?.(n),n===`SUCCESS`)return await e(t._client);if(n===`FAILED`)return await t._logout(),await t.listeners?.onLogout?.(),null}return n}catch(e){return console.error(`Error in fetchApi:`,JSON.stringify(e)),{success:!1,statusCode:500,data:null,message:`Internal Client Error`,error:{statusCode:500,message:`Internal Client Error`},meta:{version:`1.0.0`,timestamp:new Date().toISOString(),path:``}}}}};exports.ClientApi=t;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../src/utils.ts"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noExplicitAny: true */\nimport type { Treaty } from '@elysiajs/eden';\nimport { treaty } from '@elysiajs/eden';\nimport type { AppType, TResponse } from 'app/src/types.d';\n\ntype Status =\n | 'INITIAL'\n | 'LOGGING'\n | 'LOGGED'\n | 'REFRESHING_TOKEN'\n | 'LOGGING_OUT'\n | 'LOGOUT';\n\ntype RefreshStatus = 'SUCCESS' | 'FAILED';\n\n// Trick to extract Treaty Client type\nclass _Client {\n public static client: Treaty.Create<AppType>;\n public getClient() {\n return null;\n }\n}\n\n// Extract the client type\nconst _func = () => _Client.client;\ntype TClient = ReturnType<typeof _func>;\n\nexport type TUser = Treaty.Data<\n Awaited<ReturnType<TClient['admin']['v1']['auth']['me']['get']>>\n>['data'];\n\ntype Config = {\n baseURL: string;\n config?: Omit<Treaty.Config, 'onResponse'>;\n listeners?: {\n onSetUser?: (user: TUser | null) => void | Promise<void>;\n onUnauthorized?: () => void | Promise<void>;\n onLogout?: () => void | Promise<void>;\n onRefreshToken?: (status: 'SUCCESS' | 'FAILED') => void | Promise<void>;\n onRefreshFailed?: () => void | Promise<void>;\n };\n};\n\nexport class ClientApi {\n // Keep track of the ongoing \"me\" request to prevent multiple simultaneous calls\n private static _client: TClient | undefined;\n private static _getMeTask: Promise<any> | null = null;\n private static _refreshTokenTask: Promise<{ status: RefreshStatus }> | null =\n null;\n private static _logoutTask: Promise<any> | null = null;\n\n public static client: Treaty.Create<AppType>;\n public static status: Status = 'INITIAL';\n public static user: TUser = null;\n\n public static async getMe() {\n // If already logged in, no need to fetch again\n if (['LOGGED', 'REFRESHING_TOKEN'].includes(ClientApi.status)) return;\n\n // Ensure client is initialized\n if (!ClientApi._client) return;\n\n // If there's an ongoing \"me\" request, await its completion\n if (ClientApi._getMeTask) {\n await ClientApi._getMeTask;\n return;\n }\n\n const getMe = ClientApi._client.admin.v1.auth.me.get();\n // Store the ongoing task, so other can know about it and await it if needed\n ClientApi._getMeTask = getMe;\n try {\n ClientApi.status = 'LOGGING';\n const res = await getMe;\n if (!!res.data && !!res.data.data && res.data.success) {\n ClientApi.status = 'LOGGED';\n ClientApi.user = res.data.data;\n } else {\n ClientApi.status = 'INITIAL';\n ClientApi.user = null;\n }\n } catch (error) {\n console.error('Error fetching user data:', JSON.stringify(error));\n ClientApi.status = 'INITIAL';\n ClientApi.user = null;\n } finally {\n ClientApi._getMeTask = null;\n }\n }\n\n private static async _refreshToken() {\n // Ensure client is initialized\n if (!ClientApi._client) {\n console.error('Client not initialized');\n return { status: 'FAILED' as const };\n }\n\n // If there's an ongoing \"refresh token\" request, await its completion\n if (ClientApi._refreshTokenTask) {\n const res = await ClientApi._refreshTokenTask;\n return res;\n }\n\n const handler = async (): Promise<{ status: RefreshStatus }> => {\n try {\n ClientApi.status = 'REFRESHING_TOKEN';\n const res =\n await ClientApi._client?.admin.v1.auth['refresh-token'].get();\n if (!!res?.data && !!res.data.success && res.data.statusCode === 200) {\n return { status: 'SUCCESS' };\n }\n return { status: 'FAILED' };\n } catch (error) {\n console.error('Error refreshing token:', JSON.stringify(error));\n return { status: 'FAILED' };\n }\n };\n // Store the ongoing task, so other can know about it and await it if needed\n ClientApi._refreshTokenTask = handler();\n return ClientApi._refreshTokenTask.finally(() => {\n ClientApi._refreshTokenTask = null;\n });\n }\n\n private static async _logout() {\n // Ensure client is initialized\n if (!ClientApi._client) {\n console.error('Client not initialized');\n return;\n }\n\n // If there's an ongoing \"logout\" request, await its completion\n if (ClientApi._logoutTask) {\n await ClientApi._logoutTask;\n return;\n }\n\n const logout = ClientApi._client.admin.v1.auth.logout.delete();\n // Store the ongoing task, so other can know about it\n // and await it if needed\n ClientApi._logoutTask = logout;\n try {\n ClientApi.status = 'LOGGING_OUT';\n await logout;\n ClientApi.status = 'LOGGED';\n } catch (error) {\n ClientApi.status = 'LOGGED';\n console.error('Error during logout:', error);\n } finally {\n ClientApi.user = null;\n ClientApi._logoutTask = null;\n }\n }\n\n constructor({ baseURL, config, listeners }: Config) {\n // Initialize Treaty Client\n if (!ClientApi._client) {\n ClientApi._client = treaty<AppType>(baseURL, config);\n }\n\n this._onSetUser = async (user: TUser) => {\n await listeners?.onSetUser?.(user);\n ClientApi.status = user ? 'LOGGED' : 'INITIAL';\n ClientApi.user = user;\n };\n\n this._onUnauthorized = async () => {\n this._onSetUser?.(null);\n await listeners?.onUnauthorized?.();\n };\n\n this._onLogout = async () => {\n await listeners?.onLogout?.();\n };\n }\n\n public isLogged() {\n return ['LOGGED', 'REFRESHING_TOKEN'].includes(ClientApi.status);\n }\n\n public isInitial() {\n return ClientApi.status === 'INITIAL';\n }\n\n public getUser() {\n return ClientApi.user ?? null;\n }\n\n public getClient(): TClient | undefined {\n return ClientApi._client;\n }\n\n public async getMeAPI() {\n await ClientApi.getMe();\n }\n\n public async logout() {\n ClientApi.status = 'LOGGING_OUT';\n await ClientApi._client?.admin.v1.auth.logout.delete();\n await this._onLogout?.();\n await this._onSetUser?.(null);\n ClientApi.status = 'INITIAL';\n }\n\n public async fetchApi<TData>({\n request,\n }: {\n request: (api: TClient) => Promise<TData>;\n }) {\n // Ensure client is initialized\n if (!ClientApi._client) {\n throw new Error('Client not initialized');\n }\n\n try {\n // Await ongoing \"me\" request to ensure user state is up-to-date\n if (ClientApi._getMeTask) {\n console.log(\n 'Awaiting ongoing _getMeTask before proceeding with fetchApi'\n );\n await ClientApi._getMeTask;\n }\n\n // Await ongoing \"refresh token\" request to ensure token state is up-to-date\n if (ClientApi._refreshTokenTask) {\n console.log(\n 'Awaiting ongoing _refreshTokenTask before proceeding with fetchApi'\n );\n await ClientApi._refreshTokenTask;\n }\n\n // Await ongoing \"logout\" request to ensure user is logged out properly\n if (ClientApi._logoutTask) {\n console.log(\n 'Awaiting ongoing _logoutTask before proceeding with fetchApi'\n );\n await ClientApi._logoutTask;\n }\n\n const response = (await request(\n ClientApi._client\n )) as Treaty.TreatyResponse<Record<number, TResponse<any>>>;\n\n // Check if response data exists\n if (!response.data) {\n console.error('No response data received from API request');\n return null;\n }\n\n // Check for status codes in the response data\n const _data = response.data;\n\n // CASE: User is Unauthorized\n if (_data?.statusCode === 401) {\n await this._onUnauthorized?.();\n return null;\n }\n\n // CASE: TOKEN EXPIRED - Re-fetch user data\n if (_data?.statusCode === 4001) {\n const { status } = await ClientApi._refreshToken();\n if (status === 'SUCCESS') {\n ClientApi.status = 'LOGGED';\n const response = (await request(\n ClientApi._client\n )) as Treaty.TreatyResponse<Record<number, TResponse<any>>>;\n return response as TData;\n }\n if (status === 'FAILED') {\n await ClientApi._logout();\n this._onLogout?.();\n return null;\n }\n }\n\n return response as TData;\n } catch (error) {\n console.error('Error in fetchApi:', JSON.stringify(error));\n return {\n success: false,\n statusCode: 500,\n data: null,\n message: 'Internal Client Error',\n error: {\n statusCode: 500,\n message: 'Internal Client Error',\n },\n meta: {\n version: '1.0.0',\n timestamp: new Date().toISOString(),\n path: '',\n },\n };\n }\n }\n\n private _onSetUser?: (user: TUser | null) => void | Promise<void>;\n private _onUnauthorized?: () => void | Promise<void>;\n private _onLogout?: () => void | Promise<void>;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../src/utils.ts"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noExplicitAny: true */\nimport type { Treaty } from '@elysiajs/eden';\nimport { treaty } from '@elysiajs/eden';\nimport type { AppType, TResponse } from 'app/src/types.d';\n\ntype RefreshStatus = 'SUCCESS' | 'FAILED';\n\n// Trick to extract Treaty Client type\nclass _Client {\n public static client: Treaty.Create<AppType>;\n public getClient() {\n return null;\n }\n}\n\n// Extract the client type\nconst _func = () => _Client.client;\ntype TClient = ReturnType<typeof _func>;\n\nexport type TUser = Treaty.Data<\n Awaited<ReturnType<TClient['admin']['v1']['auth']['me']['get']>>\n>['data'];\n\ntype Config = {\n baseURL: string;\n config?: Omit<Treaty.Config, 'onResponse'>;\n};\n\nexport class ClientApi {\n // Keep track of the ongoing \"me\" request to prevent multiple simultaneous calls\n private static _client: TClient | undefined;\n private static _getMeTask: Promise<any> | null = null;\n private static _refreshTokenTask: Promise<{ status: RefreshStatus }> | null =\n null;\n private static _logoutTask: Promise<any> | null = null;\n\n public static client: Treaty.Create<AppType>;\n public static user: TUser = null;\n\n public static listeners: {\n onUserChange?: (user: TUser | null) => void | Promise<void>;\n onGetMe?: (user: TUser | null) => void | Promise<void>;\n onLogout?: () => void | Promise<void>;\n onUnauthorized?: () => void | Promise<void>;\n onRefreshToken?: (status: 'SUCCESS' | 'FAILED') => void | Promise<void>;\n } | null = null;\n\n private static async _getUser() {\n // If already logged in, no need to fetch again\n if (ClientApi.user) return;\n\n // Ensure client is initialized\n if (!ClientApi._client) return;\n\n // If there's an ongoing \"me\" request, await its completion\n if (ClientApi._getMeTask) {\n await ClientApi._getMeTask;\n return;\n }\n\n const getMe = ClientApi._client.admin.v1.auth.me.get();\n // Store the ongoing task, so other can know about it and await it if needed\n ClientApi._getMeTask = getMe;\n try {\n const res = await getMe;\n if (!!res.data && !!res.data.data && res.data.success) {\n ClientApi.user = res.data.data;\n } else {\n ClientApi.user = null;\n console.error('Failed to fetch user data:', JSON.stringify(res.data));\n }\n } catch (error) {\n console.error('Error fetching user data:', JSON.stringify(error));\n ClientApi.user = null;\n } finally {\n ClientApi._getMeTask = null;\n }\n }\n\n private static async _refreshToken() {\n // Ensure client is initialized\n if (!ClientApi._client) return { status: 'FAILED' as const };\n\n // If there's an ongoing \"refresh token\" request, await its completion\n if (ClientApi._refreshTokenTask) {\n const res = await ClientApi._refreshTokenTask;\n return res;\n }\n\n const handler = async (): Promise<{ status: RefreshStatus }> => {\n try {\n const res =\n await ClientApi._client?.admin.v1.auth['refresh-token'].get();\n if (!!res?.data && !!res.data.success && res.data.statusCode === 200) {\n return { status: 'SUCCESS' };\n }\n return { status: 'FAILED' };\n } catch (error) {\n console.error('Error refreshing token:', JSON.stringify(error));\n return { status: 'FAILED' };\n }\n };\n // Store the ongoing task, so other can know about it and await it if needed\n ClientApi._refreshTokenTask = handler();\n return ClientApi._refreshTokenTask.finally(() => {\n ClientApi._refreshTokenTask = null;\n });\n }\n\n private static async _logout() {\n // Ensure client is initialized\n if (!ClientApi._client) return;\n try {\n // If there's an ongoing \"logout\" request, await its completion\n if (ClientApi._logoutTask) {\n await ClientApi._logoutTask;\n return;\n }\n\n const logout = ClientApi._client.admin.v1.auth.logout.delete();\n // Store the ongoing task, so other can know about it and await it if needed\n ClientApi._logoutTask = logout;\n await logout;\n } catch (error) {\n console.error('Error during logout:', error);\n } finally {\n ClientApi.user = null;\n ClientApi._logoutTask = null;\n ClientApi.listeners?.onUserChange?.(null);\n ClientApi.listeners?.onLogout?.();\n }\n }\n\n constructor({ baseURL, config }: Config) {\n // Initialize Treaty Client\n if (!ClientApi._client) {\n ClientApi._client = treaty<AppType>(baseURL, config);\n }\n\n this._onUnauthorized = async () => {\n ClientApi.user = null;\n await ClientApi.listeners?.onUserChange?.(null);\n await ClientApi.listeners?.onUnauthorized?.();\n };\n }\n\n public async getUser() {\n await ClientApi._getUser();\n await ClientApi.listeners?.onGetMe?.(ClientApi.user);\n return ClientApi.user ?? null;\n }\n\n public getClient(): TClient | undefined {\n return ClientApi._client;\n }\n\n public async logout() {\n await ClientApi._client?.admin.v1.auth.logout.delete();\n await ClientApi.listeners?.onLogout?.();\n }\n\n public async fetchApi<TData>({\n request,\n }: {\n request: (api: TClient) => Promise<TData>;\n }) {\n // Ensure client is initialized\n if (!ClientApi._client) {\n throw new Error('Client not initialized');\n }\n\n try {\n // Await ongoing \"me\" request to ensure user state is up-to-date\n if (ClientApi._getMeTask) {\n console.log(\n 'Awaiting ongoing _getMeTask before proceeding with fetchApi'\n );\n await ClientApi._getMeTask;\n }\n\n // Await ongoing \"refresh token\" request to ensure token state is up-to-date\n if (ClientApi._refreshTokenTask) {\n console.log(\n 'Awaiting ongoing _refreshTokenTask before proceeding with fetchApi'\n );\n await ClientApi._refreshTokenTask;\n }\n\n // Await ongoing \"logout\" request to ensure user is logged out properly\n if (ClientApi._logoutTask) {\n console.log(\n 'Awaiting ongoing _logoutTask before proceeding with fetchApi'\n );\n await ClientApi._logoutTask;\n }\n\n const response = (await request(\n ClientApi._client\n )) as Treaty.TreatyResponse<Record<number, TResponse<any>>>;\n\n // Check if response data exists\n if (!response.data) {\n console.error('No response data received from API request');\n return null;\n }\n\n // Check for status codes in the response data\n const _data = response.data;\n\n // CASE: User is Unauthorized\n if (_data?.statusCode === 401) {\n await this._onUnauthorized?.();\n await ClientApi.listeners?.onUnauthorized?.();\n return null;\n }\n\n // CASE: TOKEN EXPIRED - Re-fetch user data\n if (_data?.statusCode === 4001) {\n const { status } = await ClientApi._refreshToken();\n await ClientApi.listeners?.onRefreshToken?.(status);\n if (status === 'SUCCESS') {\n const response = (await request(\n ClientApi._client\n )) as Treaty.TreatyResponse<Record<number, TResponse<any>>>;\n return response as TData;\n }\n if (status === 'FAILED') {\n await ClientApi._logout();\n await ClientApi.listeners?.onLogout?.();\n return null;\n }\n }\n\n return response as TData;\n } catch (error) {\n console.error('Error in fetchApi:', JSON.stringify(error));\n return {\n success: false,\n statusCode: 500,\n data: null,\n message: 'Internal Client Error',\n error: {\n statusCode: 500,\n message: 'Internal Client Error',\n },\n meta: {\n version: '1.0.0',\n timestamp: new Date().toISOString(),\n path: '',\n },\n };\n }\n }\n\n private _onUnauthorized?: () => void | Promise<void>;\n}\n"],"mappings":"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"}
|
package/dist/index.d.cts
CHANGED
|
@@ -50,10 +50,38 @@ type TResponseMeta = {
|
|
|
50
50
|
path: string;
|
|
51
51
|
pagination?: TResponsePagination;
|
|
52
52
|
};
|
|
53
|
+
type TResponse<T> = T extends string ? {
|
|
54
|
+
success: true;
|
|
55
|
+
statusCode: number;
|
|
56
|
+
data: null;
|
|
57
|
+
message: string;
|
|
58
|
+
error: null;
|
|
59
|
+
meta: TResponseMeta;
|
|
60
|
+
} | {
|
|
61
|
+
success: false;
|
|
62
|
+
statusCode: number;
|
|
63
|
+
data: null;
|
|
64
|
+
message: string;
|
|
65
|
+
error: TResponseError;
|
|
66
|
+
meta: TResponseMeta;
|
|
67
|
+
} : {
|
|
68
|
+
success: true;
|
|
69
|
+
statusCode: number;
|
|
70
|
+
data: T;
|
|
71
|
+
message: null;
|
|
72
|
+
error: null;
|
|
73
|
+
meta: TResponseMeta;
|
|
74
|
+
} | {
|
|
75
|
+
success: false;
|
|
76
|
+
statusCode: number;
|
|
77
|
+
data: null;
|
|
78
|
+
message: string;
|
|
79
|
+
error: TResponseError;
|
|
80
|
+
meta: TResponseMeta;
|
|
81
|
+
};
|
|
53
82
|
type AppType = typeof app;
|
|
54
83
|
//#endregion
|
|
55
84
|
//#region src/utils.d.ts
|
|
56
|
-
type Status = 'INITIAL' | 'LOGGING' | 'LOGGED' | 'REFRESHING_TOKEN' | 'LOGGING_OUT' | 'LOGOUT';
|
|
57
85
|
declare const _func: () => {
|
|
58
86
|
admin: {
|
|
59
87
|
v1: {
|
|
@@ -2104,13 +2132,6 @@ type TUser = Treaty.Data<Awaited<ReturnType<TClient['admin']['v1']['auth']['me']
|
|
|
2104
2132
|
type Config = {
|
|
2105
2133
|
baseURL: string;
|
|
2106
2134
|
config?: Omit<Treaty.Config, 'onResponse'>;
|
|
2107
|
-
listeners?: {
|
|
2108
|
-
onSetUser?: (user: TUser | null) => void | Promise<void>;
|
|
2109
|
-
onUnauthorized?: () => void | Promise<void>;
|
|
2110
|
-
onLogout?: () => void | Promise<void>;
|
|
2111
|
-
onRefreshToken?: (status: 'SUCCESS' | 'FAILED') => void | Promise<void>;
|
|
2112
|
-
onRefreshFailed?: () => void | Promise<void>;
|
|
2113
|
-
};
|
|
2114
2135
|
};
|
|
2115
2136
|
declare class ClientApi {
|
|
2116
2137
|
private static _client;
|
|
@@ -2118,19 +2139,22 @@ declare class ClientApi {
|
|
|
2118
2139
|
private static _refreshTokenTask;
|
|
2119
2140
|
private static _logoutTask;
|
|
2120
2141
|
static client: Treaty.Create<AppType>;
|
|
2121
|
-
static status: Status;
|
|
2122
2142
|
static user: TUser;
|
|
2123
|
-
static
|
|
2143
|
+
static listeners: {
|
|
2144
|
+
onUserChange?: (user: TUser | null) => void | Promise<void>;
|
|
2145
|
+
onGetMe?: (user: TUser | null) => void | Promise<void>;
|
|
2146
|
+
onLogout?: () => void | Promise<void>;
|
|
2147
|
+
onUnauthorized?: () => void | Promise<void>;
|
|
2148
|
+
onRefreshToken?: (status: 'SUCCESS' | 'FAILED') => void | Promise<void>;
|
|
2149
|
+
} | null;
|
|
2150
|
+
private static _getUser;
|
|
2124
2151
|
private static _refreshToken;
|
|
2125
2152
|
private static _logout;
|
|
2126
2153
|
constructor({
|
|
2127
2154
|
baseURL,
|
|
2128
|
-
config
|
|
2129
|
-
listeners
|
|
2155
|
+
config
|
|
2130
2156
|
}: Config);
|
|
2131
|
-
|
|
2132
|
-
isInitial(): boolean;
|
|
2133
|
-
getUser(): {
|
|
2157
|
+
getUser(): Promise<{
|
|
2134
2158
|
uuid: string | null;
|
|
2135
2159
|
email: string;
|
|
2136
2160
|
createdAt: Date | null;
|
|
@@ -2180,9 +2204,8 @@ declare class ClientApi {
|
|
|
2180
2204
|
provinceId: string | null;
|
|
2181
2205
|
};
|
|
2182
2206
|
}[];
|
|
2183
|
-
} | null
|
|
2207
|
+
} | null>;
|
|
2184
2208
|
getClient(): TClient | undefined;
|
|
2185
|
-
getMeAPI(): Promise<void>;
|
|
2186
2209
|
logout(): Promise<void>;
|
|
2187
2210
|
fetchApi<TData>({
|
|
2188
2211
|
request
|
|
@@ -2203,10 +2226,8 @@ declare class ClientApi {
|
|
|
2203
2226
|
path: string;
|
|
2204
2227
|
};
|
|
2205
2228
|
} | null>;
|
|
2206
|
-
private _onSetUser?;
|
|
2207
2229
|
private _onUnauthorized?;
|
|
2208
|
-
private _onLogout?;
|
|
2209
2230
|
}
|
|
2210
2231
|
//#endregion
|
|
2211
|
-
export { ClientApi, type TUser };
|
|
2232
|
+
export { ClientApi, type TResponse, type TUser };
|
|
2212
2233
|
//# sourceMappingURL=index.d.cts.map
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":["app","EMediaEntityType","EMimeType","EWeightUnit","EDimensionUnit","ECountry","ERole","EProvider","EProductStatus","EProductInventoryStatus","ECartStatus","ECartType","TResponsePagination","TResponseError","TResponseMeta","TResponse","T","TPayloadJwt","AppType"],"sources":["../../app/src/types.d.ts","../src/utils.ts"],"sourcesContent":["import type { app } from '.';\n\nexport enum EMediaEntityType {\n PRODUCT = 'product',\n EXTRA_PRODUCT = 'extra_product',\n VARIANT = 'variant',\n CATEGORY = 'category',\n BRAND = 'brand',\n BLOG_POST = 'blog_post',\n SERIES = 'series',\n}\n\nexport enum EMimeType {\n IMAGE_WEBP = 'image/webp',\n IMAGE_JPEG = 'image/jpeg',\n IMAGE_JPG = 'image/jpg',\n IMAGE_PNG = 'image/png',\n IMAGE_GIF = 'image/gif',\n IMAGE_AVIF = 'image/avif',\n IMAGE_SVG = 'image/svg+xml',\n}\n\nexport enum EWeightUnit {\n KG = 'kg',\n G = 'g',\n LB = 'lb',\n OZ = 'oz',\n}\n\nexport enum EDimensionUnit {\n CM = 'cm',\n M = 'm',\n INCH = 'inch',\n FT = 'ft',\n}\n\nexport enum ECountry {\n VIETNAM = 'Vietnam',\n USA = 'USA',\n JAPAN = 'Japan',\n KOREA = 'Korea',\n CHINA = 'China',\n TAIWAN = 'Taiwan',\n THAILAND = 'Thailand',\n MALAYSIA = 'Malaysia',\n SINGAPORE = 'Singapore',\n INDONESIA = 'Indonesia',\n}\n\nexport enum ERole {\n SUPER_ADMIN = 'SUPER_ADMIN',\n ADMIN = 'ADMIN',\n MODERATOR = 'MODERATOR',\n STAFF = 'STAFF',\n EDITOR = 'EDITOR',\n VIEWER = 'VIEWER',\n USER = 'USER',\n}\n\nexport enum EProvider {\n BASIC = 'BASIC',\n FACEBOOK = 'FACEBOOK',\n GOOGLE = 'GOOGLE',\n GITHUB = 'GITHUB',\n TWITTER = 'TWITTER',\n}\n\nexport enum EProductStatus {\n DRAFT = 'draft',\n REVIEW = 'review',\n ACTIVE = 'active',\n INACTIVE = 'inactive',\n CANCELLED = 'cancelled',\n}\n\nexport enum EProductInventoryStatus {\n IN_STOCK = 'in_stock',\n OUT_OF_STOCK = 'out_of_stock',\n PREORDER = 'preorder',\n}\n\nexport enum ECartStatus {\n ACTIVE = 'active',\n COMPLETED = 'completed',\n ABANDONED = 'abandoned',\n EXPIRED = 'expired',\n}\n\nexport enum ECartType {\n IN_STOCK = 'in_stock',\n ORDER = 'order',\n}\n\nexport type TResponsePagination = {\n page: number;\n limit: number;\n total: number;\n totalPages: number;\n hasNextPage: boolean;\n hasPreviousPage: boolean;\n};\n\nexport type TResponseError = {\n statusCode: number;\n message: string;\n reference?: string | null;\n fields?: {\n [key: string]: string[] | string;\n };\n};\n\nexport type TResponseMeta = {\n version: string;\n timestamp: string;\n path: string;\n pagination?: TResponsePagination;\n};\n\nexport type TResponse<T> = T extends string\n ?\n | {\n success: true;\n statusCode: number;\n data: null;\n message: string;\n error: null;\n meta: TResponseMeta;\n }\n | {\n success: false;\n statusCode: number;\n data: null;\n message: string;\n error: TResponseError;\n meta: TResponseMeta;\n }\n :\n | {\n success: true;\n statusCode: number;\n data: T;\n message: null;\n error: null;\n meta: TResponseMeta;\n }\n | {\n success: false;\n statusCode: number;\n data: null;\n message: string;\n error: TResponseError;\n meta: TResponseMeta;\n };\n\nexport type TPayloadJwt = {\n uuid: string;\n role: string;\n};\n\nexport type AppType = typeof app;\n"],"mappings":";;;aAEYC,gBAAAA;EAAZ,OAAYA,GAAAA,SAAAA;EAUZ,aAAYC,GAAS,eAAA;EAqCrB,OAAYI,GAAK,SAAA;EA4CjB,QAAYM,GAAAA,UAAAA;EASZ,KAAYC,GAAAA,OAAAA;EASZ,SAAYC,GAAAA,WAAa;
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":["app","EMediaEntityType","EMimeType","EWeightUnit","EDimensionUnit","ECountry","ERole","EProvider","EProductStatus","EProductInventoryStatus","ECartStatus","ECartType","TResponsePagination","TResponseError","TResponseMeta","TResponse","T","TPayloadJwt","AppType"],"sources":["../../app/src/types.d.ts","../src/utils.ts"],"sourcesContent":["import type { app } from '.';\n\nexport enum EMediaEntityType {\n PRODUCT = 'product',\n EXTRA_PRODUCT = 'extra_product',\n VARIANT = 'variant',\n CATEGORY = 'category',\n BRAND = 'brand',\n BLOG_POST = 'blog_post',\n SERIES = 'series',\n}\n\nexport enum EMimeType {\n IMAGE_WEBP = 'image/webp',\n IMAGE_JPEG = 'image/jpeg',\n IMAGE_JPG = 'image/jpg',\n IMAGE_PNG = 'image/png',\n IMAGE_GIF = 'image/gif',\n IMAGE_AVIF = 'image/avif',\n IMAGE_SVG = 'image/svg+xml',\n}\n\nexport enum EWeightUnit {\n KG = 'kg',\n G = 'g',\n LB = 'lb',\n OZ = 'oz',\n}\n\nexport enum EDimensionUnit {\n CM = 'cm',\n M = 'm',\n INCH = 'inch',\n FT = 'ft',\n}\n\nexport enum ECountry {\n VIETNAM = 'Vietnam',\n USA = 'USA',\n JAPAN = 'Japan',\n KOREA = 'Korea',\n CHINA = 'China',\n TAIWAN = 'Taiwan',\n THAILAND = 'Thailand',\n MALAYSIA = 'Malaysia',\n SINGAPORE = 'Singapore',\n INDONESIA = 'Indonesia',\n}\n\nexport enum ERole {\n SUPER_ADMIN = 'SUPER_ADMIN',\n ADMIN = 'ADMIN',\n MODERATOR = 'MODERATOR',\n STAFF = 'STAFF',\n EDITOR = 'EDITOR',\n VIEWER = 'VIEWER',\n USER = 'USER',\n}\n\nexport enum EProvider {\n BASIC = 'BASIC',\n FACEBOOK = 'FACEBOOK',\n GOOGLE = 'GOOGLE',\n GITHUB = 'GITHUB',\n TWITTER = 'TWITTER',\n}\n\nexport enum EProductStatus {\n DRAFT = 'draft',\n REVIEW = 'review',\n ACTIVE = 'active',\n INACTIVE = 'inactive',\n CANCELLED = 'cancelled',\n}\n\nexport enum EProductInventoryStatus {\n IN_STOCK = 'in_stock',\n OUT_OF_STOCK = 'out_of_stock',\n PREORDER = 'preorder',\n}\n\nexport enum ECartStatus {\n ACTIVE = 'active',\n COMPLETED = 'completed',\n ABANDONED = 'abandoned',\n EXPIRED = 'expired',\n}\n\nexport enum ECartType {\n IN_STOCK = 'in_stock',\n ORDER = 'order',\n}\n\nexport type TResponsePagination = {\n page: number;\n limit: number;\n total: number;\n totalPages: number;\n hasNextPage: boolean;\n hasPreviousPage: boolean;\n};\n\nexport type TResponseError = {\n statusCode: number;\n message: string;\n reference?: string | null;\n fields?: {\n [key: string]: string[] | string;\n };\n};\n\nexport type TResponseMeta = {\n version: string;\n timestamp: string;\n path: string;\n pagination?: TResponsePagination;\n};\n\nexport type TResponse<T> = T extends string\n ?\n | {\n success: true;\n statusCode: number;\n data: null;\n message: string;\n error: null;\n meta: TResponseMeta;\n }\n | {\n success: false;\n statusCode: number;\n data: null;\n message: string;\n error: TResponseError;\n meta: TResponseMeta;\n }\n :\n | {\n success: true;\n statusCode: number;\n data: T;\n message: null;\n error: null;\n meta: TResponseMeta;\n }\n | {\n success: false;\n statusCode: number;\n data: null;\n message: string;\n error: TResponseError;\n meta: TResponseMeta;\n };\n\nexport type TPayloadJwt = {\n uuid: string;\n role: string;\n};\n\nexport type AppType = typeof app;\n"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KApJE,OAAA,GAAU,kBAAkB;KAErB,KAAA,GAAQ,MAAA,CAAO,KACzB,QAAQ,WAAW;KAGhB,MAAA;;WAEM,KAAK,MAAA,CAAO;;cAGV,SAAA;;;;;iBAQW,MAAA,CAAO,OAAO;eAChB;;0BAGI,wBAAwB;qBAC7B,wBAAwB;4BACjB;kCACM;8DAC4B;;;;;;;;KAyF3B;aAab;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAMA;YAID;;;;mBAQF,YAAY,QAAQ;MACpC,QAAA"}
|
package/dist/index.d.mts
CHANGED
|
@@ -50,10 +50,38 @@ type TResponseMeta = {
|
|
|
50
50
|
path: string;
|
|
51
51
|
pagination?: TResponsePagination;
|
|
52
52
|
};
|
|
53
|
+
type TResponse<T> = T extends string ? {
|
|
54
|
+
success: true;
|
|
55
|
+
statusCode: number;
|
|
56
|
+
data: null;
|
|
57
|
+
message: string;
|
|
58
|
+
error: null;
|
|
59
|
+
meta: TResponseMeta;
|
|
60
|
+
} | {
|
|
61
|
+
success: false;
|
|
62
|
+
statusCode: number;
|
|
63
|
+
data: null;
|
|
64
|
+
message: string;
|
|
65
|
+
error: TResponseError;
|
|
66
|
+
meta: TResponseMeta;
|
|
67
|
+
} : {
|
|
68
|
+
success: true;
|
|
69
|
+
statusCode: number;
|
|
70
|
+
data: T;
|
|
71
|
+
message: null;
|
|
72
|
+
error: null;
|
|
73
|
+
meta: TResponseMeta;
|
|
74
|
+
} | {
|
|
75
|
+
success: false;
|
|
76
|
+
statusCode: number;
|
|
77
|
+
data: null;
|
|
78
|
+
message: string;
|
|
79
|
+
error: TResponseError;
|
|
80
|
+
meta: TResponseMeta;
|
|
81
|
+
};
|
|
53
82
|
type AppType = typeof app;
|
|
54
83
|
//#endregion
|
|
55
84
|
//#region src/utils.d.ts
|
|
56
|
-
type Status = 'INITIAL' | 'LOGGING' | 'LOGGED' | 'REFRESHING_TOKEN' | 'LOGGING_OUT' | 'LOGOUT';
|
|
57
85
|
declare const _func: () => {
|
|
58
86
|
admin: {
|
|
59
87
|
v1: {
|
|
@@ -2104,13 +2132,6 @@ type TUser = Treaty.Data<Awaited<ReturnType<TClient['admin']['v1']['auth']['me']
|
|
|
2104
2132
|
type Config = {
|
|
2105
2133
|
baseURL: string;
|
|
2106
2134
|
config?: Omit<Treaty.Config, 'onResponse'>;
|
|
2107
|
-
listeners?: {
|
|
2108
|
-
onSetUser?: (user: TUser | null) => void | Promise<void>;
|
|
2109
|
-
onUnauthorized?: () => void | Promise<void>;
|
|
2110
|
-
onLogout?: () => void | Promise<void>;
|
|
2111
|
-
onRefreshToken?: (status: 'SUCCESS' | 'FAILED') => void | Promise<void>;
|
|
2112
|
-
onRefreshFailed?: () => void | Promise<void>;
|
|
2113
|
-
};
|
|
2114
2135
|
};
|
|
2115
2136
|
declare class ClientApi {
|
|
2116
2137
|
private static _client;
|
|
@@ -2118,19 +2139,22 @@ declare class ClientApi {
|
|
|
2118
2139
|
private static _refreshTokenTask;
|
|
2119
2140
|
private static _logoutTask;
|
|
2120
2141
|
static client: Treaty.Create<AppType>;
|
|
2121
|
-
static status: Status;
|
|
2122
2142
|
static user: TUser;
|
|
2123
|
-
static
|
|
2143
|
+
static listeners: {
|
|
2144
|
+
onUserChange?: (user: TUser | null) => void | Promise<void>;
|
|
2145
|
+
onGetMe?: (user: TUser | null) => void | Promise<void>;
|
|
2146
|
+
onLogout?: () => void | Promise<void>;
|
|
2147
|
+
onUnauthorized?: () => void | Promise<void>;
|
|
2148
|
+
onRefreshToken?: (status: 'SUCCESS' | 'FAILED') => void | Promise<void>;
|
|
2149
|
+
} | null;
|
|
2150
|
+
private static _getUser;
|
|
2124
2151
|
private static _refreshToken;
|
|
2125
2152
|
private static _logout;
|
|
2126
2153
|
constructor({
|
|
2127
2154
|
baseURL,
|
|
2128
|
-
config
|
|
2129
|
-
listeners
|
|
2155
|
+
config
|
|
2130
2156
|
}: Config);
|
|
2131
|
-
|
|
2132
|
-
isInitial(): boolean;
|
|
2133
|
-
getUser(): {
|
|
2157
|
+
getUser(): Promise<{
|
|
2134
2158
|
uuid: string | null;
|
|
2135
2159
|
email: string;
|
|
2136
2160
|
createdAt: Date | null;
|
|
@@ -2180,9 +2204,8 @@ declare class ClientApi {
|
|
|
2180
2204
|
provinceId: string | null;
|
|
2181
2205
|
};
|
|
2182
2206
|
}[];
|
|
2183
|
-
} | null
|
|
2207
|
+
} | null>;
|
|
2184
2208
|
getClient(): TClient | undefined;
|
|
2185
|
-
getMeAPI(): Promise<void>;
|
|
2186
2209
|
logout(): Promise<void>;
|
|
2187
2210
|
fetchApi<TData>({
|
|
2188
2211
|
request
|
|
@@ -2203,10 +2226,8 @@ declare class ClientApi {
|
|
|
2203
2226
|
path: string;
|
|
2204
2227
|
};
|
|
2205
2228
|
} | null>;
|
|
2206
|
-
private _onSetUser?;
|
|
2207
2229
|
private _onUnauthorized?;
|
|
2208
|
-
private _onLogout?;
|
|
2209
2230
|
}
|
|
2210
2231
|
//#endregion
|
|
2211
|
-
export { ClientApi, type TUser };
|
|
2232
|
+
export { ClientApi, type TResponse, type TUser };
|
|
2212
2233
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":["app","EMediaEntityType","EMimeType","EWeightUnit","EDimensionUnit","ECountry","ERole","EProvider","EProductStatus","EProductInventoryStatus","ECartStatus","ECartType","TResponsePagination","TResponseError","TResponseMeta","TResponse","T","TPayloadJwt","AppType"],"sources":["../../app/src/types.d.ts","../src/utils.ts"],"sourcesContent":["import type { app } from '.';\n\nexport enum EMediaEntityType {\n PRODUCT = 'product',\n EXTRA_PRODUCT = 'extra_product',\n VARIANT = 'variant',\n CATEGORY = 'category',\n BRAND = 'brand',\n BLOG_POST = 'blog_post',\n SERIES = 'series',\n}\n\nexport enum EMimeType {\n IMAGE_WEBP = 'image/webp',\n IMAGE_JPEG = 'image/jpeg',\n IMAGE_JPG = 'image/jpg',\n IMAGE_PNG = 'image/png',\n IMAGE_GIF = 'image/gif',\n IMAGE_AVIF = 'image/avif',\n IMAGE_SVG = 'image/svg+xml',\n}\n\nexport enum EWeightUnit {\n KG = 'kg',\n G = 'g',\n LB = 'lb',\n OZ = 'oz',\n}\n\nexport enum EDimensionUnit {\n CM = 'cm',\n M = 'm',\n INCH = 'inch',\n FT = 'ft',\n}\n\nexport enum ECountry {\n VIETNAM = 'Vietnam',\n USA = 'USA',\n JAPAN = 'Japan',\n KOREA = 'Korea',\n CHINA = 'China',\n TAIWAN = 'Taiwan',\n THAILAND = 'Thailand',\n MALAYSIA = 'Malaysia',\n SINGAPORE = 'Singapore',\n INDONESIA = 'Indonesia',\n}\n\nexport enum ERole {\n SUPER_ADMIN = 'SUPER_ADMIN',\n ADMIN = 'ADMIN',\n MODERATOR = 'MODERATOR',\n STAFF = 'STAFF',\n EDITOR = 'EDITOR',\n VIEWER = 'VIEWER',\n USER = 'USER',\n}\n\nexport enum EProvider {\n BASIC = 'BASIC',\n FACEBOOK = 'FACEBOOK',\n GOOGLE = 'GOOGLE',\n GITHUB = 'GITHUB',\n TWITTER = 'TWITTER',\n}\n\nexport enum EProductStatus {\n DRAFT = 'draft',\n REVIEW = 'review',\n ACTIVE = 'active',\n INACTIVE = 'inactive',\n CANCELLED = 'cancelled',\n}\n\nexport enum EProductInventoryStatus {\n IN_STOCK = 'in_stock',\n OUT_OF_STOCK = 'out_of_stock',\n PREORDER = 'preorder',\n}\n\nexport enum ECartStatus {\n ACTIVE = 'active',\n COMPLETED = 'completed',\n ABANDONED = 'abandoned',\n EXPIRED = 'expired',\n}\n\nexport enum ECartType {\n IN_STOCK = 'in_stock',\n ORDER = 'order',\n}\n\nexport type TResponsePagination = {\n page: number;\n limit: number;\n total: number;\n totalPages: number;\n hasNextPage: boolean;\n hasPreviousPage: boolean;\n};\n\nexport type TResponseError = {\n statusCode: number;\n message: string;\n reference?: string | null;\n fields?: {\n [key: string]: string[] | string;\n };\n};\n\nexport type TResponseMeta = {\n version: string;\n timestamp: string;\n path: string;\n pagination?: TResponsePagination;\n};\n\nexport type TResponse<T> = T extends string\n ?\n | {\n success: true;\n statusCode: number;\n data: null;\n message: string;\n error: null;\n meta: TResponseMeta;\n }\n | {\n success: false;\n statusCode: number;\n data: null;\n message: string;\n error: TResponseError;\n meta: TResponseMeta;\n }\n :\n | {\n success: true;\n statusCode: number;\n data: T;\n message: null;\n error: null;\n meta: TResponseMeta;\n }\n | {\n success: false;\n statusCode: number;\n data: null;\n message: string;\n error: TResponseError;\n meta: TResponseMeta;\n };\n\nexport type TPayloadJwt = {\n uuid: string;\n role: string;\n};\n\nexport type AppType = typeof app;\n"],"mappings":";;;aAEYC,gBAAAA;EAAZ,OAAYA,GAAAA,SAAAA;EAUZ,aAAYC,GAAS,eAAA;EAqCrB,OAAYI,GAAK,SAAA;EA4CjB,QAAYM,GAAAA,UAAAA;EASZ,KAAYC,GAAAA,OAAAA;EASZ,SAAYC,GAAAA,WAAa;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":["app","EMediaEntityType","EMimeType","EWeightUnit","EDimensionUnit","ECountry","ERole","EProvider","EProductStatus","EProductInventoryStatus","ECartStatus","ECartType","TResponsePagination","TResponseError","TResponseMeta","TResponse","T","TPayloadJwt","AppType"],"sources":["../../app/src/types.d.ts","../src/utils.ts"],"sourcesContent":["import type { app } from '.';\n\nexport enum EMediaEntityType {\n PRODUCT = 'product',\n EXTRA_PRODUCT = 'extra_product',\n VARIANT = 'variant',\n CATEGORY = 'category',\n BRAND = 'brand',\n BLOG_POST = 'blog_post',\n SERIES = 'series',\n}\n\nexport enum EMimeType {\n IMAGE_WEBP = 'image/webp',\n IMAGE_JPEG = 'image/jpeg',\n IMAGE_JPG = 'image/jpg',\n IMAGE_PNG = 'image/png',\n IMAGE_GIF = 'image/gif',\n IMAGE_AVIF = 'image/avif',\n IMAGE_SVG = 'image/svg+xml',\n}\n\nexport enum EWeightUnit {\n KG = 'kg',\n G = 'g',\n LB = 'lb',\n OZ = 'oz',\n}\n\nexport enum EDimensionUnit {\n CM = 'cm',\n M = 'm',\n INCH = 'inch',\n FT = 'ft',\n}\n\nexport enum ECountry {\n VIETNAM = 'Vietnam',\n USA = 'USA',\n JAPAN = 'Japan',\n KOREA = 'Korea',\n CHINA = 'China',\n TAIWAN = 'Taiwan',\n THAILAND = 'Thailand',\n MALAYSIA = 'Malaysia',\n SINGAPORE = 'Singapore',\n INDONESIA = 'Indonesia',\n}\n\nexport enum ERole {\n SUPER_ADMIN = 'SUPER_ADMIN',\n ADMIN = 'ADMIN',\n MODERATOR = 'MODERATOR',\n STAFF = 'STAFF',\n EDITOR = 'EDITOR',\n VIEWER = 'VIEWER',\n USER = 'USER',\n}\n\nexport enum EProvider {\n BASIC = 'BASIC',\n FACEBOOK = 'FACEBOOK',\n GOOGLE = 'GOOGLE',\n GITHUB = 'GITHUB',\n TWITTER = 'TWITTER',\n}\n\nexport enum EProductStatus {\n DRAFT = 'draft',\n REVIEW = 'review',\n ACTIVE = 'active',\n INACTIVE = 'inactive',\n CANCELLED = 'cancelled',\n}\n\nexport enum EProductInventoryStatus {\n IN_STOCK = 'in_stock',\n OUT_OF_STOCK = 'out_of_stock',\n PREORDER = 'preorder',\n}\n\nexport enum ECartStatus {\n ACTIVE = 'active',\n COMPLETED = 'completed',\n ABANDONED = 'abandoned',\n EXPIRED = 'expired',\n}\n\nexport enum ECartType {\n IN_STOCK = 'in_stock',\n ORDER = 'order',\n}\n\nexport type TResponsePagination = {\n page: number;\n limit: number;\n total: number;\n totalPages: number;\n hasNextPage: boolean;\n hasPreviousPage: boolean;\n};\n\nexport type TResponseError = {\n statusCode: number;\n message: string;\n reference?: string | null;\n fields?: {\n [key: string]: string[] | string;\n };\n};\n\nexport type TResponseMeta = {\n version: string;\n timestamp: string;\n path: string;\n pagination?: TResponsePagination;\n};\n\nexport type TResponse<T> = T extends string\n ?\n | {\n success: true;\n statusCode: number;\n data: null;\n message: string;\n error: null;\n meta: TResponseMeta;\n }\n | {\n success: false;\n statusCode: number;\n data: null;\n message: string;\n error: TResponseError;\n meta: TResponseMeta;\n }\n :\n | {\n success: true;\n statusCode: number;\n data: T;\n message: null;\n error: null;\n meta: TResponseMeta;\n }\n | {\n success: false;\n statusCode: number;\n data: null;\n message: string;\n error: TResponseError;\n meta: TResponseMeta;\n };\n\nexport type TPayloadJwt = {\n uuid: string;\n role: string;\n};\n\nexport type AppType = typeof app;\n"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KApJE,OAAA,GAAU,kBAAkB;KAErB,KAAA,GAAQ,MAAA,CAAO,KACzB,QAAQ,WAAW;KAGhB,MAAA;;WAEM,KAAK,MAAA,CAAO;;cAGV,SAAA;;;;;iBAQW,MAAA,CAAO,OAAO;eAChB;;0BAGI,wBAAwB;qBAC7B,wBAAwB;4BACjB;kCACM;8DAC4B;;;;;;;;KAyF3B;aAab;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAMA;YAID;;;;mBAQF,YAAY,QAAQ;MACpC,QAAA"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{treaty as e}from"@elysiajs/eden";var t=class t{static{this._getMeTask=null}static{this._refreshTokenTask=null}static{this._logoutTask=null}static{this.
|
|
1
|
+
import{treaty as e}from"@elysiajs/eden";var t=class t{static{this._getMeTask=null}static{this._refreshTokenTask=null}static{this._logoutTask=null}static{this.user=null}static{this.listeners=null}static async _getUser(){if(t.user||!t._client)return;if(t._getMeTask){await t._getMeTask;return}let e=t._client.admin.v1.auth.me.get();t._getMeTask=e;try{let n=await e;n.data&&n.data.data&&n.data.success?t.user=n.data.data:(t.user=null,console.error(`Failed to fetch user data:`,JSON.stringify(n.data)))}catch(e){console.error(`Error fetching user data:`,JSON.stringify(e)),t.user=null}finally{t._getMeTask=null}}static async _refreshToken(){return t._client?t._refreshTokenTask?await t._refreshTokenTask:(t._refreshTokenTask=(async()=>{try{let e=await t._client?.admin.v1.auth[`refresh-token`].get();return e?.data&&e.data.success&&e.data.statusCode===200?{status:`SUCCESS`}:{status:`FAILED`}}catch(e){return console.error(`Error refreshing token:`,JSON.stringify(e)),{status:`FAILED`}}})(),t._refreshTokenTask.finally(()=>{t._refreshTokenTask=null})):{status:`FAILED`}}static async _logout(){if(t._client)try{if(t._logoutTask){await t._logoutTask;return}let e=t._client.admin.v1.auth.logout.delete();t._logoutTask=e,await e}catch(e){console.error(`Error during logout:`,e)}finally{t.user=null,t._logoutTask=null,t.listeners?.onUserChange?.(null),t.listeners?.onLogout?.()}}constructor({baseURL:n,config:r}){t._client||=e(n,r),this._onUnauthorized=async()=>{t.user=null,await t.listeners?.onUserChange?.(null),await t.listeners?.onUnauthorized?.()}}async getUser(){return await t._getUser(),await t.listeners?.onGetMe?.(t.user),t.user??null}getClient(){return t._client}async logout(){await t._client?.admin.v1.auth.logout.delete(),await t.listeners?.onLogout?.()}async fetchApi({request:e}){if(!t._client)throw Error(`Client not initialized`);try{t._getMeTask&&(console.log(`Awaiting ongoing _getMeTask before proceeding with fetchApi`),await t._getMeTask),t._refreshTokenTask&&(console.log(`Awaiting ongoing _refreshTokenTask before proceeding with fetchApi`),await t._refreshTokenTask),t._logoutTask&&(console.log(`Awaiting ongoing _logoutTask before proceeding with fetchApi`),await t._logoutTask);let n=await e(t._client);if(!n.data)return console.error(`No response data received from API request`),null;let r=n.data;if(r?.statusCode===401)return await this._onUnauthorized?.(),await t.listeners?.onUnauthorized?.(),null;if(r?.statusCode===4001){let{status:n}=await t._refreshToken();if(await t.listeners?.onRefreshToken?.(n),n===`SUCCESS`)return await e(t._client);if(n===`FAILED`)return await t._logout(),await t.listeners?.onLogout?.(),null}return n}catch(e){return console.error(`Error in fetchApi:`,JSON.stringify(e)),{success:!1,statusCode:500,data:null,message:`Internal Client Error`,error:{statusCode:500,message:`Internal Client Error`},meta:{version:`1.0.0`,timestamp:new Date().toISOString(),path:``}}}}};export{t as ClientApi};
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/utils.ts"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noExplicitAny: true */\nimport type { Treaty } from '@elysiajs/eden';\nimport { treaty } from '@elysiajs/eden';\nimport type { AppType, TResponse } from 'app/src/types.d';\n\ntype Status =\n | 'INITIAL'\n | 'LOGGING'\n | 'LOGGED'\n | 'REFRESHING_TOKEN'\n | 'LOGGING_OUT'\n | 'LOGOUT';\n\ntype RefreshStatus = 'SUCCESS' | 'FAILED';\n\n// Trick to extract Treaty Client type\nclass _Client {\n public static client: Treaty.Create<AppType>;\n public getClient() {\n return null;\n }\n}\n\n// Extract the client type\nconst _func = () => _Client.client;\ntype TClient = ReturnType<typeof _func>;\n\nexport type TUser = Treaty.Data<\n Awaited<ReturnType<TClient['admin']['v1']['auth']['me']['get']>>\n>['data'];\n\ntype Config = {\n baseURL: string;\n config?: Omit<Treaty.Config, 'onResponse'>;\n listeners?: {\n onSetUser?: (user: TUser | null) => void | Promise<void>;\n onUnauthorized?: () => void | Promise<void>;\n onLogout?: () => void | Promise<void>;\n onRefreshToken?: (status: 'SUCCESS' | 'FAILED') => void | Promise<void>;\n onRefreshFailed?: () => void | Promise<void>;\n };\n};\n\nexport class ClientApi {\n // Keep track of the ongoing \"me\" request to prevent multiple simultaneous calls\n private static _client: TClient | undefined;\n private static _getMeTask: Promise<any> | null = null;\n private static _refreshTokenTask: Promise<{ status: RefreshStatus }> | null =\n null;\n private static _logoutTask: Promise<any> | null = null;\n\n public static client: Treaty.Create<AppType>;\n public static status: Status = 'INITIAL';\n public static user: TUser = null;\n\n public static async getMe() {\n // If already logged in, no need to fetch again\n if (['LOGGED', 'REFRESHING_TOKEN'].includes(ClientApi.status)) return;\n\n // Ensure client is initialized\n if (!ClientApi._client) return;\n\n // If there's an ongoing \"me\" request, await its completion\n if (ClientApi._getMeTask) {\n await ClientApi._getMeTask;\n return;\n }\n\n const getMe = ClientApi._client.admin.v1.auth.me.get();\n // Store the ongoing task, so other can know about it and await it if needed\n ClientApi._getMeTask = getMe;\n try {\n ClientApi.status = 'LOGGING';\n const res = await getMe;\n if (!!res.data && !!res.data.data && res.data.success) {\n ClientApi.status = 'LOGGED';\n ClientApi.user = res.data.data;\n } else {\n ClientApi.status = 'INITIAL';\n ClientApi.user = null;\n }\n } catch (error) {\n console.error('Error fetching user data:', JSON.stringify(error));\n ClientApi.status = 'INITIAL';\n ClientApi.user = null;\n } finally {\n ClientApi._getMeTask = null;\n }\n }\n\n private static async _refreshToken() {\n // Ensure client is initialized\n if (!ClientApi._client) {\n console.error('Client not initialized');\n return { status: 'FAILED' as const };\n }\n\n // If there's an ongoing \"refresh token\" request, await its completion\n if (ClientApi._refreshTokenTask) {\n const res = await ClientApi._refreshTokenTask;\n return res;\n }\n\n const handler = async (): Promise<{ status: RefreshStatus }> => {\n try {\n ClientApi.status = 'REFRESHING_TOKEN';\n const res =\n await ClientApi._client?.admin.v1.auth['refresh-token'].get();\n if (!!res?.data && !!res.data.success && res.data.statusCode === 200) {\n return { status: 'SUCCESS' };\n }\n return { status: 'FAILED' };\n } catch (error) {\n console.error('Error refreshing token:', JSON.stringify(error));\n return { status: 'FAILED' };\n }\n };\n // Store the ongoing task, so other can know about it and await it if needed\n ClientApi._refreshTokenTask = handler();\n return ClientApi._refreshTokenTask.finally(() => {\n ClientApi._refreshTokenTask = null;\n });\n }\n\n private static async _logout() {\n // Ensure client is initialized\n if (!ClientApi._client) {\n console.error('Client not initialized');\n return;\n }\n\n // If there's an ongoing \"logout\" request, await its completion\n if (ClientApi._logoutTask) {\n await ClientApi._logoutTask;\n return;\n }\n\n const logout = ClientApi._client.admin.v1.auth.logout.delete();\n // Store the ongoing task, so other can know about it\n // and await it if needed\n ClientApi._logoutTask = logout;\n try {\n ClientApi.status = 'LOGGING_OUT';\n await logout;\n ClientApi.status = 'LOGGED';\n } catch (error) {\n ClientApi.status = 'LOGGED';\n console.error('Error during logout:', error);\n } finally {\n ClientApi.user = null;\n ClientApi._logoutTask = null;\n }\n }\n\n constructor({ baseURL, config, listeners }: Config) {\n // Initialize Treaty Client\n if (!ClientApi._client) {\n ClientApi._client = treaty<AppType>(baseURL, config);\n }\n\n this._onSetUser = async (user: TUser) => {\n await listeners?.onSetUser?.(user);\n ClientApi.status = user ? 'LOGGED' : 'INITIAL';\n ClientApi.user = user;\n };\n\n this._onUnauthorized = async () => {\n this._onSetUser?.(null);\n await listeners?.onUnauthorized?.();\n };\n\n this._onLogout = async () => {\n await listeners?.onLogout?.();\n };\n }\n\n public isLogged() {\n return ['LOGGED', 'REFRESHING_TOKEN'].includes(ClientApi.status);\n }\n\n public isInitial() {\n return ClientApi.status === 'INITIAL';\n }\n\n public getUser() {\n return ClientApi.user ?? null;\n }\n\n public getClient(): TClient | undefined {\n return ClientApi._client;\n }\n\n public async getMeAPI() {\n await ClientApi.getMe();\n }\n\n public async logout() {\n ClientApi.status = 'LOGGING_OUT';\n await ClientApi._client?.admin.v1.auth.logout.delete();\n await this._onLogout?.();\n await this._onSetUser?.(null);\n ClientApi.status = 'INITIAL';\n }\n\n public async fetchApi<TData>({\n request,\n }: {\n request: (api: TClient) => Promise<TData>;\n }) {\n // Ensure client is initialized\n if (!ClientApi._client) {\n throw new Error('Client not initialized');\n }\n\n try {\n // Await ongoing \"me\" request to ensure user state is up-to-date\n if (ClientApi._getMeTask) {\n console.log(\n 'Awaiting ongoing _getMeTask before proceeding with fetchApi'\n );\n await ClientApi._getMeTask;\n }\n\n // Await ongoing \"refresh token\" request to ensure token state is up-to-date\n if (ClientApi._refreshTokenTask) {\n console.log(\n 'Awaiting ongoing _refreshTokenTask before proceeding with fetchApi'\n );\n await ClientApi._refreshTokenTask;\n }\n\n // Await ongoing \"logout\" request to ensure user is logged out properly\n if (ClientApi._logoutTask) {\n console.log(\n 'Awaiting ongoing _logoutTask before proceeding with fetchApi'\n );\n await ClientApi._logoutTask;\n }\n\n const response = (await request(\n ClientApi._client\n )) as Treaty.TreatyResponse<Record<number, TResponse<any>>>;\n\n // Check if response data exists\n if (!response.data) {\n console.error('No response data received from API request');\n return null;\n }\n\n // Check for status codes in the response data\n const _data = response.data;\n\n // CASE: User is Unauthorized\n if (_data?.statusCode === 401) {\n await this._onUnauthorized?.();\n return null;\n }\n\n // CASE: TOKEN EXPIRED - Re-fetch user data\n if (_data?.statusCode === 4001) {\n const { status } = await ClientApi._refreshToken();\n if (status === 'SUCCESS') {\n ClientApi.status = 'LOGGED';\n const response = (await request(\n ClientApi._client\n )) as Treaty.TreatyResponse<Record<number, TResponse<any>>>;\n return response as TData;\n }\n if (status === 'FAILED') {\n await ClientApi._logout();\n this._onLogout?.();\n return null;\n }\n }\n\n return response as TData;\n } catch (error) {\n console.error('Error in fetchApi:', JSON.stringify(error));\n return {\n success: false,\n statusCode: 500,\n data: null,\n message: 'Internal Client Error',\n error: {\n statusCode: 500,\n message: 'Internal Client Error',\n },\n meta: {\n version: '1.0.0',\n timestamp: new Date().toISOString(),\n path: '',\n },\n };\n }\n }\n\n private _onSetUser?: (user: TUser | null) => void | Promise<void>;\n private _onUnauthorized?: () => void | Promise<void>;\n private _onLogout?: () => void | Promise<void>;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/utils.ts"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noExplicitAny: true */\nimport type { Treaty } from '@elysiajs/eden';\nimport { treaty } from '@elysiajs/eden';\nimport type { AppType, TResponse } from 'app/src/types.d';\n\ntype RefreshStatus = 'SUCCESS' | 'FAILED';\n\n// Trick to extract Treaty Client type\nclass _Client {\n public static client: Treaty.Create<AppType>;\n public getClient() {\n return null;\n }\n}\n\n// Extract the client type\nconst _func = () => _Client.client;\ntype TClient = ReturnType<typeof _func>;\n\nexport type TUser = Treaty.Data<\n Awaited<ReturnType<TClient['admin']['v1']['auth']['me']['get']>>\n>['data'];\n\ntype Config = {\n baseURL: string;\n config?: Omit<Treaty.Config, 'onResponse'>;\n};\n\nexport class ClientApi {\n // Keep track of the ongoing \"me\" request to prevent multiple simultaneous calls\n private static _client: TClient | undefined;\n private static _getMeTask: Promise<any> | null = null;\n private static _refreshTokenTask: Promise<{ status: RefreshStatus }> | null =\n null;\n private static _logoutTask: Promise<any> | null = null;\n\n public static client: Treaty.Create<AppType>;\n public static user: TUser = null;\n\n public static listeners: {\n onUserChange?: (user: TUser | null) => void | Promise<void>;\n onGetMe?: (user: TUser | null) => void | Promise<void>;\n onLogout?: () => void | Promise<void>;\n onUnauthorized?: () => void | Promise<void>;\n onRefreshToken?: (status: 'SUCCESS' | 'FAILED') => void | Promise<void>;\n } | null = null;\n\n private static async _getUser() {\n // If already logged in, no need to fetch again\n if (ClientApi.user) return;\n\n // Ensure client is initialized\n if (!ClientApi._client) return;\n\n // If there's an ongoing \"me\" request, await its completion\n if (ClientApi._getMeTask) {\n await ClientApi._getMeTask;\n return;\n }\n\n const getMe = ClientApi._client.admin.v1.auth.me.get();\n // Store the ongoing task, so other can know about it and await it if needed\n ClientApi._getMeTask = getMe;\n try {\n const res = await getMe;\n if (!!res.data && !!res.data.data && res.data.success) {\n ClientApi.user = res.data.data;\n } else {\n ClientApi.user = null;\n console.error('Failed to fetch user data:', JSON.stringify(res.data));\n }\n } catch (error) {\n console.error('Error fetching user data:', JSON.stringify(error));\n ClientApi.user = null;\n } finally {\n ClientApi._getMeTask = null;\n }\n }\n\n private static async _refreshToken() {\n // Ensure client is initialized\n if (!ClientApi._client) return { status: 'FAILED' as const };\n\n // If there's an ongoing \"refresh token\" request, await its completion\n if (ClientApi._refreshTokenTask) {\n const res = await ClientApi._refreshTokenTask;\n return res;\n }\n\n const handler = async (): Promise<{ status: RefreshStatus }> => {\n try {\n const res =\n await ClientApi._client?.admin.v1.auth['refresh-token'].get();\n if (!!res?.data && !!res.data.success && res.data.statusCode === 200) {\n return { status: 'SUCCESS' };\n }\n return { status: 'FAILED' };\n } catch (error) {\n console.error('Error refreshing token:', JSON.stringify(error));\n return { status: 'FAILED' };\n }\n };\n // Store the ongoing task, so other can know about it and await it if needed\n ClientApi._refreshTokenTask = handler();\n return ClientApi._refreshTokenTask.finally(() => {\n ClientApi._refreshTokenTask = null;\n });\n }\n\n private static async _logout() {\n // Ensure client is initialized\n if (!ClientApi._client) return;\n try {\n // If there's an ongoing \"logout\" request, await its completion\n if (ClientApi._logoutTask) {\n await ClientApi._logoutTask;\n return;\n }\n\n const logout = ClientApi._client.admin.v1.auth.logout.delete();\n // Store the ongoing task, so other can know about it and await it if needed\n ClientApi._logoutTask = logout;\n await logout;\n } catch (error) {\n console.error('Error during logout:', error);\n } finally {\n ClientApi.user = null;\n ClientApi._logoutTask = null;\n ClientApi.listeners?.onUserChange?.(null);\n ClientApi.listeners?.onLogout?.();\n }\n }\n\n constructor({ baseURL, config }: Config) {\n // Initialize Treaty Client\n if (!ClientApi._client) {\n ClientApi._client = treaty<AppType>(baseURL, config);\n }\n\n this._onUnauthorized = async () => {\n ClientApi.user = null;\n await ClientApi.listeners?.onUserChange?.(null);\n await ClientApi.listeners?.onUnauthorized?.();\n };\n }\n\n public async getUser() {\n await ClientApi._getUser();\n await ClientApi.listeners?.onGetMe?.(ClientApi.user);\n return ClientApi.user ?? null;\n }\n\n public getClient(): TClient | undefined {\n return ClientApi._client;\n }\n\n public async logout() {\n await ClientApi._client?.admin.v1.auth.logout.delete();\n await ClientApi.listeners?.onLogout?.();\n }\n\n public async fetchApi<TData>({\n request,\n }: {\n request: (api: TClient) => Promise<TData>;\n }) {\n // Ensure client is initialized\n if (!ClientApi._client) {\n throw new Error('Client not initialized');\n }\n\n try {\n // Await ongoing \"me\" request to ensure user state is up-to-date\n if (ClientApi._getMeTask) {\n console.log(\n 'Awaiting ongoing _getMeTask before proceeding with fetchApi'\n );\n await ClientApi._getMeTask;\n }\n\n // Await ongoing \"refresh token\" request to ensure token state is up-to-date\n if (ClientApi._refreshTokenTask) {\n console.log(\n 'Awaiting ongoing _refreshTokenTask before proceeding with fetchApi'\n );\n await ClientApi._refreshTokenTask;\n }\n\n // Await ongoing \"logout\" request to ensure user is logged out properly\n if (ClientApi._logoutTask) {\n console.log(\n 'Awaiting ongoing _logoutTask before proceeding with fetchApi'\n );\n await ClientApi._logoutTask;\n }\n\n const response = (await request(\n ClientApi._client\n )) as Treaty.TreatyResponse<Record<number, TResponse<any>>>;\n\n // Check if response data exists\n if (!response.data) {\n console.error('No response data received from API request');\n return null;\n }\n\n // Check for status codes in the response data\n const _data = response.data;\n\n // CASE: User is Unauthorized\n if (_data?.statusCode === 401) {\n await this._onUnauthorized?.();\n await ClientApi.listeners?.onUnauthorized?.();\n return null;\n }\n\n // CASE: TOKEN EXPIRED - Re-fetch user data\n if (_data?.statusCode === 4001) {\n const { status } = await ClientApi._refreshToken();\n await ClientApi.listeners?.onRefreshToken?.(status);\n if (status === 'SUCCESS') {\n const response = (await request(\n ClientApi._client\n )) as Treaty.TreatyResponse<Record<number, TResponse<any>>>;\n return response as TData;\n }\n if (status === 'FAILED') {\n await ClientApi._logout();\n await ClientApi.listeners?.onLogout?.();\n return null;\n }\n }\n\n return response as TData;\n } catch (error) {\n console.error('Error in fetchApi:', JSON.stringify(error));\n return {\n success: false,\n statusCode: 500,\n data: null,\n message: 'Internal Client Error',\n error: {\n statusCode: 500,\n message: 'Internal Client Error',\n },\n meta: {\n version: '1.0.0',\n timestamp: new Date().toISOString(),\n path: '',\n },\n };\n }\n }\n\n private _onUnauthorized?: () => void | Promise<void>;\n}\n"],"mappings":"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"}
|