@opexa/portal-sdk 0.59.75 → 0.59.77

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.cjs CHANGED
@@ -4500,7 +4500,7 @@ var AuthService = class {
4500
4500
  }
4501
4501
  async createSession(input, version = 1) {
4502
4502
  const headers = new Headers(this.headers);
4503
- if (version === 3) {
4503
+ if (version === 3 || version === 4) {
4504
4504
  const fingerprint = await getFingerPrint();
4505
4505
  if (fingerprint) {
4506
4506
  headers.append("Fingerprint", fingerprint);
@@ -4538,14 +4538,12 @@ var AuthService = class {
4538
4538
  headers.set("test-pass", input.testPass);
4539
4539
  }
4540
4540
  try {
4541
- const res = await fetch(
4542
- `${this.url}${version === 3 ? "/v3/sessions" : "/sessions"}`,
4543
- {
4544
- method: "POST",
4545
- headers,
4546
- body: JSON.stringify(input)
4547
- }
4548
- );
4541
+ const res = await fetch(`${this.url}${version !== 1 ? `/v${version}/sessions` : "/sessions"}`, {
4542
+ method: "POST",
4543
+ headers,
4544
+ body: JSON.stringify(input),
4545
+ ...version === 4 && { credentials: "include" }
4546
+ });
4549
4547
  const data = await res.json();
4550
4548
  if (res.ok) {
4551
4549
  return {
@@ -4626,14 +4624,26 @@ var AuthService = class {
4626
4624
  }
4627
4625
  throw new Error("Invalid input 'type'");
4628
4626
  }
4629
- async refreshSession(refreshToken) {
4627
+ async refreshSession(refreshToken, version = 1) {
4630
4628
  const headers = new Headers(this.headers);
4631
- headers.append("Authorization", `Bearer ${refreshToken}`);
4629
+ if (version !== 4) {
4630
+ headers.append("Authorization", `Bearer ${refreshToken}`);
4631
+ }
4632
+ if (version === 3 || version === 4) {
4633
+ const fingerprint = await getFingerPrint();
4634
+ if (fingerprint) {
4635
+ headers.append("Fingerprint", fingerprint);
4636
+ }
4637
+ }
4632
4638
  try {
4633
- const res = await fetch(`${this.url}/session:refresh`, {
4634
- method: "POST",
4635
- headers
4636
- });
4639
+ const res = await fetch(
4640
+ `${this.url}${version !== 1 ? `/v${version}/session/refresh` : "/session:refresh"}`,
4641
+ {
4642
+ method: "POST",
4643
+ headers,
4644
+ ...version === 4 && { credentials: "include" }
4645
+ }
4646
+ );
4637
4647
  const data = await res.json();
4638
4648
  if (res.ok) {
4639
4649
  return {
@@ -4670,14 +4680,20 @@ var AuthService = class {
4670
4680
  };
4671
4681
  }
4672
4682
  }
4673
- async destroySession(accessToken) {
4683
+ async destroySession(accessToken, version = 1) {
4674
4684
  const headers = new Headers(this.headers);
4675
- headers.append("Authorization", `Bearer ${accessToken}`);
4685
+ if (version !== 4) {
4686
+ headers.append("Authorization", `Bearer ${accessToken}`);
4687
+ }
4676
4688
  try {
4677
- const res = await fetch(`${this.url}/session`, {
4678
- method: "DELETE",
4679
- headers
4680
- });
4689
+ const res = await fetch(
4690
+ `${this.url}${version !== 1 ? `/v${version}/session` : "/session"}`,
4691
+ {
4692
+ method: "DELETE",
4693
+ headers,
4694
+ ...version === 4 && { credentials: "include" }
4695
+ }
4696
+ );
4681
4697
  return res.ok ? { ok: true } : { ok: false, error: statusCodeToOperationError(res.status) };
4682
4698
  } catch {
4683
4699
  return { ok: false, error: statusCodeToOperationError(500) };
@@ -7103,6 +7119,13 @@ var SessionManagerCookie = class {
7103
7119
  authService;
7104
7120
  walletService;
7105
7121
  _refreshing = false;
7122
+ /*
7123
+ * v4 access tokens are never persisted (localStorage/cookie) so that an
7124
+ * XSS-readable storage layer never holds a live access token. They only
7125
+ * live in memory and get re-minted from the HttpOnly refresh cookie.
7126
+ */
7127
+ v4AccessToken = null;
7128
+ v4AccessTokenExpiresAt = null;
7106
7129
  constructor(config) {
7107
7130
  this.authService = config.authService;
7108
7131
  this.walletService = config.walletService;
@@ -7114,6 +7137,29 @@ var SessionManagerCookie = class {
7114
7137
  set refreshing(value) {
7115
7138
  this._refreshing = value;
7116
7139
  }
7140
+ persist(data, version) {
7141
+ const now = /* @__PURE__ */ new Date();
7142
+ if (version === 4) {
7143
+ this.v4AccessToken = data.accessToken ?? null;
7144
+ this.v4AccessTokenExpiresAt = addMinutes(now, 5).getTime();
7145
+ cookies__default.default.set(
7146
+ this.storageKey,
7147
+ JSON.stringify({ version, session: data.session }),
7148
+ { expires: subMinutes(addDays(now, 15), 2).getTime() }
7149
+ );
7150
+ return;
7151
+ }
7152
+ cookies__default.default.set(
7153
+ this.storageKey,
7154
+ JSON.stringify({
7155
+ version,
7156
+ ...data,
7157
+ accessTokenExpiresAt: addMinutes(now, 8).getTime(),
7158
+ refreshTokenExpiresAt: subMinutes(addDays(now, 30), 2).getTime()
7159
+ }),
7160
+ { expires: subMinutes(addDays(now, 30), 2).getTime() }
7161
+ );
7162
+ }
7117
7163
  async create(input, version = 1) {
7118
7164
  if (input.type === "MAYA") {
7119
7165
  localStorage.setItem(this.platformStorageKey, "MAYA");
@@ -7140,16 +7186,7 @@ var SessionManagerCookie = class {
7140
7186
  maxAttempt: 5
7141
7187
  })();
7142
7188
  if (!r1.ok) return r1;
7143
- const now2 = /* @__PURE__ */ new Date();
7144
- cookies__default.default.set(
7145
- this.storageKey,
7146
- JSON.stringify({
7147
- ...r1.data,
7148
- accessTokenExpiresAt: addMinutes(now2, 8).getTime(),
7149
- refreshTokenExpiresAt: subMinutes(addDays(now2, 30), 2).getTime()
7150
- }),
7151
- { expires: subMinutes(addDays(now2, 30), 2).getTime() }
7152
- );
7189
+ this.persist(r1.data, version);
7153
7190
  return {
7154
7191
  ok: true,
7155
7192
  data: null
@@ -7158,18 +7195,7 @@ var SessionManagerCookie = class {
7158
7195
  if (input.type === "MOBILE_NUMBER") {
7159
7196
  const res2 = await this.authService.createSession(input, version);
7160
7197
  if (res2.ok) {
7161
- const now2 = /* @__PURE__ */ new Date();
7162
- cookies__default.default.set(
7163
- this.storageKey,
7164
- JSON.stringify({
7165
- ...res2.data,
7166
- accessTokenExpiresAt: addMinutes(now2, 8).getTime(),
7167
- refreshTokenExpiresAt: subMinutes(addDays(now2, 30), 2).getTime()
7168
- }),
7169
- {
7170
- expires: subMinutes(addDays(now2, 30), 2).getTime()
7171
- }
7172
- );
7198
+ this.persist(res2.data, version);
7173
7199
  return {
7174
7200
  ok: true,
7175
7201
  data: null
@@ -7186,16 +7212,7 @@ var SessionManagerCookie = class {
7186
7212
  version
7187
7213
  );
7188
7214
  if (res2.ok) {
7189
- const now2 = /* @__PURE__ */ new Date();
7190
- cookies__default.default.set(
7191
- this.storageKey,
7192
- JSON.stringify({
7193
- ...res2.data,
7194
- accessTokenExpiresAt: addMinutes(now2, 8).getTime(),
7195
- refreshTokenExpiresAt: subMinutes(addDays(now2, 30), 2).getTime()
7196
- }),
7197
- { expires: subMinutes(addDays(now2, 30), 2).getTime() }
7198
- );
7215
+ this.persist(res2.data, version);
7199
7216
  return {
7200
7217
  ok: true,
7201
7218
  data: null
@@ -7207,16 +7224,7 @@ var SessionManagerCookie = class {
7207
7224
  localStorage.setItem(this.platformStorageKey, "CABINET");
7208
7225
  const res2 = await this.authService.createSession(input, version);
7209
7226
  if (res2.ok) {
7210
- const now2 = /* @__PURE__ */ new Date();
7211
- cookies__default.default.set(
7212
- this.storageKey,
7213
- JSON.stringify({
7214
- ...res2.data,
7215
- accessTokenExpiresAt: addMinutes(now2, 8).getTime(),
7216
- refreshTokenExpiresAt: subMinutes(addDays(now2, 30), 2).getTime()
7217
- }),
7218
- { expires: subMinutes(addDays(now2, 30), 2).getTime() }
7219
- );
7227
+ this.persist(res2.data, version);
7220
7228
  return {
7221
7229
  ok: true,
7222
7230
  data: null
@@ -7234,16 +7242,7 @@ var SessionManagerCookie = class {
7234
7242
  }
7235
7243
  };
7236
7244
  }
7237
- const now = /* @__PURE__ */ new Date();
7238
- cookies__default.default.set(
7239
- this.storageKey,
7240
- JSON.stringify({
7241
- ...res.data,
7242
- accessTokenExpiresAt: addMinutes(now, 8).getTime(),
7243
- refreshTokenExpiresAt: subMinutes(addDays(now, 30), 2).getTime()
7244
- }),
7245
- {}
7246
- );
7245
+ this.persist(res.data, version);
7247
7246
  return {
7248
7247
  ok: true,
7249
7248
  data: null
@@ -7252,21 +7251,10 @@ var SessionManagerCookie = class {
7252
7251
  async createFromAuthenticator(input) {
7253
7252
  const res = await this.authService.authenticate(input);
7254
7253
  if (res.ok) {
7255
- const now = /* @__PURE__ */ new Date();
7256
7254
  if (this.isServer) {
7257
7255
  this.logger.warn("'client cookies' is not available on the server.");
7258
7256
  } else {
7259
- cookies__default.default.set(
7260
- this.storageKey,
7261
- JSON.stringify({
7262
- ...res.data,
7263
- accessTokenExpiresAt: addMinutes(now, 8).getTime(),
7264
- refreshTokenExpiresAt: subMinutes(addDays(now, 30), 2).getTime()
7265
- }),
7266
- {
7267
- expires: subMinutes(addDays(now, 30), 2).getTime()
7268
- }
7269
- );
7257
+ this.persist(res.data, 1);
7270
7258
  }
7271
7259
  return { ok: true };
7272
7260
  } else {
@@ -7293,7 +7281,11 @@ var SessionManagerCookie = class {
7293
7281
  };
7294
7282
  }
7295
7283
  try {
7296
- let obj = JSON.parse(val);
7284
+ const stored = JSON.parse(val);
7285
+ if (stored.version === 4) {
7286
+ return await this.getV4(stored.session);
7287
+ }
7288
+ let obj = stored;
7297
7289
  let now = /* @__PURE__ */ new Date();
7298
7290
  const accessTokenExpiresAt = new Date(obj.accessTokenExpiresAt);
7299
7291
  const refreshTokenExpiresAt = new Date(obj.refreshTokenExpiresAt);
@@ -7311,7 +7303,10 @@ var SessionManagerCookie = class {
7311
7303
  if (isAfter(now, accessTokenExpiresAt)) {
7312
7304
  this.logger.info("Refreshing session...");
7313
7305
  this.refreshing = true;
7314
- const res = await this.authService.refreshSession(obj.refreshToken);
7306
+ const res = await this.authService.refreshSession(
7307
+ obj.refreshToken,
7308
+ obj.version ?? 1
7309
+ );
7315
7310
  this.refreshing = false;
7316
7311
  if (!res.ok) {
7317
7312
  this.logger.error(`Failed to refresh session: ${res.error.message}`);
@@ -7333,7 +7328,8 @@ var SessionManagerCookie = class {
7333
7328
  now = /* @__PURE__ */ new Date();
7334
7329
  obj = {
7335
7330
  ...obj,
7336
- ...res.data,
7331
+ accessToken: res.data.accessToken,
7332
+ refreshToken: res.data.refreshToken ?? obj.refreshToken,
7337
7333
  accessTokenExpiresAt: addMinutes(now, 8).getTime(),
7338
7334
  refreshTokenExpiresAt: subMinutes(addDays(now, 30), 2).getTime()
7339
7335
  };
@@ -7371,11 +7367,18 @@ var SessionManagerCookie = class {
7371
7367
  };
7372
7368
  }
7373
7369
  try {
7374
- let obj = JSON.parse(val);
7370
+ const stored = JSON.parse(val);
7371
+ if (stored.version === 4) {
7372
+ return await this.refreshV4(stored.session);
7373
+ }
7374
+ let obj = stored;
7375
7375
  let now = /* @__PURE__ */ new Date();
7376
7376
  this.logger.info("Refreshing session...");
7377
7377
  this.refreshing = true;
7378
- const res = await this.authService.refreshSession(obj.refreshToken);
7378
+ const res = await this.authService.refreshSession(
7379
+ obj.refreshToken,
7380
+ obj.version ?? 1
7381
+ );
7379
7382
  this.refreshing = false;
7380
7383
  if (!res.ok) {
7381
7384
  this.logger.error(`Failed to refresh session: ${res.error.message}`);
@@ -7397,7 +7400,8 @@ var SessionManagerCookie = class {
7397
7400
  now = /* @__PURE__ */ new Date();
7398
7401
  obj = {
7399
7402
  ...obj,
7400
- ...res.data,
7403
+ accessToken: res.data.accessToken,
7404
+ refreshToken: res.data.refreshToken ?? obj.refreshToken,
7401
7405
  accessTokenExpiresAt: addMinutes(now, 8).getTime(),
7402
7406
  refreshTokenExpiresAt: subMinutes(addDays(now, 30), 2).getTime()
7403
7407
  };
@@ -7418,15 +7422,70 @@ var SessionManagerCookie = class {
7418
7422
  };
7419
7423
  }
7420
7424
  }
7425
+ async getV4(session) {
7426
+ const now = /* @__PURE__ */ new Date();
7427
+ if (this.v4AccessToken && this.v4AccessTokenExpiresAt && !isAfter(now, new Date(this.v4AccessTokenExpiresAt))) {
7428
+ return {
7429
+ ok: true,
7430
+ data: {
7431
+ session,
7432
+ accessToken: this.v4AccessToken,
7433
+ accessTokenExpiresAt: this.v4AccessTokenExpiresAt
7434
+ }
7435
+ };
7436
+ }
7437
+ return await this.refreshV4(session);
7438
+ }
7439
+ async refreshV4(session) {
7440
+ this.logger.info("Refreshing session...");
7441
+ this.refreshing = true;
7442
+ const res = await this.authService.refreshSession(void 0, 4);
7443
+ this.refreshing = false;
7444
+ if (!res.ok) {
7445
+ this.logger.error(`Failed to refresh session: ${res.error.message}`);
7446
+ if (res.error.name === "InvalidTokenError" || res.error.name === "AccountBlacklistedError" || res.error.name === "VerificationLockedError") {
7447
+ cookies__default.default.remove(this.storageKey);
7448
+ this.v4AccessToken = null;
7449
+ this.v4AccessTokenExpiresAt = null;
7450
+ }
7451
+ return {
7452
+ ok: false,
7453
+ error: res.error
7454
+ };
7455
+ }
7456
+ this.logger.success("Session refreshed!");
7457
+ const now = /* @__PURE__ */ new Date();
7458
+ this.v4AccessToken = res.data.accessToken;
7459
+ this.v4AccessTokenExpiresAt = addMinutes(now, 5).getTime();
7460
+ return {
7461
+ ok: true,
7462
+ data: {
7463
+ session,
7464
+ accessToken: this.v4AccessToken,
7465
+ accessTokenExpiresAt: this.v4AccessTokenExpiresAt
7466
+ }
7467
+ };
7468
+ }
7421
7469
  async destroy() {
7422
7470
  if (this.isServer) {
7423
7471
  this.logger.warn("'client cookies' is not available on the server.");
7424
7472
  return;
7425
7473
  }
7474
+ let version = 1;
7475
+ const val = cookies__default.default.get(this.storageKey);
7476
+ if (val) {
7477
+ try {
7478
+ const stored = JSON.parse(val);
7479
+ version = stored.version ?? 1;
7480
+ } catch {
7481
+ }
7482
+ }
7426
7483
  const res = await this.get();
7427
7484
  if (res.data?.accessToken) {
7428
- await this.authService.destroySession(res.data.accessToken);
7485
+ await this.authService.destroySession(res.data.accessToken, version);
7429
7486
  }
7487
+ this.v4AccessToken = null;
7488
+ this.v4AccessTokenExpiresAt = null;
7430
7489
  cookies__default.default.remove(this.storageKey);
7431
7490
  }
7432
7491
  async verify() {
@@ -7472,6 +7531,13 @@ var SessionManager = class {
7472
7531
  authService;
7473
7532
  walletService;
7474
7533
  _refreshing = false;
7534
+ /*
7535
+ * v4 access tokens are never persisted (localStorage/cookie) so that an
7536
+ * XSS-readable storage layer never holds a live access token. They only
7537
+ * live in memory and get re-minted from the HttpOnly refresh cookie.
7538
+ */
7539
+ v4AccessToken = null;
7540
+ v4AccessTokenExpiresAt = null;
7475
7541
  constructor(config) {
7476
7542
  this.authService = config.authService;
7477
7543
  this.walletService = config.walletService;
@@ -7487,6 +7553,27 @@ var SessionManager = class {
7487
7553
  set refreshing(value) {
7488
7554
  this._refreshing = value;
7489
7555
  }
7556
+ persist(data, version) {
7557
+ const now = /* @__PURE__ */ new Date();
7558
+ if (version === 4) {
7559
+ this.v4AccessToken = data.accessToken ?? null;
7560
+ this.v4AccessTokenExpiresAt = addMinutes(now, 5).getTime();
7561
+ localStorage.setItem(
7562
+ this.storageKey,
7563
+ JSON.stringify({ version, session: data.session })
7564
+ );
7565
+ return;
7566
+ }
7567
+ localStorage.setItem(
7568
+ this.storageKey,
7569
+ JSON.stringify({
7570
+ version,
7571
+ ...data,
7572
+ accessTokenExpiresAt: addMinutes(now, 8).getTime(),
7573
+ refreshTokenExpiresAt: subMinutes(addDays(now, 30), 2).getTime()
7574
+ })
7575
+ );
7576
+ }
7490
7577
  async create(input, version = 1) {
7491
7578
  if (this.isServer) {
7492
7579
  this.logger.warn("'localStorage' is not available on the server.");
@@ -7523,15 +7610,7 @@ var SessionManager = class {
7523
7610
  maxAttempt: 5
7524
7611
  })();
7525
7612
  if (!r1.ok) return r1;
7526
- const now2 = /* @__PURE__ */ new Date();
7527
- localStorage.setItem(
7528
- this.storageKey,
7529
- JSON.stringify({
7530
- ...r1.data,
7531
- accessTokenExpiresAt: addMinutes(now2, 8).getTime(),
7532
- refreshTokenExpiresAt: subMinutes(addDays(now2, 30), 2).getTime()
7533
- })
7534
- );
7613
+ this.persist(r1.data, version);
7535
7614
  return {
7536
7615
  ok: true,
7537
7616
  data: null
@@ -7540,15 +7619,7 @@ var SessionManager = class {
7540
7619
  if (input.type === "MOBILE_NUMBER") {
7541
7620
  const res2 = await this.authService.createSession(input, version);
7542
7621
  if (res2.ok) {
7543
- const now2 = /* @__PURE__ */ new Date();
7544
- localStorage.setItem(
7545
- this.storageKey,
7546
- JSON.stringify({
7547
- ...res2.data,
7548
- accessTokenExpiresAt: addMinutes(now2, 8).getTime(),
7549
- refreshTokenExpiresAt: subMinutes(addDays(now2, 30), 2).getTime()
7550
- })
7551
- );
7622
+ this.persist(res2.data, version);
7552
7623
  return {
7553
7624
  ok: true,
7554
7625
  data: null
@@ -7566,15 +7637,7 @@ var SessionManager = class {
7566
7637
  version
7567
7638
  );
7568
7639
  if (res2.ok) {
7569
- const now2 = /* @__PURE__ */ new Date();
7570
- localStorage.setItem(
7571
- this.storageKey,
7572
- JSON.stringify({
7573
- ...res2.data,
7574
- accessTokenExpiresAt: addMinutes(now2, 8).getTime(),
7575
- refreshTokenExpiresAt: subMinutes(addDays(now2, 30), 2).getTime()
7576
- })
7577
- );
7640
+ this.persist(res2.data, version);
7578
7641
  return {
7579
7642
  ok: true,
7580
7643
  data: null
@@ -7586,15 +7649,7 @@ var SessionManager = class {
7586
7649
  localStorage.setItem(this.platformStorageKey, "CABINET");
7587
7650
  const res2 = await this.authService.createSession(input, version);
7588
7651
  if (res2.ok) {
7589
- const now2 = /* @__PURE__ */ new Date();
7590
- localStorage.setItem(
7591
- this.storageKey,
7592
- JSON.stringify({
7593
- ...res2.data,
7594
- accessTokenExpiresAt: addMinutes(now2, 8).getTime(),
7595
- refreshTokenExpiresAt: subMinutes(addDays(now2, 30), 2).getTime()
7596
- })
7597
- );
7652
+ this.persist(res2.data, version);
7598
7653
  return {
7599
7654
  ok: true,
7600
7655
  data: null
@@ -7612,15 +7667,7 @@ var SessionManager = class {
7612
7667
  }
7613
7668
  };
7614
7669
  }
7615
- const now = /* @__PURE__ */ new Date();
7616
- localStorage.setItem(
7617
- this.storageKey,
7618
- JSON.stringify({
7619
- ...res.data,
7620
- accessTokenExpiresAt: addMinutes(now, 8).getTime(),
7621
- refreshTokenExpiresAt: subMinutes(addDays(now, 30), 2).getTime()
7622
- })
7623
- );
7670
+ this.persist(res.data, version);
7624
7671
  return {
7625
7672
  ok: true,
7626
7673
  data: null
@@ -7629,18 +7676,10 @@ var SessionManager = class {
7629
7676
  async createFromAuthenticator(input) {
7630
7677
  const res = await this.authService.authenticate(input);
7631
7678
  if (res.ok) {
7632
- const now = /* @__PURE__ */ new Date();
7633
7679
  if (this.isServer) {
7634
7680
  this.logger.warn("'localStorage' is not available on the server.");
7635
7681
  } else {
7636
- localStorage.setItem(
7637
- this.storageKey,
7638
- JSON.stringify({
7639
- ...res.data,
7640
- accessTokenExpiresAt: addMinutes(now, 8).getTime(),
7641
- refreshTokenExpiresAt: subMinutes(addDays(now, 30), 2).getTime()
7642
- })
7643
- );
7682
+ this.persist(res.data, 1);
7644
7683
  }
7645
7684
  return { ok: true };
7646
7685
  } else {
@@ -7667,7 +7706,11 @@ var SessionManager = class {
7667
7706
  };
7668
7707
  }
7669
7708
  try {
7670
- let obj = JSON.parse(val);
7709
+ const stored = JSON.parse(val);
7710
+ if (stored.version === 4) {
7711
+ return await this.getV4(stored.session);
7712
+ }
7713
+ let obj = stored;
7671
7714
  let now = /* @__PURE__ */ new Date();
7672
7715
  const accessTokenExpiresAt = new Date(obj.accessTokenExpiresAt);
7673
7716
  const refreshTokenExpiresAt = new Date(obj.refreshTokenExpiresAt);
@@ -7685,7 +7728,10 @@ var SessionManager = class {
7685
7728
  if (isAfter(now, accessTokenExpiresAt)) {
7686
7729
  this.logger.info("Refreshing session...");
7687
7730
  this.refreshing = true;
7688
- const res = await this.authService.refreshSession(obj.refreshToken);
7731
+ const res = await this.authService.refreshSession(
7732
+ obj.refreshToken,
7733
+ obj.version ?? 1
7734
+ );
7689
7735
  this.refreshing = false;
7690
7736
  if (!res.ok) {
7691
7737
  this.logger.error(`Failed to refresh session: ${res.error.message}`);
@@ -7707,7 +7753,8 @@ var SessionManager = class {
7707
7753
  now = /* @__PURE__ */ new Date();
7708
7754
  obj = {
7709
7755
  ...obj,
7710
- ...res.data,
7756
+ accessToken: res.data.accessToken,
7757
+ refreshToken: res.data.refreshToken ?? obj.refreshToken,
7711
7758
  accessTokenExpiresAt: addMinutes(now, 8).getTime(),
7712
7759
  refreshTokenExpiresAt: subMinutes(addDays(now, 30), 2).getTime()
7713
7760
  };
@@ -7743,11 +7790,18 @@ var SessionManager = class {
7743
7790
  };
7744
7791
  }
7745
7792
  try {
7746
- let obj = JSON.parse(val);
7793
+ const stored = JSON.parse(val);
7794
+ if (stored.version === 4) {
7795
+ return await this.refreshV4(stored.session);
7796
+ }
7797
+ let obj = stored;
7747
7798
  let now = /* @__PURE__ */ new Date();
7748
7799
  this.logger.info("Refreshing session...");
7749
7800
  this.refreshing = true;
7750
- const res = await this.authService.refreshSession(obj.refreshToken);
7801
+ const res = await this.authService.refreshSession(
7802
+ obj.refreshToken,
7803
+ obj.version ?? 1
7804
+ );
7751
7805
  this.refreshing = false;
7752
7806
  if (!res.ok) {
7753
7807
  this.logger.error(`Failed to refresh session: ${res.error.message}`);
@@ -7769,7 +7823,8 @@ var SessionManager = class {
7769
7823
  now = /* @__PURE__ */ new Date();
7770
7824
  obj = {
7771
7825
  ...obj,
7772
- ...res.data,
7826
+ accessToken: res.data.accessToken,
7827
+ refreshToken: res.data.refreshToken ?? obj.refreshToken,
7773
7828
  accessTokenExpiresAt: addMinutes(now, 8).getTime(),
7774
7829
  refreshTokenExpiresAt: subMinutes(addDays(now, 30), 2).getTime()
7775
7830
  };
@@ -7788,15 +7843,70 @@ var SessionManager = class {
7788
7843
  };
7789
7844
  }
7790
7845
  }
7846
+ async getV4(session) {
7847
+ const now = /* @__PURE__ */ new Date();
7848
+ if (this.v4AccessToken && this.v4AccessTokenExpiresAt && !isAfter(now, new Date(this.v4AccessTokenExpiresAt))) {
7849
+ return {
7850
+ ok: true,
7851
+ data: {
7852
+ session,
7853
+ accessToken: this.v4AccessToken,
7854
+ accessTokenExpiresAt: this.v4AccessTokenExpiresAt
7855
+ }
7856
+ };
7857
+ }
7858
+ return await this.refreshV4(session);
7859
+ }
7860
+ async refreshV4(session) {
7861
+ this.logger.info("Refreshing session...");
7862
+ this.refreshing = true;
7863
+ const res = await this.authService.refreshSession(void 0, 4);
7864
+ this.refreshing = false;
7865
+ if (!res.ok) {
7866
+ this.logger.error(`Failed to refresh session: ${res.error.message}`);
7867
+ if (res.error.name === "InvalidTokenError" || res.error.name === "AccountBlacklistedError" || res.error.name === "VerificationLockedError") {
7868
+ localStorage.removeItem(this.storageKey);
7869
+ this.v4AccessToken = null;
7870
+ this.v4AccessTokenExpiresAt = null;
7871
+ }
7872
+ return {
7873
+ ok: false,
7874
+ error: res.error
7875
+ };
7876
+ }
7877
+ this.logger.success("Session refreshed!");
7878
+ const now = /* @__PURE__ */ new Date();
7879
+ this.v4AccessToken = res.data.accessToken;
7880
+ this.v4AccessTokenExpiresAt = addMinutes(now, 5).getTime();
7881
+ return {
7882
+ ok: true,
7883
+ data: {
7884
+ session,
7885
+ accessToken: this.v4AccessToken,
7886
+ accessTokenExpiresAt: this.v4AccessTokenExpiresAt
7887
+ }
7888
+ };
7889
+ }
7791
7890
  async destroy() {
7792
7891
  if (this.isServer) {
7793
7892
  this.logger.warn("'localStorage' is not available on the server.");
7794
7893
  return;
7795
7894
  }
7895
+ let version = 1;
7896
+ const val = localStorage.getItem(this.storageKey);
7897
+ if (val) {
7898
+ try {
7899
+ const stored = JSON.parse(val);
7900
+ version = stored.version ?? 1;
7901
+ } catch {
7902
+ }
7903
+ }
7796
7904
  const res = await this.get();
7797
7905
  if (res.data?.accessToken) {
7798
- await this.authService.destroySession(res.data.accessToken);
7906
+ await this.authService.destroySession(res.data.accessToken, version);
7799
7907
  }
7908
+ this.v4AccessToken = null;
7909
+ this.v4AccessTokenExpiresAt = null;
7800
7910
  localStorage.removeItem(this.storageKey);
7801
7911
  }
7802
7912
  async verify() {