@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.
- package/README.md +1634 -1634
- package/dist/{chunk-5WRVWQBT.js → chunk-7APXFZ5G.js} +3 -3
- package/dist/chunk-7APXFZ5G.js.map +1 -0
- package/dist/{chunk-UT6VBXJ4.js → chunk-BDZPLMTL.js} +21 -17
- package/dist/chunk-BDZPLMTL.js.map +1 -0
- package/dist/{chunk-ROBGEUSE.js → chunk-WVFSGB7Y.js} +2 -2
- package/dist/chunk-WVFSGB7Y.js.map +1 -0
- package/dist/index.cjs +224 -144
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -9
- package/dist/index.d.ts +9 -9
- package/dist/index.js +209 -133
- package/dist/index.js.map +1 -1
- package/dist/services/index.cjs +18 -14
- package/dist/services/index.cjs.map +1 -1
- package/dist/services/index.d.cts +4 -4
- package/dist/services/index.d.ts +4 -4
- package/dist/services/index.js +2 -2
- package/dist/{types-Dz4J_rhs.d.cts → types-kTe_j8tm.d.cts} +3 -3
- package/dist/{types-Cmawo0zW.d.ts → types-lZQpMvHU.d.ts} +3 -3
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-5WRVWQBT.js.map +0 -1
- package/dist/chunk-ROBGEUSE.js.map +0 -1
- package/dist/chunk-UT6VBXJ4.js.map +0 -1
|
@@ -39,5 +39,5 @@ function callIfFn(value, ...args) {
|
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
export { callIfFn, gql, statusCodeToOperationError };
|
|
42
|
-
//# sourceMappingURL=chunk-
|
|
43
|
-
//# sourceMappingURL=chunk-
|
|
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
|
-
|
|
4543
|
-
|
|
4544
|
-
|
|
4545
|
-
|
|
4546
|
-
|
|
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
|
-
|
|
4629
|
+
if (version !== 4) {
|
|
4630
|
+
headers.append("Authorization", `Bearer ${refreshToken}`);
|
|
4631
|
+
}
|
|
4632
4632
|
try {
|
|
4633
|
-
const res = await fetch(
|
|
4634
|
-
|
|
4635
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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() {
|