@opexa/portal-sdk 0.59.74 → 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
@@ -2795,6 +2795,22 @@ var REFERRALS_QUERY = gql`
2795
2795
 
2796
2796
  ${REFERRAL_FRAGMENT}
2797
2797
  `;
2798
+ var QUALIFIED_REFERRALS_QUERY = gql`
2799
+ query QualifiedReferrals($first: Int, $after: Cursor, $filter: ReferralFilterInput) {
2800
+ member {
2801
+ referrals(first: $first, after: $after, filter: $filter) {
2802
+ edges {
2803
+ node {
2804
+ ... on Referral {
2805
+ id
2806
+ }
2807
+ }
2808
+ }
2809
+ totalCount
2810
+ }
2811
+ }
2812
+ }
2813
+ `;
2798
2814
  var UPLINES_BY_NAME_QUERY = gql`
2799
2815
  query UplinesByName($search: String!, $first: Int) {
2800
2816
  uplinesByName(search: $search, first: $first) {
@@ -4522,10 +4538,11 @@ var AuthService = class {
4522
4538
  headers.set("test-pass", input.testPass);
4523
4539
  }
4524
4540
  try {
4525
- const res = await fetch(`${this.url}${version === 3 ? "/v3/sessions" : "/sessions"}`, {
4541
+ const res = await fetch(`${this.url}${version !== 1 ? `/v${version}/sessions` : "/sessions"}`, {
4526
4542
  method: "POST",
4527
4543
  headers,
4528
- body: JSON.stringify(input)
4544
+ body: JSON.stringify(input),
4545
+ ...version === 4 && { credentials: "include" }
4529
4546
  });
4530
4547
  const data = await res.json();
4531
4548
  if (res.ok) {
@@ -4607,14 +4624,20 @@ var AuthService = class {
4607
4624
  }
4608
4625
  throw new Error("Invalid input 'type'");
4609
4626
  }
4610
- async refreshSession(refreshToken) {
4627
+ async refreshSession(refreshToken, version = 1) {
4611
4628
  const headers = new Headers(this.headers);
4612
- headers.append("Authorization", `Bearer ${refreshToken}`);
4629
+ if (version !== 4) {
4630
+ headers.append("Authorization", `Bearer ${refreshToken}`);
4631
+ }
4613
4632
  try {
4614
- const res = await fetch(`${this.url}/session:refresh`, {
4615
- method: "POST",
4616
- headers
4617
- });
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
+ );
4618
4641
  const data = await res.json();
4619
4642
  if (res.ok) {
4620
4643
  return {
@@ -5295,6 +5318,10 @@ var ReportService = class {
5295
5318
  const res = await this.client.request(REFERRALS_QUERY, variables);
5296
5319
  return res.ok ? { ok: res.ok, data: res.data.member.referrals } : res;
5297
5320
  }
5321
+ async qualifiedReferrals(variables) {
5322
+ const res = await this.client.request(QUALIFIED_REFERRALS_QUERY, variables);
5323
+ return res.ok ? { ok: res.ok, data: res.data.member.referrals } : res;
5324
+ }
5298
5325
  async referralCommission() {
5299
5326
  const res = await this.client.request(
5300
5327
  REFERRAL_COMMISSION_QUERY
@@ -6528,7 +6555,9 @@ var ExtensionService = class {
6528
6555
  };
6529
6556
  }
6530
6557
  async memberCabinetSiteMachine() {
6531
- const res = await this.client.request(MEMBER_CABINET_SITE_MACHINE_QUERY);
6558
+ const res = await this.client.request(
6559
+ MEMBER_CABINET_SITE_MACHINE_QUERY
6560
+ );
6532
6561
  return res.ok ? { ok: res.ok, data: res.data.memberCabinetSiteMachine } : res;
6533
6562
  }
6534
6563
  };
@@ -7078,6 +7107,13 @@ var SessionManagerCookie = class {
7078
7107
  authService;
7079
7108
  walletService;
7080
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;
7081
7117
  constructor(config) {
7082
7118
  this.authService = config.authService;
7083
7119
  this.walletService = config.walletService;
@@ -7089,6 +7125,29 @@ var SessionManagerCookie = class {
7089
7125
  set refreshing(value) {
7090
7126
  this._refreshing = value;
7091
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
+ }
7092
7151
  async create(input, version = 1) {
7093
7152
  if (input.type === "MAYA") {
7094
7153
  localStorage.setItem(this.platformStorageKey, "MAYA");
@@ -7115,16 +7174,7 @@ var SessionManagerCookie = class {
7115
7174
  maxAttempt: 5
7116
7175
  })();
7117
7176
  if (!r1.ok) return r1;
7118
- const now2 = /* @__PURE__ */ new Date();
7119
- cookies__default.default.set(
7120
- this.storageKey,
7121
- JSON.stringify({
7122
- ...r1.data,
7123
- accessTokenExpiresAt: addMinutes(now2, 8).getTime(),
7124
- refreshTokenExpiresAt: subMinutes(addDays(now2, 30), 2).getTime()
7125
- }),
7126
- { expires: subMinutes(addDays(now2, 30), 2).getTime() }
7127
- );
7177
+ this.persist(r1.data, version);
7128
7178
  return {
7129
7179
  ok: true,
7130
7180
  data: null
@@ -7133,18 +7183,7 @@ var SessionManagerCookie = class {
7133
7183
  if (input.type === "MOBILE_NUMBER") {
7134
7184
  const res2 = await this.authService.createSession(input, version);
7135
7185
  if (res2.ok) {
7136
- const now2 = /* @__PURE__ */ new Date();
7137
- cookies__default.default.set(
7138
- this.storageKey,
7139
- JSON.stringify({
7140
- ...res2.data,
7141
- accessTokenExpiresAt: addMinutes(now2, 8).getTime(),
7142
- refreshTokenExpiresAt: subMinutes(addDays(now2, 30), 2).getTime()
7143
- }),
7144
- {
7145
- expires: subMinutes(addDays(now2, 30), 2).getTime()
7146
- }
7147
- );
7186
+ this.persist(res2.data, version);
7148
7187
  return {
7149
7188
  ok: true,
7150
7189
  data: null
@@ -7161,16 +7200,7 @@ var SessionManagerCookie = class {
7161
7200
  version
7162
7201
  );
7163
7202
  if (res2.ok) {
7164
- const now2 = /* @__PURE__ */ new Date();
7165
- cookies__default.default.set(
7166
- this.storageKey,
7167
- JSON.stringify({
7168
- ...res2.data,
7169
- accessTokenExpiresAt: addMinutes(now2, 8).getTime(),
7170
- refreshTokenExpiresAt: subMinutes(addDays(now2, 30), 2).getTime()
7171
- }),
7172
- { expires: subMinutes(addDays(now2, 30), 2).getTime() }
7173
- );
7203
+ this.persist(res2.data, version);
7174
7204
  return {
7175
7205
  ok: true,
7176
7206
  data: null
@@ -7182,16 +7212,7 @@ var SessionManagerCookie = class {
7182
7212
  localStorage.setItem(this.platformStorageKey, "CABINET");
7183
7213
  const res2 = await this.authService.createSession(input, version);
7184
7214
  if (res2.ok) {
7185
- const now2 = /* @__PURE__ */ new Date();
7186
- cookies__default.default.set(
7187
- this.storageKey,
7188
- JSON.stringify({
7189
- ...res2.data,
7190
- accessTokenExpiresAt: addMinutes(now2, 8).getTime(),
7191
- refreshTokenExpiresAt: subMinutes(addDays(now2, 30), 2).getTime()
7192
- }),
7193
- { expires: subMinutes(addDays(now2, 30), 2).getTime() }
7194
- );
7215
+ this.persist(res2.data, version);
7195
7216
  return {
7196
7217
  ok: true,
7197
7218
  data: null
@@ -7209,16 +7230,7 @@ var SessionManagerCookie = class {
7209
7230
  }
7210
7231
  };
7211
7232
  }
7212
- const now = /* @__PURE__ */ new Date();
7213
- cookies__default.default.set(
7214
- this.storageKey,
7215
- JSON.stringify({
7216
- ...res.data,
7217
- accessTokenExpiresAt: addMinutes(now, 8).getTime(),
7218
- refreshTokenExpiresAt: subMinutes(addDays(now, 30), 2).getTime()
7219
- }),
7220
- {}
7221
- );
7233
+ this.persist(res.data, version);
7222
7234
  return {
7223
7235
  ok: true,
7224
7236
  data: null
@@ -7227,21 +7239,10 @@ var SessionManagerCookie = class {
7227
7239
  async createFromAuthenticator(input) {
7228
7240
  const res = await this.authService.authenticate(input);
7229
7241
  if (res.ok) {
7230
- const now = /* @__PURE__ */ new Date();
7231
7242
  if (this.isServer) {
7232
7243
  this.logger.warn("'client cookies' is not available on the server.");
7233
7244
  } else {
7234
- cookies__default.default.set(
7235
- this.storageKey,
7236
- JSON.stringify({
7237
- ...res.data,
7238
- accessTokenExpiresAt: addMinutes(now, 8).getTime(),
7239
- refreshTokenExpiresAt: subMinutes(addDays(now, 30), 2).getTime()
7240
- }),
7241
- {
7242
- expires: subMinutes(addDays(now, 30), 2).getTime()
7243
- }
7244
- );
7245
+ this.persist(res.data, 1);
7245
7246
  }
7246
7247
  return { ok: true };
7247
7248
  } else {
@@ -7268,7 +7269,11 @@ var SessionManagerCookie = class {
7268
7269
  };
7269
7270
  }
7270
7271
  try {
7271
- 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;
7272
7277
  let now = /* @__PURE__ */ new Date();
7273
7278
  const accessTokenExpiresAt = new Date(obj.accessTokenExpiresAt);
7274
7279
  const refreshTokenExpiresAt = new Date(obj.refreshTokenExpiresAt);
@@ -7286,7 +7291,10 @@ var SessionManagerCookie = class {
7286
7291
  if (isAfter(now, accessTokenExpiresAt)) {
7287
7292
  this.logger.info("Refreshing session...");
7288
7293
  this.refreshing = true;
7289
- const res = await this.authService.refreshSession(obj.refreshToken);
7294
+ const res = await this.authService.refreshSession(
7295
+ obj.refreshToken,
7296
+ obj.version ?? 1
7297
+ );
7290
7298
  this.refreshing = false;
7291
7299
  if (!res.ok) {
7292
7300
  this.logger.error(`Failed to refresh session: ${res.error.message}`);
@@ -7308,7 +7316,8 @@ var SessionManagerCookie = class {
7308
7316
  now = /* @__PURE__ */ new Date();
7309
7317
  obj = {
7310
7318
  ...obj,
7311
- ...res.data,
7319
+ accessToken: res.data.accessToken,
7320
+ refreshToken: res.data.refreshToken ?? obj.refreshToken,
7312
7321
  accessTokenExpiresAt: addMinutes(now, 8).getTime(),
7313
7322
  refreshTokenExpiresAt: subMinutes(addDays(now, 30), 2).getTime()
7314
7323
  };
@@ -7346,11 +7355,18 @@ var SessionManagerCookie = class {
7346
7355
  };
7347
7356
  }
7348
7357
  try {
7349
- 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;
7350
7363
  let now = /* @__PURE__ */ new Date();
7351
7364
  this.logger.info("Refreshing session...");
7352
7365
  this.refreshing = true;
7353
- const res = await this.authService.refreshSession(obj.refreshToken);
7366
+ const res = await this.authService.refreshSession(
7367
+ obj.refreshToken,
7368
+ obj.version ?? 1
7369
+ );
7354
7370
  this.refreshing = false;
7355
7371
  if (!res.ok) {
7356
7372
  this.logger.error(`Failed to refresh session: ${res.error.message}`);
@@ -7372,7 +7388,8 @@ var SessionManagerCookie = class {
7372
7388
  now = /* @__PURE__ */ new Date();
7373
7389
  obj = {
7374
7390
  ...obj,
7375
- ...res.data,
7391
+ accessToken: res.data.accessToken,
7392
+ refreshToken: res.data.refreshToken ?? obj.refreshToken,
7376
7393
  accessTokenExpiresAt: addMinutes(now, 8).getTime(),
7377
7394
  refreshTokenExpiresAt: subMinutes(addDays(now, 30), 2).getTime()
7378
7395
  };
@@ -7393,6 +7410,50 @@ var SessionManagerCookie = class {
7393
7410
  };
7394
7411
  }
7395
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
+ }
7396
7457
  async destroy() {
7397
7458
  if (this.isServer) {
7398
7459
  this.logger.warn("'client cookies' is not available on the server.");
@@ -7402,6 +7463,8 @@ var SessionManagerCookie = class {
7402
7463
  if (res.data?.accessToken) {
7403
7464
  await this.authService.destroySession(res.data.accessToken);
7404
7465
  }
7466
+ this.v4AccessToken = null;
7467
+ this.v4AccessTokenExpiresAt = null;
7405
7468
  cookies__default.default.remove(this.storageKey);
7406
7469
  }
7407
7470
  async verify() {
@@ -7447,6 +7510,13 @@ var SessionManager = class {
7447
7510
  authService;
7448
7511
  walletService;
7449
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;
7450
7520
  constructor(config) {
7451
7521
  this.authService = config.authService;
7452
7522
  this.walletService = config.walletService;
@@ -7462,6 +7532,27 @@ var SessionManager = class {
7462
7532
  set refreshing(value) {
7463
7533
  this._refreshing = value;
7464
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
+ }
7465
7556
  async create(input, version = 1) {
7466
7557
  if (this.isServer) {
7467
7558
  this.logger.warn("'localStorage' is not available on the server.");
@@ -7498,15 +7589,7 @@ var SessionManager = class {
7498
7589
  maxAttempt: 5
7499
7590
  })();
7500
7591
  if (!r1.ok) return r1;
7501
- const now2 = /* @__PURE__ */ new Date();
7502
- localStorage.setItem(
7503
- this.storageKey,
7504
- JSON.stringify({
7505
- ...r1.data,
7506
- accessTokenExpiresAt: addMinutes(now2, 8).getTime(),
7507
- refreshTokenExpiresAt: subMinutes(addDays(now2, 30), 2).getTime()
7508
- })
7509
- );
7592
+ this.persist(r1.data, version);
7510
7593
  return {
7511
7594
  ok: true,
7512
7595
  data: null
@@ -7515,15 +7598,7 @@ var SessionManager = class {
7515
7598
  if (input.type === "MOBILE_NUMBER") {
7516
7599
  const res2 = await this.authService.createSession(input, version);
7517
7600
  if (res2.ok) {
7518
- const now2 = /* @__PURE__ */ new Date();
7519
- localStorage.setItem(
7520
- this.storageKey,
7521
- JSON.stringify({
7522
- ...res2.data,
7523
- accessTokenExpiresAt: addMinutes(now2, 8).getTime(),
7524
- refreshTokenExpiresAt: subMinutes(addDays(now2, 30), 2).getTime()
7525
- })
7526
- );
7601
+ this.persist(res2.data, version);
7527
7602
  return {
7528
7603
  ok: true,
7529
7604
  data: null
@@ -7541,15 +7616,7 @@ var SessionManager = class {
7541
7616
  version
7542
7617
  );
7543
7618
  if (res2.ok) {
7544
- const now2 = /* @__PURE__ */ new Date();
7545
- localStorage.setItem(
7546
- this.storageKey,
7547
- JSON.stringify({
7548
- ...res2.data,
7549
- accessTokenExpiresAt: addMinutes(now2, 8).getTime(),
7550
- refreshTokenExpiresAt: subMinutes(addDays(now2, 30), 2).getTime()
7551
- })
7552
- );
7619
+ this.persist(res2.data, version);
7553
7620
  return {
7554
7621
  ok: true,
7555
7622
  data: null
@@ -7561,15 +7628,7 @@ var SessionManager = class {
7561
7628
  localStorage.setItem(this.platformStorageKey, "CABINET");
7562
7629
  const res2 = await this.authService.createSession(input, version);
7563
7630
  if (res2.ok) {
7564
- const now2 = /* @__PURE__ */ new Date();
7565
- localStorage.setItem(
7566
- this.storageKey,
7567
- JSON.stringify({
7568
- ...res2.data,
7569
- accessTokenExpiresAt: addMinutes(now2, 8).getTime(),
7570
- refreshTokenExpiresAt: subMinutes(addDays(now2, 30), 2).getTime()
7571
- })
7572
- );
7631
+ this.persist(res2.data, version);
7573
7632
  return {
7574
7633
  ok: true,
7575
7634
  data: null
@@ -7587,15 +7646,7 @@ var SessionManager = class {
7587
7646
  }
7588
7647
  };
7589
7648
  }
7590
- const now = /* @__PURE__ */ new Date();
7591
- localStorage.setItem(
7592
- this.storageKey,
7593
- JSON.stringify({
7594
- ...res.data,
7595
- accessTokenExpiresAt: addMinutes(now, 8).getTime(),
7596
- refreshTokenExpiresAt: subMinutes(addDays(now, 30), 2).getTime()
7597
- })
7598
- );
7649
+ this.persist(res.data, version);
7599
7650
  return {
7600
7651
  ok: true,
7601
7652
  data: null
@@ -7604,18 +7655,10 @@ var SessionManager = class {
7604
7655
  async createFromAuthenticator(input) {
7605
7656
  const res = await this.authService.authenticate(input);
7606
7657
  if (res.ok) {
7607
- const now = /* @__PURE__ */ new Date();
7608
7658
  if (this.isServer) {
7609
7659
  this.logger.warn("'localStorage' is not available on the server.");
7610
7660
  } else {
7611
- localStorage.setItem(
7612
- this.storageKey,
7613
- JSON.stringify({
7614
- ...res.data,
7615
- accessTokenExpiresAt: addMinutes(now, 8).getTime(),
7616
- refreshTokenExpiresAt: subMinutes(addDays(now, 30), 2).getTime()
7617
- })
7618
- );
7661
+ this.persist(res.data, 1);
7619
7662
  }
7620
7663
  return { ok: true };
7621
7664
  } else {
@@ -7642,7 +7685,11 @@ var SessionManager = class {
7642
7685
  };
7643
7686
  }
7644
7687
  try {
7645
- 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;
7646
7693
  let now = /* @__PURE__ */ new Date();
7647
7694
  const accessTokenExpiresAt = new Date(obj.accessTokenExpiresAt);
7648
7695
  const refreshTokenExpiresAt = new Date(obj.refreshTokenExpiresAt);
@@ -7660,7 +7707,10 @@ var SessionManager = class {
7660
7707
  if (isAfter(now, accessTokenExpiresAt)) {
7661
7708
  this.logger.info("Refreshing session...");
7662
7709
  this.refreshing = true;
7663
- const res = await this.authService.refreshSession(obj.refreshToken);
7710
+ const res = await this.authService.refreshSession(
7711
+ obj.refreshToken,
7712
+ obj.version ?? 1
7713
+ );
7664
7714
  this.refreshing = false;
7665
7715
  if (!res.ok) {
7666
7716
  this.logger.error(`Failed to refresh session: ${res.error.message}`);
@@ -7682,7 +7732,8 @@ var SessionManager = class {
7682
7732
  now = /* @__PURE__ */ new Date();
7683
7733
  obj = {
7684
7734
  ...obj,
7685
- ...res.data,
7735
+ accessToken: res.data.accessToken,
7736
+ refreshToken: res.data.refreshToken ?? obj.refreshToken,
7686
7737
  accessTokenExpiresAt: addMinutes(now, 8).getTime(),
7687
7738
  refreshTokenExpiresAt: subMinutes(addDays(now, 30), 2).getTime()
7688
7739
  };
@@ -7718,11 +7769,18 @@ var SessionManager = class {
7718
7769
  };
7719
7770
  }
7720
7771
  try {
7721
- 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;
7722
7777
  let now = /* @__PURE__ */ new Date();
7723
7778
  this.logger.info("Refreshing session...");
7724
7779
  this.refreshing = true;
7725
- const res = await this.authService.refreshSession(obj.refreshToken);
7780
+ const res = await this.authService.refreshSession(
7781
+ obj.refreshToken,
7782
+ obj.version ?? 1
7783
+ );
7726
7784
  this.refreshing = false;
7727
7785
  if (!res.ok) {
7728
7786
  this.logger.error(`Failed to refresh session: ${res.error.message}`);
@@ -7744,7 +7802,8 @@ var SessionManager = class {
7744
7802
  now = /* @__PURE__ */ new Date();
7745
7803
  obj = {
7746
7804
  ...obj,
7747
- ...res.data,
7805
+ accessToken: res.data.accessToken,
7806
+ refreshToken: res.data.refreshToken ?? obj.refreshToken,
7748
7807
  accessTokenExpiresAt: addMinutes(now, 8).getTime(),
7749
7808
  refreshTokenExpiresAt: subMinutes(addDays(now, 30), 2).getTime()
7750
7809
  };
@@ -7763,6 +7822,50 @@ var SessionManager = class {
7763
7822
  };
7764
7823
  }
7765
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
+ }
7766
7869
  async destroy() {
7767
7870
  if (this.isServer) {
7768
7871
  this.logger.warn("'localStorage' is not available on the server.");
@@ -7772,6 +7875,8 @@ var SessionManager = class {
7772
7875
  if (res.data?.accessToken) {
7773
7876
  await this.authService.destroySession(res.data.accessToken);
7774
7877
  }
7878
+ this.v4AccessToken = null;
7879
+ this.v4AccessTokenExpiresAt = null;
7775
7880
  localStorage.removeItem(this.storageKey);
7776
7881
  }
7777
7882
  async verify() {
@@ -11859,6 +11964,20 @@ var Sdk = class {
11859
11964
  }
11860
11965
  };
11861
11966
  }
11967
+ async qualifiedReferrals(input) {
11968
+ const res = await this.reportService.qualifiedReferrals({
11969
+ ...input,
11970
+ filter: {
11971
+ ...input?.filter,
11972
+ qualified: { equal: true }
11973
+ }
11974
+ });
11975
+ if (!res.ok) return res;
11976
+ return {
11977
+ ok: true,
11978
+ data: res.data.totalCount
11979
+ };
11980
+ }
11862
11981
  async referralCommission() {
11863
11982
  const res = await this.reportService.referralCommission();
11864
11983
  if (!res.ok) return res;