@opexa/portal-sdk 0.59.75 → 0.59.76

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.
@@ -39,5 +39,5 @@ function callIfFn(value, ...args) {
39
39
  }
40
40
 
41
41
  export { callIfFn, gql, statusCodeToOperationError };
42
- //# sourceMappingURL=chunk-ROBGEUSE.js.map
43
- //# sourceMappingURL=chunk-ROBGEUSE.js.map
42
+ //# sourceMappingURL=chunk-WVFSGB7Y.js.map
43
+ //# sourceMappingURL=chunk-WVFSGB7Y.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/gql.ts","../src/utils/status-code-to-operation-error.ts","../src/utils/call-if-fn.ts"],"names":[],"mappings":";AAAO,SAAS,GAAA,CAAI,YAAkC,MAAA,EAAmB;AACxE,EAAA,IAAI,MAAA,GAAS,EAAA;AAEb,EAAA,KAAA,MAAW,CAAC,KAAA,EAAO,MAAM,CAAA,IAAK,OAAA,CAAQ,SAAQ,EAAG;AAChD,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,EAAA,CAAG,KAAK,CAAA,IAAK,EAAA;AAElC,IAAA,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,EAAG,MAAM,GAAG,KAAK,CAAA,CAAA;AAAA,EACpC;AAEA,EAAA,OAAO,OAAO,IAAA,EAAK;AACpB;;;ACRO,SAAS,0BAAA,CACf,OACA,OAAA,EAC4B;AAC5B,EAAA,MAAM,CAAA,GAAI,UAAU,KAAK,CAAA,GAAI,UAAU,KAAK,CAAA,GAAI,UAAU,GAAG,CAAA;AAE7D,EAAA,OAAO;AAAA,IACN,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,OAAA,EAAS,WAAW,CAAA,CAAE;AAAA,GACvB;AACD;AAEA,IAAM,SAAA,GAAuD;AAAA,EAC5D,GAAA,EAAK,EAAE,IAAA,EAAM,gBAAA,EAAkB,SAAS,aAAA,EAAc;AAAA,EACtD,GAAA,EAAK,EAAE,IAAA,EAAM,kBAAA,EAAoB,SAAS,cAAA,EAAe;AAAA,EACzD,GAAA,EAAK,EAAE,IAAA,EAAM,eAAA,EAAiB,SAAS,WAAA,EAAY;AAAA,EACnD,GAAA,EAAK,EAAE,IAAA,EAAM,cAAA,EAAgB,SAAS,WAAA,EAAY;AAAA,EAClD,GAAA,EAAK,EAAE,IAAA,EAAM,oBAAA,EAAsB,SAAS,iBAAA,EAAkB;AAAA,EAC9D,GAAA,EAAK,EAAE,IAAA,EAAM,qBAAA,EAAuB,SAAS,mBAAA,EAAoB;AAAA,EACjE,GAAA,EAAK,EAAE,IAAA,EAAM,yBAAA,EAA2B,SAAS,uBAAA;AAClD,CAAA;;;ACtBA,SAAS,WACR,KAAA,EACuC;AACvC,EAAA,OAAO,OAAO,KAAA,KAAU,UAAA;AACzB;AAEO,SAAS,QAAA,CACf,UACG,IAAA,EACF;AACD,EAAA,IAAI,UAAA,CAAyB,KAAK,CAAA,EAAG;AACpC,IAAA,OAAO,KAAA,CAAM,GAAG,IAAI,CAAA;AAAA,EACrB,CAAA,MAAO;AACN,IAAA,OAAO,KAAA;AAAA,EACR;AACD","file":"chunk-WVFSGB7Y.js","sourcesContent":["export function gql(strings: TemplateStringsArray, ...values: unknown[]) {\r\n\tlet result = '';\r\n\r\n\tfor (const [index, string] of strings.entries()) {\r\n\t\tconst value = values.at(index) ?? '';\r\n\r\n\t\tresult = `${result}${string}${value}`;\r\n\t}\r\n\r\n\treturn result.trim();\r\n}\r\n","import type { HttpError, OperationError } from '../types/index.js';\r\n\r\nexport function statusCodeToOperationError(\r\n\tvalue: number,\r\n\tmessage?: string,\r\n): OperationError<HttpError> {\r\n\tconst e = ERROR_MAP[value] ? ERROR_MAP[value] : ERROR_MAP[500];\r\n\r\n\treturn {\r\n\t\tname: e.name,\r\n\t\tmessage: message ?? e.message,\r\n\t};\r\n}\r\n\r\nconst ERROR_MAP: Record<number, OperationError<HttpError>> = {\r\n\t400: { name: 'HttpBadRequest', message: 'Bad Request' },\r\n\t401: { name: 'HttpUnauthorized', message: 'Unauthorized' },\r\n\t403: { name: 'HttpForbidden', message: 'Forbidden' },\r\n\t404: { name: 'HttpNotFound', message: 'Not Found' },\r\n\t408: { name: 'HttpRequestTimeout', message: 'Request Timeout' },\r\n\t429: { name: 'HttpTooManyRequests', message: 'Too Many Requests' },\r\n\t500: { name: 'HttpInternalServerError', message: 'Internal Server Error' },\r\n};\r\n","function isFunction<Return, Args = never>(\r\n\tvalue: unknown | ((...args: Args[]) => Return),\r\n): value is (...args: Args[]) => Return {\r\n\treturn typeof value === 'function';\r\n}\r\n\r\nexport function callIfFn<Return, Args = never>(\r\n\tvalue: Return | ((...args: Args[]) => Return),\r\n\t...args: Args[]\r\n) {\r\n\tif (isFunction<Return, Args>(value)) {\r\n\t\treturn value(...args);\r\n\t} else {\r\n\t\treturn value;\r\n\t}\r\n}\r\n"]}
package/dist/index.cjs CHANGED
@@ -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,20 @@ 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
4632
  try {
4633
- const res = await fetch(`${this.url}/session:refresh`, {
4634
- method: "POST",
4635
- headers
4636
- });
4633
+ const res = await fetch(
4634
+ `${this.url}${version === 4 ? "/v4/session/refresh" : "/session:refresh"}`,
4635
+ {
4636
+ method: "POST",
4637
+ headers,
4638
+ ...version === 4 && { credentials: "include" }
4639
+ }
4640
+ );
4637
4641
  const data = await res.json();
4638
4642
  if (res.ok) {
4639
4643
  return {
@@ -7103,6 +7107,13 @@ var SessionManagerCookie = class {
7103
7107
  authService;
7104
7108
  walletService;
7105
7109
  _refreshing = false;
7110
+ /*
7111
+ * v4 access tokens are never persisted (localStorage/cookie) so that an
7112
+ * XSS-readable storage layer never holds a live access token. They only
7113
+ * live in memory and get re-minted from the HttpOnly refresh cookie.
7114
+ */
7115
+ v4AccessToken = null;
7116
+ v4AccessTokenExpiresAt = null;
7106
7117
  constructor(config) {
7107
7118
  this.authService = config.authService;
7108
7119
  this.walletService = config.walletService;
@@ -7114,6 +7125,29 @@ var SessionManagerCookie = class {
7114
7125
  set refreshing(value) {
7115
7126
  this._refreshing = value;
7116
7127
  }
7128
+ persist(data, version) {
7129
+ const now = /* @__PURE__ */ new Date();
7130
+ if (version === 4) {
7131
+ this.v4AccessToken = data.accessToken ?? null;
7132
+ this.v4AccessTokenExpiresAt = addMinutes(now, 5).getTime();
7133
+ cookies__default.default.set(
7134
+ this.storageKey,
7135
+ JSON.stringify({ version, session: data.session }),
7136
+ { expires: subMinutes(addDays(now, 15), 2).getTime() }
7137
+ );
7138
+ return;
7139
+ }
7140
+ cookies__default.default.set(
7141
+ this.storageKey,
7142
+ JSON.stringify({
7143
+ version,
7144
+ ...data,
7145
+ accessTokenExpiresAt: addMinutes(now, 8).getTime(),
7146
+ refreshTokenExpiresAt: subMinutes(addDays(now, 30), 2).getTime()
7147
+ }),
7148
+ { expires: subMinutes(addDays(now, 30), 2).getTime() }
7149
+ );
7150
+ }
7117
7151
  async create(input, version = 1) {
7118
7152
  if (input.type === "MAYA") {
7119
7153
  localStorage.setItem(this.platformStorageKey, "MAYA");
@@ -7140,16 +7174,7 @@ var SessionManagerCookie = class {
7140
7174
  maxAttempt: 5
7141
7175
  })();
7142
7176
  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
- );
7177
+ this.persist(r1.data, version);
7153
7178
  return {
7154
7179
  ok: true,
7155
7180
  data: null
@@ -7158,18 +7183,7 @@ var SessionManagerCookie = class {
7158
7183
  if (input.type === "MOBILE_NUMBER") {
7159
7184
  const res2 = await this.authService.createSession(input, version);
7160
7185
  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
- );
7186
+ this.persist(res2.data, version);
7173
7187
  return {
7174
7188
  ok: true,
7175
7189
  data: null
@@ -7186,16 +7200,7 @@ var SessionManagerCookie = class {
7186
7200
  version
7187
7201
  );
7188
7202
  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
- );
7203
+ this.persist(res2.data, version);
7199
7204
  return {
7200
7205
  ok: true,
7201
7206
  data: null
@@ -7207,16 +7212,7 @@ var SessionManagerCookie = class {
7207
7212
  localStorage.setItem(this.platformStorageKey, "CABINET");
7208
7213
  const res2 = await this.authService.createSession(input, version);
7209
7214
  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
- );
7215
+ this.persist(res2.data, version);
7220
7216
  return {
7221
7217
  ok: true,
7222
7218
  data: null
@@ -7234,16 +7230,7 @@ var SessionManagerCookie = class {
7234
7230
  }
7235
7231
  };
7236
7232
  }
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
- );
7233
+ this.persist(res.data, version);
7247
7234
  return {
7248
7235
  ok: true,
7249
7236
  data: null
@@ -7252,21 +7239,10 @@ var SessionManagerCookie = class {
7252
7239
  async createFromAuthenticator(input) {
7253
7240
  const res = await this.authService.authenticate(input);
7254
7241
  if (res.ok) {
7255
- const now = /* @__PURE__ */ new Date();
7256
7242
  if (this.isServer) {
7257
7243
  this.logger.warn("'client cookies' is not available on the server.");
7258
7244
  } 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
- );
7245
+ this.persist(res.data, 1);
7270
7246
  }
7271
7247
  return { ok: true };
7272
7248
  } else {
@@ -7293,7 +7269,11 @@ var SessionManagerCookie = class {
7293
7269
  };
7294
7270
  }
7295
7271
  try {
7296
- let obj = JSON.parse(val);
7272
+ const stored = JSON.parse(val);
7273
+ if (stored.version === 4) {
7274
+ return await this.getV4(stored.session);
7275
+ }
7276
+ let obj = stored;
7297
7277
  let now = /* @__PURE__ */ new Date();
7298
7278
  const accessTokenExpiresAt = new Date(obj.accessTokenExpiresAt);
7299
7279
  const refreshTokenExpiresAt = new Date(obj.refreshTokenExpiresAt);
@@ -7311,7 +7291,10 @@ var SessionManagerCookie = class {
7311
7291
  if (isAfter(now, accessTokenExpiresAt)) {
7312
7292
  this.logger.info("Refreshing session...");
7313
7293
  this.refreshing = true;
7314
- const res = await this.authService.refreshSession(obj.refreshToken);
7294
+ const res = await this.authService.refreshSession(
7295
+ obj.refreshToken,
7296
+ obj.version ?? 1
7297
+ );
7315
7298
  this.refreshing = false;
7316
7299
  if (!res.ok) {
7317
7300
  this.logger.error(`Failed to refresh session: ${res.error.message}`);
@@ -7333,7 +7316,8 @@ var SessionManagerCookie = class {
7333
7316
  now = /* @__PURE__ */ new Date();
7334
7317
  obj = {
7335
7318
  ...obj,
7336
- ...res.data,
7319
+ accessToken: res.data.accessToken,
7320
+ refreshToken: res.data.refreshToken ?? obj.refreshToken,
7337
7321
  accessTokenExpiresAt: addMinutes(now, 8).getTime(),
7338
7322
  refreshTokenExpiresAt: subMinutes(addDays(now, 30), 2).getTime()
7339
7323
  };
@@ -7371,11 +7355,18 @@ var SessionManagerCookie = class {
7371
7355
  };
7372
7356
  }
7373
7357
  try {
7374
- let obj = JSON.parse(val);
7358
+ const stored = JSON.parse(val);
7359
+ if (stored.version === 4) {
7360
+ return await this.refreshV4(stored.session);
7361
+ }
7362
+ let obj = stored;
7375
7363
  let now = /* @__PURE__ */ new Date();
7376
7364
  this.logger.info("Refreshing session...");
7377
7365
  this.refreshing = true;
7378
- const res = await this.authService.refreshSession(obj.refreshToken);
7366
+ const res = await this.authService.refreshSession(
7367
+ obj.refreshToken,
7368
+ obj.version ?? 1
7369
+ );
7379
7370
  this.refreshing = false;
7380
7371
  if (!res.ok) {
7381
7372
  this.logger.error(`Failed to refresh session: ${res.error.message}`);
@@ -7397,7 +7388,8 @@ var SessionManagerCookie = class {
7397
7388
  now = /* @__PURE__ */ new Date();
7398
7389
  obj = {
7399
7390
  ...obj,
7400
- ...res.data,
7391
+ accessToken: res.data.accessToken,
7392
+ refreshToken: res.data.refreshToken ?? obj.refreshToken,
7401
7393
  accessTokenExpiresAt: addMinutes(now, 8).getTime(),
7402
7394
  refreshTokenExpiresAt: subMinutes(addDays(now, 30), 2).getTime()
7403
7395
  };
@@ -7418,6 +7410,50 @@ var SessionManagerCookie = class {
7418
7410
  };
7419
7411
  }
7420
7412
  }
7413
+ async getV4(session) {
7414
+ const now = /* @__PURE__ */ new Date();
7415
+ if (this.v4AccessToken && this.v4AccessTokenExpiresAt && !isAfter(now, new Date(this.v4AccessTokenExpiresAt))) {
7416
+ return {
7417
+ ok: true,
7418
+ data: {
7419
+ session,
7420
+ accessToken: this.v4AccessToken,
7421
+ accessTokenExpiresAt: this.v4AccessTokenExpiresAt
7422
+ }
7423
+ };
7424
+ }
7425
+ return await this.refreshV4(session);
7426
+ }
7427
+ async refreshV4(session) {
7428
+ this.logger.info("Refreshing session...");
7429
+ this.refreshing = true;
7430
+ const res = await this.authService.refreshSession(void 0, 4);
7431
+ this.refreshing = false;
7432
+ if (!res.ok) {
7433
+ this.logger.error(`Failed to refresh session: ${res.error.message}`);
7434
+ if (res.error.name === "InvalidTokenError" || res.error.name === "AccountBlacklistedError" || res.error.name === "VerificationLockedError") {
7435
+ cookies__default.default.remove(this.storageKey);
7436
+ this.v4AccessToken = null;
7437
+ this.v4AccessTokenExpiresAt = null;
7438
+ }
7439
+ return {
7440
+ ok: false,
7441
+ error: res.error
7442
+ };
7443
+ }
7444
+ this.logger.success("Session refreshed!");
7445
+ const now = /* @__PURE__ */ new Date();
7446
+ this.v4AccessToken = res.data.accessToken;
7447
+ this.v4AccessTokenExpiresAt = addMinutes(now, 5).getTime();
7448
+ return {
7449
+ ok: true,
7450
+ data: {
7451
+ session,
7452
+ accessToken: this.v4AccessToken,
7453
+ accessTokenExpiresAt: this.v4AccessTokenExpiresAt
7454
+ }
7455
+ };
7456
+ }
7421
7457
  async destroy() {
7422
7458
  if (this.isServer) {
7423
7459
  this.logger.warn("'client cookies' is not available on the server.");
@@ -7427,6 +7463,8 @@ var SessionManagerCookie = class {
7427
7463
  if (res.data?.accessToken) {
7428
7464
  await this.authService.destroySession(res.data.accessToken);
7429
7465
  }
7466
+ this.v4AccessToken = null;
7467
+ this.v4AccessTokenExpiresAt = null;
7430
7468
  cookies__default.default.remove(this.storageKey);
7431
7469
  }
7432
7470
  async verify() {
@@ -7472,6 +7510,13 @@ var SessionManager = class {
7472
7510
  authService;
7473
7511
  walletService;
7474
7512
  _refreshing = false;
7513
+ /*
7514
+ * v4 access tokens are never persisted (localStorage/cookie) so that an
7515
+ * XSS-readable storage layer never holds a live access token. They only
7516
+ * live in memory and get re-minted from the HttpOnly refresh cookie.
7517
+ */
7518
+ v4AccessToken = null;
7519
+ v4AccessTokenExpiresAt = null;
7475
7520
  constructor(config) {
7476
7521
  this.authService = config.authService;
7477
7522
  this.walletService = config.walletService;
@@ -7487,6 +7532,27 @@ var SessionManager = class {
7487
7532
  set refreshing(value) {
7488
7533
  this._refreshing = value;
7489
7534
  }
7535
+ persist(data, version) {
7536
+ const now = /* @__PURE__ */ new Date();
7537
+ if (version === 4) {
7538
+ this.v4AccessToken = data.accessToken ?? null;
7539
+ this.v4AccessTokenExpiresAt = addMinutes(now, 5).getTime();
7540
+ localStorage.setItem(
7541
+ this.storageKey,
7542
+ JSON.stringify({ version, session: data.session })
7543
+ );
7544
+ return;
7545
+ }
7546
+ localStorage.setItem(
7547
+ this.storageKey,
7548
+ JSON.stringify({
7549
+ version,
7550
+ ...data,
7551
+ accessTokenExpiresAt: addMinutes(now, 8).getTime(),
7552
+ refreshTokenExpiresAt: subMinutes(addDays(now, 30), 2).getTime()
7553
+ })
7554
+ );
7555
+ }
7490
7556
  async create(input, version = 1) {
7491
7557
  if (this.isServer) {
7492
7558
  this.logger.warn("'localStorage' is not available on the server.");
@@ -7523,15 +7589,7 @@ var SessionManager = class {
7523
7589
  maxAttempt: 5
7524
7590
  })();
7525
7591
  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
- );
7592
+ this.persist(r1.data, version);
7535
7593
  return {
7536
7594
  ok: true,
7537
7595
  data: null
@@ -7540,15 +7598,7 @@ var SessionManager = class {
7540
7598
  if (input.type === "MOBILE_NUMBER") {
7541
7599
  const res2 = await this.authService.createSession(input, version);
7542
7600
  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
- );
7601
+ this.persist(res2.data, version);
7552
7602
  return {
7553
7603
  ok: true,
7554
7604
  data: null
@@ -7566,15 +7616,7 @@ var SessionManager = class {
7566
7616
  version
7567
7617
  );
7568
7618
  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
- );
7619
+ this.persist(res2.data, version);
7578
7620
  return {
7579
7621
  ok: true,
7580
7622
  data: null
@@ -7586,15 +7628,7 @@ var SessionManager = class {
7586
7628
  localStorage.setItem(this.platformStorageKey, "CABINET");
7587
7629
  const res2 = await this.authService.createSession(input, version);
7588
7630
  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
- );
7631
+ this.persist(res2.data, version);
7598
7632
  return {
7599
7633
  ok: true,
7600
7634
  data: null
@@ -7612,15 +7646,7 @@ var SessionManager = class {
7612
7646
  }
7613
7647
  };
7614
7648
  }
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
- );
7649
+ this.persist(res.data, version);
7624
7650
  return {
7625
7651
  ok: true,
7626
7652
  data: null
@@ -7629,18 +7655,10 @@ var SessionManager = class {
7629
7655
  async createFromAuthenticator(input) {
7630
7656
  const res = await this.authService.authenticate(input);
7631
7657
  if (res.ok) {
7632
- const now = /* @__PURE__ */ new Date();
7633
7658
  if (this.isServer) {
7634
7659
  this.logger.warn("'localStorage' is not available on the server.");
7635
7660
  } 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
- );
7661
+ this.persist(res.data, 1);
7644
7662
  }
7645
7663
  return { ok: true };
7646
7664
  } else {
@@ -7667,7 +7685,11 @@ var SessionManager = class {
7667
7685
  };
7668
7686
  }
7669
7687
  try {
7670
- let obj = JSON.parse(val);
7688
+ const stored = JSON.parse(val);
7689
+ if (stored.version === 4) {
7690
+ return await this.getV4(stored.session);
7691
+ }
7692
+ let obj = stored;
7671
7693
  let now = /* @__PURE__ */ new Date();
7672
7694
  const accessTokenExpiresAt = new Date(obj.accessTokenExpiresAt);
7673
7695
  const refreshTokenExpiresAt = new Date(obj.refreshTokenExpiresAt);
@@ -7685,7 +7707,10 @@ var SessionManager = class {
7685
7707
  if (isAfter(now, accessTokenExpiresAt)) {
7686
7708
  this.logger.info("Refreshing session...");
7687
7709
  this.refreshing = true;
7688
- const res = await this.authService.refreshSession(obj.refreshToken);
7710
+ const res = await this.authService.refreshSession(
7711
+ obj.refreshToken,
7712
+ obj.version ?? 1
7713
+ );
7689
7714
  this.refreshing = false;
7690
7715
  if (!res.ok) {
7691
7716
  this.logger.error(`Failed to refresh session: ${res.error.message}`);
@@ -7707,7 +7732,8 @@ var SessionManager = class {
7707
7732
  now = /* @__PURE__ */ new Date();
7708
7733
  obj = {
7709
7734
  ...obj,
7710
- ...res.data,
7735
+ accessToken: res.data.accessToken,
7736
+ refreshToken: res.data.refreshToken ?? obj.refreshToken,
7711
7737
  accessTokenExpiresAt: addMinutes(now, 8).getTime(),
7712
7738
  refreshTokenExpiresAt: subMinutes(addDays(now, 30), 2).getTime()
7713
7739
  };
@@ -7743,11 +7769,18 @@ var SessionManager = class {
7743
7769
  };
7744
7770
  }
7745
7771
  try {
7746
- let obj = JSON.parse(val);
7772
+ const stored = JSON.parse(val);
7773
+ if (stored.version === 4) {
7774
+ return await this.refreshV4(stored.session);
7775
+ }
7776
+ let obj = stored;
7747
7777
  let now = /* @__PURE__ */ new Date();
7748
7778
  this.logger.info("Refreshing session...");
7749
7779
  this.refreshing = true;
7750
- const res = await this.authService.refreshSession(obj.refreshToken);
7780
+ const res = await this.authService.refreshSession(
7781
+ obj.refreshToken,
7782
+ obj.version ?? 1
7783
+ );
7751
7784
  this.refreshing = false;
7752
7785
  if (!res.ok) {
7753
7786
  this.logger.error(`Failed to refresh session: ${res.error.message}`);
@@ -7769,7 +7802,8 @@ var SessionManager = class {
7769
7802
  now = /* @__PURE__ */ new Date();
7770
7803
  obj = {
7771
7804
  ...obj,
7772
- ...res.data,
7805
+ accessToken: res.data.accessToken,
7806
+ refreshToken: res.data.refreshToken ?? obj.refreshToken,
7773
7807
  accessTokenExpiresAt: addMinutes(now, 8).getTime(),
7774
7808
  refreshTokenExpiresAt: subMinutes(addDays(now, 30), 2).getTime()
7775
7809
  };
@@ -7788,6 +7822,50 @@ var SessionManager = class {
7788
7822
  };
7789
7823
  }
7790
7824
  }
7825
+ async getV4(session) {
7826
+ const now = /* @__PURE__ */ new Date();
7827
+ if (this.v4AccessToken && this.v4AccessTokenExpiresAt && !isAfter(now, new Date(this.v4AccessTokenExpiresAt))) {
7828
+ return {
7829
+ ok: true,
7830
+ data: {
7831
+ session,
7832
+ accessToken: this.v4AccessToken,
7833
+ accessTokenExpiresAt: this.v4AccessTokenExpiresAt
7834
+ }
7835
+ };
7836
+ }
7837
+ return await this.refreshV4(session);
7838
+ }
7839
+ async refreshV4(session) {
7840
+ this.logger.info("Refreshing session...");
7841
+ this.refreshing = true;
7842
+ const res = await this.authService.refreshSession(void 0, 4);
7843
+ this.refreshing = false;
7844
+ if (!res.ok) {
7845
+ this.logger.error(`Failed to refresh session: ${res.error.message}`);
7846
+ if (res.error.name === "InvalidTokenError" || res.error.name === "AccountBlacklistedError" || res.error.name === "VerificationLockedError") {
7847
+ localStorage.removeItem(this.storageKey);
7848
+ this.v4AccessToken = null;
7849
+ this.v4AccessTokenExpiresAt = null;
7850
+ }
7851
+ return {
7852
+ ok: false,
7853
+ error: res.error
7854
+ };
7855
+ }
7856
+ this.logger.success("Session refreshed!");
7857
+ const now = /* @__PURE__ */ new Date();
7858
+ this.v4AccessToken = res.data.accessToken;
7859
+ this.v4AccessTokenExpiresAt = addMinutes(now, 5).getTime();
7860
+ return {
7861
+ ok: true,
7862
+ data: {
7863
+ session,
7864
+ accessToken: this.v4AccessToken,
7865
+ accessTokenExpiresAt: this.v4AccessTokenExpiresAt
7866
+ }
7867
+ };
7868
+ }
7791
7869
  async destroy() {
7792
7870
  if (this.isServer) {
7793
7871
  this.logger.warn("'localStorage' is not available on the server.");
@@ -7797,6 +7875,8 @@ var SessionManager = class {
7797
7875
  if (res.data?.accessToken) {
7798
7876
  await this.authService.destroySession(res.data.accessToken);
7799
7877
  }
7878
+ this.v4AccessToken = null;
7879
+ this.v4AccessTokenExpiresAt = null;
7800
7880
  localStorage.removeItem(this.storageKey);
7801
7881
  }
7802
7882
  async verify() {