@dream-api/sdk 0.1.32 → 0.1.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +69 -68
- package/dist/index.mjs +69 -68
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -194,6 +194,7 @@ var JWT_TEMPLATE = "end-user-api";
|
|
|
194
194
|
function getClerk() {
|
|
195
195
|
return window.Clerk;
|
|
196
196
|
}
|
|
197
|
+
var STORAGE_KEY = "dream_api_jwt";
|
|
197
198
|
var ClerkManager = class {
|
|
198
199
|
constructor(mode, onTokenChange) {
|
|
199
200
|
this.loaded = false;
|
|
@@ -202,25 +203,57 @@ var ClerkManager = class {
|
|
|
202
203
|
this.onTokenChange = onTokenChange;
|
|
203
204
|
}
|
|
204
205
|
/**
|
|
205
|
-
* Load
|
|
206
|
+
* Load auth (call once on page load)
|
|
207
|
+
* Uses JWT from URL or localStorage - no Clerk needed on dev's domain
|
|
206
208
|
*/
|
|
207
209
|
async load() {
|
|
208
210
|
if (this.loaded || typeof window === "undefined") return;
|
|
209
211
|
const urlParams = new URLSearchParams(window.location.search);
|
|
210
212
|
const jwt = urlParams.get("__clerk_jwt");
|
|
211
213
|
if (jwt) {
|
|
212
|
-
console.log("[DreamAPI] JWT received from
|
|
213
|
-
this.
|
|
214
|
-
this.onTokenChange?.(jwt);
|
|
214
|
+
console.log("[DreamAPI] JWT received from auth worker");
|
|
215
|
+
this.setToken(jwt);
|
|
215
216
|
urlParams.delete("__clerk_jwt");
|
|
216
217
|
const newUrl = urlParams.toString() ? `${window.location.pathname}?${urlParams}` : window.location.pathname;
|
|
217
218
|
window.history.replaceState({}, "", newUrl);
|
|
218
219
|
this.loaded = true;
|
|
219
220
|
return;
|
|
220
221
|
}
|
|
222
|
+
const storedJwt = localStorage.getItem(STORAGE_KEY);
|
|
223
|
+
if (storedJwt) {
|
|
224
|
+
try {
|
|
225
|
+
const payload = JSON.parse(atob(storedJwt.split(".")[1].replace(/-/g, "+").replace(/_/g, "/")));
|
|
226
|
+
const now = Math.floor(Date.now() / 1e3);
|
|
227
|
+
if (payload.exp && payload.exp > now) {
|
|
228
|
+
console.log("[DreamAPI] Valid JWT from localStorage");
|
|
229
|
+
this.token = storedJwt;
|
|
230
|
+
this.onTokenChange?.(storedJwt);
|
|
231
|
+
this.loaded = true;
|
|
232
|
+
return;
|
|
233
|
+
} else {
|
|
234
|
+
console.log("[DreamAPI] Stored JWT expired, clearing");
|
|
235
|
+
localStorage.removeItem(STORAGE_KEY);
|
|
236
|
+
}
|
|
237
|
+
} catch (e) {
|
|
238
|
+
console.log("[DreamAPI] Invalid stored JWT, clearing");
|
|
239
|
+
localStorage.removeItem(STORAGE_KEY);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
if (this.mode === "test") {
|
|
243
|
+
try {
|
|
244
|
+
await this.loadClerkSDK();
|
|
245
|
+
} catch (e) {
|
|
246
|
+
console.log("[DreamAPI] Clerk load failed (expected in some environments)");
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
this.loaded = true;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Load Clerk SDK (test mode only, for better DX on localhost)
|
|
253
|
+
*/
|
|
254
|
+
async loadClerkSDK() {
|
|
221
255
|
const existingClerk = getClerk();
|
|
222
256
|
if (existingClerk) {
|
|
223
|
-
this.loaded = true;
|
|
224
257
|
await this.checkSession();
|
|
225
258
|
return;
|
|
226
259
|
}
|
|
@@ -242,55 +275,16 @@ var ClerkManager = class {
|
|
|
242
275
|
}
|
|
243
276
|
if (clerk) {
|
|
244
277
|
await clerk.load();
|
|
245
|
-
|
|
246
|
-
const ticket = urlParams2.get("__clerk_ticket");
|
|
247
|
-
console.log("[DreamAPI] URL:", window.location.href);
|
|
248
|
-
console.log("[DreamAPI] Ticket present:", ticket ? "YES" : "NO");
|
|
249
|
-
const sdkDebug = {
|
|
250
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
251
|
-
url: window.location.href,
|
|
252
|
-
hasTicket: !!ticket,
|
|
253
|
-
ticketLength: ticket ? ticket.length : 0,
|
|
254
|
-
signupDebug: localStorage.getItem("dream_signup_debug"),
|
|
255
|
-
signupRedirect: localStorage.getItem("dream_signup_redirect")
|
|
256
|
-
};
|
|
257
|
-
localStorage.setItem("dream_sdk_debug", JSON.stringify(sdkDebug));
|
|
258
|
-
if (ticket) {
|
|
259
|
-
for (let i = 0; i < 50; i++) {
|
|
260
|
-
const hasSignIn = clerk.signIn || clerk.client?.signIn;
|
|
261
|
-
if (hasSignIn && clerk.setActive) break;
|
|
262
|
-
await new Promise((r) => setTimeout(r, 100));
|
|
263
|
-
}
|
|
264
|
-
console.log("[DreamAPI] signIn available:", !!clerk.signIn, "client.signIn:", !!clerk.client?.signIn, "setActive:", !!clerk.setActive);
|
|
265
|
-
}
|
|
266
|
-
const signInObj = clerk.signIn || clerk.client?.signIn;
|
|
267
|
-
if (ticket && signInObj && clerk.setActive) {
|
|
268
|
-
console.log("[DreamAPI] Consuming ticket...");
|
|
269
|
-
try {
|
|
270
|
-
const result = await signInObj.create({ strategy: "ticket", ticket });
|
|
271
|
-
console.log("[DreamAPI] Ticket result:", result.status, result.createdSessionId);
|
|
272
|
-
if (result.status === "complete" && result.createdSessionId) {
|
|
273
|
-
await clerk.setActive({ session: result.createdSessionId });
|
|
274
|
-
console.log("[DreamAPI] Session activated!");
|
|
275
|
-
for (let i = 0; i < 20; i++) {
|
|
276
|
-
await new Promise((r) => setTimeout(r, 100));
|
|
277
|
-
if (clerk.user && clerk.session) break;
|
|
278
|
-
}
|
|
279
|
-
console.log("[DreamAPI] User hydrated:", !!clerk.user);
|
|
280
|
-
urlParams2.delete("__clerk_ticket");
|
|
281
|
-
const newUrl = urlParams2.toString() ? `${window.location.pathname}?${urlParams2}` : window.location.pathname;
|
|
282
|
-
window.history.replaceState({}, "", newUrl);
|
|
283
|
-
}
|
|
284
|
-
} catch (err) {
|
|
285
|
-
console.error("[DreamAPI] Ticket error:", err?.message, err);
|
|
286
|
-
}
|
|
287
|
-
} else if (ticket) {
|
|
288
|
-
console.error("[DreamAPI] FAILED to get signIn object! Ticket NOT consumed.");
|
|
289
|
-
console.log("[DreamAPI] clerk keys:", Object.keys(clerk));
|
|
290
|
-
}
|
|
278
|
+
await this.checkSession();
|
|
291
279
|
}
|
|
292
|
-
|
|
293
|
-
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Store JWT in memory and localStorage
|
|
283
|
+
*/
|
|
284
|
+
setToken(jwt) {
|
|
285
|
+
this.token = jwt;
|
|
286
|
+
localStorage.setItem(STORAGE_KEY, jwt);
|
|
287
|
+
this.onTokenChange?.(jwt);
|
|
294
288
|
}
|
|
295
289
|
/**
|
|
296
290
|
* Check if returning from auth and grab token
|
|
@@ -355,33 +349,40 @@ var ClerkManager = class {
|
|
|
355
349
|
return this.token;
|
|
356
350
|
}
|
|
357
351
|
/**
|
|
358
|
-
* Refresh token and user data
|
|
359
|
-
*
|
|
352
|
+
* Refresh token and user data
|
|
353
|
+
* In test mode: refreshes from Clerk session
|
|
354
|
+
* In live mode: returns current token (re-auth needed for fresh data)
|
|
360
355
|
*/
|
|
361
356
|
async refreshToken() {
|
|
362
357
|
const clerk = getClerk();
|
|
363
|
-
if (
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
358
|
+
if (clerk?.session) {
|
|
359
|
+
try {
|
|
360
|
+
if (clerk.user?.reload) {
|
|
361
|
+
await clerk.user.reload();
|
|
362
|
+
}
|
|
363
|
+
this.token = await clerk.session.getToken({ template: JWT_TEMPLATE });
|
|
364
|
+
this.setToken(this.token);
|
|
365
|
+
return this.token;
|
|
366
|
+
} catch (err) {
|
|
367
|
+
console.error("Failed to refresh token from Clerk:", err);
|
|
367
368
|
}
|
|
368
|
-
this.token = await clerk.session.getToken({ template: JWT_TEMPLATE });
|
|
369
|
-
this.onTokenChange?.(this.token);
|
|
370
|
-
return this.token;
|
|
371
|
-
} catch (err) {
|
|
372
|
-
console.error("Failed to refresh token:", err);
|
|
373
|
-
return null;
|
|
374
369
|
}
|
|
370
|
+
return this.token;
|
|
375
371
|
}
|
|
376
372
|
/**
|
|
377
373
|
* Sign out
|
|
378
374
|
*/
|
|
379
375
|
async signOut() {
|
|
380
|
-
|
|
381
|
-
if (!clerk) return;
|
|
382
|
-
await clerk.signOut();
|
|
376
|
+
localStorage.removeItem(STORAGE_KEY);
|
|
383
377
|
this.token = null;
|
|
384
378
|
this.onTokenChange?.(null);
|
|
379
|
+
const clerk = getClerk();
|
|
380
|
+
if (clerk) {
|
|
381
|
+
try {
|
|
382
|
+
await clerk.signOut();
|
|
383
|
+
} catch (e) {
|
|
384
|
+
}
|
|
385
|
+
}
|
|
385
386
|
}
|
|
386
387
|
/**
|
|
387
388
|
* Check if we're returning from auth (has clerk params/cookies)
|
package/dist/index.mjs
CHANGED
|
@@ -166,6 +166,7 @@ var JWT_TEMPLATE = "end-user-api";
|
|
|
166
166
|
function getClerk() {
|
|
167
167
|
return window.Clerk;
|
|
168
168
|
}
|
|
169
|
+
var STORAGE_KEY = "dream_api_jwt";
|
|
169
170
|
var ClerkManager = class {
|
|
170
171
|
constructor(mode, onTokenChange) {
|
|
171
172
|
this.loaded = false;
|
|
@@ -174,25 +175,57 @@ var ClerkManager = class {
|
|
|
174
175
|
this.onTokenChange = onTokenChange;
|
|
175
176
|
}
|
|
176
177
|
/**
|
|
177
|
-
* Load
|
|
178
|
+
* Load auth (call once on page load)
|
|
179
|
+
* Uses JWT from URL or localStorage - no Clerk needed on dev's domain
|
|
178
180
|
*/
|
|
179
181
|
async load() {
|
|
180
182
|
if (this.loaded || typeof window === "undefined") return;
|
|
181
183
|
const urlParams = new URLSearchParams(window.location.search);
|
|
182
184
|
const jwt = urlParams.get("__clerk_jwt");
|
|
183
185
|
if (jwt) {
|
|
184
|
-
console.log("[DreamAPI] JWT received from
|
|
185
|
-
this.
|
|
186
|
-
this.onTokenChange?.(jwt);
|
|
186
|
+
console.log("[DreamAPI] JWT received from auth worker");
|
|
187
|
+
this.setToken(jwt);
|
|
187
188
|
urlParams.delete("__clerk_jwt");
|
|
188
189
|
const newUrl = urlParams.toString() ? `${window.location.pathname}?${urlParams}` : window.location.pathname;
|
|
189
190
|
window.history.replaceState({}, "", newUrl);
|
|
190
191
|
this.loaded = true;
|
|
191
192
|
return;
|
|
192
193
|
}
|
|
194
|
+
const storedJwt = localStorage.getItem(STORAGE_KEY);
|
|
195
|
+
if (storedJwt) {
|
|
196
|
+
try {
|
|
197
|
+
const payload = JSON.parse(atob(storedJwt.split(".")[1].replace(/-/g, "+").replace(/_/g, "/")));
|
|
198
|
+
const now = Math.floor(Date.now() / 1e3);
|
|
199
|
+
if (payload.exp && payload.exp > now) {
|
|
200
|
+
console.log("[DreamAPI] Valid JWT from localStorage");
|
|
201
|
+
this.token = storedJwt;
|
|
202
|
+
this.onTokenChange?.(storedJwt);
|
|
203
|
+
this.loaded = true;
|
|
204
|
+
return;
|
|
205
|
+
} else {
|
|
206
|
+
console.log("[DreamAPI] Stored JWT expired, clearing");
|
|
207
|
+
localStorage.removeItem(STORAGE_KEY);
|
|
208
|
+
}
|
|
209
|
+
} catch (e) {
|
|
210
|
+
console.log("[DreamAPI] Invalid stored JWT, clearing");
|
|
211
|
+
localStorage.removeItem(STORAGE_KEY);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
if (this.mode === "test") {
|
|
215
|
+
try {
|
|
216
|
+
await this.loadClerkSDK();
|
|
217
|
+
} catch (e) {
|
|
218
|
+
console.log("[DreamAPI] Clerk load failed (expected in some environments)");
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
this.loaded = true;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Load Clerk SDK (test mode only, for better DX on localhost)
|
|
225
|
+
*/
|
|
226
|
+
async loadClerkSDK() {
|
|
193
227
|
const existingClerk = getClerk();
|
|
194
228
|
if (existingClerk) {
|
|
195
|
-
this.loaded = true;
|
|
196
229
|
await this.checkSession();
|
|
197
230
|
return;
|
|
198
231
|
}
|
|
@@ -214,55 +247,16 @@ var ClerkManager = class {
|
|
|
214
247
|
}
|
|
215
248
|
if (clerk) {
|
|
216
249
|
await clerk.load();
|
|
217
|
-
|
|
218
|
-
const ticket = urlParams2.get("__clerk_ticket");
|
|
219
|
-
console.log("[DreamAPI] URL:", window.location.href);
|
|
220
|
-
console.log("[DreamAPI] Ticket present:", ticket ? "YES" : "NO");
|
|
221
|
-
const sdkDebug = {
|
|
222
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
223
|
-
url: window.location.href,
|
|
224
|
-
hasTicket: !!ticket,
|
|
225
|
-
ticketLength: ticket ? ticket.length : 0,
|
|
226
|
-
signupDebug: localStorage.getItem("dream_signup_debug"),
|
|
227
|
-
signupRedirect: localStorage.getItem("dream_signup_redirect")
|
|
228
|
-
};
|
|
229
|
-
localStorage.setItem("dream_sdk_debug", JSON.stringify(sdkDebug));
|
|
230
|
-
if (ticket) {
|
|
231
|
-
for (let i = 0; i < 50; i++) {
|
|
232
|
-
const hasSignIn = clerk.signIn || clerk.client?.signIn;
|
|
233
|
-
if (hasSignIn && clerk.setActive) break;
|
|
234
|
-
await new Promise((r) => setTimeout(r, 100));
|
|
235
|
-
}
|
|
236
|
-
console.log("[DreamAPI] signIn available:", !!clerk.signIn, "client.signIn:", !!clerk.client?.signIn, "setActive:", !!clerk.setActive);
|
|
237
|
-
}
|
|
238
|
-
const signInObj = clerk.signIn || clerk.client?.signIn;
|
|
239
|
-
if (ticket && signInObj && clerk.setActive) {
|
|
240
|
-
console.log("[DreamAPI] Consuming ticket...");
|
|
241
|
-
try {
|
|
242
|
-
const result = await signInObj.create({ strategy: "ticket", ticket });
|
|
243
|
-
console.log("[DreamAPI] Ticket result:", result.status, result.createdSessionId);
|
|
244
|
-
if (result.status === "complete" && result.createdSessionId) {
|
|
245
|
-
await clerk.setActive({ session: result.createdSessionId });
|
|
246
|
-
console.log("[DreamAPI] Session activated!");
|
|
247
|
-
for (let i = 0; i < 20; i++) {
|
|
248
|
-
await new Promise((r) => setTimeout(r, 100));
|
|
249
|
-
if (clerk.user && clerk.session) break;
|
|
250
|
-
}
|
|
251
|
-
console.log("[DreamAPI] User hydrated:", !!clerk.user);
|
|
252
|
-
urlParams2.delete("__clerk_ticket");
|
|
253
|
-
const newUrl = urlParams2.toString() ? `${window.location.pathname}?${urlParams2}` : window.location.pathname;
|
|
254
|
-
window.history.replaceState({}, "", newUrl);
|
|
255
|
-
}
|
|
256
|
-
} catch (err) {
|
|
257
|
-
console.error("[DreamAPI] Ticket error:", err?.message, err);
|
|
258
|
-
}
|
|
259
|
-
} else if (ticket) {
|
|
260
|
-
console.error("[DreamAPI] FAILED to get signIn object! Ticket NOT consumed.");
|
|
261
|
-
console.log("[DreamAPI] clerk keys:", Object.keys(clerk));
|
|
262
|
-
}
|
|
250
|
+
await this.checkSession();
|
|
263
251
|
}
|
|
264
|
-
|
|
265
|
-
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Store JWT in memory and localStorage
|
|
255
|
+
*/
|
|
256
|
+
setToken(jwt) {
|
|
257
|
+
this.token = jwt;
|
|
258
|
+
localStorage.setItem(STORAGE_KEY, jwt);
|
|
259
|
+
this.onTokenChange?.(jwt);
|
|
266
260
|
}
|
|
267
261
|
/**
|
|
268
262
|
* Check if returning from auth and grab token
|
|
@@ -327,33 +321,40 @@ var ClerkManager = class {
|
|
|
327
321
|
return this.token;
|
|
328
322
|
}
|
|
329
323
|
/**
|
|
330
|
-
* Refresh token and user data
|
|
331
|
-
*
|
|
324
|
+
* Refresh token and user data
|
|
325
|
+
* In test mode: refreshes from Clerk session
|
|
326
|
+
* In live mode: returns current token (re-auth needed for fresh data)
|
|
332
327
|
*/
|
|
333
328
|
async refreshToken() {
|
|
334
329
|
const clerk = getClerk();
|
|
335
|
-
if (
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
330
|
+
if (clerk?.session) {
|
|
331
|
+
try {
|
|
332
|
+
if (clerk.user?.reload) {
|
|
333
|
+
await clerk.user.reload();
|
|
334
|
+
}
|
|
335
|
+
this.token = await clerk.session.getToken({ template: JWT_TEMPLATE });
|
|
336
|
+
this.setToken(this.token);
|
|
337
|
+
return this.token;
|
|
338
|
+
} catch (err) {
|
|
339
|
+
console.error("Failed to refresh token from Clerk:", err);
|
|
339
340
|
}
|
|
340
|
-
this.token = await clerk.session.getToken({ template: JWT_TEMPLATE });
|
|
341
|
-
this.onTokenChange?.(this.token);
|
|
342
|
-
return this.token;
|
|
343
|
-
} catch (err) {
|
|
344
|
-
console.error("Failed to refresh token:", err);
|
|
345
|
-
return null;
|
|
346
341
|
}
|
|
342
|
+
return this.token;
|
|
347
343
|
}
|
|
348
344
|
/**
|
|
349
345
|
* Sign out
|
|
350
346
|
*/
|
|
351
347
|
async signOut() {
|
|
352
|
-
|
|
353
|
-
if (!clerk) return;
|
|
354
|
-
await clerk.signOut();
|
|
348
|
+
localStorage.removeItem(STORAGE_KEY);
|
|
355
349
|
this.token = null;
|
|
356
350
|
this.onTokenChange?.(null);
|
|
351
|
+
const clerk = getClerk();
|
|
352
|
+
if (clerk) {
|
|
353
|
+
try {
|
|
354
|
+
await clerk.signOut();
|
|
355
|
+
} catch (e) {
|
|
356
|
+
}
|
|
357
|
+
}
|
|
357
358
|
}
|
|
358
359
|
/**
|
|
359
360
|
* Check if we're returning from auth (has clerk params/cookies)
|