@crossmint/client-sdk-auth 0.2.3 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +97 -0
  3. package/dist/CrossmintAuthClient.cjs +12 -0
  4. package/dist/CrossmintAuthClient.cjs.map +1 -0
  5. package/dist/CrossmintAuthClient.d.cts +35 -0
  6. package/dist/CrossmintAuthClient.d.ts +35 -0
  7. package/dist/CrossmintAuthClient.js +12 -0
  8. package/dist/CrossmintAuthClient.js.map +1 -0
  9. package/dist/chunk-5JXPQKM4.js +19 -0
  10. package/dist/chunk-5JXPQKM4.js.map +1 -0
  11. package/dist/chunk-7YATBCAU.js +229 -0
  12. package/dist/chunk-7YATBCAU.js.map +1 -0
  13. package/dist/chunk-BGMXXFQ4.cjs +19 -0
  14. package/dist/chunk-BGMXXFQ4.cjs.map +1 -0
  15. package/dist/chunk-BMYZMMVR.js +7 -0
  16. package/dist/chunk-BMYZMMVR.js.map +1 -0
  17. package/dist/chunk-F45I5NLI.cjs +46 -0
  18. package/dist/chunk-F45I5NLI.cjs.map +1 -0
  19. package/dist/chunk-ILL57KWX.cjs +229 -0
  20. package/dist/chunk-ILL57KWX.cjs.map +1 -0
  21. package/dist/chunk-JPRRZPBL.js +46 -0
  22. package/dist/chunk-JPRRZPBL.js.map +1 -0
  23. package/dist/chunk-MLMLBCSI.js +11 -0
  24. package/dist/chunk-MLMLBCSI.js.map +1 -0
  25. package/dist/chunk-QY4RIGNM.cjs +11 -0
  26. package/dist/chunk-QY4RIGNM.cjs.map +1 -0
  27. package/dist/chunk-TIUX4OOQ.cjs +7 -0
  28. package/dist/chunk-TIUX4OOQ.cjs.map +1 -0
  29. package/dist/chunk-TOXKCKTY.js +1 -0
  30. package/dist/chunk-TOXKCKTY.js.map +1 -0
  31. package/dist/chunk-VQ3HTIQ3.cjs +1 -0
  32. package/dist/chunk-VQ3HTIQ3.cjs.map +1 -0
  33. package/dist/index.cjs +28 -1
  34. package/dist/index.cjs.map +1 -1
  35. package/dist/index.d.cts +7 -5
  36. package/dist/index.d.ts +7 -5
  37. package/dist/index.js +28 -1
  38. package/dist/index.js.map +1 -1
  39. package/dist/utils/constants.cjs +8 -0
  40. package/dist/utils/constants.cjs.map +1 -0
  41. package/dist/utils/constants.d.cts +3 -0
  42. package/dist/utils/constants.d.ts +3 -0
  43. package/dist/utils/constants.js +8 -0
  44. package/dist/utils/constants.js.map +1 -0
  45. package/dist/utils/cookies.cjs +12 -0
  46. package/dist/utils/cookies.cjs.map +1 -0
  47. package/dist/utils/cookies.d.cts +5 -0
  48. package/dist/utils/cookies.d.ts +5 -0
  49. package/dist/utils/cookies.js +12 -0
  50. package/dist/utils/cookies.js.map +1 -0
  51. package/dist/utils/index.cjs +21 -0
  52. package/dist/utils/index.cjs.map +1 -0
  53. package/dist/utils/index.d.cts +3 -0
  54. package/dist/utils/index.d.ts +3 -0
  55. package/dist/utils/index.js +21 -0
  56. package/dist/utils/index.js.map +1 -0
  57. package/dist/utils/jwt.cjs +8 -0
  58. package/dist/utils/jwt.cjs.map +1 -0
  59. package/dist/utils/jwt.d.cts +3 -0
  60. package/dist/utils/jwt.d.ts +3 -0
  61. package/dist/utils/jwt.js +8 -0
  62. package/dist/utils/jwt.js.map +1 -0
  63. package/package.json +8 -4
  64. package/src/CrossmintAuthClient.test.ts +406 -0
  65. package/src/CrossmintAuthClient.ts +241 -0
  66. package/src/index.ts +2 -1
  67. package/src/utils/constants.ts +1 -0
  68. package/src/utils/cookies.test.ts +44 -0
  69. package/src/utils/cookies.ts +13 -0
  70. package/src/utils/index.ts +2 -0
package/LICENSE CHANGED
@@ -186,7 +186,7 @@ APPENDIX: How to apply the Apache License to your work.
186
186
  same "printed page" as the copyright notice for easier
187
187
  identification within third-party archives.
188
188
 
189
- Copyright 2022 Paella Labs Inc
189
+ Copyright 2024 Paella Labs Inc
190
190
 
191
191
  Licensed under the Apache License, Version 2.0 (the "License");
192
192
  you may not use this file except in compliance with the License.
package/README.md CHANGED
@@ -1,2 +1,99 @@
1
1
  # @crossmint/client-sdk-auth
2
2
 
3
+ This SDK provides a set of tools for authenticating users in a Crossmint-powered application on the client-side. It simplifies the process of handling authentication tokens, managing user sessions, and integrating various authentication methods into your web applications.
4
+
5
+ ## Installation
6
+
7
+ To install the SDK, you can use npm or yarn:
8
+
9
+ ```bash
10
+ npm install @crossmint/client-sdk-auth
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ To use the SDK in your application, follow these steps:
16
+
17
+ 1. Import the SDK into your project:
18
+
19
+ ```typescript
20
+ import { createCrossmint, CrossmintAuth } from "@crossmint/client-sdk-auth";
21
+
22
+ const crossmint = createCrossmint({
23
+ apiKey: process.env.CLIENT_CROSSMINT_API_KEY || "",
24
+ });
25
+
26
+ const crossmintAuth = CrossmintAuth.from(crossmint);
27
+ ```
28
+
29
+ 2. Use the SDK to authenticate users and manage sessions:
30
+
31
+ ```typescript
32
+ // Get the current user
33
+ const user = await crossmintAuth.getUser();
34
+
35
+ // Log out the user and clear cookies
36
+ crossmintAuth.logout();
37
+ ```
38
+
39
+ ## Secure setup using HttpOnly cookies
40
+
41
+ To secure the authentication material, you can set up a custom endpoint in your backend that will handle refreshing the authentication material and storing it in HttpOnly cookies. This way, the authentication material is not accessible to JavaScript running in the browser.
42
+
43
+ ### Configure custom refresh route
44
+
45
+ In the client, provide the custom refresh route when creating the CrossmintAuth instance:
46
+
47
+ ```typescript
48
+ const crossmintAuth = CrossmintAuth.from(crossmint, {
49
+ refreshRoute: "/api/refresh",
50
+ });
51
+ ```
52
+
53
+ This way, the SDK will use the provided route to refresh the token instead of the default one and the authentication material can be stored in HttpOnly cookies that are tied to the domain of the provided route.
54
+
55
+ ### Configure custom logout route
56
+
57
+ As you're now using HttpOnly cookies, logout can't happen client-side as it doesn't have access to the cookies. You can set up a custom logout route to handle the logout process.
58
+
59
+ In the client, provide the custom logout route when creating the CrossmintAuth instance:
60
+
61
+ ```typescript
62
+ const crossmintAuth = CrossmintAuth.from(crossmint, {
63
+ logoutRoute: "/api/logout",
64
+ });
65
+ ```
66
+
67
+ NOTE: Depending on the framework you're using, you might need to set the whole URL in the `refreshRoute` and `logoutRoute` options.
68
+
69
+ ## Advanced Usage
70
+
71
+ You can provide callbacks for token refresh and logout events when creating the CrossmintAuthClient:
72
+
73
+ ```typescript
74
+ const crossmintAuth = CrossmintAuth.from(crossmint, {
75
+ callbacks: {
76
+ onTokenRefresh: (authMaterial) => {
77
+ // Handle new authentication material
78
+ },
79
+ onLogout: () => {
80
+ // Handle logout
81
+ },
82
+ },
83
+ });
84
+ ```
85
+
86
+ ### Authentication Material
87
+
88
+ ```json
89
+ {
90
+ "jwt": "...",
91
+ "refreshToken": "...",
92
+ "user": {
93
+ "id": "...",
94
+ "email": "..."
95
+ }
96
+ }
97
+ ```
98
+
99
+ These callbacks allow you to perform custom actions when tokens are refreshed or when the user logs out.
@@ -0,0 +1,12 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+ var _chunkILL57KWXcjs = require('./chunk-ILL57KWX.cjs');
4
+ require('./chunk-VQ3HTIQ3.cjs');
5
+ require('./chunk-TIUX4OOQ.cjs');
6
+ require('./chunk-BGMXXFQ4.cjs');
7
+ require('./chunk-QY4RIGNM.cjs');
8
+ require('./chunk-F45I5NLI.cjs');
9
+
10
+
11
+ exports.CrossmintAuthClient = _chunkILL57KWXcjs.CrossmintAuthClient;
12
+ //# sourceMappingURL=CrossmintAuthClient.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ import { UseSignInData } from '@farcaster/auth-kit';
2
+ import { CrossmintAuth, AuthMaterialWithUser, OAuthProvider, CrossmintAuthOptions } from '@crossmint/common-sdk-auth';
3
+ import { Crossmint } from '@crossmint/common-sdk-base';
4
+
5
+ type CrossmintAuthClientConfig = CrossmintAuthOptions & {
6
+ callbacks?: CrossmintAuthClientCallbacks;
7
+ logoutRoute?: string;
8
+ };
9
+ declare class CrossmintAuthClient extends CrossmintAuth {
10
+ private callbacks;
11
+ private refreshTask;
12
+ private isRefreshing;
13
+ private logoutRoute;
14
+ private constructor();
15
+ static from(crossmint: Crossmint, config?: CrossmintAuthClientConfig): CrossmintAuthClient;
16
+ getUser(): Promise<any>;
17
+ storeAuthMaterial(authMaterial: AuthMaterialWithUser): void;
18
+ logout(): Promise<void>;
19
+ handleRefreshAuthMaterial(refreshTokenSecret?: string): Promise<void>;
20
+ getOAuthUrl(provider: OAuthProvider): Promise<string>;
21
+ sendEmailOtp(email: string): Promise<any>;
22
+ confirmEmailOtp(email: string, emailId: string, token: string): Promise<string | null>;
23
+ signInWithFarcaster(data: UseSignInData): Promise<string | null>;
24
+ signInWithSmartWallet(address: string): Promise<any>;
25
+ authenticateSmartWallet(address: string, signature: string): Promise<any>;
26
+ private logoutFromCustomRoute;
27
+ private scheduleNextRefresh;
28
+ private cancelScheduledRefresh;
29
+ }
30
+ type CrossmintAuthClientCallbacks = {
31
+ onTokenRefresh?: (authMaterial: AuthMaterialWithUser) => void;
32
+ onLogout?: () => void;
33
+ };
34
+
35
+ export { CrossmintAuthClient };
@@ -0,0 +1,35 @@
1
+ import { UseSignInData } from '@farcaster/auth-kit';
2
+ import { CrossmintAuth, AuthMaterialWithUser, OAuthProvider, CrossmintAuthOptions } from '@crossmint/common-sdk-auth';
3
+ import { Crossmint } from '@crossmint/common-sdk-base';
4
+
5
+ type CrossmintAuthClientConfig = CrossmintAuthOptions & {
6
+ callbacks?: CrossmintAuthClientCallbacks;
7
+ logoutRoute?: string;
8
+ };
9
+ declare class CrossmintAuthClient extends CrossmintAuth {
10
+ private callbacks;
11
+ private refreshTask;
12
+ private isRefreshing;
13
+ private logoutRoute;
14
+ private constructor();
15
+ static from(crossmint: Crossmint, config?: CrossmintAuthClientConfig): CrossmintAuthClient;
16
+ getUser(): Promise<any>;
17
+ storeAuthMaterial(authMaterial: AuthMaterialWithUser): void;
18
+ logout(): Promise<void>;
19
+ handleRefreshAuthMaterial(refreshTokenSecret?: string): Promise<void>;
20
+ getOAuthUrl(provider: OAuthProvider): Promise<string>;
21
+ sendEmailOtp(email: string): Promise<any>;
22
+ confirmEmailOtp(email: string, emailId: string, token: string): Promise<string | null>;
23
+ signInWithFarcaster(data: UseSignInData): Promise<string | null>;
24
+ signInWithSmartWallet(address: string): Promise<any>;
25
+ authenticateSmartWallet(address: string, signature: string): Promise<any>;
26
+ private logoutFromCustomRoute;
27
+ private scheduleNextRefresh;
28
+ private cancelScheduledRefresh;
29
+ }
30
+ type CrossmintAuthClientCallbacks = {
31
+ onTokenRefresh?: (authMaterial: AuthMaterialWithUser) => void;
32
+ onLogout?: () => void;
33
+ };
34
+
35
+ export { CrossmintAuthClient };
@@ -0,0 +1,12 @@
1
+ import {
2
+ CrossmintAuthClient
3
+ } from "./chunk-7YATBCAU.js";
4
+ import "./chunk-TOXKCKTY.js";
5
+ import "./chunk-BMYZMMVR.js";
6
+ import "./chunk-5JXPQKM4.js";
7
+ import "./chunk-MLMLBCSI.js";
8
+ import "./chunk-JPRRZPBL.js";
9
+ export {
10
+ CrossmintAuthClient
11
+ };
12
+ //# sourceMappingURL=CrossmintAuthClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,19 @@
1
+ // src/utils/cookies.ts
2
+ function getCookie(name) {
3
+ const crossmintRefreshToken = document.cookie.split("; ").find((row) => row.startsWith(name));
4
+ return crossmintRefreshToken ? crossmintRefreshToken.split("=")[1] : void 0;
5
+ }
6
+ function setCookie(name, value, expiresAt) {
7
+ const expiresInUtc = expiresAt ? new Date(expiresAt).toUTCString() : "";
8
+ document.cookie = `${name}=${value}; ${expiresAt ? `expires=${expiresInUtc};` : ""} path=/; SameSite=Lax;`;
9
+ }
10
+ function deleteCookie(name) {
11
+ document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;
12
+ }
13
+
14
+ export {
15
+ getCookie,
16
+ setCookie,
17
+ deleteCookie
18
+ };
19
+ //# sourceMappingURL=chunk-5JXPQKM4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/cookies.ts"],"sourcesContent":["export function getCookie(name: string): string | undefined {\n const crossmintRefreshToken = document.cookie.split(\"; \").find((row) => row.startsWith(name));\n return crossmintRefreshToken ? crossmintRefreshToken.split(\"=\")[1] : undefined;\n}\n\nexport function setCookie(name: string, value: string, expiresAt?: string) {\n const expiresInUtc = expiresAt ? new Date(expiresAt).toUTCString() : \"\";\n document.cookie = `${name}=${value}; ${expiresAt ? `expires=${expiresInUtc};` : \"\"} path=/; SameSite=Lax;`;\n}\n\nexport function deleteCookie(name: string) {\n document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;\n}\n"],"mappings":";AAAO,SAAS,UAAU,MAAkC;AACxD,QAAM,wBAAwB,SAAS,OAAO,MAAM,IAAI,EAAE,KAAK,CAAC,QAAQ,IAAI,WAAW,IAAI,CAAC;AAC5F,SAAO,wBAAwB,sBAAsB,MAAM,GAAG,EAAE,CAAC,IAAI;AACzE;AAEO,SAAS,UAAU,MAAc,OAAe,WAAoB;AACvE,QAAM,eAAe,YAAY,IAAI,KAAK,SAAS,EAAE,YAAY,IAAI;AACrE,WAAS,SAAS,GAAG,IAAI,IAAI,KAAK,KAAK,YAAY,WAAW,YAAY,MAAM,EAAE;AACtF;AAEO,SAAS,aAAa,MAAc;AACvC,WAAS,SAAS,GAAG,IAAI;AAC7B;","names":[]}
@@ -0,0 +1,229 @@
1
+ import {
2
+ TIME_BEFORE_EXPIRING_JWT_IN_SECONDS
3
+ } from "./chunk-BMYZMMVR.js";
4
+ import {
5
+ deleteCookie,
6
+ getCookie,
7
+ setCookie
8
+ } from "./chunk-5JXPQKM4.js";
9
+ import {
10
+ getJWTExpiration
11
+ } from "./chunk-MLMLBCSI.js";
12
+ import {
13
+ __async,
14
+ __spreadProps,
15
+ __spreadValues
16
+ } from "./chunk-JPRRZPBL.js";
17
+
18
+ // src/CrossmintAuthClient.ts
19
+ import {
20
+ AUTH_SDK_ROOT_ENDPOINT,
21
+ CROSSMINT_API_VERSION,
22
+ CrossmintAuth,
23
+ REFRESH_TOKEN_PREFIX,
24
+ SESSION_PREFIX
25
+ } from "@crossmint/common-sdk-auth";
26
+ import { queueTask } from "@crossmint/client-sdk-base";
27
+ var CrossmintAuthClient = class _CrossmintAuthClient extends CrossmintAuth {
28
+ constructor(crossmint, apiClient, config = {}) {
29
+ var _a, _b;
30
+ super(crossmint, apiClient, config);
31
+ this.refreshTask = null;
32
+ this.isRefreshing = false;
33
+ this.callbacks = (_a = config.callbacks) != null ? _a : {};
34
+ this.logoutRoute = (_b = config.logoutRoute) != null ? _b : null;
35
+ }
36
+ static from(crossmint, config = {}) {
37
+ const authClient = new _CrossmintAuthClient(crossmint, CrossmintAuth.defaultApiClient(crossmint), config);
38
+ if (typeof window !== "undefined") {
39
+ authClient.handleRefreshAuthMaterial();
40
+ }
41
+ return authClient;
42
+ }
43
+ getUser() {
44
+ return __async(this, null, function* () {
45
+ const result = yield this.apiClient.get(`api/${CROSSMINT_API_VERSION}/sdk/auth/user`, {
46
+ headers: {
47
+ "Content-Type": "application/json"
48
+ }
49
+ });
50
+ const user = yield result.json();
51
+ return user;
52
+ });
53
+ }
54
+ storeAuthMaterial(authMaterial) {
55
+ setCookie(SESSION_PREFIX, authMaterial.jwt);
56
+ setCookie(REFRESH_TOKEN_PREFIX, authMaterial.refreshToken.secret, authMaterial.refreshToken.expiresAt);
57
+ }
58
+ logout() {
59
+ return __async(this, null, function* () {
60
+ var _a, _b;
61
+ try {
62
+ if (this.logoutRoute != null) {
63
+ yield this.logoutFromCustomRoute();
64
+ } else {
65
+ yield this.logoutFromDefaultRoute(getCookie(REFRESH_TOKEN_PREFIX));
66
+ }
67
+ } catch (error) {
68
+ console.error(error);
69
+ } finally {
70
+ deleteCookie(REFRESH_TOKEN_PREFIX);
71
+ deleteCookie(SESSION_PREFIX);
72
+ (_b = (_a = this.callbacks).onLogout) == null ? void 0 : _b.call(_a);
73
+ }
74
+ });
75
+ }
76
+ handleRefreshAuthMaterial(refreshTokenSecret) {
77
+ return __async(this, null, function* () {
78
+ var _a, _b;
79
+ const refreshToken = refreshTokenSecret != null ? refreshTokenSecret : getCookie(REFRESH_TOKEN_PREFIX);
80
+ if (refreshToken == null && this.refreshRoute == null || this.isRefreshing) {
81
+ return;
82
+ }
83
+ try {
84
+ this.isRefreshing = true;
85
+ const authMaterial = yield this.refreshAuthMaterial(refreshToken);
86
+ if (this.refreshRoute == null) {
87
+ this.storeAuthMaterial(authMaterial);
88
+ }
89
+ (_b = (_a = this.callbacks).onTokenRefresh) == null ? void 0 : _b.call(_a, authMaterial);
90
+ this.scheduleNextRefresh(authMaterial.jwt);
91
+ } catch (error) {
92
+ console.error(error);
93
+ this.logout();
94
+ } finally {
95
+ this.isRefreshing = false;
96
+ }
97
+ });
98
+ }
99
+ getOAuthUrl(provider) {
100
+ return __async(this, null, function* () {
101
+ const result = yield this.apiClient.get(`${AUTH_SDK_ROOT_ENDPOINT}/social/${provider}/start`, {
102
+ headers: {
103
+ "Content-Type": "application/json"
104
+ }
105
+ });
106
+ const data = yield result.json();
107
+ return data.oauthUrl;
108
+ });
109
+ }
110
+ sendEmailOtp(email) {
111
+ return __async(this, null, function* () {
112
+ const result = yield this.apiClient.post(`${AUTH_SDK_ROOT_ENDPOINT}/otps/send`, {
113
+ headers: {
114
+ "Content-Type": "application/json"
115
+ },
116
+ body: JSON.stringify({ email })
117
+ });
118
+ return yield result.json();
119
+ });
120
+ }
121
+ confirmEmailOtp(email, emailId, token) {
122
+ return __async(this, null, function* () {
123
+ const queryParams = new URLSearchParams({
124
+ email,
125
+ signinAuthenticationMethod: "email",
126
+ token,
127
+ locale: "en",
128
+ state: emailId,
129
+ callbackUrl: `${this.apiClient.baseUrl}/${AUTH_SDK_ROOT_ENDPOINT}/we-dont-actually-use-this-anymore`
130
+ });
131
+ const result = yield this.apiClient.post(`${AUTH_SDK_ROOT_ENDPOINT}/authenticate?${queryParams}`, {
132
+ headers: {
133
+ "Content-Type": "application/json"
134
+ }
135
+ });
136
+ const resData = yield result.json();
137
+ const callbackUrl = new URL(resData.callbackUrl);
138
+ return callbackUrl.searchParams.get("oneTimeSecret");
139
+ });
140
+ }
141
+ signInWithFarcaster(data) {
142
+ return __async(this, null, function* () {
143
+ const queryParams = new URLSearchParams({
144
+ signinAuthenticationMethod: "farcaster",
145
+ callbackUrl: `${this.apiClient.baseUrl}/${AUTH_SDK_ROOT_ENDPOINT}/callback?isPopup=false`
146
+ });
147
+ const result = yield this.apiClient.post(`${AUTH_SDK_ROOT_ENDPOINT}/authenticate?${queryParams}`, {
148
+ headers: {
149
+ "Content-Type": "application/json"
150
+ },
151
+ body: JSON.stringify(__spreadProps(__spreadValues({}, data), {
152
+ domain: data.signatureParams.domain,
153
+ redirect: true,
154
+ callbackUrl: `${this.apiClient.baseUrl}/${AUTH_SDK_ROOT_ENDPOINT}/callback?isPopup=false`
155
+ }))
156
+ });
157
+ const resData = yield result.json();
158
+ const callbackUrl = new URL(resData.callbackUrl);
159
+ return callbackUrl.searchParams.get("oneTimeSecret");
160
+ });
161
+ }
162
+ signInWithSmartWallet(address) {
163
+ return __async(this, null, function* () {
164
+ const queryParams = new URLSearchParams({
165
+ signinAuthenticationMethod: "evm"
166
+ });
167
+ const result = yield this.apiClient.post(
168
+ `${AUTH_SDK_ROOT_ENDPOINT}/crypto_wallets/authenticate/start?${queryParams}`,
169
+ {
170
+ headers: {
171
+ "Content-Type": "application/json"
172
+ },
173
+ body: JSON.stringify({ walletAddress: address })
174
+ }
175
+ );
176
+ return yield result.json();
177
+ });
178
+ }
179
+ authenticateSmartWallet(address, signature) {
180
+ return __async(this, null, function* () {
181
+ const queryParams = new URLSearchParams({
182
+ signinAuthenticationMethod: "evm",
183
+ callbackUrl: `${this.apiClient.baseUrl}/${AUTH_SDK_ROOT_ENDPOINT}/we-dont-actually-use-this-anymore`
184
+ });
185
+ const result = yield this.apiClient.post(
186
+ `${AUTH_SDK_ROOT_ENDPOINT}/crypto_wallets/authenticate?${queryParams}`,
187
+ {
188
+ headers: {
189
+ "Content-Type": "application/json"
190
+ },
191
+ body: JSON.stringify({ walletAddress: address, signature })
192
+ }
193
+ );
194
+ return yield result.json();
195
+ });
196
+ }
197
+ logoutFromCustomRoute() {
198
+ return __async(this, null, function* () {
199
+ if (!this.logoutRoute) {
200
+ throw new Error("Custom logout route is not set");
201
+ }
202
+ return yield fetch(this.logoutRoute, { method: "POST" });
203
+ });
204
+ }
205
+ scheduleNextRefresh(jwt) {
206
+ const jwtExpiration = getJWTExpiration(jwt);
207
+ if (!jwtExpiration) {
208
+ throw new Error("Invalid JWT");
209
+ }
210
+ const currentTime = Date.now() / 1e3;
211
+ const timeToExpire = jwtExpiration - currentTime - TIME_BEFORE_EXPIRING_JWT_IN_SECONDS;
212
+ if (timeToExpire > 0) {
213
+ const endTime = Date.now() + timeToExpire * 1e3;
214
+ this.cancelScheduledRefresh();
215
+ this.refreshTask = queueTask(() => this.handleRefreshAuthMaterial(), endTime);
216
+ }
217
+ }
218
+ cancelScheduledRefresh() {
219
+ if (this.refreshTask) {
220
+ this.refreshTask.cancel();
221
+ this.refreshTask = null;
222
+ }
223
+ }
224
+ };
225
+
226
+ export {
227
+ CrossmintAuthClient
228
+ };
229
+ //# sourceMappingURL=chunk-7YATBCAU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/CrossmintAuthClient.ts"],"sourcesContent":["import type { UseSignInData } from \"@farcaster/auth-kit\";\nimport {\n AUTH_SDK_ROOT_ENDPOINT,\n type AuthMaterialWithUser,\n CROSSMINT_API_VERSION,\n CrossmintAuth,\n type CrossmintAuthOptions,\n type OAuthProvider,\n REFRESH_TOKEN_PREFIX,\n SESSION_PREFIX,\n} from \"@crossmint/common-sdk-auth\";\nimport type { Crossmint, CrossmintApiClient } from \"@crossmint/common-sdk-base\";\nimport { type CancellableTask, queueTask } from \"@crossmint/client-sdk-base\";\nimport { deleteCookie, getCookie, getJWTExpiration, setCookie, TIME_BEFORE_EXPIRING_JWT_IN_SECONDS } from \"./utils\";\n\ntype CrossmintAuthClientConfig = CrossmintAuthOptions & {\n callbacks?: CrossmintAuthClientCallbacks;\n logoutRoute?: string;\n};\n\nexport class CrossmintAuthClient extends CrossmintAuth {\n private callbacks: CrossmintAuthClientCallbacks;\n private refreshTask: CancellableTask | null = null;\n private isRefreshing = false;\n private logoutRoute: string | null;\n\n private constructor(crossmint: Crossmint, apiClient: CrossmintApiClient, config: CrossmintAuthClientConfig = {}) {\n super(crossmint, apiClient, config);\n this.callbacks = config.callbacks ?? {};\n this.logoutRoute = config.logoutRoute ?? null;\n }\n\n public static from(crossmint: Crossmint, config: CrossmintAuthClientConfig = {}): CrossmintAuthClient {\n const authClient = new CrossmintAuthClient(crossmint, CrossmintAuth.defaultApiClient(crossmint), config);\n // In case an instance is created on the server, we can't refresh as this stores cookies\n if (typeof window !== \"undefined\") {\n authClient.handleRefreshAuthMaterial();\n }\n return authClient;\n }\n\n public async getUser() {\n const result = await this.apiClient.get(`api/${CROSSMINT_API_VERSION}/sdk/auth/user`, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n const user = await result.json();\n return user;\n }\n\n public storeAuthMaterial(authMaterial: AuthMaterialWithUser) {\n setCookie(SESSION_PREFIX, authMaterial.jwt);\n setCookie(REFRESH_TOKEN_PREFIX, authMaterial.refreshToken.secret, authMaterial.refreshToken.expiresAt);\n }\n\n public async logout() {\n // Even if there's a server error, we want to clear the cookies\n try {\n if (this.logoutRoute != null) {\n await this.logoutFromCustomRoute();\n } else {\n await this.logoutFromDefaultRoute(getCookie(REFRESH_TOKEN_PREFIX));\n }\n } catch (error) {\n console.error(error);\n } finally {\n deleteCookie(REFRESH_TOKEN_PREFIX);\n deleteCookie(SESSION_PREFIX);\n this.callbacks.onLogout?.();\n }\n }\n\n public async handleRefreshAuthMaterial(refreshTokenSecret?: string): Promise<void> {\n const refreshToken = refreshTokenSecret ?? getCookie(REFRESH_TOKEN_PREFIX);\n // If there is a custom refresh route, that endpoint will fetch the cookies itself\n if ((refreshToken == null && this.refreshRoute == null) || this.isRefreshing) {\n return;\n }\n\n try {\n this.isRefreshing = true;\n const authMaterial = await this.refreshAuthMaterial(refreshToken);\n\n // If a custom refresh route is set, storing in cookies is handled in the server\n if (this.refreshRoute == null) {\n this.storeAuthMaterial(authMaterial);\n }\n\n this.callbacks.onTokenRefresh?.(authMaterial);\n\n this.scheduleNextRefresh(authMaterial.jwt);\n } catch (error) {\n console.error(error);\n this.logout();\n } finally {\n this.isRefreshing = false;\n }\n }\n\n public async getOAuthUrl(provider: OAuthProvider) {\n const result = await this.apiClient.get(`${AUTH_SDK_ROOT_ENDPOINT}/social/${provider}/start`, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n const data = (await result.json()) as { oauthUrl: string };\n return data.oauthUrl;\n }\n\n public async sendEmailOtp(email: string) {\n const result = await this.apiClient.post(`${AUTH_SDK_ROOT_ENDPOINT}/otps/send`, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ email }),\n });\n\n return await result.json();\n }\n\n public async confirmEmailOtp(email: string, emailId: string, token: string) {\n const queryParams = new URLSearchParams({\n email,\n signinAuthenticationMethod: \"email\",\n token,\n locale: \"en\",\n state: emailId,\n callbackUrl: `${this.apiClient.baseUrl}/${AUTH_SDK_ROOT_ENDPOINT}/we-dont-actually-use-this-anymore`,\n });\n const result = await this.apiClient.post(`${AUTH_SDK_ROOT_ENDPOINT}/authenticate?${queryParams}`, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n const resData = await result.json();\n const callbackUrl = new URL(resData.callbackUrl);\n\n // parse the oneTimeSecret from the callbackUrl response\n return callbackUrl.searchParams.get(\"oneTimeSecret\");\n }\n\n public async signInWithFarcaster(data: UseSignInData) {\n const queryParams = new URLSearchParams({\n signinAuthenticationMethod: \"farcaster\",\n callbackUrl: `${this.apiClient.baseUrl}/${AUTH_SDK_ROOT_ENDPOINT}/callback?isPopup=false`,\n });\n\n const result = await this.apiClient.post(`${AUTH_SDK_ROOT_ENDPOINT}/authenticate?${queryParams}`, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n ...data,\n domain: data.signatureParams.domain,\n redirect: true,\n callbackUrl: `${this.apiClient.baseUrl}/${AUTH_SDK_ROOT_ENDPOINT}/callback?isPopup=false`,\n }),\n });\n\n const resData = await result.json();\n const callbackUrl = new URL(resData.callbackUrl);\n\n // parse the oneTimeSecret from the callbackUrl response\n return callbackUrl.searchParams.get(\"oneTimeSecret\");\n }\n\n public async signInWithSmartWallet(address: string) {\n const queryParams = new URLSearchParams({\n signinAuthenticationMethod: \"evm\",\n });\n\n const result = await this.apiClient.post(\n `${AUTH_SDK_ROOT_ENDPOINT}/crypto_wallets/authenticate/start?${queryParams}`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ walletAddress: address }),\n }\n );\n return await result.json();\n }\n\n public async authenticateSmartWallet(address: string, signature: string) {\n const queryParams = new URLSearchParams({\n signinAuthenticationMethod: \"evm\",\n callbackUrl: `${this.apiClient.baseUrl}/${AUTH_SDK_ROOT_ENDPOINT}/we-dont-actually-use-this-anymore`,\n });\n\n const result = await this.apiClient.post(\n `${AUTH_SDK_ROOT_ENDPOINT}/crypto_wallets/authenticate?${queryParams}`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ walletAddress: address, signature }),\n }\n );\n return await result.json();\n }\n\n private async logoutFromCustomRoute(): Promise<Response> {\n if (!this.logoutRoute) {\n throw new Error(\"Custom logout route is not set\");\n }\n\n return await fetch(this.logoutRoute, { method: \"POST\" });\n }\n\n private scheduleNextRefresh(jwt: string): void {\n const jwtExpiration = getJWTExpiration(jwt);\n if (!jwtExpiration) {\n throw new Error(\"Invalid JWT\");\n }\n\n const currentTime = Date.now() / 1000;\n const timeToExpire = jwtExpiration - currentTime - TIME_BEFORE_EXPIRING_JWT_IN_SECONDS;\n\n if (timeToExpire > 0) {\n const endTime = Date.now() + timeToExpire * 1000;\n this.cancelScheduledRefresh();\n this.refreshTask = queueTask(() => this.handleRefreshAuthMaterial(), endTime);\n }\n }\n\n private cancelScheduledRefresh(): void {\n if (this.refreshTask) {\n this.refreshTask.cancel();\n this.refreshTask = null;\n }\n }\n}\n\ntype CrossmintAuthClientCallbacks = {\n onTokenRefresh?: (authMaterial: AuthMaterialWithUser) => void;\n onLogout?: () => void;\n};\n"],"mappings":"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","names":[]}
@@ -0,0 +1,19 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/utils/cookies.ts
2
+ function getCookie(name) {
3
+ const crossmintRefreshToken = document.cookie.split("; ").find((row) => row.startsWith(name));
4
+ return crossmintRefreshToken ? crossmintRefreshToken.split("=")[1] : void 0;
5
+ }
6
+ function setCookie(name, value, expiresAt) {
7
+ const expiresInUtc = expiresAt ? new Date(expiresAt).toUTCString() : "";
8
+ document.cookie = `${name}=${value}; ${expiresAt ? `expires=${expiresInUtc};` : ""} path=/; SameSite=Lax;`;
9
+ }
10
+ function deleteCookie(name) {
11
+ document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;
12
+ }
13
+
14
+
15
+
16
+
17
+
18
+ exports.getCookie = getCookie; exports.setCookie = setCookie; exports.deleteCookie = deleteCookie;
19
+ //# sourceMappingURL=chunk-BGMXXFQ4.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/cookies.ts"],"names":[],"mappings":";AAAO,SAAS,UAAU,MAAkC;AACxD,QAAM,wBAAwB,SAAS,OAAO,MAAM,IAAI,EAAE,KAAK,CAAC,QAAQ,IAAI,WAAW,IAAI,CAAC;AAC5F,SAAO,wBAAwB,sBAAsB,MAAM,GAAG,EAAE,CAAC,IAAI;AACzE;AAEO,SAAS,UAAU,MAAc,OAAe,WAAoB;AACvE,QAAM,eAAe,YAAY,IAAI,KAAK,SAAS,EAAE,YAAY,IAAI;AACrE,WAAS,SAAS,GAAG,IAAI,IAAI,KAAK,KAAK,YAAY,WAAW,YAAY,MAAM,EAAE;AACtF;AAEO,SAAS,aAAa,MAAc;AACvC,WAAS,SAAS,GAAG,IAAI;AAC7B","sourcesContent":["export function getCookie(name: string): string | undefined {\n const crossmintRefreshToken = document.cookie.split(\"; \").find((row) => row.startsWith(name));\n return crossmintRefreshToken ? crossmintRefreshToken.split(\"=\")[1] : undefined;\n}\n\nexport function setCookie(name: string, value: string, expiresAt?: string) {\n const expiresInUtc = expiresAt ? new Date(expiresAt).toUTCString() : \"\";\n document.cookie = `${name}=${value}; ${expiresAt ? `expires=${expiresInUtc};` : \"\"} path=/; SameSite=Lax;`;\n}\n\nexport function deleteCookie(name: string) {\n document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;\n}\n"]}
@@ -0,0 +1,7 @@
1
+ // src/utils/constants.ts
2
+ var TIME_BEFORE_EXPIRING_JWT_IN_SECONDS = 120;
3
+
4
+ export {
5
+ TIME_BEFORE_EXPIRING_JWT_IN_SECONDS
6
+ };
7
+ //# sourceMappingURL=chunk-BMYZMMVR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/constants.ts"],"sourcesContent":["export const TIME_BEFORE_EXPIRING_JWT_IN_SECONDS = 120;\n"],"mappings":";AAAO,IAAM,sCAAsC;","names":[]}
@@ -0,0 +1,46 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ var __async = (__this, __arguments, generator) => {
21
+ return new Promise((resolve, reject) => {
22
+ var fulfilled = (value) => {
23
+ try {
24
+ step(generator.next(value));
25
+ } catch (e) {
26
+ reject(e);
27
+ }
28
+ };
29
+ var rejected = (value) => {
30
+ try {
31
+ step(generator.throw(value));
32
+ } catch (e) {
33
+ reject(e);
34
+ }
35
+ };
36
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
37
+ step((generator = generator.apply(__this, __arguments)).next());
38
+ });
39
+ };
40
+
41
+
42
+
43
+
44
+
45
+ exports.__spreadValues = __spreadValues; exports.__spreadProps = __spreadProps; exports.__async = __async;
46
+ //# sourceMappingURL=chunk-F45I5NLI.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":""}