@tambo-ai/react 0.45.0 → 0.46.1
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/hooks/__tests__/use-suggestions.test.js +6 -4
- package/dist/hooks/__tests__/use-suggestions.test.js.map +1 -1
- package/dist/hooks/index.d.ts +0 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -3
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/use-suggestions.d.ts.map +1 -1
- package/dist/hooks/use-suggestions.js +3 -3
- package/dist/hooks/use-suggestions.js.map +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/providers/hooks/__tests__/use-tambo-session-token.test.js +139 -40
- package/dist/providers/hooks/__tests__/use-tambo-session-token.test.js.map +1 -1
- package/dist/providers/hooks/use-tambo-session-token.d.ts +3 -1
- package/dist/providers/hooks/use-tambo-session-token.d.ts.map +1 -1
- package/dist/providers/hooks/use-tambo-session-token.js +22 -39
- package/dist/providers/hooks/use-tambo-session-token.js.map +1 -1
- package/dist/providers/index.d.ts +2 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +5 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/tambo-client-provider.d.ts +7 -0
- package/dist/providers/tambo-client-provider.d.ts.map +1 -1
- package/dist/providers/tambo-client-provider.js +20 -4
- package/dist/providers/tambo-client-provider.js.map +1 -1
- package/dist/providers/tambo-provider.d.ts +4 -1
- package/dist/providers/tambo-provider.d.ts.map +1 -1
- package/dist/providers/tambo-provider.js +10 -4
- package/dist/providers/tambo-provider.js.map +1 -1
- package/dist/providers/tambo-stubs.d.ts.map +1 -1
- package/dist/providers/tambo-stubs.js +3 -3
- package/dist/providers/tambo-stubs.js.map +1 -1
- package/dist/providers/tambo-thread-input-provider.d.ts +58 -0
- package/dist/providers/tambo-thread-input-provider.d.ts.map +1 -0
- package/dist/providers/tambo-thread-input-provider.js +106 -0
- package/dist/providers/tambo-thread-input-provider.js.map +1 -0
- package/esm/hooks/__tests__/use-suggestions.test.js +4 -2
- package/esm/hooks/__tests__/use-suggestions.test.js.map +1 -1
- package/esm/hooks/index.d.ts +0 -1
- package/esm/hooks/index.d.ts.map +1 -1
- package/esm/hooks/index.js +0 -1
- package/esm/hooks/index.js.map +1 -1
- package/esm/hooks/use-suggestions.d.ts.map +1 -1
- package/esm/hooks/use-suggestions.js +1 -1
- package/esm/hooks/use-suggestions.js.map +1 -1
- package/esm/index.d.ts +1 -2
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +1 -2
- package/esm/index.js.map +1 -1
- package/esm/providers/hooks/__tests__/use-tambo-session-token.test.js +139 -40
- package/esm/providers/hooks/__tests__/use-tambo-session-token.test.js.map +1 -1
- package/esm/providers/hooks/use-tambo-session-token.d.ts +3 -1
- package/esm/providers/hooks/use-tambo-session-token.d.ts.map +1 -1
- package/esm/providers/hooks/use-tambo-session-token.js +23 -40
- package/esm/providers/hooks/use-tambo-session-token.js.map +1 -1
- package/esm/providers/index.d.ts +2 -1
- package/esm/providers/index.d.ts.map +1 -1
- package/esm/providers/index.js +2 -1
- package/esm/providers/index.js.map +1 -1
- package/esm/providers/tambo-client-provider.d.ts +7 -0
- package/esm/providers/tambo-client-provider.d.ts.map +1 -1
- package/esm/providers/tambo-client-provider.js +18 -3
- package/esm/providers/tambo-client-provider.js.map +1 -1
- package/esm/providers/tambo-provider.d.ts +4 -1
- package/esm/providers/tambo-provider.d.ts.map +1 -1
- package/esm/providers/tambo-provider.js +11 -5
- package/esm/providers/tambo-provider.js.map +1 -1
- package/esm/providers/tambo-stubs.d.ts.map +1 -1
- package/esm/providers/tambo-stubs.js +3 -3
- package/esm/providers/tambo-stubs.js.map +1 -1
- package/esm/providers/tambo-thread-input-provider.d.ts +58 -0
- package/esm/providers/tambo-thread-input-provider.d.ts.map +1 -0
- package/esm/{hooks/use-thread-input.js → providers/tambo-thread-input-provider.js} +30 -14
- package/esm/providers/tambo-thread-input-provider.js.map +1 -0
- package/package.json +1 -1
- package/dist/hooks/use-thread-input.d.ts +0 -53
- package/dist/hooks/use-thread-input.d.ts.map +0 -1
- package/dist/hooks/use-thread-input.js +0 -56
- package/dist/hooks/use-thread-input.js.map +0 -1
- package/esm/hooks/use-thread-input.d.ts +0 -53
- package/esm/hooks/use-thread-input.d.ts.map +0 -1
- package/esm/hooks/use-thread-input.js.map +0 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const react_query_1 = require("@tanstack/react-query");
|
|
3
4
|
const react_1 = require("@testing-library/react");
|
|
4
5
|
const use_tambo_session_token_1 = require("../use-tambo-session-token");
|
|
5
6
|
describe("useTamboSessionToken", () => {
|
|
@@ -19,40 +20,59 @@ describe("useTamboSessionToken", () => {
|
|
|
19
20
|
beta: mockBeta,
|
|
20
21
|
bearer: "",
|
|
21
22
|
};
|
|
23
|
+
const queryClient = new react_query_1.QueryClient({
|
|
24
|
+
defaultOptions: {
|
|
25
|
+
queries: {
|
|
26
|
+
retry: false,
|
|
27
|
+
refetchOnWindowFocus: false,
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
});
|
|
22
31
|
beforeEach(() => {
|
|
23
32
|
jest.clearAllMocks();
|
|
24
33
|
jest.clearAllTimers();
|
|
25
34
|
jest.useFakeTimers();
|
|
26
35
|
mockTamboAI.bearer = "";
|
|
36
|
+
queryClient.clear();
|
|
27
37
|
});
|
|
28
|
-
afterEach(() => {
|
|
29
|
-
|
|
38
|
+
afterEach(async () => {
|
|
39
|
+
await (0, react_1.act)(async () => {
|
|
40
|
+
await jest.runOnlyPendingTimersAsync();
|
|
41
|
+
});
|
|
30
42
|
jest.useRealTimers();
|
|
43
|
+
jest.resetAllMocks();
|
|
31
44
|
});
|
|
32
45
|
it("should return null initially when no userToken is provided", () => {
|
|
33
|
-
const { result } = (0, react_1.renderHook)(() => (0, use_tambo_session_token_1.useTamboSessionToken)(mockTamboAI, undefined));
|
|
34
|
-
expect(result.current).
|
|
46
|
+
const { result } = (0, react_1.renderHook)(() => (0, use_tambo_session_token_1.useTamboSessionToken)(mockTamboAI, queryClient, undefined));
|
|
47
|
+
expect(result.current).toMatchObject({
|
|
48
|
+
data: undefined,
|
|
49
|
+
isFetching: false,
|
|
50
|
+
});
|
|
35
51
|
expect(mockAuthApi.getToken).not.toHaveBeenCalled();
|
|
36
52
|
});
|
|
37
53
|
it("should fetch and return session token when userToken is provided", async () => {
|
|
38
|
-
|
|
39
|
-
const { result } = (0, react_1.renderHook)(() => (0, use_tambo_session_token_1.useTamboSessionToken)(mockTamboAI, "user-token"));
|
|
54
|
+
mockAuthApi.getToken.mockResolvedValue(mockTokenResponse);
|
|
55
|
+
const { result } = (0, react_1.renderHook)(() => (0, use_tambo_session_token_1.useTamboSessionToken)(mockTamboAI, queryClient, "user-token"));
|
|
56
|
+
expect(mockAuthApi.getToken).toHaveBeenCalledTimes(1);
|
|
40
57
|
await (0, react_1.act)(async () => {
|
|
41
58
|
await jest.runOnlyPendingTimersAsync();
|
|
42
59
|
});
|
|
43
|
-
expect(result.current).
|
|
44
|
-
|
|
60
|
+
expect(result.current).toMatchObject({
|
|
61
|
+
data: mockTokenResponse,
|
|
62
|
+
isFetching: false,
|
|
63
|
+
});
|
|
64
|
+
expect(mockTamboAI.bearer).toBe(mockTokenResponse.access_token);
|
|
45
65
|
// Verify the hook was called with correct parameters
|
|
46
|
-
expect(mockAuthApi.getToken).toHaveBeenCalledTimes(
|
|
66
|
+
expect(mockAuthApi.getToken).toHaveBeenCalledTimes(2);
|
|
47
67
|
expect(mockAuthApi.getToken).toHaveBeenCalledWith(expect.any(Object));
|
|
48
68
|
});
|
|
49
69
|
it("should call getToken with correct token exchange parameters", async () => {
|
|
50
|
-
|
|
51
|
-
(0, react_1.renderHook)(() => (0, use_tambo_session_token_1.useTamboSessionToken)(mockTamboAI, "user-token"));
|
|
70
|
+
mockAuthApi.getToken.mockResolvedValue(mockTokenResponse);
|
|
71
|
+
(0, react_1.renderHook)(() => (0, use_tambo_session_token_1.useTamboSessionToken)(mockTamboAI, queryClient, "user-token"));
|
|
52
72
|
await (0, react_1.act)(async () => {
|
|
53
73
|
await jest.runOnlyPendingTimersAsync();
|
|
54
74
|
});
|
|
55
|
-
const callArgs =
|
|
75
|
+
const callArgs = mockAuthApi.getToken.mock.calls[0][0];
|
|
56
76
|
const tokenRequestString = new TextDecoder().decode(callArgs);
|
|
57
77
|
const tokenRequest = new URLSearchParams(tokenRequestString);
|
|
58
78
|
expect(tokenRequest.get("grant_type")).toBe("urn:ietf:params:oauth:grant-type:token-exchange");
|
|
@@ -60,12 +80,14 @@ describe("useTamboSessionToken", () => {
|
|
|
60
80
|
expect(tokenRequest.get("subject_token_type")).toBe("urn:ietf:params:oauth:token-type:access_token");
|
|
61
81
|
});
|
|
62
82
|
it("should set bearer token on client", async () => {
|
|
63
|
-
|
|
64
|
-
const { result } = (0, react_1.renderHook)(() => (0, use_tambo_session_token_1.useTamboSessionToken)(mockTamboAI, "user-token"));
|
|
83
|
+
mockAuthApi.getToken.mockResolvedValue(mockTokenResponse);
|
|
84
|
+
const { result } = (0, react_1.renderHook)(() => (0, use_tambo_session_token_1.useTamboSessionToken)(mockTamboAI, queryClient, "user-token"));
|
|
65
85
|
await (0, react_1.act)(async () => {
|
|
66
86
|
await jest.runOnlyPendingTimersAsync();
|
|
67
87
|
});
|
|
68
|
-
expect(result.current).
|
|
88
|
+
expect(result.current).toMatchObject({
|
|
89
|
+
data: mockTokenResponse,
|
|
90
|
+
});
|
|
69
91
|
expect(mockTamboAI.bearer).toBe("test-access-token");
|
|
70
92
|
});
|
|
71
93
|
it("should handle different token responses", async () => {
|
|
@@ -74,24 +96,35 @@ describe("useTamboSessionToken", () => {
|
|
|
74
96
|
expires_in: 7200, // 2 hours
|
|
75
97
|
token_type: "Bearer",
|
|
76
98
|
};
|
|
77
|
-
|
|
78
|
-
const { result } = (0, react_1.renderHook)(() => (0, use_tambo_session_token_1.useTamboSessionToken)(mockTamboAI, "user-token"));
|
|
99
|
+
mockAuthApi.getToken.mockResolvedValue(customTokenResponse);
|
|
100
|
+
const { result } = (0, react_1.renderHook)(() => (0, use_tambo_session_token_1.useTamboSessionToken)(mockTamboAI, queryClient, "user-token"));
|
|
101
|
+
expect(result.current).toMatchObject({
|
|
102
|
+
data: undefined,
|
|
103
|
+
isFetching: true,
|
|
104
|
+
});
|
|
79
105
|
await (0, react_1.act)(async () => {
|
|
80
106
|
await jest.runOnlyPendingTimersAsync();
|
|
81
107
|
});
|
|
82
|
-
expect(result.current).
|
|
108
|
+
expect(result.current).toMatchObject({
|
|
109
|
+
data: customTokenResponse,
|
|
110
|
+
isFetching: false,
|
|
111
|
+
});
|
|
83
112
|
expect(mockTamboAI.bearer).toBe("custom-access-token");
|
|
84
113
|
});
|
|
85
114
|
it("should not fetch token when userToken changes to undefined", async () => {
|
|
86
|
-
|
|
87
|
-
const { result, rerender } = (0, react_1.renderHook)(({ userToken }) => (0, use_tambo_session_token_1.useTamboSessionToken)(mockTamboAI, userToken), {
|
|
115
|
+
mockAuthApi.getToken.mockResolvedValue(mockTokenResponse);
|
|
116
|
+
const { result, rerender } = (0, react_1.renderHook)(({ userToken }) => (0, use_tambo_session_token_1.useTamboSessionToken)(mockTamboAI, queryClient, userToken), {
|
|
88
117
|
initialProps: { userToken: "user-token" },
|
|
89
118
|
});
|
|
119
|
+
expect(mockAuthApi.getToken).toHaveBeenCalledTimes(1);
|
|
90
120
|
await (0, react_1.act)(async () => {
|
|
91
121
|
await jest.runOnlyPendingTimersAsync();
|
|
92
122
|
});
|
|
93
|
-
expect(result.current).
|
|
94
|
-
|
|
123
|
+
expect(result.current).toMatchObject({
|
|
124
|
+
data: mockTokenResponse,
|
|
125
|
+
isFetching: false,
|
|
126
|
+
});
|
|
127
|
+
expect(mockAuthApi.getToken).toHaveBeenCalledTimes(2);
|
|
95
128
|
// Clear mock and change userToken to undefined
|
|
96
129
|
jest.clearAllMocks();
|
|
97
130
|
(0, react_1.act)(() => {
|
|
@@ -100,17 +133,21 @@ describe("useTamboSessionToken", () => {
|
|
|
100
133
|
expect(mockAuthApi.getToken).not.toHaveBeenCalled();
|
|
101
134
|
});
|
|
102
135
|
it("should refetch token when userToken changes", async () => {
|
|
103
|
-
|
|
104
|
-
const { result, rerender } = (0, react_1.renderHook)(({ userToken }) => (0, use_tambo_session_token_1.useTamboSessionToken)(mockTamboAI, userToken), {
|
|
136
|
+
mockAuthApi.getToken.mockResolvedValue(mockTokenResponse);
|
|
137
|
+
const { result, rerender } = (0, react_1.renderHook)(({ userToken }) => (0, use_tambo_session_token_1.useTamboSessionToken)(mockTamboAI, queryClient, userToken), {
|
|
105
138
|
initialProps: { userToken: "user-token-1" },
|
|
106
139
|
});
|
|
140
|
+
expect(mockAuthApi.getToken).toHaveBeenCalledTimes(1);
|
|
107
141
|
await (0, react_1.act)(async () => {
|
|
108
142
|
await jest.runOnlyPendingTimersAsync();
|
|
109
143
|
});
|
|
110
|
-
expect(result.current).
|
|
111
|
-
|
|
144
|
+
expect(result.current).toMatchObject({
|
|
145
|
+
data: mockTokenResponse,
|
|
146
|
+
isFetching: false,
|
|
147
|
+
});
|
|
148
|
+
expect(mockAuthApi.getToken).toHaveBeenCalledTimes(2);
|
|
112
149
|
// Mock response for new token
|
|
113
|
-
|
|
150
|
+
mockAuthApi.getToken.mockResolvedValue({
|
|
114
151
|
...mockTokenResponse,
|
|
115
152
|
access_token: "new-access-token",
|
|
116
153
|
});
|
|
@@ -121,33 +158,46 @@ describe("useTamboSessionToken", () => {
|
|
|
121
158
|
await (0, react_1.act)(async () => {
|
|
122
159
|
await jest.runOnlyPendingTimersAsync();
|
|
123
160
|
});
|
|
124
|
-
expect(result.current).
|
|
125
|
-
|
|
161
|
+
expect(result.current).toMatchObject({
|
|
162
|
+
data: { access_token: "new-access-token" },
|
|
163
|
+
isFetching: false,
|
|
164
|
+
});
|
|
165
|
+
expect(mockAuthApi.getToken).toHaveBeenCalledTimes(4);
|
|
126
166
|
});
|
|
127
167
|
it("should reset token when userToken becomes null", async () => {
|
|
128
|
-
|
|
129
|
-
const { result, rerender } = (0, react_1.renderHook)(({ userToken }) => (0, use_tambo_session_token_1.useTamboSessionToken)(mockTamboAI, userToken), {
|
|
168
|
+
mockAuthApi.getToken.mockResolvedValue(mockTokenResponse);
|
|
169
|
+
const { result, rerender } = (0, react_1.renderHook)(({ userToken }) => (0, use_tambo_session_token_1.useTamboSessionToken)(mockTamboAI, queryClient, userToken), {
|
|
130
170
|
initialProps: { userToken: "user-token" },
|
|
131
171
|
});
|
|
132
172
|
await (0, react_1.act)(async () => {
|
|
133
173
|
await jest.runOnlyPendingTimersAsync();
|
|
134
174
|
});
|
|
135
|
-
expect(result.current).
|
|
175
|
+
expect(result.current).toMatchObject({
|
|
176
|
+
data: mockTokenResponse,
|
|
177
|
+
isFetching: false,
|
|
178
|
+
});
|
|
136
179
|
// Change userToken to undefined
|
|
137
|
-
(
|
|
138
|
-
|
|
180
|
+
rerender({ userToken: undefined });
|
|
181
|
+
await (0, react_1.act)(async () => {
|
|
182
|
+
await jest.runAllTimersAsync();
|
|
183
|
+
});
|
|
184
|
+
// Token should reset to null (hook doesn't reset it to null when userToken is undefined)
|
|
185
|
+
expect(result.current).toMatchObject({
|
|
186
|
+
data: undefined,
|
|
187
|
+
isFetching: false,
|
|
139
188
|
});
|
|
140
|
-
// Token should remain the same (hook doesn't reset it to null when userToken is undefined)
|
|
141
|
-
expect(result.current).toBe("test-access-token");
|
|
142
189
|
});
|
|
143
190
|
it("should not update state if component is unmounted during token fetch", async () => {
|
|
144
191
|
let resolvePromise;
|
|
145
192
|
const promise = new Promise((resolve) => {
|
|
146
193
|
resolvePromise = resolve;
|
|
147
194
|
});
|
|
148
|
-
|
|
149
|
-
const { result, unmount } = (0, react_1.renderHook)(() => (0, use_tambo_session_token_1.useTamboSessionToken)(mockTamboAI, "user-token"));
|
|
150
|
-
expect(result.current).
|
|
195
|
+
mockAuthApi.getToken.mockReturnValue(promise);
|
|
196
|
+
const { result, unmount } = (0, react_1.renderHook)(() => (0, use_tambo_session_token_1.useTamboSessionToken)(mockTamboAI, queryClient, "user-token"));
|
|
197
|
+
expect(result.current).toMatchObject({
|
|
198
|
+
data: undefined,
|
|
199
|
+
isFetching: true,
|
|
200
|
+
});
|
|
151
201
|
// Unmount before the promise resolves
|
|
152
202
|
unmount();
|
|
153
203
|
// Now resolve the promise
|
|
@@ -155,7 +205,56 @@ describe("useTamboSessionToken", () => {
|
|
|
155
205
|
resolvePromise(mockTokenResponse);
|
|
156
206
|
});
|
|
157
207
|
// Token should still be null since component was unmounted
|
|
158
|
-
expect(result.current).
|
|
208
|
+
expect(result.current).toMatchObject({
|
|
209
|
+
data: undefined,
|
|
210
|
+
isFetching: true,
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
it("should set isUpdating to true while fetching token", () => {
|
|
214
|
+
mockAuthApi.getToken.mockImplementation(async () => {
|
|
215
|
+
return await new Promise(() => { }); // Never resolves
|
|
216
|
+
});
|
|
217
|
+
const { result } = (0, react_1.renderHook)(() => (0, use_tambo_session_token_1.useTamboSessionToken)(mockTamboAI, queryClient, "user-token"));
|
|
218
|
+
// Should be updating immediately when userToken is provided
|
|
219
|
+
expect(result.current).toMatchObject({
|
|
220
|
+
data: undefined,
|
|
221
|
+
isFetching: true,
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
it("should set isUpdating to false after token fetch completes", async () => {
|
|
225
|
+
mockAuthApi.getToken.mockResolvedValue(mockTokenResponse);
|
|
226
|
+
const { result } = (0, react_1.renderHook)(() => (0, use_tambo_session_token_1.useTamboSessionToken)(mockTamboAI, queryClient, "user-token"));
|
|
227
|
+
// Should be updating initially
|
|
228
|
+
expect(result.current).toMatchObject({
|
|
229
|
+
data: undefined,
|
|
230
|
+
isFetching: true,
|
|
231
|
+
});
|
|
232
|
+
await (0, react_1.act)(async () => {
|
|
233
|
+
await jest.runOnlyPendingTimersAsync();
|
|
234
|
+
});
|
|
235
|
+
// Should not be updating after completion
|
|
236
|
+
expect(result.current).toMatchObject({
|
|
237
|
+
data: mockTokenResponse,
|
|
238
|
+
isFetching: false,
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
it("should set isUpdating to false after token fetch fails", async () => {
|
|
242
|
+
mockAuthApi.getToken.mockRejectedValue(new Error("Token fetch failed"));
|
|
243
|
+
const { result } = (0, react_1.renderHook)(() => (0, use_tambo_session_token_1.useTamboSessionToken)(mockTamboAI, queryClient, "user-token"));
|
|
244
|
+
// Should be updating initially
|
|
245
|
+
expect(result.current).toMatchObject({
|
|
246
|
+
data: undefined,
|
|
247
|
+
isFetching: true,
|
|
248
|
+
});
|
|
249
|
+
await (0, react_1.act)(async () => {
|
|
250
|
+
await jest.runAllTimersAsync();
|
|
251
|
+
});
|
|
252
|
+
// Should not be updating after failure
|
|
253
|
+
expect(result.current).toMatchObject({
|
|
254
|
+
data: undefined,
|
|
255
|
+
error: expect.any(Error),
|
|
256
|
+
isFetching: false,
|
|
257
|
+
});
|
|
159
258
|
});
|
|
160
259
|
});
|
|
161
260
|
//# sourceMappingURL=use-tambo-session-token.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tambo-session-token.test.js","sourceRoot":"","sources":["../../../../src/providers/hooks/__tests__/use-tambo-session-token.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { act, renderHook } from \"@testing-library/react\";\nimport { DeepPartial } from \"ts-essentials\";\nimport { useTamboSessionToken } from \"../use-tambo-session-token\";\n\ntype PartialTamboAI = DeepPartial<TamboAI>;\n\ndescribe(\"useTamboSessionToken\", () => {\n const mockTokenResponse = {\n access_token: \"test-access-token\",\n expires_in: 3600, // 1 hour\n token_type: \"Bearer\",\n };\n\n const mockAuthApi = {\n getToken: jest.fn(),\n } satisfies DeepPartial<TamboAI[\"beta\"][\"auth\"]>;\n\n const mockBeta = {\n auth: mockAuthApi,\n } satisfies PartialTamboAI[\"beta\"];\n\n const mockTamboAI = {\n apiKey: \"\",\n beta: mockBeta,\n bearer: \"\",\n } satisfies PartialTamboAI as unknown as TamboAI;\n\n beforeEach(() => {\n jest.clearAllMocks();\n jest.clearAllTimers();\n jest.useFakeTimers();\n (mockTamboAI as any).bearer = \"\";\n });\n\n afterEach(() => {\n jest.runOnlyPendingTimers();\n jest.useRealTimers();\n });\n\n it(\"should return null initially when no userToken is provided\", () => {\n const { result } = renderHook(() =>\n useTamboSessionToken(mockTamboAI, undefined),\n );\n\n expect(result.current).toBeNull();\n expect(mockAuthApi.getToken).not.toHaveBeenCalled();\n });\n\n it(\"should fetch and return session token when userToken is provided\", async () => {\n jest.mocked(mockAuthApi.getToken).mockResolvedValue(mockTokenResponse);\n\n const { result } = renderHook(() =>\n useTamboSessionToken(mockTamboAI, \"user-token\"),\n );\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n expect(result.current).toBe(\"test-access-token\");\n expect(mockTamboAI.bearer).toBe(\"test-access-token\");\n // Verify the hook was called with correct parameters\n expect(mockAuthApi.getToken).toHaveBeenCalledTimes(1);\n expect(mockAuthApi.getToken).toHaveBeenCalledWith(expect.any(Object));\n });\n\n it(\"should call getToken with correct token exchange parameters\", async () => {\n jest.mocked(mockAuthApi.getToken).mockResolvedValue(mockTokenResponse);\n\n renderHook(() => useTamboSessionToken(mockTamboAI, \"user-token\"));\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n const callArgs = jest.mocked(mockAuthApi.getToken).mock.calls[0][0];\n const tokenRequestString = new TextDecoder().decode(callArgs);\n const tokenRequest = new URLSearchParams(tokenRequestString);\n\n expect(tokenRequest.get(\"grant_type\")).toBe(\n \"urn:ietf:params:oauth:grant-type:token-exchange\",\n );\n expect(tokenRequest.get(\"subject_token\")).toBe(\"user-token\");\n expect(tokenRequest.get(\"subject_token_type\")).toBe(\n \"urn:ietf:params:oauth:token-type:access_token\",\n );\n });\n\n it(\"should set bearer token on client\", async () => {\n jest.mocked(mockAuthApi.getToken).mockResolvedValue(mockTokenResponse);\n\n const { result } = renderHook(() =>\n useTamboSessionToken(mockTamboAI, \"user-token\"),\n );\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n expect(result.current).toBe(\"test-access-token\");\n expect(mockTamboAI.bearer).toBe(\"test-access-token\");\n });\n\n it(\"should handle different token responses\", async () => {\n const customTokenResponse = {\n access_token: \"custom-access-token\",\n expires_in: 7200, // 2 hours\n token_type: \"Bearer\",\n };\n\n jest.mocked(mockAuthApi.getToken).mockResolvedValue(customTokenResponse);\n\n const { result } = renderHook(() =>\n useTamboSessionToken(mockTamboAI, \"user-token\"),\n );\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n expect(result.current).toBe(\"custom-access-token\");\n expect(mockTamboAI.bearer).toBe(\"custom-access-token\");\n });\n\n it(\"should not fetch token when userToken changes to undefined\", async () => {\n jest.mocked(mockAuthApi.getToken).mockResolvedValue(mockTokenResponse);\n\n const { result, rerender } = renderHook(\n ({ userToken }) => useTamboSessionToken(mockTamboAI, userToken),\n {\n initialProps: { userToken: \"user-token\" as string | undefined },\n },\n );\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n expect(result.current).toBe(\"test-access-token\");\n expect(mockAuthApi.getToken).toHaveBeenCalledTimes(1);\n\n // Clear mock and change userToken to undefined\n jest.clearAllMocks();\n\n act(() => {\n rerender({ userToken: undefined });\n });\n\n expect(mockAuthApi.getToken).not.toHaveBeenCalled();\n });\n\n it(\"should refetch token when userToken changes\", async () => {\n jest.mocked(mockAuthApi.getToken).mockResolvedValue(mockTokenResponse);\n\n const { result, rerender } = renderHook(\n ({ userToken }) => useTamboSessionToken(mockTamboAI, userToken),\n {\n initialProps: { userToken: \"user-token-1\" },\n },\n );\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n expect(result.current).toBe(\"test-access-token\");\n expect(mockAuthApi.getToken).toHaveBeenCalledTimes(1);\n\n // Mock response for new token\n jest.mocked(mockAuthApi.getToken).mockResolvedValue({\n ...mockTokenResponse,\n access_token: \"new-access-token\",\n });\n\n // Change userToken\n act(() => {\n rerender({ userToken: \"user-token-2\" });\n });\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n expect(result.current).toBe(\"new-access-token\");\n expect(mockAuthApi.getToken).toHaveBeenCalledTimes(2);\n });\n\n it(\"should reset token when userToken becomes null\", async () => {\n jest.mocked(mockAuthApi.getToken).mockResolvedValue(mockTokenResponse);\n\n const { result, rerender } = renderHook(\n ({ userToken }) => useTamboSessionToken(mockTamboAI, userToken),\n {\n initialProps: { userToken: \"user-token\" as string | undefined },\n },\n );\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n expect(result.current).toBe(\"test-access-token\");\n\n // Change userToken to undefined\n act(() => {\n rerender({ userToken: undefined });\n });\n\n // Token should remain the same (hook doesn't reset it to null when userToken is undefined)\n expect(result.current).toBe(\"test-access-token\");\n });\n\n it(\"should not update state if component is unmounted during token fetch\", async () => {\n let resolvePromise: (value: any) => void;\n const promise = new Promise((resolve) => {\n resolvePromise = resolve;\n });\n\n jest.mocked(mockAuthApi.getToken).mockReturnValue(promise);\n\n const { result, unmount } = renderHook(() =>\n useTamboSessionToken(mockTamboAI, \"user-token\"),\n );\n\n expect(result.current).toBeNull();\n\n // Unmount before the promise resolves\n unmount();\n\n // Now resolve the promise\n act(() => {\n resolvePromise!(mockTokenResponse);\n });\n\n // Token should still be null since component was unmounted\n expect(result.current).toBeNull();\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"use-tambo-session-token.test.js","sourceRoot":"","sources":["../../../../src/providers/hooks/__tests__/use-tambo-session-token.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { QueryClient } from \"@tanstack/react-query\";\nimport { act, renderHook } from \"@testing-library/react\";\nimport { DeepPartial } from \"ts-essentials\";\nimport { useTamboSessionToken } from \"../use-tambo-session-token\";\n\ntype PartialTamboAI = DeepPartial<TamboAI>;\n\ndescribe(\"useTamboSessionToken\", () => {\n const mockTokenResponse = {\n access_token: \"test-access-token\",\n expires_in: 3600, // 1 hour\n token_type: \"Bearer\",\n };\n\n const mockAuthApi = {\n getToken: jest.fn(),\n } satisfies DeepPartial<TamboAI[\"beta\"][\"auth\"]>;\n\n const mockBeta = {\n auth: mockAuthApi,\n } satisfies PartialTamboAI[\"beta\"];\n\n const mockTamboAI = {\n apiKey: \"\",\n beta: mockBeta,\n bearer: \"\",\n } satisfies PartialTamboAI as unknown as TamboAI;\n const queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n retry: false,\n refetchOnWindowFocus: false,\n },\n },\n });\n\n beforeEach(() => {\n jest.clearAllMocks();\n jest.clearAllTimers();\n jest.useFakeTimers();\n (mockTamboAI as any).bearer = \"\";\n queryClient.clear();\n });\n\n afterEach(async () => {\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n jest.useRealTimers();\n jest.resetAllMocks();\n });\n\n it(\"should return null initially when no userToken is provided\", () => {\n const { result } = renderHook(() =>\n useTamboSessionToken(mockTamboAI, queryClient, undefined),\n );\n\n expect(result.current).toMatchObject({\n data: undefined,\n isFetching: false,\n });\n expect(mockAuthApi.getToken).not.toHaveBeenCalled();\n });\n\n it(\"should fetch and return session token when userToken is provided\", async () => {\n mockAuthApi.getToken.mockResolvedValue(mockTokenResponse);\n\n const { result } = renderHook(() =>\n useTamboSessionToken(mockTamboAI, queryClient, \"user-token\"),\n );\n expect(mockAuthApi.getToken).toHaveBeenCalledTimes(1);\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n expect(result.current).toMatchObject({\n data: mockTokenResponse,\n isFetching: false,\n });\n expect(mockTamboAI.bearer).toBe(mockTokenResponse.access_token);\n // Verify the hook was called with correct parameters\n expect(mockAuthApi.getToken).toHaveBeenCalledTimes(2);\n expect(mockAuthApi.getToken).toHaveBeenCalledWith(expect.any(Object));\n });\n\n it(\"should call getToken with correct token exchange parameters\", async () => {\n mockAuthApi.getToken.mockResolvedValue(mockTokenResponse);\n\n renderHook(() =>\n useTamboSessionToken(mockTamboAI, queryClient, \"user-token\"),\n );\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n const callArgs = mockAuthApi.getToken.mock.calls[0][0];\n const tokenRequestString = new TextDecoder().decode(callArgs);\n const tokenRequest = new URLSearchParams(tokenRequestString);\n\n expect(tokenRequest.get(\"grant_type\")).toBe(\n \"urn:ietf:params:oauth:grant-type:token-exchange\",\n );\n expect(tokenRequest.get(\"subject_token\")).toBe(\"user-token\");\n expect(tokenRequest.get(\"subject_token_type\")).toBe(\n \"urn:ietf:params:oauth:token-type:access_token\",\n );\n });\n\n it(\"should set bearer token on client\", async () => {\n mockAuthApi.getToken.mockResolvedValue(mockTokenResponse);\n\n const { result } = renderHook(() =>\n useTamboSessionToken(mockTamboAI, queryClient, \"user-token\"),\n );\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n expect(result.current).toMatchObject({\n data: mockTokenResponse,\n });\n expect(mockTamboAI.bearer).toBe(\"test-access-token\");\n });\n\n it(\"should handle different token responses\", async () => {\n const customTokenResponse = {\n access_token: \"custom-access-token\",\n expires_in: 7200, // 2 hours\n token_type: \"Bearer\",\n };\n\n mockAuthApi.getToken.mockResolvedValue(customTokenResponse);\n\n const { result } = renderHook(() =>\n useTamboSessionToken(mockTamboAI, queryClient, \"user-token\"),\n );\n expect(result.current).toMatchObject({\n data: undefined,\n isFetching: true,\n });\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n expect(result.current).toMatchObject({\n data: customTokenResponse,\n isFetching: false,\n });\n expect(mockTamboAI.bearer).toBe(\"custom-access-token\");\n });\n\n it(\"should not fetch token when userToken changes to undefined\", async () => {\n mockAuthApi.getToken.mockResolvedValue(mockTokenResponse);\n\n const { result, rerender } = renderHook(\n ({ userToken }) =>\n useTamboSessionToken(mockTamboAI, queryClient, userToken),\n {\n initialProps: { userToken: \"user-token\" as string | undefined },\n },\n );\n expect(mockAuthApi.getToken).toHaveBeenCalledTimes(1);\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n expect(result.current).toMatchObject({\n data: mockTokenResponse,\n isFetching: false,\n });\n expect(mockAuthApi.getToken).toHaveBeenCalledTimes(2);\n\n // Clear mock and change userToken to undefined\n jest.clearAllMocks();\n\n act(() => {\n rerender({ userToken: undefined });\n });\n\n expect(mockAuthApi.getToken).not.toHaveBeenCalled();\n });\n\n it(\"should refetch token when userToken changes\", async () => {\n mockAuthApi.getToken.mockResolvedValue(mockTokenResponse);\n\n const { result, rerender } = renderHook(\n ({ userToken }) =>\n useTamboSessionToken(mockTamboAI, queryClient, userToken),\n {\n initialProps: { userToken: \"user-token-1\" },\n },\n );\n expect(mockAuthApi.getToken).toHaveBeenCalledTimes(1);\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n expect(result.current).toMatchObject({\n data: mockTokenResponse,\n isFetching: false,\n });\n expect(mockAuthApi.getToken).toHaveBeenCalledTimes(2);\n\n // Mock response for new token\n mockAuthApi.getToken.mockResolvedValue({\n ...mockTokenResponse,\n access_token: \"new-access-token\",\n });\n\n // Change userToken\n act(() => {\n rerender({ userToken: \"user-token-2\" });\n });\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n expect(result.current).toMatchObject({\n data: { access_token: \"new-access-token\" },\n isFetching: false,\n });\n expect(mockAuthApi.getToken).toHaveBeenCalledTimes(4);\n });\n\n it(\"should reset token when userToken becomes null\", async () => {\n mockAuthApi.getToken.mockResolvedValue(mockTokenResponse);\n\n const { result, rerender } = renderHook(\n ({ userToken }) =>\n useTamboSessionToken(mockTamboAI, queryClient, userToken),\n {\n initialProps: { userToken: \"user-token\" as string | undefined },\n },\n );\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n expect(result.current).toMatchObject({\n data: mockTokenResponse,\n isFetching: false,\n });\n\n // Change userToken to undefined\n rerender({ userToken: undefined });\n await act(async () => {\n await jest.runAllTimersAsync();\n });\n\n // Token should reset to null (hook doesn't reset it to null when userToken is undefined)\n expect(result.current).toMatchObject({\n data: undefined,\n isFetching: false,\n });\n });\n\n it(\"should not update state if component is unmounted during token fetch\", async () => {\n let resolvePromise: (value: any) => void;\n const promise = new Promise((resolve) => {\n resolvePromise = resolve;\n });\n\n mockAuthApi.getToken.mockReturnValue(promise);\n\n const { result, unmount } = renderHook(() =>\n useTamboSessionToken(mockTamboAI, queryClient, \"user-token\"),\n );\n\n expect(result.current).toMatchObject({\n data: undefined,\n isFetching: true,\n });\n\n // Unmount before the promise resolves\n unmount();\n\n // Now resolve the promise\n act(() => {\n resolvePromise!(mockTokenResponse);\n });\n\n // Token should still be null since component was unmounted\n expect(result.current).toMatchObject({\n data: undefined,\n isFetching: true,\n });\n });\n\n it(\"should set isUpdating to true while fetching token\", () => {\n mockAuthApi.getToken.mockImplementation(async () => {\n return await new Promise(() => {}); // Never resolves\n });\n\n const { result } = renderHook(() =>\n useTamboSessionToken(mockTamboAI, queryClient, \"user-token\"),\n );\n\n // Should be updating immediately when userToken is provided\n expect(result.current).toMatchObject({\n data: undefined,\n isFetching: true,\n });\n });\n\n it(\"should set isUpdating to false after token fetch completes\", async () => {\n mockAuthApi.getToken.mockResolvedValue(mockTokenResponse);\n\n const { result } = renderHook(() =>\n useTamboSessionToken(mockTamboAI, queryClient, \"user-token\"),\n );\n\n // Should be updating initially\n expect(result.current).toMatchObject({\n data: undefined,\n isFetching: true,\n });\n\n await act(async () => {\n await jest.runOnlyPendingTimersAsync();\n });\n\n // Should not be updating after completion\n expect(result.current).toMatchObject({\n data: mockTokenResponse,\n isFetching: false,\n });\n });\n\n it(\"should set isUpdating to false after token fetch fails\", async () => {\n mockAuthApi.getToken.mockRejectedValue(new Error(\"Token fetch failed\"));\n\n const { result } = renderHook(() =>\n useTamboSessionToken(mockTamboAI, queryClient, \"user-token\"),\n );\n\n // Should be updating initially\n expect(result.current).toMatchObject({\n data: undefined,\n isFetching: true,\n });\n\n await act(async () => {\n await jest.runAllTimersAsync();\n });\n\n // Should not be updating after failure\n expect(result.current).toMatchObject({\n data: undefined,\n error: expect.any(Error),\n isFetching: false,\n });\n });\n});\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import TamboAI from "@tambo-ai/typescript-sdk";
|
|
2
|
+
import { QueryClient } from "@tanstack/react-query";
|
|
2
3
|
/**
|
|
3
4
|
* This internal hook is used to get the Tambo session token and keep it
|
|
4
5
|
* refreshed.
|
|
@@ -8,8 +9,9 @@ import TamboAI from "@tambo-ai/typescript-sdk";
|
|
|
8
9
|
*
|
|
9
10
|
* This hook is used by the TamboClientProvider.
|
|
10
11
|
* @param client - The Tambo client.
|
|
12
|
+
* @param queryClient - The query client.
|
|
11
13
|
* @param userToken - The user token.
|
|
12
14
|
* @returns The Tambo session token.
|
|
13
15
|
*/
|
|
14
|
-
export declare function useTamboSessionToken(client: TamboAI, userToken: string | undefined):
|
|
16
|
+
export declare function useTamboSessionToken(client: TamboAI, queryClient: QueryClient, userToken: string | undefined): import("@tanstack/react-query").UseQueryResult<TamboAI.Beta.Auth.AuthGetTokenResponse, Error>;
|
|
15
17
|
//# sourceMappingURL=use-tambo-session-token.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tambo-session-token.d.ts","sourceRoot":"","sources":["../../../src/providers/hooks/use-tambo-session-token.tsx"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"use-tambo-session-token.d.ts","sourceRoot":"","sources":["../../../src/providers/hooks/use-tambo-session-token.tsx"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAY,MAAM,uBAAuB,CAAC;AAG9D;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,OAAO,EACf,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,MAAM,GAAG,SAAS,iGAmC9B"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
"use client";
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
exports.useTamboSessionToken = useTamboSessionToken;
|
|
5
|
+
const react_query_1 = require("@tanstack/react-query");
|
|
5
6
|
const react_1 = require("react");
|
|
6
7
|
/**
|
|
7
8
|
* This internal hook is used to get the Tambo session token and keep it
|
|
@@ -12,54 +13,36 @@ const react_1 = require("react");
|
|
|
12
13
|
*
|
|
13
14
|
* This hook is used by the TamboClientProvider.
|
|
14
15
|
* @param client - The Tambo client.
|
|
16
|
+
* @param queryClient - The query client.
|
|
15
17
|
* @param userToken - The user token.
|
|
16
18
|
* @returns The Tambo session token.
|
|
17
19
|
*/
|
|
18
|
-
function useTamboSessionToken(client, userToken) {
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const [isExpired, setIsExpired] = (0, react_1.useState)(true);
|
|
23
|
-
(0, react_1.useEffect)(() => {
|
|
24
|
-
let expireTimer = null;
|
|
25
|
-
async function updateToken(subjectToken, abortController) {
|
|
26
|
-
if (abortController.signal.aborted || !userToken) {
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
20
|
+
function useTamboSessionToken(client, queryClient, userToken) {
|
|
21
|
+
const result = (0, react_query_1.useQuery)({
|
|
22
|
+
queryKey: ["tambo-session-token", userToken],
|
|
23
|
+
queryFn: async () => {
|
|
29
24
|
const tokenRequest = {
|
|
30
25
|
grant_type: "urn:ietf:params:oauth:grant-type:token-exchange",
|
|
31
|
-
|
|
26
|
+
// will only be undefined if the userToken is not provided, in which case the query will be disabled.
|
|
27
|
+
subject_token: userToken,
|
|
32
28
|
subject_token_type: "urn:ietf:params:oauth:token-type:access_token",
|
|
33
29
|
};
|
|
34
30
|
const tokenRequestFormEncoded = new URLSearchParams(tokenRequest).toString();
|
|
35
31
|
const tokenAsArrayBuffer = new TextEncoder().encode(tokenRequestFormEncoded);
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
32
|
+
return await client.beta.auth.getToken(tokenAsArrayBuffer);
|
|
33
|
+
},
|
|
34
|
+
enabled: !!userToken,
|
|
35
|
+
refetchInterval: (result) => {
|
|
36
|
+
if (result.state.data?.expires_in) {
|
|
37
|
+
return result.state.data.expires_in * 1000;
|
|
39
38
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
setIsExpired(true);
|
|
49
|
-
}, refreshTime * 1000);
|
|
50
|
-
}
|
|
51
|
-
const abortController = new AbortController();
|
|
52
|
-
if (userToken && isExpired) {
|
|
53
|
-
updateToken(userToken, abortController);
|
|
54
|
-
}
|
|
55
|
-
return () => {
|
|
56
|
-
// This fires when the component unmounts or the userToken changes
|
|
57
|
-
abortController.abort();
|
|
58
|
-
if (expireTimer) {
|
|
59
|
-
clearTimeout(expireTimer);
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
}, [client, isExpired, userToken]);
|
|
63
|
-
return tamboSessionToken;
|
|
39
|
+
return false;
|
|
40
|
+
},
|
|
41
|
+
}, queryClient);
|
|
42
|
+
const accessToken = result.data?.access_token ?? null;
|
|
43
|
+
(0, react_1.useEffect)(() => {
|
|
44
|
+
client.bearer = accessToken;
|
|
45
|
+
}, [accessToken, client]);
|
|
46
|
+
return result;
|
|
64
47
|
}
|
|
65
48
|
//# sourceMappingURL=use-tambo-session-token.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tambo-session-token.js","sourceRoot":"","sources":["../../../src/providers/hooks/use-tambo-session-token.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;
|
|
1
|
+
{"version":3,"file":"use-tambo-session-token.js","sourceRoot":"","sources":["../../../src/providers/hooks/use-tambo-session-token.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;AAkBb,oDAsCC;AAtDD,uDAA8D;AAC9D,iCAAkC;AAElC;;;;;;;;;;;;GAYG;AACH,SAAgB,oBAAoB,CAClC,MAAe,EACf,WAAwB,EACxB,SAA6B;IAE7B,MAAM,MAAM,GAAG,IAAA,sBAAQ,EACrB;QACE,QAAQ,EAAE,CAAC,qBAAqB,EAAE,SAAS,CAAC;QAC5C,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,YAAY,GAAG;gBACnB,UAAU,EAAE,iDAAiD;gBAC7D,qGAAqG;gBACrG,aAAa,EAAE,SAAU;gBACzB,kBAAkB,EAAE,+CAA+C;aACpE,CAAC;YACF,MAAM,uBAAuB,GAAG,IAAI,eAAe,CACjD,YAAY,CACb,CAAC,QAAQ,EAAE,CAAC;YACb,MAAM,kBAAkB,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CACjD,uBAAuB,CACxB,CAAC;YACF,OAAO,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAyB,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,EAAE,CAAC,CAAC,SAAS;QACpB,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE;YAC1B,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC;gBAClC,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YAC7C,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;KACF,EACD,WAAW,CACZ,CAAC;IACF,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,EAAE,YAAY,IAAI,IAAI,CAAC;IACtD,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,MAAM,CAAC,MAAM,GAAG,WAAW,CAAC;IAC9B,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1B,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["\"use client\";\nimport TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { QueryClient, useQuery } from \"@tanstack/react-query\";\nimport { useEffect } from \"react\";\n\n/**\n * This internal hook is used to get the Tambo session token and keep it\n * refreshed.\n *\n * It will refresh the token when it expires.\n * It will also set the bearer token on the client.\n *\n * This hook is used by the TamboClientProvider.\n * @param client - The Tambo client.\n * @param queryClient - The query client.\n * @param userToken - The user token.\n * @returns The Tambo session token.\n */\nexport function useTamboSessionToken(\n client: TamboAI,\n queryClient: QueryClient,\n userToken: string | undefined,\n) {\n const result = useQuery(\n {\n queryKey: [\"tambo-session-token\", userToken],\n queryFn: async () => {\n const tokenRequest = {\n grant_type: \"urn:ietf:params:oauth:grant-type:token-exchange\",\n // will only be undefined if the userToken is not provided, in which case the query will be disabled.\n subject_token: userToken!,\n subject_token_type: \"urn:ietf:params:oauth:token-type:access_token\",\n };\n const tokenRequestFormEncoded = new URLSearchParams(\n tokenRequest,\n ).toString();\n const tokenAsArrayBuffer = new TextEncoder().encode(\n tokenRequestFormEncoded,\n );\n return await client.beta.auth.getToken(tokenAsArrayBuffer as any);\n },\n enabled: !!userToken,\n refetchInterval: (result) => {\n if (result.state.data?.expires_in) {\n return result.state.data.expires_in * 1000;\n }\n return false;\n },\n },\n queryClient,\n );\n const accessToken = result.data?.access_token ?? null;\n useEffect(() => {\n client.bearer = accessToken;\n }, [accessToken, client]);\n return result;\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export type { TamboComponent, TamboTool } from "../model/component-metadata";
|
|
2
|
-
export { TamboClientProvider, useTamboClient } from "./tambo-client-provider";
|
|
2
|
+
export { TamboClientProvider, useIsTamboTokenUpdating, useTamboClient, } from "./tambo-client-provider";
|
|
3
3
|
export { TamboComponentProvider, useTamboComponent, } from "./tambo-component-provider";
|
|
4
4
|
export { TamboContextHelpersProvider, useTamboContextHelpers, type TamboContextHelpersContextProps, type TamboContextHelpersProviderProps, } from "./tambo-context-helpers-provider";
|
|
5
5
|
export { Pending, Streaming, Success, TamboPropStreamProvider, useTamboStream, } from "./tambo-prop-stream-provider";
|
|
@@ -7,5 +7,6 @@ export type { StreamStateComponentProps, StreamStatus, TamboPropStreamContextVal
|
|
|
7
7
|
export { TamboContext, TamboProvider, useTambo } from "./tambo-provider";
|
|
8
8
|
export { TamboRegistryProvider, useTamboRegistry, type TamboRegistryContext, } from "./tambo-registry-provider";
|
|
9
9
|
export { TamboStubProvider, type TamboStubProviderProps } from "./tambo-stubs";
|
|
10
|
+
export { TamboThreadInputProvider, useTamboThreadInput, type TamboThreadInputContextProps, } from "./tambo-thread-input-provider";
|
|
10
11
|
export { TamboThreadContext, TamboThreadProvider, useTamboGenerationStage, useTamboThread, } from "./tambo-thread-provider";
|
|
11
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,cAAc,GACf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,2BAA2B,EAC3B,sBAAsB,EACtB,KAAK,+BAA+B,EACpC,KAAK,gCAAgC,GACtC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,OAAO,EACP,SAAS,EACT,OAAO,EACP,uBAAuB,EACvB,cAAc,GACf,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,yBAAyB,EACzB,YAAY,EACZ,2BAA2B,GAC5B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,KAAK,oBAAoB,GAC1B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAE,KAAK,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,KAAK,4BAA4B,GAClC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,EACvB,cAAc,GACf,MAAM,yBAAyB,CAAC"}
|
package/dist/providers/index.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.useTamboThread = exports.useTamboGenerationStage = exports.TamboThreadProvider = exports.TamboThreadContext = exports.TamboStubProvider = exports.useTamboRegistry = exports.TamboRegistryProvider = exports.useTambo = exports.TamboProvider = exports.TamboContext = exports.useTamboStream = exports.TamboPropStreamProvider = exports.Success = exports.Streaming = exports.Pending = exports.useTamboContextHelpers = exports.TamboContextHelpersProvider = exports.useTamboComponent = exports.TamboComponentProvider = exports.useTamboClient = exports.TamboClientProvider = void 0;
|
|
3
|
+
exports.useTamboThread = exports.useTamboGenerationStage = exports.TamboThreadProvider = exports.TamboThreadContext = exports.useTamboThreadInput = exports.TamboThreadInputProvider = exports.TamboStubProvider = exports.useTamboRegistry = exports.TamboRegistryProvider = exports.useTambo = exports.TamboProvider = exports.TamboContext = exports.useTamboStream = exports.TamboPropStreamProvider = exports.Success = exports.Streaming = exports.Pending = exports.useTamboContextHelpers = exports.TamboContextHelpersProvider = exports.useTamboComponent = exports.TamboComponentProvider = exports.useTamboClient = exports.useIsTamboTokenUpdating = exports.TamboClientProvider = void 0;
|
|
4
4
|
var tambo_client_provider_1 = require("./tambo-client-provider");
|
|
5
5
|
Object.defineProperty(exports, "TamboClientProvider", { enumerable: true, get: function () { return tambo_client_provider_1.TamboClientProvider; } });
|
|
6
|
+
Object.defineProperty(exports, "useIsTamboTokenUpdating", { enumerable: true, get: function () { return tambo_client_provider_1.useIsTamboTokenUpdating; } });
|
|
6
7
|
Object.defineProperty(exports, "useTamboClient", { enumerable: true, get: function () { return tambo_client_provider_1.useTamboClient; } });
|
|
7
8
|
var tambo_component_provider_1 = require("./tambo-component-provider");
|
|
8
9
|
Object.defineProperty(exports, "TamboComponentProvider", { enumerable: true, get: function () { return tambo_component_provider_1.TamboComponentProvider; } });
|
|
@@ -25,6 +26,9 @@ Object.defineProperty(exports, "TamboRegistryProvider", { enumerable: true, get:
|
|
|
25
26
|
Object.defineProperty(exports, "useTamboRegistry", { enumerable: true, get: function () { return tambo_registry_provider_1.useTamboRegistry; } });
|
|
26
27
|
var tambo_stubs_1 = require("./tambo-stubs");
|
|
27
28
|
Object.defineProperty(exports, "TamboStubProvider", { enumerable: true, get: function () { return tambo_stubs_1.TamboStubProvider; } });
|
|
29
|
+
var tambo_thread_input_provider_1 = require("./tambo-thread-input-provider");
|
|
30
|
+
Object.defineProperty(exports, "TamboThreadInputProvider", { enumerable: true, get: function () { return tambo_thread_input_provider_1.TamboThreadInputProvider; } });
|
|
31
|
+
Object.defineProperty(exports, "useTamboThreadInput", { enumerable: true, get: function () { return tambo_thread_input_provider_1.useTamboThreadInput; } });
|
|
28
32
|
var tambo_thread_provider_1 = require("./tambo-thread-provider");
|
|
29
33
|
Object.defineProperty(exports, "TamboThreadContext", { enumerable: true, get: function () { return tambo_thread_provider_1.TamboThreadContext; } });
|
|
30
34
|
Object.defineProperty(exports, "TamboThreadProvider", { enumerable: true, get: function () { return tambo_thread_provider_1.TamboThreadProvider; } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":";;;AACA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":";;;AACA,iEAIiC;AAH/B,4HAAA,mBAAmB,OAAA;AACnB,gIAAA,uBAAuB,OAAA;AACvB,uHAAA,cAAc,OAAA;AAEhB,uEAGoC;AAFlC,kIAAA,sBAAsB,OAAA;AACtB,6HAAA,iBAAiB,OAAA;AAEnB,mFAK0C;AAJxC,6IAAA,2BAA2B,OAAA;AAC3B,wIAAA,sBAAsB,OAAA;AAIxB,2EAMsC;AALpC,qHAAA,OAAO,OAAA;AACP,uHAAA,SAAS,OAAA;AACT,qHAAA,OAAO,OAAA;AACP,qIAAA,uBAAuB,OAAA;AACvB,4HAAA,cAAc,OAAA;AAOhB,mDAAyE;AAAhE,8GAAA,YAAY,OAAA;AAAE,+GAAA,aAAa,OAAA;AAAE,0GAAA,QAAQ,OAAA;AAC9C,qEAImC;AAHjC,gIAAA,qBAAqB,OAAA;AACrB,2HAAA,gBAAgB,OAAA;AAGlB,6CAA+E;AAAtE,gHAAA,iBAAiB,OAAA;AAC1B,6EAIuC;AAHrC,uIAAA,wBAAwB,OAAA;AACxB,kIAAA,mBAAmB,OAAA;AAGrB,iEAKiC;AAJ/B,2HAAA,kBAAkB,OAAA;AAClB,4HAAA,mBAAmB,OAAA;AACnB,gIAAA,uBAAuB,OAAA;AACvB,uHAAA,cAAc,OAAA","sourcesContent":["export type { TamboComponent, TamboTool } from \"../model/component-metadata\";\nexport {\n TamboClientProvider,\n useIsTamboTokenUpdating,\n useTamboClient,\n} from \"./tambo-client-provider\";\nexport {\n TamboComponentProvider,\n useTamboComponent,\n} from \"./tambo-component-provider\";\nexport {\n TamboContextHelpersProvider,\n useTamboContextHelpers,\n type TamboContextHelpersContextProps,\n type TamboContextHelpersProviderProps,\n} from \"./tambo-context-helpers-provider\";\nexport {\n Pending,\n Streaming,\n Success,\n TamboPropStreamProvider,\n useTamboStream,\n} from \"./tambo-prop-stream-provider\";\nexport type {\n StreamStateComponentProps,\n StreamStatus,\n TamboPropStreamContextValue,\n} from \"./tambo-prop-stream-provider\";\nexport { TamboContext, TamboProvider, useTambo } from \"./tambo-provider\";\nexport {\n TamboRegistryProvider,\n useTamboRegistry,\n type TamboRegistryContext,\n} from \"./tambo-registry-provider\";\nexport { TamboStubProvider, type TamboStubProviderProps } from \"./tambo-stubs\";\nexport {\n TamboThreadInputProvider,\n useTamboThreadInput,\n type TamboThreadInputContextProps,\n} from \"./tambo-thread-input-provider\";\nexport {\n TamboThreadContext,\n TamboThreadProvider,\n useTamboGenerationStage,\n useTamboThread,\n} from \"./tambo-thread-provider\";\n"]}
|
|
@@ -28,6 +28,8 @@ export interface TamboClientContextProps {
|
|
|
28
28
|
client: TamboAI;
|
|
29
29
|
/** The tambo-specific query client */
|
|
30
30
|
queryClient: QueryClient;
|
|
31
|
+
/** Whether the session token is currently being updated */
|
|
32
|
+
isUpdatingToken: boolean;
|
|
31
33
|
}
|
|
32
34
|
export declare const TamboClientContext: React.Context<TamboClientContextProps | undefined>;
|
|
33
35
|
/**
|
|
@@ -55,4 +57,9 @@ export declare const useTamboClient: () => TamboAI;
|
|
|
55
57
|
* @private
|
|
56
58
|
*/
|
|
57
59
|
export declare const useTamboQueryClient: () => QueryClient;
|
|
60
|
+
/**
|
|
61
|
+
* Hook to check if the session token is currently being updated
|
|
62
|
+
* @returns true if the token is being refreshed, false otherwise
|
|
63
|
+
*/
|
|
64
|
+
export declare const useIsTamboTokenUpdating: () => boolean;
|
|
58
65
|
//# sourceMappingURL=tambo-client-provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tambo-client-provider.d.ts","sourceRoot":"","sources":["../../src/providers/tambo-client-provider.tsx"],"names":[],"mappings":"AACA,OAAO,OAA0B,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,EAAiB,iBAAiB,EAAY,MAAM,OAAO,CAAC;AAI1E,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,WAAW,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IAEvC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,yBAAyB;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,sCAAsC;IACtC,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,eAAO,MAAM,kBAAkB,oDAEnB,CAAC;AAEb;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CACxC,iBAAiB,CAAC,wBAAwB,CAAC,
|
|
1
|
+
{"version":3,"file":"tambo-client-provider.d.ts","sourceRoot":"","sources":["../../src/providers/tambo-client-provider.tsx"],"names":[],"mappings":"AACA,OAAO,OAA0B,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,EAAiB,iBAAiB,EAAY,MAAM,OAAO,CAAC;AAI1E,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,WAAW,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IAEvC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,yBAAyB;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,sCAAsC;IACtC,WAAW,EAAE,WAAW,CAAC;IACzB,2DAA2D;IAC3D,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,eAAO,MAAM,kBAAkB,oDAEnB,CAAC;AAEb;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CACxC,iBAAiB,CAAC,wBAAwB,CAAC,CAmC5C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,cAAc,eAM1B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,mBAQ/B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,eAQnC,CAAC"}
|