@dream-api/sdk 0.1.31 → 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 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 Clerk SDK (call once on page 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 sign-up worker");
213
- this.token = jwt;
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
- const urlParams2 = new URLSearchParams(window.location.search);
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
- this.loaded = true;
293
- await this.checkSession();
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
@@ -319,6 +313,17 @@ var ClerkManager = class {
319
313
  * Get current user info
320
314
  */
321
315
  getUser() {
316
+ const clerk = getClerk();
317
+ if (clerk?.user) {
318
+ const user = clerk.user;
319
+ const metadata = user.publicMetadata || {};
320
+ return {
321
+ id: user.id,
322
+ email: user.primaryEmailAddress?.emailAddress || "",
323
+ plan: metadata.plan || "free",
324
+ publishableKey: metadata.publishableKey || ""
325
+ };
326
+ }
322
327
  if (this.token) {
323
328
  try {
324
329
  const parts = this.token.split(".");
@@ -335,16 +340,7 @@ var ClerkManager = class {
335
340
  console.error("[DreamAPI] Failed to decode JWT:", e);
336
341
  }
337
342
  }
338
- const clerk = getClerk();
339
- if (!clerk?.user) return null;
340
- const user = clerk.user;
341
- const metadata = user.publicMetadata || {};
342
- return {
343
- id: user.id,
344
- email: user.primaryEmailAddress?.emailAddress || "",
345
- plan: metadata.plan || "free",
346
- publishableKey: metadata.publishableKey || ""
347
- };
343
+ return null;
348
344
  }
349
345
  /**
350
346
  * Get current token
@@ -353,33 +349,40 @@ var ClerkManager = class {
353
349
  return this.token;
354
350
  }
355
351
  /**
356
- * Refresh token and user data from Clerk server
357
- * Call after plan changes (checkout success) to get updated metadata
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)
358
355
  */
359
356
  async refreshToken() {
360
357
  const clerk = getClerk();
361
- if (!clerk?.session) return null;
362
- try {
363
- if (clerk.user?.reload) {
364
- await clerk.user.reload();
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);
365
368
  }
366
- this.token = await clerk.session.getToken({ template: JWT_TEMPLATE });
367
- this.onTokenChange?.(this.token);
368
- return this.token;
369
- } catch (err) {
370
- console.error("Failed to refresh token:", err);
371
- return null;
372
369
  }
370
+ return this.token;
373
371
  }
374
372
  /**
375
373
  * Sign out
376
374
  */
377
375
  async signOut() {
378
- const clerk = getClerk();
379
- if (!clerk) return;
380
- await clerk.signOut();
376
+ localStorage.removeItem(STORAGE_KEY);
381
377
  this.token = null;
382
378
  this.onTokenChange?.(null);
379
+ const clerk = getClerk();
380
+ if (clerk) {
381
+ try {
382
+ await clerk.signOut();
383
+ } catch (e) {
384
+ }
385
+ }
383
386
  }
384
387
  /**
385
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 Clerk SDK (call once on page 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 sign-up worker");
185
- this.token = jwt;
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
- const urlParams2 = new URLSearchParams(window.location.search);
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
- this.loaded = true;
265
- await this.checkSession();
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
@@ -291,6 +285,17 @@ var ClerkManager = class {
291
285
  * Get current user info
292
286
  */
293
287
  getUser() {
288
+ const clerk = getClerk();
289
+ if (clerk?.user) {
290
+ const user = clerk.user;
291
+ const metadata = user.publicMetadata || {};
292
+ return {
293
+ id: user.id,
294
+ email: user.primaryEmailAddress?.emailAddress || "",
295
+ plan: metadata.plan || "free",
296
+ publishableKey: metadata.publishableKey || ""
297
+ };
298
+ }
294
299
  if (this.token) {
295
300
  try {
296
301
  const parts = this.token.split(".");
@@ -307,16 +312,7 @@ var ClerkManager = class {
307
312
  console.error("[DreamAPI] Failed to decode JWT:", e);
308
313
  }
309
314
  }
310
- const clerk = getClerk();
311
- if (!clerk?.user) return null;
312
- const user = clerk.user;
313
- const metadata = user.publicMetadata || {};
314
- return {
315
- id: user.id,
316
- email: user.primaryEmailAddress?.emailAddress || "",
317
- plan: metadata.plan || "free",
318
- publishableKey: metadata.publishableKey || ""
319
- };
315
+ return null;
320
316
  }
321
317
  /**
322
318
  * Get current token
@@ -325,33 +321,40 @@ var ClerkManager = class {
325
321
  return this.token;
326
322
  }
327
323
  /**
328
- * Refresh token and user data from Clerk server
329
- * Call after plan changes (checkout success) to get updated metadata
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)
330
327
  */
331
328
  async refreshToken() {
332
329
  const clerk = getClerk();
333
- if (!clerk?.session) return null;
334
- try {
335
- if (clerk.user?.reload) {
336
- await clerk.user.reload();
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);
337
340
  }
338
- this.token = await clerk.session.getToken({ template: JWT_TEMPLATE });
339
- this.onTokenChange?.(this.token);
340
- return this.token;
341
- } catch (err) {
342
- console.error("Failed to refresh token:", err);
343
- return null;
344
341
  }
342
+ return this.token;
345
343
  }
346
344
  /**
347
345
  * Sign out
348
346
  */
349
347
  async signOut() {
350
- const clerk = getClerk();
351
- if (!clerk) return;
352
- await clerk.signOut();
348
+ localStorage.removeItem(STORAGE_KEY);
353
349
  this.token = null;
354
350
  this.onTokenChange?.(null);
351
+ const clerk = getClerk();
352
+ if (clerk) {
353
+ try {
354
+ await clerk.signOut();
355
+ } catch (e) {
356
+ }
357
+ }
355
358
  }
356
359
  /**
357
360
  * Check if we're returning from auth (has clerk params/cookies)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dream-api/sdk",
3
- "version": "0.1.31",
3
+ "version": "0.1.33",
4
4
  "description": "Official SDK for Dream API - Auth, billing, and usage tracking in one API",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",