librechat-data-provider 0.2.0 → 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
@@ -94,49 +94,62 @@ var processQueue = function (error, token) {
94
94
  });
95
95
  failedQueue = [];
96
96
  };
97
- axios.interceptors.response.use(function (response) { return response; }, function (error) {
98
- var originalRequest = error.config;
99
- if (error.response.status === 401 && !originalRequest._retry) {
100
- if (isRefreshing) {
101
- return new Promise(function (resolve, reject) {
102
- failedQueue.push({ resolve: resolve, reject: reject });
103
- })
104
- .then(function (token) {
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, token, err_2;
99
+ var _a;
100
+ return __generator(this, function (_b) {
101
+ switch (_b.label) {
102
+ case 0:
103
+ originalRequest = error.config;
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;
108
+ case 1:
109
+ _b.trys.push([1, 4, , 5]);
110
+ return [4 /*yield*/, new Promise(function (resolve, reject) {
111
+ failedQueue.push({ resolve: resolve, reject: reject });
112
+ })];
113
+ case 2:
114
+ token = _b.sent();
105
115
  originalRequest.headers['Authorization'] = 'Bearer ' + token;
106
- return axios(originalRequest);
107
- })
108
- .catch(function (err) {
109
- return Promise.reject(err);
110
- });
111
- }
112
- originalRequest._retry = true;
113
- isRefreshing = true;
114
- return new Promise(function (resolve, reject) {
115
- refreshToken()
116
- .then(function (_a) {
117
- var token = _a.token;
118
- if (token) {
119
- originalRequest.headers['Authorization'] = 'Bearer ' + token;
120
- setTokenHeader(token);
121
- window.dispatchEvent(new CustomEvent('tokenUpdated', { detail: token }));
122
- processQueue(null, token);
123
- resolve(axios(originalRequest));
124
- }
125
- else {
126
- window.location.href = '/login';
127
- }
128
- })
129
- .catch(function (err) {
130
- processQueue(err, null);
131
- reject(err);
132
- })
133
- .then(function () {
116
+ return [4 /*yield*/, axios(originalRequest)];
117
+ case 3: return [2 /*return*/, _b.sent()];
118
+ case 4:
119
+ err_1 = _b.sent();
120
+ return [2 /*return*/, Promise.reject(err_1)];
121
+ case 5:
122
+ isRefreshing = true;
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:
134
147
  isRefreshing = false;
135
- });
136
- });
137
- }
138
- return Promise.reject(error);
139
- });
148
+ return [7 /*endfinally*/];
149
+ case 13: return [2 /*return*/, Promise.reject(error)];
150
+ }
151
+ });
152
+ }); });
140
153
  function _get(url, options) {
141
154
  return __awaiter(this, void 0, void 0, function () {
142
155
  var response;
@@ -273,7 +286,7 @@ var login$1 = function () { return '/api/auth/login'; };
273
286
  var logout$1 = function () { return '/api/auth/logout'; };
274
287
  var register$1 = function () { return '/api/auth/register'; };
275
288
  var loginGoogle = function () { return '/api/auth/google'; };
276
- var refreshToken$1 = function () { return '/api/auth/refresh'; };
289
+ var refreshToken$1 = function (retry) { return "/api/auth/refresh".concat(retry ? '?retry=true' : ''); };
277
290
  var requestPasswordReset$1 = function () { return '/api/auth/requestPasswordReset'; };
278
291
  var resetPassword$1 = function () { return '/api/auth/resetPassword'; };
279
292
  var plugins = function () { return '/api/plugins'; };
@@ -350,9 +363,11 @@ var searchConversations = function (q, pageNumber) { return __awaiter(void 0, vo
350
363
  var getAIEndpoints = function () {
351
364
  return request.get(aiEndpoints());
352
365
  };
353
- var getModels = function () {
354
- return request.get(models());
355
- };
366
+ var getModels = function () { return __awaiter(void 0, void 0, void 0, function () {
367
+ return __generator(this, function (_a) {
368
+ return [2 /*return*/, request.get(models())];
369
+ });
370
+ }); };
356
371
  var updateTokenCount = function (text) {
357
372
  return request.post(tokenizer(), { arg: text });
358
373
  };
@@ -365,7 +380,7 @@ var logout = function () {
365
380
  var register = function (payload) {
366
381
  return request.post(register$1(), payload);
367
382
  };
368
- var refreshToken = function () { return request.post(refreshToken$1()); };
383
+ var refreshToken = function (retry) { return request.post(refreshToken$1(retry)); };
369
384
  var userKeyQuery = function (name) {
370
385
  return request.get(userKeyQuery$1(name));
371
386
  };
@@ -702,7 +717,7 @@ var getResponseSender = function (endpointOption) {
702
717
 
703
718
  var QueryKeys;
704
719
  (function (QueryKeys) {
705
- QueryKeys["messages"] = "messsages";
720
+ QueryKeys["messages"] = "messages";
706
721
  QueryKeys["allConversations"] = "allConversations";
707
722
  QueryKeys["conversation"] = "conversation";
708
723
  QueryKeys["searchEnabled"] = "searchEnabled";
@@ -815,19 +830,11 @@ var useGetConversationsQuery = function (pageNumber, config) {
815
830
  var useGetSearchEnabledQuery = function (config) {
816
831
  return useQuery([QueryKeys.searchEnabled], function () { return getSearchEnabled(); }, __assign({ refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false }, config));
817
832
  };
818
- var useGetEndpointsQuery = function () {
819
- return useQuery([QueryKeys.endpoints], function () { return getAIEndpoints(); }, {
820
- refetchOnWindowFocus: false,
821
- refetchOnReconnect: false,
822
- refetchOnMount: false,
823
- });
833
+ var useGetEndpointsQuery = function (config) {
834
+ return useQuery([QueryKeys.endpoints], function () { return getAIEndpoints(); }, __assign({ refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false }, config));
824
835
  };
825
- var useGetModelsQuery = function () {
826
- return useQuery([QueryKeys.models], function () { return getModels(); }, {
827
- refetchOnWindowFocus: false,
828
- refetchOnReconnect: false,
829
- refetchOnMount: false,
830
- });
836
+ var useGetModelsQuery = function (config) {
837
+ return useQuery([QueryKeys.models], function () { return getModels(); }, __assign({ refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false }, config));
831
838
  };
832
839
  var useCreatePresetMutation = function () {
833
840
  var queryClient = useQueryClient();
@@ -1205,4 +1212,4 @@ function createPayload(submission) {
1205
1212
  return { server: server, payload: payload };
1206
1213
  }
1207
1214
 
1208
- export { EModelEndpoint, QueryKeys, SSE, abortRequestWithMessage, anthropicSchema, bingAISchema, chatGPTBrowserSchema, clearAllConversations, createPayload, createPreset, deleteConversation, deletePreset, eModelEndpointSchema, getAIEndpoints, getAvailablePlugins, getConversationById, getConversations, getLoginGoogle, getMessagesByConvoId, getModels, getPresets, getResponseSender, getSearchEnabled, getStartupConfig, getUser, getUserBalance, googleSchema, gptPluginsSchema, login, logout, openAISchema, parseConvo, refreshToken, register, requestPasswordReset, resetPassword, revokeAllUserKeys, revokeUserKey, searchConversations, setAcceptLanguageHeader, setTokenHeader, tAgentOptionsSchema, tConversationSchema, tExampleSchema, tMessageSchema, tPluginAuthConfigSchema, tPluginSchema, tPresetSchema, updateConversation, updateMessage, updatePreset, updateTokenCount, updateUserKey, updateUserPlugins, useAbortRequestWithMessage, useAvailablePluginsQuery, useClearConversationsMutation, useCreatePresetMutation, useDeleteConversationMutation, useDeletePresetMutation, useGetConversationByIdMutation, useGetConversationByIdQuery, useGetConversationsQuery, useGetEndpointsQuery, useGetMessagesByConvoId, useGetModelsQuery, useGetPresetsQuery, useGetSearchEnabledQuery, useGetStartupConfig, useGetUserBalance, useGetUserQuery, useLoginUserMutation, useLogoutUserMutation, useRefreshTokenMutation, useRegisterUserMutation, useRequestPasswordResetMutation, useResetPasswordMutation, useRevokeAllUserKeysMutation, useRevokeUserKeyMutation, useSearchQuery, useUpdateConversationMutation, useUpdateMessageMutation, useUpdatePresetMutation, useUpdateTokenCountMutation, useUpdateUserKeysMutation, useUpdateUserPluginsMutation, useUserKeyQuery, userKeyQuery };
1215
+ export { EModelEndpoint, QueryKeys, SSE, abortRequestWithMessage, anthropicSchema, bingAISchema, chatGPTBrowserSchema, clearAllConversations, createPayload, createPreset, deleteConversation, deletePreset, eModelEndpointSchema, getAIEndpoints, getAvailablePlugins, getConversationById, getConversations, getLoginGoogle, getMessagesByConvoId, getModels, getPresets, getResponseSender, getSearchEnabled, getStartupConfig, getUser, getUserBalance, googleSchema, gptPluginsSchema, login, logout, openAISchema, parseConvo, refreshToken, register, request, requestPasswordReset, resetPassword, revokeAllUserKeys, revokeUserKey, searchConversations, setAcceptLanguageHeader, setTokenHeader, tAgentOptionsSchema, tConversationSchema, tExampleSchema, tMessageSchema, tPluginAuthConfigSchema, tPluginSchema, tPresetSchema, updateConversation, updateMessage, updatePreset, updateTokenCount, updateUserKey, updateUserPlugins, useAbortRequestWithMessage, useAvailablePluginsQuery, useClearConversationsMutation, useCreatePresetMutation, useDeleteConversationMutation, useDeletePresetMutation, useGetConversationByIdMutation, useGetConversationByIdQuery, useGetConversationsQuery, useGetEndpointsQuery, useGetMessagesByConvoId, useGetModelsQuery, useGetPresetsQuery, useGetSearchEnabledQuery, useGetStartupConfig, useGetUserBalance, useGetUserQuery, useLoginUserMutation, useLogoutUserMutation, useRefreshTokenMutation, useRegisterUserMutation, useRequestPasswordResetMutation, useResetPasswordMutation, useRevokeAllUserKeysMutation, useRevokeUserKeyMutation, useSearchQuery, useUpdateConversationMutation, useUpdateMessageMutation, useUpdatePresetMutation, useUpdateTokenCountMutation, useUpdateUserKeysMutation, useUpdateUserPluginsMutation, useUserKeyQuery, userKeyQuery };
package/dist/index.js CHANGED
@@ -96,49 +96,62 @@ var processQueue = function (error, token) {
96
96
  });
97
97
  failedQueue = [];
98
98
  };
99
- axios.interceptors.response.use(function (response) { return response; }, function (error) {
100
- var originalRequest = error.config;
101
- if (error.response.status === 401 && !originalRequest._retry) {
102
- if (isRefreshing) {
103
- return new Promise(function (resolve, reject) {
104
- failedQueue.push({ resolve: resolve, reject: reject });
105
- })
106
- .then(function (token) {
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, token, err_2;
101
+ var _a;
102
+ return __generator(this, function (_b) {
103
+ switch (_b.label) {
104
+ case 0:
105
+ originalRequest = error.config;
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;
110
+ case 1:
111
+ _b.trys.push([1, 4, , 5]);
112
+ return [4 /*yield*/, new Promise(function (resolve, reject) {
113
+ failedQueue.push({ resolve: resolve, reject: reject });
114
+ })];
115
+ case 2:
116
+ token = _b.sent();
107
117
  originalRequest.headers['Authorization'] = 'Bearer ' + token;
108
- return axios(originalRequest);
109
- })
110
- .catch(function (err) {
111
- return Promise.reject(err);
112
- });
113
- }
114
- originalRequest._retry = true;
115
- isRefreshing = true;
116
- return new Promise(function (resolve, reject) {
117
- refreshToken()
118
- .then(function (_a) {
119
- var token = _a.token;
120
- if (token) {
121
- originalRequest.headers['Authorization'] = 'Bearer ' + token;
122
- setTokenHeader(token);
123
- window.dispatchEvent(new CustomEvent('tokenUpdated', { detail: token }));
124
- processQueue(null, token);
125
- resolve(axios(originalRequest));
126
- }
127
- else {
128
- window.location.href = '/login';
129
- }
130
- })
131
- .catch(function (err) {
132
- processQueue(err, null);
133
- reject(err);
134
- })
135
- .then(function () {
118
+ return [4 /*yield*/, axios(originalRequest)];
119
+ case 3: return [2 /*return*/, _b.sent()];
120
+ case 4:
121
+ err_1 = _b.sent();
122
+ return [2 /*return*/, Promise.reject(err_1)];
123
+ case 5:
124
+ isRefreshing = true;
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:
136
149
  isRefreshing = false;
137
- });
138
- });
139
- }
140
- return Promise.reject(error);
141
- });
150
+ return [7 /*endfinally*/];
151
+ case 13: return [2 /*return*/, Promise.reject(error)];
152
+ }
153
+ });
154
+ }); });
142
155
  function _get(url, options) {
143
156
  return __awaiter(this, void 0, void 0, function () {
144
157
  var response;
@@ -275,7 +288,7 @@ var login$1 = function () { return '/api/auth/login'; };
275
288
  var logout$1 = function () { return '/api/auth/logout'; };
276
289
  var register$1 = function () { return '/api/auth/register'; };
277
290
  var loginGoogle = function () { return '/api/auth/google'; };
278
- var refreshToken$1 = function () { return '/api/auth/refresh'; };
291
+ var refreshToken$1 = function (retry) { return "/api/auth/refresh".concat(retry ? '?retry=true' : ''); };
279
292
  var requestPasswordReset$1 = function () { return '/api/auth/requestPasswordReset'; };
280
293
  var resetPassword$1 = function () { return '/api/auth/resetPassword'; };
281
294
  var plugins = function () { return '/api/plugins'; };
@@ -352,9 +365,11 @@ var searchConversations = function (q, pageNumber) { return __awaiter(void 0, vo
352
365
  var getAIEndpoints = function () {
353
366
  return request.get(aiEndpoints());
354
367
  };
355
- var getModels = function () {
356
- return request.get(models());
357
- };
368
+ var getModels = function () { return __awaiter(void 0, void 0, void 0, function () {
369
+ return __generator(this, function (_a) {
370
+ return [2 /*return*/, request.get(models())];
371
+ });
372
+ }); };
358
373
  var updateTokenCount = function (text) {
359
374
  return request.post(tokenizer(), { arg: text });
360
375
  };
@@ -367,7 +382,7 @@ var logout = function () {
367
382
  var register = function (payload) {
368
383
  return request.post(register$1(), payload);
369
384
  };
370
- var refreshToken = function () { return request.post(refreshToken$1()); };
385
+ var refreshToken = function (retry) { return request.post(refreshToken$1(retry)); };
371
386
  var userKeyQuery = function (name) {
372
387
  return request.get(userKeyQuery$1(name));
373
388
  };
@@ -704,7 +719,7 @@ var getResponseSender = function (endpointOption) {
704
719
 
705
720
  exports.QueryKeys = void 0;
706
721
  (function (QueryKeys) {
707
- QueryKeys["messages"] = "messsages";
722
+ QueryKeys["messages"] = "messages";
708
723
  QueryKeys["allConversations"] = "allConversations";
709
724
  QueryKeys["conversation"] = "conversation";
710
725
  QueryKeys["searchEnabled"] = "searchEnabled";
@@ -817,19 +832,11 @@ var useGetConversationsQuery = function (pageNumber, config) {
817
832
  var useGetSearchEnabledQuery = function (config) {
818
833
  return reactQuery.useQuery([exports.QueryKeys.searchEnabled], function () { return getSearchEnabled(); }, __assign({ refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false }, config));
819
834
  };
820
- var useGetEndpointsQuery = function () {
821
- return reactQuery.useQuery([exports.QueryKeys.endpoints], function () { return getAIEndpoints(); }, {
822
- refetchOnWindowFocus: false,
823
- refetchOnReconnect: false,
824
- refetchOnMount: false,
825
- });
835
+ var useGetEndpointsQuery = function (config) {
836
+ return reactQuery.useQuery([exports.QueryKeys.endpoints], function () { return getAIEndpoints(); }, __assign({ refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false }, config));
826
837
  };
827
- var useGetModelsQuery = function () {
828
- return reactQuery.useQuery([exports.QueryKeys.models], function () { return getModels(); }, {
829
- refetchOnWindowFocus: false,
830
- refetchOnReconnect: false,
831
- refetchOnMount: false,
832
- });
838
+ var useGetModelsQuery = function (config) {
839
+ return reactQuery.useQuery([exports.QueryKeys.models], function () { return getModels(); }, __assign({ refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false }, config));
833
840
  };
834
841
  var useCreatePresetMutation = function () {
835
842
  var queryClient = reactQuery.useQueryClient();
@@ -1239,6 +1246,7 @@ exports.openAISchema = openAISchema;
1239
1246
  exports.parseConvo = parseConvo;
1240
1247
  exports.refreshToken = refreshToken;
1241
1248
  exports.register = register;
1249
+ exports.request = request;
1242
1250
  exports.requestPasswordReset = requestPasswordReset;
1243
1251
  exports.resetPassword = resetPassword;
1244
1252
  exports.revokeAllUserKeys = revokeAllUserKeys;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "librechat-data-provider",
3
- "version": "0.2.0",
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,11 +101,11 @@ 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
 
108
- export const getModels = () => {
108
+ export const getModels = async (): Promise<t.TModelsConfig> => {
109
109
  return request.get(endpoints.models());
110
110
  };
111
111
 
@@ -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));
package/src/index.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export * from './data-service';
2
- export * from './request';
2
+ export { default as request } from './request';
3
3
  export * from './types';
4
4
  export * from './react-query-service';
5
5
  export * from './headers-helpers';
@@ -11,7 +11,7 @@ import * as s from './schemas';
11
11
  import * as dataService from './data-service';
12
12
 
13
13
  export enum QueryKeys {
14
- messages = 'messsages',
14
+ messages = 'messages',
15
15
  allConversations = 'allConversations',
16
16
  conversation = 'conversation',
17
17
  searchEnabled = 'searchEnabled',
@@ -230,19 +230,29 @@ 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
- export const useGetModelsQuery = (): QueryObserverResult<t.TModelsConfig> => {
242
- return useQuery([QueryKeys.models], () => dataService.getModels(), {
248
+ export const useGetModelsQuery = (
249
+ config?: UseQueryOptions<t.TModelsConfig>,
250
+ ): QueryObserverResult<t.TModelsConfig> => {
251
+ return useQuery<t.TModelsConfig>([QueryKeys.models], () => dataService.getModels(), {
243
252
  refetchOnWindowFocus: false,
244
253
  refetchOnReconnect: false,
245
254
  refetchOnMount: false,
255
+ ...config,
246
256
  });
247
257
  };
248
258
 
package/src/request.ts CHANGED
@@ -21,47 +21,49 @@ const processQueue = (error: AxiosError | null, token: string | null = null) =>
21
21
 
22
22
  axios.interceptors.response.use(
23
23
  (response) => response,
24
- (error) => {
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
- return new Promise(function (resolve, reject) {
29
- failedQueue.push({ resolve, reject });
30
- })
31
- .then((token) => {
32
- originalRequest.headers['Authorization'] = 'Bearer ' + token;
33
- return axios(originalRequest);
34
- })
35
- .catch((err) => {
36
- return Promise.reject(err);
31
+ try {
32
+ const token = await new Promise((resolve, reject) => {
33
+ failedQueue.push({ resolve, reject });
37
34
  });
35
+ originalRequest.headers['Authorization'] = 'Bearer ' + token;
36
+ return await axios(originalRequest);
37
+ } catch (err) {
38
+ return Promise.reject(err);
39
+ }
38
40
  }
39
41
 
40
- originalRequest._retry = true;
41
42
  isRefreshing = true;
42
43
 
43
- return new Promise(function (resolve, reject) {
44
- refreshToken()
45
- .then(({ token }) => {
46
- if (token) {
47
- originalRequest.headers['Authorization'] = 'Bearer ' + token;
48
- setTokenHeader(token);
49
- window.dispatchEvent(new CustomEvent('tokenUpdated', { detail: token }));
50
- processQueue(null, token);
51
- resolve(axios(originalRequest));
52
- } else {
53
- window.location.href = '/login';
54
- }
55
- })
56
- .catch((err) => {
57
- processQueue(err, null);
58
- reject(err);
59
- })
60
- .then(() => {
61
- isRefreshing = false;
62
- });
63
- });
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
+ }
64
65
  }
66
+
65
67
  return Promise.reject(error);
66
68
  },
67
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>;
23
- export declare const getModels: () => Promise<unknown>;
22
+ export declare const getAIEndpoints: () => Promise<t.TEndpointsConfig>;
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>;
package/types/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export * from './data-service';
2
- export * from './request';
2
+ export { default as request } from './request';
3
3
  export * from './types';
4
4
  export * from './react-query-service';
5
5
  export * from './headers-helpers';
@@ -2,7 +2,7 @@ import { UseQueryOptions, UseMutationResult, QueryObserverResult } from '@tansta
2
2
  import * as t from './types';
3
3
  import * as s from './schemas';
4
4
  export declare enum QueryKeys {
5
- messages = "messsages",
5
+ messages = "messages",
6
6
  allConversations = "allConversations",
7
7
  conversation = "conversation",
8
8
  searchEnabled = "searchEnabled",
@@ -36,8 +36,8 @@ 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>;
40
- export declare const useGetModelsQuery: () => QueryObserverResult<t.TModelsConfig>;
39
+ export declare const useGetEndpointsQuery: <TData = t.TEndpointsConfig>(config?: UseQueryOptions<t.TEndpointsConfig, unknown, TData, import("@tanstack/react-query").QueryKey> | undefined) => QueryObserverResult<TData>;
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>;
43
43
  export declare const useGetPresetsQuery: (config?: UseQueryOptions<s.TPreset[]>) => QueryObserverResult<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;