@crossmint/client-sdk-auth 1.0.0 → 1.1.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.
@@ -1,229 +0,0 @@
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
@@ -1 +0,0 @@
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":[]}
@@ -1,229 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
-
3
- var _chunkTIUX4OOQcjs = require('./chunk-TIUX4OOQ.cjs');
4
-
5
-
6
-
7
-
8
- var _chunkBGMXXFQ4cjs = require('./chunk-BGMXXFQ4.cjs');
9
-
10
-
11
- var _chunkQY4RIGNMcjs = require('./chunk-QY4RIGNM.cjs');
12
-
13
-
14
-
15
-
16
- var _chunkF45I5NLIcjs = require('./chunk-F45I5NLI.cjs');
17
-
18
- // src/CrossmintAuthClient.ts
19
-
20
-
21
-
22
-
23
-
24
-
25
- var _commonsdkauth = require('@crossmint/common-sdk-auth');
26
- var _clientsdkbase = require('@crossmint/client-sdk-base');
27
- var CrossmintAuthClient = class _CrossmintAuthClient extends _commonsdkauth.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, _commonsdkauth.CrossmintAuth.defaultApiClient(crossmint), config);
38
- if (typeof window !== "undefined") {
39
- authClient.handleRefreshAuthMaterial();
40
- }
41
- return authClient;
42
- }
43
- getUser() {
44
- return _chunkF45I5NLIcjs.__async.call(void 0, this, null, function* () {
45
- const result = yield this.apiClient.get(`api/${_commonsdkauth.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
- _chunkBGMXXFQ4cjs.setCookie.call(void 0, _commonsdkauth.SESSION_PREFIX, authMaterial.jwt);
56
- _chunkBGMXXFQ4cjs.setCookie.call(void 0, _commonsdkauth.REFRESH_TOKEN_PREFIX, authMaterial.refreshToken.secret, authMaterial.refreshToken.expiresAt);
57
- }
58
- logout() {
59
- return _chunkF45I5NLIcjs.__async.call(void 0, this, null, function* () {
60
- var _a, _b;
61
- try {
62
- if (this.logoutRoute != null) {
63
- yield this.logoutFromCustomRoute();
64
- } else {
65
- yield this.logoutFromDefaultRoute(_chunkBGMXXFQ4cjs.getCookie.call(void 0, _commonsdkauth.REFRESH_TOKEN_PREFIX));
66
- }
67
- } catch (error) {
68
- console.error(error);
69
- } finally {
70
- _chunkBGMXXFQ4cjs.deleteCookie.call(void 0, _commonsdkauth.REFRESH_TOKEN_PREFIX);
71
- _chunkBGMXXFQ4cjs.deleteCookie.call(void 0, _commonsdkauth.SESSION_PREFIX);
72
- (_b = (_a = this.callbacks).onLogout) == null ? void 0 : _b.call(_a);
73
- }
74
- });
75
- }
76
- handleRefreshAuthMaterial(refreshTokenSecret) {
77
- return _chunkF45I5NLIcjs.__async.call(void 0, this, null, function* () {
78
- var _a, _b;
79
- const refreshToken = refreshTokenSecret != null ? refreshTokenSecret : _chunkBGMXXFQ4cjs.getCookie.call(void 0, _commonsdkauth.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 _chunkF45I5NLIcjs.__async.call(void 0, this, null, function* () {
101
- const result = yield this.apiClient.get(`${_commonsdkauth.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 _chunkF45I5NLIcjs.__async.call(void 0, this, null, function* () {
112
- const result = yield this.apiClient.post(`${_commonsdkauth.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 _chunkF45I5NLIcjs.__async.call(void 0, 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}/${_commonsdkauth.AUTH_SDK_ROOT_ENDPOINT}/we-dont-actually-use-this-anymore`
130
- });
131
- const result = yield this.apiClient.post(`${_commonsdkauth.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 _chunkF45I5NLIcjs.__async.call(void 0, this, null, function* () {
143
- const queryParams = new URLSearchParams({
144
- signinAuthenticationMethod: "farcaster",
145
- callbackUrl: `${this.apiClient.baseUrl}/${_commonsdkauth.AUTH_SDK_ROOT_ENDPOINT}/callback?isPopup=false`
146
- });
147
- const result = yield this.apiClient.post(`${_commonsdkauth.AUTH_SDK_ROOT_ENDPOINT}/authenticate?${queryParams}`, {
148
- headers: {
149
- "Content-Type": "application/json"
150
- },
151
- body: JSON.stringify(_chunkF45I5NLIcjs.__spreadProps.call(void 0, _chunkF45I5NLIcjs.__spreadValues.call(void 0, {}, data), {
152
- domain: data.signatureParams.domain,
153
- redirect: true,
154
- callbackUrl: `${this.apiClient.baseUrl}/${_commonsdkauth.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 _chunkF45I5NLIcjs.__async.call(void 0, this, null, function* () {
164
- const queryParams = new URLSearchParams({
165
- signinAuthenticationMethod: "evm"
166
- });
167
- const result = yield this.apiClient.post(
168
- `${_commonsdkauth.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 _chunkF45I5NLIcjs.__async.call(void 0, this, null, function* () {
181
- const queryParams = new URLSearchParams({
182
- signinAuthenticationMethod: "evm",
183
- callbackUrl: `${this.apiClient.baseUrl}/${_commonsdkauth.AUTH_SDK_ROOT_ENDPOINT}/we-dont-actually-use-this-anymore`
184
- });
185
- const result = yield this.apiClient.post(
186
- `${_commonsdkauth.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 _chunkF45I5NLIcjs.__async.call(void 0, 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 = _chunkQY4RIGNMcjs.getJWTExpiration.call(void 0, jwt);
207
- if (!jwtExpiration) {
208
- throw new Error("Invalid JWT");
209
- }
210
- const currentTime = Date.now() / 1e3;
211
- const timeToExpire = jwtExpiration - currentTime - _chunkTIUX4OOQcjs.TIME_BEFORE_EXPIRING_JWT_IN_SECONDS;
212
- if (timeToExpire > 0) {
213
- const endTime = Date.now() + timeToExpire * 1e3;
214
- this.cancelScheduledRefresh();
215
- this.refreshTask = _clientsdkbase.queueTask.call(void 0, () => this.handleRefreshAuthMaterial(), endTime);
216
- }
217
- }
218
- cancelScheduledRefresh() {
219
- if (this.refreshTask) {
220
- this.refreshTask.cancel();
221
- this.refreshTask = null;
222
- }
223
- }
224
- };
225
-
226
-
227
-
228
- exports.CrossmintAuthClient = CrossmintAuthClient;
229
- //# sourceMappingURL=chunk-ILL57KWX.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/CrossmintAuthClient.ts"],"names":[],"mappings":"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","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"]}