librechat-data-provider 0.2.1 → 0.2.5

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.es.js CHANGED
@@ -95,55 +95,58 @@ var processQueue = function (error, token) {
95
95
  failedQueue = [];
96
96
  };
97
97
  axios.interceptors.response.use(function (response) { return response; }, function (error) { return __awaiter(void 0, void 0, void 0, function () {
98
- var originalRequest, token, err_1;
99
- return __generator(this, function (_a) {
100
- switch (_a.label) {
98
+ var originalRequest, token, err_1, token, err_2;
99
+ var _a;
100
+ return __generator(this, function (_b) {
101
+ switch (_b.label) {
101
102
  case 0:
102
103
  originalRequest = error.config;
103
- if (!(error.response.status === 401 && !originalRequest._retry)) return [3 /*break*/, 7];
104
- if (!isRefreshing) return [3 /*break*/, 6];
105
- _a.label = 1;
104
+ if (!(error.response.status === 401 && !originalRequest._retry)) return [3 /*break*/, 13];
105
+ originalRequest._retry = true;
106
+ if (!isRefreshing) return [3 /*break*/, 5];
107
+ _b.label = 1;
106
108
  case 1:
107
- _a.trys.push([1, 4, , 6]);
109
+ _b.trys.push([1, 4, , 5]);
108
110
  return [4 /*yield*/, new Promise(function (resolve, reject) {
109
111
  failedQueue.push({ resolve: resolve, reject: reject });
110
112
  })];
111
113
  case 2:
112
- token = _a.sent();
114
+ token = _b.sent();
113
115
  originalRequest.headers['Authorization'] = 'Bearer ' + token;
114
116
  return [4 /*yield*/, axios(originalRequest)];
115
- case 3: return [2 /*return*/, _a.sent()];
117
+ case 3: return [2 /*return*/, _b.sent()];
116
118
  case 4:
117
- err_1 = _a.sent();
118
- return [4 /*yield*/, Promise.reject(err_1)];
119
- case 5: return [2 /*return*/, _a.sent()];
120
- case 6:
121
- originalRequest._retry = true;
119
+ err_1 = _b.sent();
120
+ return [2 /*return*/, Promise.reject(err_1)];
121
+ case 5:
122
122
  isRefreshing = true;
123
- return [2 /*return*/, new Promise(function (resolve, reject) {
124
- refreshToken()
125
- .then(function (_a) {
126
- var token = _a.token;
127
- if (token) {
128
- originalRequest.headers['Authorization'] = 'Bearer ' + token;
129
- setTokenHeader(token);
130
- window.dispatchEvent(new CustomEvent('tokenUpdated', { detail: token }));
131
- processQueue(null, token);
132
- resolve(axios(originalRequest));
133
- }
134
- else {
135
- window.location.href = '/login';
136
- }
137
- })
138
- .catch(function (err) {
139
- processQueue(err, null);
140
- reject(err);
141
- })
142
- .then(function () {
143
- isRefreshing = false;
144
- });
145
- })];
146
- case 7: return [2 /*return*/, Promise.reject(error)];
123
+ _b.label = 6;
124
+ case 6:
125
+ _b.trys.push([6, 11, 12, 13]);
126
+ return [4 /*yield*/, refreshToken(
127
+ // Handle edge case where we get a blank screen if the initial 401 error is from a refresh token request
128
+ ((_a = originalRequest.url) === null || _a === void 0 ? void 0 : _a.includes('api/auth/refresh')) ? true : false)];
129
+ case 7:
130
+ token = (_b.sent()).token;
131
+ if (!token) return [3 /*break*/, 9];
132
+ originalRequest.headers['Authorization'] = 'Bearer ' + token;
133
+ setTokenHeader(token);
134
+ window.dispatchEvent(new CustomEvent('tokenUpdated', { detail: token }));
135
+ processQueue(null, token);
136
+ return [4 /*yield*/, axios(originalRequest)];
137
+ case 8: return [2 /*return*/, _b.sent()];
138
+ case 9:
139
+ window.location.href = '/login';
140
+ _b.label = 10;
141
+ case 10: return [3 /*break*/, 13];
142
+ case 11:
143
+ err_2 = _b.sent();
144
+ processQueue(err_2, null);
145
+ return [2 /*return*/, Promise.reject(err_2)];
146
+ case 12:
147
+ isRefreshing = false;
148
+ return [7 /*endfinally*/];
149
+ case 13: return [2 /*return*/, Promise.reject(error)];
147
150
  }
148
151
  });
149
152
  }); });
@@ -283,7 +286,7 @@ var login$1 = function () { return '/api/auth/login'; };
283
286
  var logout$1 = function () { return '/api/auth/logout'; };
284
287
  var register$1 = function () { return '/api/auth/register'; };
285
288
  var loginGoogle = function () { return '/api/auth/google'; };
286
- var refreshToken$1 = function () { return '/api/auth/refresh'; };
289
+ var refreshToken$1 = function (retry) { return "/api/auth/refresh".concat(retry ? '?retry=true' : ''); };
287
290
  var requestPasswordReset$1 = function () { return '/api/auth/requestPasswordReset'; };
288
291
  var resetPassword$1 = function () { return '/api/auth/resetPassword'; };
289
292
  var plugins = function () { return '/api/plugins'; };
@@ -377,7 +380,7 @@ var logout = function () {
377
380
  var register = function (payload) {
378
381
  return request.post(register$1(), payload);
379
382
  };
380
- var refreshToken = function () { return request.post(refreshToken$1()); };
383
+ var refreshToken = function (retry) { return request.post(refreshToken$1(retry)); };
381
384
  var userKeyQuery = function (name) {
382
385
  return request.get(userKeyQuery$1(name));
383
386
  };
@@ -827,12 +830,8 @@ var useGetConversationsQuery = function (pageNumber, config) {
827
830
  var useGetSearchEnabledQuery = function (config) {
828
831
  return useQuery([QueryKeys.searchEnabled], function () { return getSearchEnabled(); }, __assign({ refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false }, config));
829
832
  };
830
- var useGetEndpointsQuery = function () {
831
- return useQuery([QueryKeys.endpoints], function () { return getAIEndpoints(); }, {
832
- refetchOnWindowFocus: false,
833
- refetchOnReconnect: false,
834
- refetchOnMount: false,
835
- });
833
+ var useGetEndpointsQuery = function (config) {
834
+ return useQuery([QueryKeys.endpoints], function () { return getAIEndpoints(); }, __assign({ refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false }, config));
836
835
  };
837
836
  var useGetModelsQuery = function (config) {
838
837
  return useQuery([QueryKeys.models], function () { return getModels(); }, __assign({ refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false }, config));
package/dist/index.js CHANGED
@@ -97,55 +97,58 @@ var processQueue = function (error, token) {
97
97
  failedQueue = [];
98
98
  };
99
99
  axios.interceptors.response.use(function (response) { return response; }, function (error) { return __awaiter(void 0, void 0, void 0, function () {
100
- var originalRequest, token, err_1;
101
- return __generator(this, function (_a) {
102
- switch (_a.label) {
100
+ var originalRequest, token, err_1, token, err_2;
101
+ var _a;
102
+ return __generator(this, function (_b) {
103
+ switch (_b.label) {
103
104
  case 0:
104
105
  originalRequest = error.config;
105
- if (!(error.response.status === 401 && !originalRequest._retry)) return [3 /*break*/, 7];
106
- if (!isRefreshing) return [3 /*break*/, 6];
107
- _a.label = 1;
106
+ if (!(error.response.status === 401 && !originalRequest._retry)) return [3 /*break*/, 13];
107
+ originalRequest._retry = true;
108
+ if (!isRefreshing) return [3 /*break*/, 5];
109
+ _b.label = 1;
108
110
  case 1:
109
- _a.trys.push([1, 4, , 6]);
111
+ _b.trys.push([1, 4, , 5]);
110
112
  return [4 /*yield*/, new Promise(function (resolve, reject) {
111
113
  failedQueue.push({ resolve: resolve, reject: reject });
112
114
  })];
113
115
  case 2:
114
- token = _a.sent();
116
+ token = _b.sent();
115
117
  originalRequest.headers['Authorization'] = 'Bearer ' + token;
116
118
  return [4 /*yield*/, axios(originalRequest)];
117
- case 3: return [2 /*return*/, _a.sent()];
119
+ case 3: return [2 /*return*/, _b.sent()];
118
120
  case 4:
119
- err_1 = _a.sent();
120
- return [4 /*yield*/, Promise.reject(err_1)];
121
- case 5: return [2 /*return*/, _a.sent()];
122
- case 6:
123
- originalRequest._retry = true;
121
+ err_1 = _b.sent();
122
+ return [2 /*return*/, Promise.reject(err_1)];
123
+ case 5:
124
124
  isRefreshing = true;
125
- return [2 /*return*/, new Promise(function (resolve, reject) {
126
- refreshToken()
127
- .then(function (_a) {
128
- var token = _a.token;
129
- if (token) {
130
- originalRequest.headers['Authorization'] = 'Bearer ' + token;
131
- setTokenHeader(token);
132
- window.dispatchEvent(new CustomEvent('tokenUpdated', { detail: token }));
133
- processQueue(null, token);
134
- resolve(axios(originalRequest));
135
- }
136
- else {
137
- window.location.href = '/login';
138
- }
139
- })
140
- .catch(function (err) {
141
- processQueue(err, null);
142
- reject(err);
143
- })
144
- .then(function () {
145
- isRefreshing = false;
146
- });
147
- })];
148
- case 7: return [2 /*return*/, Promise.reject(error)];
125
+ _b.label = 6;
126
+ case 6:
127
+ _b.trys.push([6, 11, 12, 13]);
128
+ return [4 /*yield*/, refreshToken(
129
+ // Handle edge case where we get a blank screen if the initial 401 error is from a refresh token request
130
+ ((_a = originalRequest.url) === null || _a === void 0 ? void 0 : _a.includes('api/auth/refresh')) ? true : false)];
131
+ case 7:
132
+ token = (_b.sent()).token;
133
+ if (!token) return [3 /*break*/, 9];
134
+ originalRequest.headers['Authorization'] = 'Bearer ' + token;
135
+ setTokenHeader(token);
136
+ window.dispatchEvent(new CustomEvent('tokenUpdated', { detail: token }));
137
+ processQueue(null, token);
138
+ return [4 /*yield*/, axios(originalRequest)];
139
+ case 8: return [2 /*return*/, _b.sent()];
140
+ case 9:
141
+ window.location.href = '/login';
142
+ _b.label = 10;
143
+ case 10: return [3 /*break*/, 13];
144
+ case 11:
145
+ err_2 = _b.sent();
146
+ processQueue(err_2, null);
147
+ return [2 /*return*/, Promise.reject(err_2)];
148
+ case 12:
149
+ isRefreshing = false;
150
+ return [7 /*endfinally*/];
151
+ case 13: return [2 /*return*/, Promise.reject(error)];
149
152
  }
150
153
  });
151
154
  }); });
@@ -285,7 +288,7 @@ var login$1 = function () { return '/api/auth/login'; };
285
288
  var logout$1 = function () { return '/api/auth/logout'; };
286
289
  var register$1 = function () { return '/api/auth/register'; };
287
290
  var loginGoogle = function () { return '/api/auth/google'; };
288
- var refreshToken$1 = function () { return '/api/auth/refresh'; };
291
+ var refreshToken$1 = function (retry) { return "/api/auth/refresh".concat(retry ? '?retry=true' : ''); };
289
292
  var requestPasswordReset$1 = function () { return '/api/auth/requestPasswordReset'; };
290
293
  var resetPassword$1 = function () { return '/api/auth/resetPassword'; };
291
294
  var plugins = function () { return '/api/plugins'; };
@@ -379,7 +382,7 @@ var logout = function () {
379
382
  var register = function (payload) {
380
383
  return request.post(register$1(), payload);
381
384
  };
382
- var refreshToken = function () { return request.post(refreshToken$1()); };
385
+ var refreshToken = function (retry) { return request.post(refreshToken$1(retry)); };
383
386
  var userKeyQuery = function (name) {
384
387
  return request.get(userKeyQuery$1(name));
385
388
  };
@@ -829,12 +832,8 @@ var useGetConversationsQuery = function (pageNumber, config) {
829
832
  var useGetSearchEnabledQuery = function (config) {
830
833
  return reactQuery.useQuery([exports.QueryKeys.searchEnabled], function () { return getSearchEnabled(); }, __assign({ refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false }, config));
831
834
  };
832
- var useGetEndpointsQuery = function () {
833
- return reactQuery.useQuery([exports.QueryKeys.endpoints], function () { return getAIEndpoints(); }, {
834
- refetchOnWindowFocus: false,
835
- refetchOnReconnect: false,
836
- refetchOnMount: false,
837
- });
835
+ var useGetEndpointsQuery = function (config) {
836
+ return reactQuery.useQuery([exports.QueryKeys.endpoints], function () { return getAIEndpoints(); }, __assign({ refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false }, config));
838
837
  };
839
838
  var useGetModelsQuery = function (config) {
840
839
  return reactQuery.useQuery([exports.QueryKeys.models], function () { return getModels(); }, __assign({ refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false }, config));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "librechat-data-provider",
3
- "version": "0.2.1",
3
+ "version": "0.2.5",
4
4
  "description": "data services for librechat apps",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.es.js",
@@ -28,7 +28,7 @@
28
28
  "dependencies": {
29
29
  "@tanstack/react-query": "^4.28.0",
30
30
  "axios": "^1.3.4",
31
- "openai": "^4.11.1",
31
+ "openai": "4.11.1",
32
32
  "zod": "^3.22.4"
33
33
  },
34
34
  "devDependencies": {
@@ -52,7 +52,7 @@ export const loginFacebook = () => '/api/auth/facebook';
52
52
 
53
53
  export const loginGoogle = () => '/api/auth/google';
54
54
 
55
- export const refreshToken = () => '/api/auth/refresh';
55
+ export const refreshToken = (retry?: boolean) => `/api/auth/refresh${retry ? '?retry=true' : ''}`;
56
56
 
57
57
  export const requestPasswordReset = () => '/api/auth/requestPasswordReset';
58
58
 
@@ -101,7 +101,7 @@ export const searchConversations = async (
101
101
  return request.get(endpoints.search(q, pageNumber));
102
102
  };
103
103
 
104
- export const getAIEndpoints = () => {
104
+ export const getAIEndpoints = (): Promise<t.TEndpointsConfig> => {
105
105
  return request.get(endpoints.aiEndpoints());
106
106
  };
107
107
 
@@ -125,7 +125,7 @@ export const register = (payload: t.TRegisterUser) => {
125
125
  return request.post(endpoints.register(), payload);
126
126
  };
127
127
 
128
- export const refreshToken = () => request.post(endpoints.refreshToken());
128
+ export const refreshToken = (retry?: boolean) => request.post(endpoints.refreshToken(retry));
129
129
 
130
130
  export const userKeyQuery = (name: string): Promise<t.TCheckUserKeyResponse> =>
131
131
  request.get(endpoints.userKeyQuery(name));
@@ -230,12 +230,19 @@ export const useGetSearchEnabledQuery = (
230
230
  });
231
231
  };
232
232
 
233
- export const useGetEndpointsQuery = (): QueryObserverResult<t.TEndpointsConfig> => {
234
- return useQuery([QueryKeys.endpoints], () => dataService.getAIEndpoints(), {
235
- refetchOnWindowFocus: false,
236
- refetchOnReconnect: false,
237
- refetchOnMount: false,
238
- });
233
+ export const useGetEndpointsQuery = <TData = t.TEndpointsConfig>(
234
+ config?: UseQueryOptions<t.TEndpointsConfig, unknown, TData>,
235
+ ): QueryObserverResult<TData> => {
236
+ return useQuery<t.TEndpointsConfig, unknown, TData>(
237
+ [QueryKeys.endpoints],
238
+ () => dataService.getAIEndpoints(),
239
+ {
240
+ refetchOnWindowFocus: false,
241
+ refetchOnReconnect: false,
242
+ refetchOnMount: false,
243
+ ...config,
244
+ },
245
+ );
239
246
  };
240
247
 
241
248
  export const useGetModelsQuery = (
package/src/request.ts CHANGED
@@ -23,44 +23,47 @@ axios.interceptors.response.use(
23
23
  (response) => response,
24
24
  async (error) => {
25
25
  const originalRequest = error.config;
26
+
26
27
  if (error.response.status === 401 && !originalRequest._retry) {
28
+ originalRequest._retry = true;
29
+
27
30
  if (isRefreshing) {
28
31
  try {
29
- const token = await new Promise(function (resolve, reject) {
32
+ const token = await new Promise((resolve, reject) => {
30
33
  failedQueue.push({ resolve, reject });
31
34
  });
32
35
  originalRequest.headers['Authorization'] = 'Bearer ' + token;
33
36
  return await axios(originalRequest);
34
37
  } catch (err) {
35
- return await Promise.reject(err);
38
+ return Promise.reject(err);
36
39
  }
37
40
  }
38
41
 
39
- originalRequest._retry = true;
40
42
  isRefreshing = true;
41
43
 
42
- return new Promise(function (resolve, reject) {
43
- refreshToken()
44
- .then(({ token }) => {
45
- if (token) {
46
- originalRequest.headers['Authorization'] = 'Bearer ' + token;
47
- setTokenHeader(token);
48
- window.dispatchEvent(new CustomEvent('tokenUpdated', { detail: token }));
49
- processQueue(null, token);
50
- resolve(axios(originalRequest));
51
- } else {
52
- window.location.href = '/login';
53
- }
54
- })
55
- .catch((err) => {
56
- processQueue(err, null);
57
- reject(err);
58
- })
59
- .then(() => {
60
- isRefreshing = false;
61
- });
62
- });
44
+ try {
45
+ const { token } = await refreshToken(
46
+ // Handle edge case where we get a blank screen if the initial 401 error is from a refresh token request
47
+ originalRequest.url?.includes('api/auth/refresh') ? true : false,
48
+ );
49
+
50
+ if (token) {
51
+ originalRequest.headers['Authorization'] = 'Bearer ' + token;
52
+ setTokenHeader(token);
53
+ window.dispatchEvent(new CustomEvent('tokenUpdated', { detail: token }));
54
+ processQueue(null, token);
55
+ return await axios(originalRequest);
56
+ } else {
57
+ window.location.href = '/login';
58
+ }
59
+ } catch (err) {
60
+ processQueue(err as AxiosError, null);
61
+ return Promise.reject(err);
62
+ } finally {
63
+ isRefreshing = false;
64
+ }
63
65
  }
66
+
64
67
  return Promise.reject(error);
65
68
  },
66
69
  );
package/src/types.ts CHANGED
@@ -120,7 +120,7 @@ export type TConfig = {
120
120
  availableModels?: [];
121
121
  userProvide?: boolean | null;
122
122
  availableTools?: [];
123
- plugins?: [];
123
+ plugins?: Record<string, string>;
124
124
  azure?: boolean;
125
125
  };
126
126
 
@@ -181,6 +181,7 @@ export type TStartupConfig = {
181
181
  socialLoginEnabled: boolean;
182
182
  emailEnabled: boolean;
183
183
  checkBalance: boolean;
184
+ customFooter?: string;
184
185
  };
185
186
 
186
187
  export type TRefreshTokenResponse = {
@@ -23,7 +23,7 @@ export declare const logout: () => string;
23
23
  export declare const register: () => string;
24
24
  export declare const loginFacebook: () => string;
25
25
  export declare const loginGoogle: () => string;
26
- export declare const refreshToken: () => string;
26
+ export declare const refreshToken: (retry?: boolean) => string;
27
27
  export declare const requestPasswordReset: () => string;
28
28
  export declare const resetPassword: () => string;
29
29
  export declare const plugins: () => string;
@@ -19,13 +19,13 @@ export declare function getSearchEnabled(): Promise<boolean>;
19
19
  export declare function getUser(): Promise<t.TUser>;
20
20
  export declare function getUserBalance(): Promise<string>;
21
21
  export declare const searchConversations: (q: string, pageNumber: string) => Promise<t.TSearchResults>;
22
- export declare const getAIEndpoints: () => Promise<unknown>;
22
+ export declare const getAIEndpoints: () => Promise<t.TEndpointsConfig>;
23
23
  export declare const getModels: () => Promise<t.TModelsConfig>;
24
24
  export declare const updateTokenCount: (text: string) => Promise<any>;
25
25
  export declare const login: (payload: t.TLoginUser) => Promise<any>;
26
26
  export declare const logout: () => Promise<any>;
27
27
  export declare const register: (payload: t.TRegisterUser) => Promise<any>;
28
- export declare const refreshToken: () => Promise<any>;
28
+ export declare const refreshToken: (retry?: boolean) => Promise<any>;
29
29
  export declare const userKeyQuery: (name: string) => Promise<t.TCheckUserKeyResponse>;
30
30
  export declare const getLoginGoogle: () => Promise<unknown>;
31
31
  export declare const requestPasswordReset: (payload: t.TRequestPasswordReset) => Promise<t.TRequestPasswordResetResponse>;
@@ -36,7 +36,7 @@ export declare const useRevokeUserKeyMutation: (name: string) => UseMutationResu
36
36
  export declare const useRevokeAllUserKeysMutation: () => UseMutationResult<unknown>;
37
37
  export declare const useGetConversationsQuery: (pageNumber: string, config?: UseQueryOptions<t.TGetConversationsResponse>) => QueryObserverResult<t.TGetConversationsResponse>;
38
38
  export declare const useGetSearchEnabledQuery: (config?: UseQueryOptions<boolean>) => QueryObserverResult<boolean>;
39
- export declare const useGetEndpointsQuery: () => QueryObserverResult<t.TEndpointsConfig>;
39
+ export declare const useGetEndpointsQuery: <TData = t.TEndpointsConfig>(config?: UseQueryOptions<t.TEndpointsConfig, unknown, TData, import("@tanstack/react-query").QueryKey> | undefined) => QueryObserverResult<TData>;
40
40
  export declare const useGetModelsQuery: (config?: UseQueryOptions<t.TModelsConfig>) => QueryObserverResult<t.TModelsConfig>;
41
41
  export declare const useCreatePresetMutation: () => UseMutationResult<s.TPreset[], unknown, s.TPreset, unknown>;
42
42
  export declare const useUpdatePresetMutation: () => UseMutationResult<s.TPreset[], unknown, s.TPreset, unknown>;
package/types/types.d.ts CHANGED
@@ -101,7 +101,7 @@ export type TConfig = {
101
101
  availableModels?: [];
102
102
  userProvide?: boolean | null;
103
103
  availableTools?: [];
104
- plugins?: [];
104
+ plugins?: Record<string, string>;
105
105
  azure?: boolean;
106
106
  };
107
107
  export type TModelsConfig = Record<string, string[]>;
@@ -150,6 +150,7 @@ export type TStartupConfig = {
150
150
  socialLoginEnabled: boolean;
151
151
  emailEnabled: boolean;
152
152
  checkBalance: boolean;
153
+ customFooter?: string;
153
154
  };
154
155
  export type TRefreshTokenResponse = {
155
156
  token: string;