@thetechfossil/auth2 1.2.21 → 1.2.22
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 +7 -0
- package/dist/index.components.d.mts +14 -1
- package/dist/index.components.d.ts +14 -1
- package/dist/index.components.js +458 -59
- package/dist/index.components.js.map +1 -1
- package/dist/index.components.mjs +458 -60
- package/dist/index.components.mjs.map +1 -1
- package/dist/index.d.mts +18 -2
- package/dist/index.d.ts +18 -2
- package/dist/index.js +459 -59
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +459 -60
- package/dist/index.mjs.map +1 -1
- package/dist/index.next.d.mts +16 -1
- package/dist/index.next.d.ts +16 -1
- package/dist/index.next.js +458 -59
- package/dist/index.next.js.map +1 -1
- package/dist/index.next.mjs +458 -60
- package/dist/index.next.mjs.map +1 -1
- package/dist/index.next.server.d.mts +2 -0
- package/dist/index.next.server.d.ts +2 -0
- package/dist/index.next.server.js +14 -0
- package/dist/index.next.server.js.map +1 -1
- package/dist/index.next.server.mjs +14 -0
- package/dist/index.next.server.mjs.map +1 -1
- package/dist/index.node.d.mts +2 -0
- package/dist/index.node.d.ts +2 -0
- package/dist/index.node.js +14 -0
- package/dist/index.node.js.map +1 -1
- package/dist/index.node.mjs +14 -0
- package/dist/index.node.mjs.map +1 -1
- package/package.json +2 -2
|
@@ -160,6 +160,8 @@ declare class AuthService {
|
|
|
160
160
|
constructor(config: AuthConfig);
|
|
161
161
|
private loadTokenFromStorage;
|
|
162
162
|
private saveTokenToStorage;
|
|
163
|
+
private setTokenCookie;
|
|
164
|
+
private removeTokenCookie;
|
|
163
165
|
private removeTokenFromStorage;
|
|
164
166
|
private connectSocket;
|
|
165
167
|
private disconnectSocket;
|
|
@@ -160,6 +160,8 @@ declare class AuthService {
|
|
|
160
160
|
constructor(config: AuthConfig);
|
|
161
161
|
private loadTokenFromStorage;
|
|
162
162
|
private saveTokenToStorage;
|
|
163
|
+
private setTokenCookie;
|
|
164
|
+
private removeTokenCookie;
|
|
163
165
|
private removeTokenFromStorage;
|
|
164
166
|
private connectSocket;
|
|
165
167
|
private disconnectSocket;
|
|
@@ -345,6 +345,7 @@ var AuthService = class {
|
|
|
345
345
|
if (token) {
|
|
346
346
|
this.token = token;
|
|
347
347
|
this.httpClient.setAuthToken(token);
|
|
348
|
+
this.setTokenCookie(token);
|
|
348
349
|
}
|
|
349
350
|
} catch (error) {
|
|
350
351
|
console.warn("Failed to load token from storage:", error);
|
|
@@ -355,15 +356,28 @@ var AuthService = class {
|
|
|
355
356
|
if (typeof window !== "undefined" && this.config.localStorageKey) {
|
|
356
357
|
try {
|
|
357
358
|
localStorage.setItem(this.config.localStorageKey, token);
|
|
359
|
+
this.setTokenCookie(token);
|
|
358
360
|
} catch (error) {
|
|
359
361
|
console.warn("Failed to save token to storage:", error);
|
|
360
362
|
}
|
|
361
363
|
}
|
|
362
364
|
}
|
|
365
|
+
setTokenCookie(token) {
|
|
366
|
+
if (typeof window !== "undefined") {
|
|
367
|
+
const maxAge = 7 * 24 * 60 * 60;
|
|
368
|
+
document.cookie = `auth_token=${token}; path=/; max-age=${maxAge}; SameSite=Lax`;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
removeTokenCookie() {
|
|
372
|
+
if (typeof window !== "undefined") {
|
|
373
|
+
document.cookie = "auth_token=; path=/; max-age=0; SameSite=Lax";
|
|
374
|
+
}
|
|
375
|
+
}
|
|
363
376
|
removeTokenFromStorage() {
|
|
364
377
|
if (typeof window !== "undefined" && this.config.localStorageKey) {
|
|
365
378
|
try {
|
|
366
379
|
localStorage.removeItem(this.config.localStorageKey);
|
|
380
|
+
this.removeTokenCookie();
|
|
367
381
|
} catch (error) {
|
|
368
382
|
console.warn("Failed to remove token from storage:", error);
|
|
369
383
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/http-client.ts","../src/core/socket-service.ts","../src/core/auth-service.ts","../src/node/auth-client.ts","../src/node/token-verifier.ts","../src/nextjs/server-auth.ts","../src/nextjs/server.ts","../src/nextjs/middleware.ts"],"names":["axios","io","UpfilesClient","cookies","redirect","auth"],"mappings":";;;;;;;;;;;;;;;;;;AAGA,IAAM,cAAA,GAAiB;AAAA,EACrB,aAAA,EAAe,uFAAA;AAAA,EACf,OAAA,EAAS,8CAAA;AAAA,EACT,YAAA,EAAc,0DAAA;AAAA,EACd,YAAA,EAAc,gDAAA;AAAA,EACd,SAAA,EAAW,oDAAA;AAAA,EACX,SAAA,EAAW,uCAAA;AAAA,EACX,YAAA,EAAc,wDAAA;AAAA,EACd,OAAA,EAAS;AACX,CAAA;AAEO,IAAM,aAAN,MAAiB;AAAA,EAMtB,WAAA,CAAY,OAAA,EAAiB,cAAA,GAAyC,EAAC,EAAG;AAJ1E,IAAA,IAAA,CAAQ,SAAA,GAA2B,IAAA;AACnC,IAAA,IAAA,CAAQ,eAAA,GAAiC,IAAA;AAIvC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAExC,IAAA,IAAA,CAAK,aAAA,GAAgBA,uBAAM,MAAA,CAAO;AAAA,MAChC,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,GAAG;AAAA,OACL;AAAA,MACA,eAAA,EAAiB,IAAA;AAAA;AAAA,MACjB,OAAA,EAAS;AAAA;AAAA,KACV,CAAA;AAGD,IAAA,IAAA,CAAK,aAAA,CAAc,aAAa,OAAA,CAAQ,GAAA;AAAA,MACtC,OAAO,MAAA,KAAW;AAEhB,QAAA,MAAM,iBAAA,GAAoB,CAAC,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,OAAO,CAAA,CAAE,QAAA,CAAS,MAAA,CAAO,MAAA,EAAQ,WAAA,EAAY,IAAK,EAAE,CAAA;AACxG,QAAA,IAAI,qBAAqB,CAAC,IAAA,CAAK,SAAA,IAAa,OAAO,WAAW,WAAA,EAAa;AACzE,UAAA,IAAI;AACF,YAAA,MAAM,KAAK,gBAAA,EAAiB;AAAA,UAC9B,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,IAAA,CAAK,+BAA+B,KAAK,CAAA;AAAA,UACnD;AAAA,QACF;AAGA,QAAA,IAAI,IAAA,CAAK,aAAa,iBAAA,EAAmB;AACvC,UAAA,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA,GAAI,IAAA,CAAK,SAAA;AAAA,QACxC;AAGA,QAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,UAAA,MAAA,CAAO,OAAA,CAAQ,gBAAgB,CAAA,GAAI,IAAA,CAAK,eAAA;AAAA,QAC1C;AAEA,QAAA,OAAO,MAAA;AAAA,MACT,CAAA;AAAA,MACA,CAAC,KAAA,KAAU,OAAA,CAAQ,OAAO,IAAA,CAAK,uBAAA,CAAwB,KAAK,CAAC;AAAA,KAC/D;AAGA,IAAA,IAAA,CAAK,aAAA,CAAc,aAAa,QAAA,CAAS,GAAA;AAAA,MACvC,CAAC,QAAA,KAAa,QAAA;AAAA,MACd,OAAO,KAAA,KAAsB;AAC3B,QAAA,MAAM,kBAAkB,KAAA,CAAM,MAAA;AAG9B,QAAA,IAAI,MAAM,QAAA,EAAU,MAAA,KAAW,GAAA,IAAO,CAAC,gBAAgB,MAAA,EAAQ;AAC7D,UAAA,eAAA,CAAgB,MAAA,GAAS,IAAA;AAEzB,UAAA,IAAI;AACF,YAAA,MAAM,KAAK,gBAAA,EAAiB;AAC5B,YAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,cAAA,eAAA,CAAgB,OAAA,CAAQ,cAAc,CAAA,GAAI,IAAA,CAAK,SAAA;AAAA,YACjD;AACA,YAAA,OAAO,IAAA,CAAK,cAAc,eAAe,CAAA;AAAA,UAC3C,SAAS,YAAA,EAAc;AACrB,YAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,uBAAA,CAAwB,YAA0B,CAAC,CAAA;AAAA,UAChF;AAAA,QACF;AAGA,QAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,uBAAA,CAAwB,KAAK,CAAC,CAAA;AAAA,MAC3D;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAwB,KAAA,EAAgC;AAE9D,IAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,CAAE,KAAA,CAAc,YAAA,EAAc;AAC1D,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,UAAA;AAGJ,IAAA,IAAIA,sBAAA,CAAM,YAAA,CAAa,KAAK,CAAA,EAAG;AAC7B,MAAA,UAAA,GAAa,MAAM,QAAA,EAAU,MAAA;AAC7B,MAAA,MAAM,YAAA,GAAe,MAAM,QAAA,EAAU,IAAA;AAGrC,MAAA,IAAI,cAAc,OAAA,EAAS;AACzB,QAAA,OAAA,GAAU,YAAA,CAAa,OAAA;AAAA,MACzB,CAAA,MAAA,IAES,CAAC,KAAA,CAAM,QAAA,EAAU;AACxB,QAAA,IAAI,MAAM,IAAA,KAAS,cAAA,IAAkB,MAAM,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,EAAG;AACtE,UAAA,OAAA,GAAU,cAAA,CAAe,OAAA;AAAA,QAC3B,WAAW,KAAA,CAAM,IAAA,KAAS,aAAA,IAAiB,KAAA,CAAM,YAAY,eAAA,EAAiB;AAC5E,UAAA,OAAA,GAAU,cAAA,CAAe,aAAA;AAAA,QAC3B,CAAA,MAAO;AACL,UAAA,OAAA,GAAU,cAAA,CAAe,aAAA;AAAA,QAC3B;AAAA,MACF,CAAA,MAEK;AACH,QAAA,QAAQ,UAAA;AAAY,UAClB,KAAK,GAAA;AACH,YAAA,OAAA,GAAU,cAAc,OAAA,IAAW,2CAAA;AACnC,YAAA;AAAA,UACF,KAAK,GAAA;AACH,YAAA,OAAA,GAAU,YAAA,EAAc,WAAW,cAAA,CAAe,YAAA;AAClD,YAAA;AAAA,UACF,KAAK,GAAA;AACH,YAAA,OAAA,GAAU,YAAA,EAAc,WAAW,cAAA,CAAe,SAAA;AAClD,YAAA;AAAA,UACF,KAAK,GAAA;AACH,YAAA,OAAA,GAAU,YAAA,EAAc,WAAW,cAAA,CAAe,SAAA;AAClD,YAAA;AAAA,UACF,KAAK,GAAA;AACH,YAAA,OAAA,GAAU,cAAA,CAAe,YAAA;AACzB,YAAA;AAAA,UACF,KAAK,GAAA;AAAA,UACL,KAAK,GAAA;AAAA,UACL,KAAK,GAAA;AAAA,UACL,KAAK,GAAA;AACH,YAAA,OAAA,GAAU,cAAA,CAAe,YAAA;AACzB,YAAA;AAAA,UACF;AACE,YAAA,OAAA,GAAU,YAAA,EAAc,WAAW,cAAA,CAAe,OAAA;AAAA;AACtD,MACF;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,OAAA,GAAU,KAAA,EAAO,WAAW,cAAA,CAAe,OAAA;AAAA,IAC7C;AAEA,IAAA,MAAM,WAAA,GAAc,IAAI,KAAA,CAAM,OAAO,CAAA;AAErC,IAAC,WAAA,CAAoB,WAAY,KAAA,EAAsB,QAAA;AACvD,IAAC,YAAoB,UAAA,GAAa,UAAA;AAClC,IAAC,YAAoB,aAAA,GAAgB,KAAA;AAErC,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAEA,MAAa,GAAA,CAAO,QAAA,EAAkB,OAAA,EAA8C;AAClF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA,CAAc,IAAO,QAAA,EAAU,EAAE,SAAS,CAAA;AACtE,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA,EAEA,MAAa,IAAA,CAAQ,QAAA,EAAkB,IAAA,EAAY,OAAA,EAA8C;AAC/F,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA,CAAc,KAAQ,QAAA,EAAU,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA;AAC7E,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA,EAEA,MAAa,GAAA,CAAO,QAAA,EAAkB,IAAA,EAAY,OAAA,EAA8C;AAC9F,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA,CAAc,IAAO,QAAA,EAAU,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA;AAC5E,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA,EAEA,MAAa,MAAA,CAAU,QAAA,EAAkB,OAAA,EAA8C;AACrF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA,CAAc,OAAU,QAAA,EAAU,EAAE,SAAS,CAAA;AACzE,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA,EAEO,aAAa,KAAA,EAAqB;AACvC,IAAA,IAAA,CAAK,cAAc,QAAA,CAAS,OAAA,CAAQ,OAAO,eAAe,CAAA,GAAI,UAAU,KAAK,CAAA,CAAA;AAAA,EAC/E;AAAA,EAEO,eAAA,GAAwB;AAC7B,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,QAAA,CAAS,OAAA,CAAQ,OAAO,eAAe,CAAA;AAAA,EACnE;AAAA,EAEO,aAAa,KAAA,EAAqB;AACvC,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AAAA,EACnB;AAAA,EAEO,YAAA,GAA8B;AACnC,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA,EAEO,eAAA,GAAwB;AAC7B,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,EACnB;AAAA,EAEO,mBAAmB,GAAA,EAAmB;AAC3C,IAAA,IAAA,CAAK,eAAA,GAAkB,GAAA;AAAA,EACzB;AAAA,EAEO,kBAAA,GAAoC;AACzC,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA,EAEO,qBAAA,GAA8B;AACnC,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,EACzB;AAAA,EAEA,MAAc,gBAAA,GAAkC;AAC9C,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA,CAAc,IAA2B,yBAAyB,CAAA;AAC9F,MAAA,IAAA,CAAK,SAAA,GAAY,SAAS,IAAA,CAAK,SAAA;AAAA,IACjC,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,iCAAiC,KAAK,CAAA;AACpD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AACF;ACjNO,IAAM,gBAAN,MAAoB;AAAA,EAOzB,YAAY,MAAA,EAAsB;AANlC,IAAA,IAAA,CAAQ,MAAA,GAAwB,IAAA;AAEhC,IAAA,IAAA,CAAQ,KAAA,GAAuB,IAAA;AAC/B,IAAA,IAAA,CAAQ,aAAA,uBAA0D,GAAA,EAAI;AACtE,IAAA,IAAA,CAAQ,YAAA,GAAe,KAAA;AAGrB,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,WAAA,EAAa,KAAA;AAAA,MACb,YAAA,EAAc,IAAA;AAAA,MACd,oBAAA,EAAsB,CAAA;AAAA,MACtB,iBAAA,EAAmB,GAAA;AAAA,MACnB,GAAG;AAAA,KACL;AAAA,EACF;AAAA,EAEA,QAAQ,KAAA,EAAqB;AAC3B,IAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,SAAA,IAAa,IAAA,CAAK,YAAA,EAAc;AAC/C,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAEpB,IAAA,IAAA,CAAK,MAAA,GAASC,kBAAA,CAAG,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS;AAAA,MACpC,IAAA,EAAM,EAAE,KAAA,EAAM;AAAA,MACd,WAAA,EAAa,IAAA;AAAA,MACb,YAAA,EAAc,KAAK,MAAA,CAAO,YAAA;AAAA,MAC1B,oBAAA,EAAsB,KAAK,MAAA,CAAO,oBAAA;AAAA,MAClC,iBAAA,EAAmB,KAAK,MAAA,CAAO,iBAAA;AAAA,MAC/B,UAAA,EAAY,CAAC,WAAA,EAAa,SAAS;AAAA,KACpC,CAAA;AAED,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,EAC3B;AAAA,EAEQ,mBAAA,GAA4B;AAClC,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAElB,IAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,SAAA,EAAW,MAAM;AAC9B,MAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,MAAA,OAAA,CAAQ,IAAI,6BAA6B,CAAA;AACzC,MAAA,IAAA,CAAK,IAAA,CAAK,WAAA,EAAa,EAAE,CAAA;AAAA,IAC3B,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,YAAA,EAAc,CAAC,MAAA,KAAW;AACvC,MAAA,OAAA,CAAQ,GAAA,CAAI,mCAAmC,MAAM,CAAA;AACrD,MAAA,IAAA,CAAK,IAAA,CAAK,cAAA,EAAgB,EAAE,MAAA,EAAQ,CAAA;AAAA,IACtC,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,eAAA,EAAiB,CAAC,KAAA,KAAU;AACzC,MAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,MAAA,OAAA,CAAQ,KAAA,CAAM,qCAAA,EAAuC,KAAA,CAAM,OAAO,CAAA;AAClE,MAAA,IAAA,CAAK,KAAK,OAAA,EAAS,EAAE,KAAA,EAAO,KAAA,CAAM,SAAS,CAAA;AAAA,IAC7C,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,cAAA,EAAgB,CAAC,IAAA,KAAyB;AACvD,MAAA,IAAA,CAAK,IAAA,CAAK,gBAAgB,IAAI,CAAA;AAAA,IAChC,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,iBAAA,EAAmB,CAAC,IAAA,KAAiC;AAClE,MAAA,IAAA,CAAK,IAAA,CAAK,mBAAmB,IAAI,CAAA;AAAA,IACnC,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,qBAAA,EAAuB,MAAM;AAC1C,MAAA,IAAA,CAAK,IAAA,CAAK,qBAAA,EAAuB,EAAE,CAAA;AAAA,IACrC,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,uBAAA,EAAyB,MAAM;AAC5C,MAAA,IAAA,CAAK,IAAA,CAAK,uBAAA,EAAyB,EAAE,CAAA;AAAA,IACvC,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,kBAAA,EAAoB,CAAC,IAAA,KAA+B;AACjE,MAAA,IAAA,CAAK,IAAA,CAAK,oBAAoB,IAAI,CAAA;AAAA,IACpC,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,cAAA,EAAgB,MAAM;AACnC,MAAA,IAAA,CAAK,IAAA,CAAK,cAAA,EAAgB,EAAE,CAAA;AAAA,IAC9B,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,UAAA,GAAmB;AACjB,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,OAAO,UAAA,EAAW;AACvB,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,MAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,WAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,QAAQ,SAAA,IAAa,KAAA;AAAA,EACnC;AAAA;AAAA,EAGA,EAAA,CAAY,OAAe,OAAA,EAA4C;AACrE,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAA,kBAAO,IAAI,KAAK,CAAA;AAAA,IACzC;AACA,IAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA,CAAG,IAAI,OAAO,CAAA;AAG1C,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,OAAO,CAAA;AAAA,IAC/C,CAAA;AAAA,EACF;AAAA,EAEA,GAAA,CAAI,OAAe,OAAA,EAAoC;AACrD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,OAAO,CAAA;AAAA,IAC/C,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,aAAA,CAAc,OAAO,KAAK,CAAA;AAAA,IACjC;AAAA,EACF;AAAA,EAEQ,IAAA,CAAK,OAAe,IAAA,EAAiB;AAC3C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA;AAC7C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,QAAQ,CAAA,OAAA,KAAW;AAC1B,QAAA,IAAI;AACF,UAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,QACd,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,sCAAA,EAAyC,KAAK,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,QACxE;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,kBAAA,GAA2B;AACzB,IAAA,IAAI,IAAA,CAAK,QAAQ,SAAA,EAAW;AAC1B,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,cAAc,CAAA;AAAA,IACjC;AAAA,EACF;AACF,CAAA;ACtIO,IAAM,cAAN,MAAkB;AAAA;AAAA,EAUvB,YAAY,MAAA,EAAoB;AANhC,IAAA,IAAA,CAAQ,KAAA,GAAuB,IAAA;AAC/B,IAAA,IAAA,CAAQ,aAAA,GAAsC,IAAA;AAC9C,IAAA,IAAA,CAAQ,UAAA,GAA0B,IAAA;AAClC,IAAA,IAAA,CAAQ,kBAAA,GAA6B,CAAA;AACrC,IAAA,IAAA,CAAiB,cAAA,GAAiB,IAAI,EAAA,GAAK,GAAA;AAGzC,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,eAAA,EAAiB,YAAA;AAAA,MACjB,WAAA,EAAa,IAAA;AAAA,MACb,YAAA,EAAc,IAAA;AAAA,MACd,GAAG;AAAA,KACL;AAEA,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,UAAA,CAAW,IAAA,CAAK,OAAO,OAAO,CAAA;AACpD,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,aAAA,CAAc,EAAE,SAAS,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA;AACvE,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAG1B,IAAA,IAAI,IAAA,CAAK,OAAO,aAAA,EAAe;AAC7B,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAIC,qBAAA,CAAc;AAAA,QACrC,OAAA,EAAS,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,OAAA;AAAA,QACnC,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,MAAA;AAAA,QAClC,YAAA,EAAc,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,YAAA;AAAA,QACxC,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,UAAA;AAAA,QACtC,WAAA,EAAa,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc;AAAA,OACxC,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAM,eAAA,GACJ,OAAA,CAAQ,GAAA,CAAI,6BAAA,IACZ,OAAA,CAAQ,GAAA,CAAI,2BAAA,IACZ,OAAA,CAAQ,GAAA,CAAI,mBAAA,IACZ,MAAA,CAAO,QAAA,CAAS,MAAA;AAElB,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,IAAA,CAAK,UAAA,CAAW,mBAAmB,eAAe,CAAA;AAAA,MACpD;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,MAAA,CAAO,iBAAiB,KAAA,EAAO;AACpD,MAAA,IAAA,CAAK,aAAA,EAAc;AAAA,IACrB;AAAA,EAIF;AAAA,EAEQ,oBAAA,GAA6B;AACnC,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,IAAA,CAAK,OAAO,eAAA,EAAiB;AAChE,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,OAAO,eAAe,CAAA;AAC9D,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,UAAA,IAAA,CAAK,UAAA,CAAW,aAAa,KAAK,CAAA;AAAA,QACpC;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,IAAA,CAAK,sCAAsC,KAAK,CAAA;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,mBAAmB,KAAA,EAAqB;AAC9C,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,IAAA,CAAK,OAAO,eAAA,EAAiB;AAChE,MAAA,IAAI;AACF,QAAA,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,eAAA,EAAiB,KAAK,CAAA;AAAA,MACzD,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,IAAA,CAAK,oCAAoC,KAAK,CAAA;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,sBAAA,GAA+B;AACrC,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,IAAA,CAAK,OAAO,eAAA,EAAiB;AAChE,MAAA,IAAI;AACF,QAAA,YAAA,CAAa,UAAA,CAAW,IAAA,CAAK,MAAA,CAAO,eAAe,CAAA;AAAA,MACrD,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,IAAA,CAAK,wCAAwC,KAAK,CAAA;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,aAAA,GAAsB;AAC5B,IAAA,IAAI,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA,CAAO,iBAAiB,KAAA,IAAS,OAAO,WAAW,WAAA,EAAa;AACrF,MAAA,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAAA,EAEQ,gBAAA,GAAyB;AAC/B,IAAA,IAAA,CAAK,cAAc,UAAA,EAAW;AAAA,EAChC;AAAA;AAAA,EAGO,cAAc,OAAA,EAAyD;AAC5E,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,EAAA,CAAG,cAAA,EAAgB,CAAC,IAAA,KAAS;AAErD,MAAA,IAAI,KAAK,IAAA,EAAM;AACb,QAAA,IAAA,CAAK,aAAa,IAAA,CAAK,IAAA;AACvB,QAAA,IAAA,CAAK,kBAAA,GAAqB,KAAK,GAAA,EAAI;AAAA,MACrC;AACA,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,CAAC,CAAA;AAAA,EACH;AAAA,EAEO,iBAAiB,OAAA,EAAiE;AACvF,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,EAAA,CAAG,iBAAA,EAAmB,OAAO,CAAA;AAAA,EACzD;AAAA,EAEO,qBAAqB,OAAA,EAA6C;AACvE,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,EAAA,CAAG,qBAAA,EAAuB,OAAO,CAAA;AAAA,EAC7D;AAAA,EAEO,kBAAkB,OAAA,EAA6C;AACpE,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,EAAA,CAAG,uBAAA,EAAyB,OAAO,CAAA;AAAA,EAC/D;AAAA,EAEO,aAAa,OAAA,EAA+D;AACjF,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,EAAA,CAAG,kBAAA,EAAoB,OAAO,CAAA;AAAA,EAC1D;AAAA,EAEO,kBAAkB,OAAA,EAA6C;AACpE,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,EAAA,CAAG,WAAA,EAAa,OAAO,CAAA;AAAA,EACnD;AAAA,EAEO,qBAAqB,OAAA,EAA6D;AACvF,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,EAAA,CAAG,cAAA,EAAgB,OAAO,CAAA;AAAA,EACtD;AAAA,EAEO,cAAc,OAAA,EAA4D;AAC/E,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,EAAA,CAAG,OAAA,EAAS,OAAO,CAAA;AAAA,EAC/C;AAAA,EAEO,iBAAA,GAA6B;AAClC,IAAA,OAAO,IAAA,CAAK,cAAc,WAAA,EAAY;AAAA,EACxC;AAAA;AAAA,EAGO,cAAA,GAAuB;AAC5B,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,IAAA,CAAK,kBAAA,GAAqB,CAAA;AAAA,EAC5B;AAAA,EAEQ,YAAA,GAAwB;AAC9B,IAAA,OAAO,IAAA,CAAK,eAAe,IAAA,IACnB,IAAA,CAAK,KAAI,GAAI,IAAA,CAAK,qBAAsB,IAAA,CAAK,cAAA;AAAA,EACvD;AAAA,EAEO,eAAA,GAA2B;AAChC,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA,EAEO,QAAA,GAA0B;AAC/B,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEO,cAAA,GAA8B;AACnC,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,OAAO,IAAA;AAExB,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA;AACzD,MAAA,OAAO,QAAQ,IAAA,IAAQ,IAAA;AAAA,IACzB,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,KAAK,CAAA;AACvD,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,MAAa,gBAAA,GAAkC;AAC7C,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,WAAA,EAAa;AAE9B,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,IAAuB,yBAAyB,CAAA;AACvF,MAAA,IAAI,SAAS,SAAA,EAAW;AACtB,QAAA,IAAA,CAAK,UAAA,CAAW,YAAA,CAAa,QAAA,CAAS,SAAS,CAAA;AAAA,MACjD;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAAA,IAClD;AAAA,EACF;AAAA,EAEO,YAAA,GAA8B;AACnC,IAAA,OAAO,IAAA,CAAK,WAAW,YAAA,EAAa;AAAA,EACtC;AAAA;AAAA,EAGO,eAAe,QAAA,EAA+B;AACnD,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AAAA,IACzE;AAEA,IAAA,MAAM,WAAW,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,OAAO,sBAAsB,QAAQ,CAAA,CAAA;AACrE,IAAA,MAAA,CAAO,SAAS,IAAA,GAAO,QAAA;AAAA,EACzB;AAAA,EAEO,kBAAkB,QAAA,EAA+B;AACtD,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAM,IAAI,MAAM,yDAAyD,CAAA;AAAA,IAC3E;AAEA,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,IAChE;AAEA,IAAA,MAAM,UAAU,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,OAAO,sBAAsB,QAAQ,CAAA,KAAA,CAAA;AACpE,IAAA,MAAA,CAAO,SAAS,IAAA,GAAO,OAAA;AAAA,EACzB;AAAA,EAEA,MAAa,oBAAoB,QAAA,EAAgD;AAC/E,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,MAAA;AAAA,MACrC,sBAAsB,QAAQ,CAAA,OAAA;AAAA,KAChC;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAa,MAAM,IAAA,EAAwC;AACzD,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,UAAA,CAAW,IAAA,CAAmB,sBAAsB,IAAI,CAAA;AAEpF,IAAA,IAAI,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS,KAAA,EAAO;AACtC,MAAA,IAAA,CAAK,QAAQ,QAAA,CAAS,KAAA;AACtB,MAAA,IAAA,CAAK,UAAA,CAAW,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA;AAC3C,MAAA,IAAA,CAAK,kBAAA,CAAmB,SAAS,KAAK,CAAA;AAGtC,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,IAAA,CAAK,aAAa,QAAA,CAAS,IAAA;AAC3B,QAAA,IAAA,CAAK,kBAAA,GAAqB,KAAK,GAAA,EAAI;AAAA,MACrC;AACA,MAAA,IAAA,CAAK,aAAA,EAAc;AAEnB,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,IAAI,SAAS,OAAA,KAAY,QAAA,CAAS,YAAY,yBAAA,IAA6B,QAAA,CAAS,YAAY,gCAAA,CAAA,EAAmC;AACjI,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,IAAI,SAAS,OAAA,IAAW,QAAA,CAAS,OAAA,KAAY,4BAAA,IAAgC,SAAS,KAAA,EAAO;AAC3F,MAAA,IAAA,CAAK,QAAQ,QAAA,CAAS,KAAA;AACtB,MAAA,IAAA,CAAK,UAAA,CAAW,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA;AAC3C,MAAA,IAAA,CAAK,kBAAA,CAAmB,SAAS,KAAK,CAAA;AAGtC,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,IAAA,CAAK,aAAa,QAAA,CAAS,IAAA;AAC3B,QAAA,IAAA,CAAK,kBAAA,GAAqB,KAAK,GAAA,EAAI;AAAA,MACrC;AACA,MAAA,IAAA,CAAK,aAAA,EAAc;AAEnB,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,OAAA,IAAW,cAAc,CAAA;AAAA,EACpD;AAAA,EAEA,MAAa,SAAS,IAAA,EAA2C;AAE/D,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,UAAA,CAAW,IAAA,CAAmB,yBAAyB,IAAI,CAAA;AAEvF,IAAA,IAAI,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS,OAAA,KAAY,4EAAA,EAA8E;AACzH,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,OAAA,IAAW,qBAAqB,CAAA;AAAA,EAC3D;AAAA,EAEA,MAAa,OAAO,IAAA,EAAyC;AAC3D,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,UAAA,CAAW,IAAA,CAAmB,uBAAuB,IAAI,CAAA;AAErF,IAAA,IAAI,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS,KAAA,EAAO;AACtC,MAAA,IAAA,CAAK,QAAQ,QAAA,CAAS,KAAA;AACtB,MAAA,IAAA,CAAK,UAAA,CAAW,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA;AAC3C,MAAA,IAAA,CAAK,kBAAA,CAAmB,SAAS,KAAK,CAAA;AAAA,IACxC;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAa,iBAAiB,KAAA,EAAsC;AAClE,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,WAAW,GAAA,CAAkB,CAAA,gCAAA,EAAmC,KAAK,CAAA,CAAE,CAAA;AAEnG,MAAA,IAAI,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS,KAAA,EAAO;AACtC,QAAA,IAAA,CAAK,QAAQ,QAAA,CAAS,KAAA;AACtB,QAAA,IAAA,CAAK,UAAA,CAAW,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA;AAC3C,QAAA,IAAA,CAAK,kBAAA,CAAmB,SAAS,KAAK,CAAA;AAAA,MACxC;AAEA,MAAA,OAAO,QAAA;AAAA,IACT,SAAS,KAAA,EAAY;AAEnB,MAAA,IAAI,KAAA,CAAM,UAAU,IAAA,EAAM;AACxB,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,OAAA,EAAS,KAAA,CAAM,QAAA,CAAS,IAAA,CAAK,OAAA,IAAW;AAAA,SAC1C;AAAA,MACF;AAGA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAA,EAAS,MAAM,OAAA,IAAW;AAAA,OAC5B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,MAAA,GAAwB;AAEnC,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAGtB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,qBAAA,EAAuB,EAAE,CAAA;AAAA,IACtD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,mCAAmC,KAAK,CAAA;AAAA,IACvD;AAEA,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,IAAA,CAAK,kBAAA,GAAqB,CAAA;AAC1B,IAAA,IAAA,CAAK,WAAW,eAAA,EAAgB;AAChC,IAAA,IAAA,CAAK,WAAW,eAAA,EAAgB;AAChC,IAAA,IAAA,CAAK,sBAAA,EAAuB;AAAA,EAC9B;AAAA,EAEA,MAAa,UAAA,CAAW,YAAA,GAAe,KAAA,EAAsB;AAC3D,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAGA,IAAA,IAAI,CAAC,YAAA,IAAgB,IAAA,CAAK,YAAA,EAAa,IAAK,KAAK,UAAA,EAAY;AAC3D,MAAA,OAAO,IAAA,CAAK,UAAA;AAAA,IACd;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,IAAoB,iBAAiB,CAAA;AAG5E,IAAA,IAAA,CAAK,aAAa,QAAA,CAAS,IAAA;AAC3B,IAAA,IAAA,CAAK,kBAAA,GAAqB,KAAK,GAAA,EAAI;AAEnC,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA,EAEA,MAAa,cAAc,IAAA,EAA6C;AACtE,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,UAAA,CAAW,IAAA,CAAmB,+BAA+B,IAAI,CAAA;AAE7F,IAAA,IAAI,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS,KAAA,EAAO;AACtC,MAAA,IAAA,CAAK,QAAQ,QAAA,CAAS,KAAA;AACtB,MAAA,IAAA,CAAK,UAAA,CAAW,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA;AAC3C,MAAA,IAAA,CAAK,kBAAA,CAAmB,SAAS,KAAK,CAAA;AAAA,IACxC;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAa,WAAA,GAA+B;AAC1C,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,IAAuB,kBAAkB,CAAA;AAChF,IAAA,OAAO,QAAA,CAAS,KAAA;AAAA,EAClB;AAAA,EAEA,MAAa,YAAY,EAAA,EAA2B;AAClD,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,WAAW,GAAA,CAAoB,CAAA,aAAA,EAAgB,EAAE,CAAA,CAAE,CAAA;AAC/E,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA,EAEA,MAAa,eAAe,KAAA,EAAsC;AAEhE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,KAAmB,8BAAA,EAAgC,EAAE,OAAO,CAAA;AACnG,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAa,aAAA,CAAc,KAAA,EAAe,QAAA,EAAyC;AACjF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,KAAmB,6BAAA,EAA+B,EAAE,KAAA,EAAO,QAAA,EAAU,CAAA;AAC5G,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAa,cAAA,CAAe,WAAA,EAAqB,WAAA,EAA4C;AAC3F,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,KAAmB,8BAAA,EAAgC;AAAA,MACxF,WAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAa,aAAa,MAAA,EAAuC;AAC/D,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,KAAmB,6BAAA,EAA+B,EAAE,QAAQ,CAAA;AAEnG,IAAA,IAAI,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS,KAAA,EAAO;AACtC,MAAA,IAAA,CAAK,QAAQ,QAAA,CAAS,KAAA;AACtB,MAAA,IAAA,CAAK,UAAA,CAAW,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA;AAC3C,MAAA,IAAA,CAAK,kBAAA,CAAmB,SAAS,KAAK,CAAA;AAAA,IACxC;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAa,sBAAsB,IAAA,EAAmC;AACpE,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAEA,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,MAAM,IAAI,MAAM,gFAAgF,CAAA;AAAA,IAClG;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,aAAA,EAAe,UAAA,IAAc,UAAA;AAC5D,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,aAAA,CAAc,OAAO,IAAA,EAAM;AAAA,QACzD,UAAA;AAAA,QACA,eAAA,EAAiB;AAAA,OAClB,CAAA;AAGD,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,CAAa,aAAa,SAAS,CAAA;AAE/D,MAAA,OAAO,QAAA;AAAA,IACT,SAAS,KAAA,EAAY;AACnB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,KAAA,CAAM,OAAA,IAAW,eAAe,CAAA,CAAE,CAAA;AAAA,IAChF;AAAA,EACF;AAAA,EAEO,gBAAA,GAAyC;AAC9C,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA,EAEA,MAAa,mBAAmB,QAAA,EAAyC;AACvE,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,KAAmB,mCAAA,EAAqC;AAAA,MAC7F;AAAA,KACD,CAAA;AACD,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAa,kBAAkB,KAAA,EAAsC;AACnE,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,WAAW,GAAA,CAAkB,CAAA,uCAAA,EAA0C,KAAK,CAAA,CAAE,CAAA;AAE1G,IAAA,IAAI,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS,KAAA,EAAO;AACtC,MAAA,IAAA,CAAK,QAAQ,QAAA,CAAS,KAAA;AACtB,MAAA,IAAA,CAAK,UAAA,CAAW,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA;AAC3C,MAAA,IAAA,CAAK,kBAAA,CAAmB,SAAS,KAAK,CAAA;AAAA,IACxC;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAa,WAAA,GAAgG;AAC3G,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,IAAA;AAAA,MACrC,sBAAA;AAAA,MACA;AAAC,KACH;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAa,UAAU,KAAA,EAAsC;AAC3D,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,KAAmB,oBAAA,EAAsB,EAAE,OAAO,CAAA;AACzF,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAa,WAAW,KAAA,EAAsC;AAC5D,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,KAAmB,qBAAA,EAAuB,EAAE,OAAO,CAAA;AAC1F,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAa,YAAY,KAAA,EAAsC;AAC7D,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,KAAmB,sBAAA,EAAwB,EAAE,OAAO,CAAA;AAC3F,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAa,WAAA,GAA8D;AACzE,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,IAA2C,kBAAkB,CAAA;AACpG,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAa,cAAc,SAAA,EAA0C;AACnE,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,WAAW,MAAA,CAAqB,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAE,CAAA;AAC3F,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAa,iBAAA,GAA2C;AACtD,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,OAAqB,6BAA6B,CAAA;AAGzF,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,WAAW,eAAA,EAAgB;AAChC,IAAA,IAAA,CAAK,sBAAA,EAAuB;AAE5B,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAa,aAAa,OAAA,EAA2D;AACnF,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,GAAA;AAAA,MACrC,0BAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAa,gBAAgB,IAAA,EAKe;AAC1C,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,IAAA;AAAA,MACrC,2BAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAa,gBAAgB,MAAA,EAAuC;AAClE,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,KAAmB,CAAA,0BAAA,EAA6B,MAAM,CAAA,CAAA,EAAI,EAAE,CAAA;AACnG,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAa,wBAAwB,MAAA,EAAuC;AAC1E,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,KAAmB,CAAA,mCAAA,EAAsC,MAAM,CAAA,CAAA,EAAI,EAAE,CAAA;AAC5G,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAa,iBAAiB,MAAA,EAAuC;AACnE,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,KAAmB,CAAA,2BAAA,EAA8B,MAAM,CAAA,CAAA,EAAI,EAAE,CAAA;AACpG,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAa,kBAAkB,MAAA,EAAuC;AACpE,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,KAAmB,CAAA,4BAAA,EAA+B,MAAM,CAAA,CAAA,EAAI,EAAE,CAAA;AACrG,IAAA,OAAO,QAAA;AAAA,EACT;AACF;;;AC9mBO,IAAM,UAAA,GAAN,cAAyB,WAAA,CAAY;AAAA,EAC1C,YAAY,MAAA,EAAoB;AAC9B,IAAA,KAAA,CAAM,MAAM,CAAA;AAAA,EACd;AAAA;AAAA;AAAA,EAKA,MAAa,SAAS,IAAA,EAA2C;AAE/D,IAAA,MAAM,eAAA,GACJ,QAAQ,GAAA,CAAI,iBAAA,IACZ,QAAQ,GAAA,CAAI,6BAAA,IACZ,QAAQ,GAAA,CAAI,2BAAA;AAEd,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,IAAA,CAAK,YAAY,CAAA,CAAE,kBAAA,CAAmB,eAAe,CAAA;AAAA,IACvD;AAGA,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,YAAY,CAAA,CAAE,IAAA,CAAmB,yBAAyB,IAAI,CAAA;AAE1F,IAAA,IAAI,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS,OAAA,KAAY,4EAAA,EAA8E;AACzH,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,OAAA,IAAW,qBAAqB,CAAA;AAAA,EAC3D;AAAA,EAEA,MAAa,MAAM,IAAA,EAAwC;AACzD,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,YAAY,CAAA,CAAE,IAAA,CAAmB,sBAAsB,IAAI,CAAA;AAGvF,IAAA,IAAI,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS,KAAA,EAAO;AACtC,MAAA,IAAA,CAAK,OAAO,IAAI,QAAA,CAAS,KAAA;AACzB,MAAA,IAAA,CAAK,YAAY,CAAA,CAAE,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA;AAE9C,MAAA,OAAO,QAAA;AAAA,IACT;AAGA,IAAA,IAAI,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS,OAAA,KAAY,yBAAA,EAA2B;AACtE,MAAA,OAAO,QAAA;AAAA,IACT;AAGA,IAAA,IAAI,SAAS,OAAA,IAAW,QAAA,CAAS,OAAA,KAAY,4BAAA,IAAgC,SAAS,KAAA,EAAO;AAC3F,MAAA,IAAA,CAAK,OAAO,IAAI,QAAA,CAAS,KAAA;AACzB,MAAA,IAAA,CAAK,YAAY,CAAA,CAAE,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA;AAE9C,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,OAAA,IAAW,cAAc,CAAA;AAAA,EACpD;AAAA,EAEA,MAAa,OAAO,IAAA,EAAyC;AAC3D,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,YAAY,CAAA,CAAE,IAAA,CAAmB,uBAAuB,IAAI,CAAA;AAExF,IAAA,IAAI,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS,KAAA,EAAO;AACtC,MAAA,IAAA,CAAK,OAAO,IAAI,QAAA,CAAS,KAAA;AACzB,MAAA,IAAA,CAAK,YAAY,CAAA,CAAE,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA;AAAA,IAEhD;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAa,MAAA,GAAwB;AACnC,IAAA,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA;AAChB,IAAA,IAAA,CAAK,YAAY,EAAE,eAAA,EAAgB;AAAA,EAErC;AAAA,EAEA,MAAa,UAAA,GAA4B;AACvC,IAAA,IAAI,CAAC,IAAA,CAAK,OAAO,CAAA,EAAG;AAClB,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,YAAY,CAAA,CAAE,IAAoB,iBAAiB,CAAA;AAC/E,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA,EAEA,MAAa,YAAY,EAAA,EAA2B;AAClD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAY,EAAE,GAAA,CAAoB,CAAA,aAAA,EAAgB,EAAE,CAAA,CAAE,CAAA;AAClF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA,EAEA,MAAa,cAAc,IAAA,EAA6C;AACtE,IAAA,IAAI,CAAC,IAAA,CAAK,OAAO,CAAA,EAAG;AAClB,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,YAAY,CAAA,CAAE,IAAA,CAAmB,4BAA4B,IAAI,CAAA;AAE7F,IAAA,IAAI,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS,KAAA,EAAO;AACtC,MAAA,IAAA,CAAK,OAAO,IAAI,QAAA,CAAS,KAAA;AACzB,MAAA,IAAA,CAAK,YAAY,CAAA,CAAE,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA;AAAA,IAEhD;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAa,WAAA,GAA+B;AAC1C,IAAA,IAAI,CAAC,IAAA,CAAK,OAAO,CAAA,EAAG;AAClB,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,YAAY,CAAA,CAAE,IAAuB,kBAAkB,CAAA;AACnF,IAAA,OAAO,QAAA,CAAS,KAAA;AAAA,EAClB;AACF;;;ACvGO,IAAM,gBAAN,MAAoB;AAAA,EAKzB,YAAY,MAAA,EAA6B;AAHzC,IAAA,IAAA,CAAQ,KAAA,uBAAqC,GAAA,EAAI;AACjD,IAAA,IAAA,CAAQ,eAAA,GAAyC,IAAA;AAG/C,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,QAAA,EAAU,GAAA;AAAA;AAAA,MACV,YAAA,EAAc,IAAA;AAAA,MACd,GAAG;AAAA,KACL;AAGA,IAAA,IAAI,IAAA,CAAK,OAAO,YAAA,EAAc;AAC5B,MAAA,IAAA,CAAK,YAAA,EAAa;AAAA,IACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAY,KAAA,EAAqC;AACrD,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,IAAA,CAAK,OAAO,YAAA,EAAc;AAC5B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AACtC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,IACF;AAGA,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,IAAA,CAAK,MAAA,CAAO,cAAc,CAAA,eAAA,CAAA,EAAmB;AAAA,QAC3E,OAAA,EAAS;AAAA,UACP,eAAA,EAAiB,UAAU,KAAK,CAAA,CAAA;AAAA,UAChC,cAAA,EAAgB;AAAA;AAClB,OACD,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAEhB,QAAA,IAAA,CAAK,KAAA,CAAM,OAAO,KAAK,CAAA;AACvB,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,IAAA;AAG1B,MAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,MAAA,CAAO,YAAA,EAAc;AACpC,QAAA,IAAA,CAAK,QAAA,CAAS,OAAO,IAAI,CAAA;AAAA,MAC3B;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,qDAAqD,KAAK,CAAA;AACxE,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,KAAA,EAAqB;AACnC,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAiE;AAC/D,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAK,KAAA,CAAM,IAAA;AAAA,MACjB,OAAA,EAAS,KAAK,MAAA,CAAO,YAAA;AAAA,MACrB,GAAA,EAAK,KAAK,MAAA,CAAO;AAAA,KACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,aAAA,CAAc,KAAK,eAAe,CAAA;AAClC,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,IACzB;AACA,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AAAA,EACnB;AAAA,EAEQ,aAAa,KAAA,EAA4B;AAC/C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA;AAClC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,SAAA,EAAW;AAChC,MAAA,IAAA,CAAK,KAAA,CAAM,OAAO,KAAK,CAAA;AACvB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,KAAA,CAAM,IAAA;AAAA,EACf;AAAA,EAEQ,QAAA,CAAS,OAAe,IAAA,EAAkB;AAChD,IAAA,IAAA,CAAK,KAAA,CAAM,IAAI,KAAA,EAAO;AAAA,MACpB,IAAA;AAAA,MACA,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,GAAI,KAAK,MAAA,CAAO;AAAA,KACrC,CAAA;AAAA,EACH;AAAA,EAEQ,YAAA,GAAqB;AAE3B,IAAA,IAAA,CAAK,eAAA,GAAkB,YAAY,MAAM;AACvC,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,KAAA,MAAW,CAAC,KAAA,EAAO,KAAK,KAAK,IAAA,CAAK,KAAA,CAAM,SAAQ,EAAG;AACjD,QAAA,IAAI,GAAA,GAAM,MAAM,SAAA,EAAW;AACzB,UAAA,IAAA,CAAK,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,QACzB;AAAA,MACF;AAAA,IACF,GAAG,GAAK,CAAA;AAGR,IAAA,IAAI,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,eAAA,CAAgB,KAAA,EAAO;AACtD,MAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAAA,IAC7B;AAAA,EACF;AACF;AAGA,IAAI,eAAA,GAAwC,IAAA;AAKrC,SAAS,oBAAoB,MAAA,EAA4C;AAC9E,EAAA,eAAA,GAAkB,IAAI,cAAc,MAAM,CAAA;AAC1C,EAAA,OAAO,eAAA;AACT;AAMO,SAAS,gBAAA,GAAkC;AAChD,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,MAAM,IAAI,MAAM,kEAAkE,CAAA;AAAA,EACpF;AACA,EAAA,OAAO,eAAA;AACT;AAMA,eAAsB,YAAY,KAAA,EAAqC;AACrE,EAAA,OAAO,gBAAA,EAAiB,CAAE,WAAA,CAAY,KAAK,CAAA;AAC7C;;;ACxLO,IAAM,cAAA,GAAN,MAAM,eAAA,SAAuB,UAAA,CAAW;AAAA,EAC7C,YAAY,MAAA,EAAoB;AAC9B,IAAA,KAAA,CAAM,MAAM,CAAA;AAAA,EACd;AAAA;AAAA,EAGA,OAAc,sBAAsB,OAAA,EAAiC;AACnE,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,eAAe,CAAA;AAC9C,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,UAAA,CAAW,UAAA,CAAW,SAAS,CAAA,EAAG;AACpD,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,UAAA,CAAW,UAAU,CAAC,CAAA;AAAA,EAC/B;AAAA;AAAA,EAGA,OAAc,sBAAsBC,QAAAA,EAAgC;AAClE,IAAA,MAAM,WAAA,GAAcA,QAAAA,CAAQ,KAAA,CAAM,GAAG,CAAA;AACrC,IAAA,KAAA,MAAW,UAAU,WAAA,EAAa;AAChC,MAAA,MAAM,CAAC,MAAM,KAAK,CAAA,GAAI,OAAO,IAAA,EAAK,CAAE,MAAM,GAAG,CAAA;AAC7C,MAAA,IAAI,SAAS,YAAA,EAAc;AACzB,QAAA,OAAO,mBAAmB,KAAK,CAAA;AAAA,MACjC;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,OAAc,sBAAsB,GAAA,EAAyB;AAE3D,IAAA,IAAI,IAAI,OAAA,EAAS;AACf,MAAA,MAAM,UAAA,GAAa,GAAA,CAAI,OAAA,CAAQ,aAAA,IAAiB,IAAI,OAAA,CAAQ,aAAA;AAC5D,MAAA,IAAI,UAAA,IAAc,UAAA,CAAW,UAAA,CAAW,SAAS,CAAA,EAAG;AAClD,QAAA,OAAO,UAAA,CAAW,UAAU,CAAC,CAAA;AAAA,MAC/B;AAAA,IACF;AAGA,IAAA,IAAI,IAAI,OAAA,EAAS;AACf,MAAA,OAAO,GAAA,CAAI,QAAQ,UAAA,IAAc,IAAA;AAAA,IACnC;AAGA,IAAA,IAAI,GAAA,CAAI,OAAA,IAAW,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ;AACrC,MAAA,OAAO,IAAA,CAAK,qBAAA,CAAsB,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAA;AAAA,IACtD;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAa,YAAY,KAAA,EAAqC;AAC5D,IAAA,IAAI;AAEF,MAAC,IAAA,CAAa,YAAY,CAAA,CAAE,YAAA,CAAa,KAAK,CAAA;AAG9C,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,UAAA,EAAW;AACnC,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,OAAc,yBAAA,CAA0B,MAAA,EAAoB,KAAA,EAA+B;AACzF,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAe,MAAM,CAAA;AACxC,IAAC,MAAA,CAAe,YAAY,CAAA,CAAE,YAAA,CAAa,KAAK,CAAA;AAChD,IAAC,MAAA,CAAe,OAAO,CAAA,GAAI,KAAA;AAC3B,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AClEO,IAAM,aAAN,MAAiB;AAAA,EAGtB,YAAY,MAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,UAAA,EAAY,MAAA,EAAQ,UAAA,IAAc,OAAA,CAAQ,IAAI,YAAA,IAAgB,uBAAA;AAAA,MAC9D,eAAA,EAAiB,QAAQ,eAAA,IAAmB;AAAA,KAC9C;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,GAAmC;AACvC,IAAA,MAAM,WAAA,GAAc,MAAMA,eAAA,EAAQ;AAClC,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,OAAO,eAAgB,CAAA;AAC1D,IAAA,OAAO,OAAO,KAAA,IAAS,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,cAAA,GAAuC;AAC3C,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,EAAS;AAClC,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,KAAK,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,EAAG,QAAQ,CAAA,CAAE,UAAU,CAAA;AAChF,MAAA,OAAO,QAAQ,IAAA,IAAQ,IAAA;AAAA,IACzB,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,KAAK,CAAA;AACvD,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,eAAA,GAAoC;AACxC,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,EAAS;AAClC,IAAA,OAAO,CAAC,CAAC,KAAA;AAAA,EACX;AAAA,EAEA,MAAM,YAAY,UAAA,EAAoC;AACpD,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,cAAA,EAAe;AACvC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,SAAA,GAAY,UAAA,IAChB,OAAA,CAAQ,GAAA,CAAI,kCAAA,IACZ,aAAA;AACF,MAAAC,mBAAA,CAAS,SAAS,CAAA;AAClB,MAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,IACxC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,wBAAwB,UAAA,EAAoC;AAChE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,EAAgB;AAC1C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,aAAA,GAAgB,UAAA,IACpB,OAAA,CAAQ,GAAA,CAAI,qCAAA,IACZ,YAAA;AACF,MAAAA,mBAAA,CAAS,aAAa,CAAA;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,GAAmC;AACvC,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,EAAS;AAClC,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA,eAAA,CAAA,EAAmB;AAAA,QACvE,OAAA,EAAS;AAAA,UACP,eAAA,EAAiB,UAAU,KAAK,CAAA;AAAA;AAClC,OACD,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,OAAO,IAAA,CAAK,IAAA;AAAA,IACd,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAC/C,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACF;AAGA,IAAI,kBAAA,GAAwC,IAAA;AAErC,SAAS,cAAc,MAAA,EAAuC;AACnE,EAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,IAAA,kBAAA,GAAqB,IAAI,WAAW,MAAM,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,kBAAA;AACT;AAGA,eAAsB,WAAA,GAAoC;AACxD,EAAA,MAAMC,QAAO,aAAA,EAAc;AAC3B,EAAA,OAAOA,MAAK,cAAA,EAAe;AAC7B;AAEA,eAAsB,IAAA,GAAO;AAC3B,EAAA,MAAM,aAAa,aAAA,EAAc;AACjC,EAAA,MAAM,IAAA,GAAO,MAAM,UAAA,CAAW,cAAA,EAAe;AAC7C,EAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,CAAW,QAAA,EAAS;AAExC,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,MAAA,EAAQ,MAAM,GAAA,IAAO,IAAA;AAAA,IACrB,eAAA,EAAiB,CAAC,CAAC,IAAA;AAAA,IACnB;AAAA,GACF;AACF;AAEA,eAAsB,YAAY,UAAA,EAAoC;AACpE,EAAA,MAAM,aAAa,aAAA,EAAc;AACjC,EAAA,OAAO,UAAA,CAAW,YAAY,UAAU,CAAA;AAC1C;AAEA,eAAsB,wBAAwB,UAAA,EAAoC;AAChF,EAAA,MAAM,aAAa,aAAA,EAAc;AACjC,EAAA,OAAO,UAAA,CAAW,wBAAwB,UAAU,CAAA;AACtD;;;AC/GA,IAAM,kBAAkB,MAAM;AAE5B,EAAA,MAAM,EAAE,YAAA,EAAa,GAAI,SAAA,CAAQ,aAAa,CAAA;AAC9C,EAAA,OAAO,YAAA;AAIT,CAAA;AAUO,SAAS,eAAe,MAAA,EAA+B;AAC5D,EAAA,MAAM;AAAA,IACJ,eAAe,CAAC,aAAA,EAAe,gBAAA,EAAkB,oBAAA,EAAsB,yBAAyB,sBAAsB,CAAA;AAAA,IACtH,eAAA,GAAkB,CAAC,YAAY,CAAA;AAAA,IAC/B,QAAA,GAAW,aAAA;AAAA,IACX,aAAA,GAAgB,YAAA;AAAA,IAChB,eAAA,GAAkB;AAAA,GACpB,GAAI,UAAU,EAAC;AAEf,EAAA,OAAO,SAAS,WAAW,OAAA,EAA0B;AACnD,IAAA,MAAM,eAAe,eAAA,EAAgB;AACrC,IAAA,MAAM,EAAE,QAAA,EAAS,GAAI,OAAA,CAAQ,OAAA;AAC7B,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,eAAe,CAAA,EAAG,KAAA;AACpD,IAAA,MAAM,eAAA,GAAkB,CAAC,CAAC,KAAA;AAG1B,IAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,IAAA,CAAK,CAAA,KAAA,KAAS;AAC/C,MAAA,IAAI,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AACvB,QAAA,OAAO,SAAS,UAAA,CAAW,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,MAC/C;AACA,MAAA,OAAO,QAAA,KAAa,KAAA,IAAS,QAAA,CAAS,UAAA,CAAW,QAAQ,GAAG,CAAA;AAAA,IAC9D,CAAC,CAAA;AAGD,IAAA,MAAM,gBAAA,GAAmB,eAAA,CAAgB,IAAA,CAAK,CAAA,KAAA,KAAS;AACrD,MAAA,IAAI,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AACvB,QAAA,OAAO,SAAS,UAAA,CAAW,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,MAC/C;AACA,MAAA,OAAO,QAAA,KAAa,KAAA,IAAS,QAAA,CAAS,UAAA,CAAW,QAAQ,GAAG,CAAA;AAAA,IAC9D,CAAC,CAAA;AAGD,IAAA,IAAI,mBAAmB,aAAA,EAAe;AACpC,MAAA,OAAO,aAAa,QAAA,CAAS,IAAI,IAAI,aAAA,EAAe,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,IAClE;AAGA,IAAA,IAAI,CAAC,mBAAmB,gBAAA,EAAkB;AACxC,MAAA,MAAM,oBAAA,GAAuB,IAAI,GAAA,CAAI,QAAA,EAAU,QAAQ,GAAG,CAAA;AAC1D,MAAA,oBAAA,CAAqB,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,QAAQ,CAAA;AAC1D,MAAA,OAAO,YAAA,CAAa,SAAS,oBAAoB,CAAA;AAAA,IACnD;AAEA,IAAA,OAAO,aAAa,IAAA,EAAK;AAAA,EAC3B,CAAA;AACF;AAGO,SAAS,qBAAqB,MAAA,EAA+B;AAClE,EAAA,OAAO,eAAe,MAAM,CAAA;AAC9B","file":"index.next.server.js","sourcesContent":["import axios, { AxiosInstance, AxiosRequestConfig, AxiosError } from 'axios';\r\n\r\n// User-friendly error messages\r\nconst ERROR_MESSAGES = {\r\n NETWORK_ERROR: 'Unable to connect to the server. Please check your internet connection and try again.',\r\n TIMEOUT: 'The request took too long. Please try again.',\r\n SERVER_ERROR: 'Something went wrong on our end. Please try again later.',\r\n UNAUTHORIZED: 'Your session has expired. Please log in again.',\r\n FORBIDDEN: 'You do not have permission to perform this action.',\r\n NOT_FOUND: 'The requested resource was not found.',\r\n RATE_LIMITED: 'Too many requests. Please wait a moment and try again.',\r\n UNKNOWN: 'An unexpected error occurred. Please try again.',\r\n};\r\n\r\nexport class HttpClient {\r\n private axiosInstance: AxiosInstance;\r\n private csrfToken: string | null = null;\r\n private frontendBaseUrl: string | null = null;\r\n private baseUrl: string;\r\n\r\n constructor(baseUrl: string, defaultHeaders: Record<string, string> = {}) {\r\n this.baseUrl = baseUrl.replace(/\\/$/, '');\r\n\r\n this.axiosInstance = axios.create({\r\n baseURL: this.baseUrl,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...defaultHeaders\r\n },\r\n withCredentials: true, // Include cookies for CSRF\r\n timeout: 30000 // 30 second timeout\r\n });\r\n\r\n // Request interceptor to add CSRF token and frontend URL\r\n this.axiosInstance.interceptors.request.use(\r\n async (config) => {\r\n // Fetch CSRF token lazily on first mutating request (only on client side)\r\n const isMutatingRequest = ['post', 'put', 'delete', 'patch'].includes(config.method?.toLowerCase() || '');\r\n if (isMutatingRequest && !this.csrfToken && typeof window !== 'undefined') {\r\n try {\r\n await this.refreshCsrfToken();\r\n } catch (error) {\r\n console.warn('Failed to fetch CSRF token:', error);\r\n }\r\n }\r\n\r\n // Add CSRF token to mutating requests\r\n if (this.csrfToken && isMutatingRequest) {\r\n config.headers['x-csrf-token'] = this.csrfToken;\r\n }\r\n\r\n // Add frontend base URL header if available\r\n if (this.frontendBaseUrl) {\r\n config.headers['X-Frontend-URL'] = this.frontendBaseUrl;\r\n }\r\n\r\n return config;\r\n },\r\n (error) => Promise.reject(this.createUserFriendlyError(error))\r\n );\r\n\r\n // Response interceptor for error handling and CSRF token refresh\r\n this.axiosInstance.interceptors.response.use(\r\n (response) => response,\r\n async (error: AxiosError) => {\r\n const originalRequest = error.config as AxiosRequestConfig & { _retry?: boolean };\r\n\r\n // Handle CSRF token refresh on 403\r\n if (error.response?.status === 403 && !originalRequest._retry) {\r\n originalRequest._retry = true;\r\n\r\n try {\r\n await this.refreshCsrfToken();\r\n if (originalRequest.headers) {\r\n originalRequest.headers['x-csrf-token'] = this.csrfToken!;\r\n }\r\n return this.axiosInstance(originalRequest);\r\n } catch (refreshError) {\r\n return Promise.reject(this.createUserFriendlyError(refreshError as AxiosError));\r\n }\r\n }\r\n\r\n // Create user-friendly error\r\n return Promise.reject(this.createUserFriendlyError(error));\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Creates a user-friendly error message from an Axios error\r\n */\r\n private createUserFriendlyError(error: AxiosError | any): Error {\r\n // If it's already a processed error with a message, return it\r\n if (error instanceof Error && !(error as any).isAxiosError) {\r\n return error;\r\n }\r\n\r\n let message: string;\r\n let statusCode: number | undefined;\r\n\r\n // Handle Axios errors\r\n if (axios.isAxiosError(error)) {\r\n statusCode = error.response?.status;\r\n const responseData = error.response?.data as any;\r\n\r\n // If server returned a specific error message, use it\r\n if (responseData?.message) {\r\n message = responseData.message;\r\n }\r\n // Handle network errors (no response)\r\n else if (!error.response) {\r\n if (error.code === 'ECONNABORTED' || error.message.includes('timeout')) {\r\n message = ERROR_MESSAGES.TIMEOUT;\r\n } else if (error.code === 'ERR_NETWORK' || error.message === 'Network Error') {\r\n message = ERROR_MESSAGES.NETWORK_ERROR;\r\n } else {\r\n message = ERROR_MESSAGES.NETWORK_ERROR;\r\n }\r\n }\r\n // Handle HTTP status codes\r\n else {\r\n switch (statusCode) {\r\n case 400:\r\n message = responseData?.message || 'Invalid request. Please check your input.';\r\n break;\r\n case 401:\r\n message = responseData?.message || ERROR_MESSAGES.UNAUTHORIZED;\r\n break;\r\n case 403:\r\n message = responseData?.message || ERROR_MESSAGES.FORBIDDEN;\r\n break;\r\n case 404:\r\n message = responseData?.message || ERROR_MESSAGES.NOT_FOUND;\r\n break;\r\n case 429:\r\n message = ERROR_MESSAGES.RATE_LIMITED;\r\n break;\r\n case 500:\r\n case 502:\r\n case 503:\r\n case 504:\r\n message = ERROR_MESSAGES.SERVER_ERROR;\r\n break;\r\n default:\r\n message = responseData?.message || ERROR_MESSAGES.UNKNOWN;\r\n }\r\n }\r\n } else {\r\n // Non-Axios error\r\n message = error?.message || ERROR_MESSAGES.UNKNOWN;\r\n }\r\n\r\n const customError = new Error(message);\r\n // Attach response and status code for compatibility\r\n (customError as any).response = (error as AxiosError)?.response;\r\n (customError as any).statusCode = statusCode;\r\n (customError as any).originalError = error;\r\n \r\n return customError;\r\n }\r\n\r\n public async get<T>(endpoint: string, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.get<T>(endpoint, { headers });\r\n return response.data;\r\n }\r\n\r\n public async post<T>(endpoint: string, data?: any, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.post<T>(endpoint, data, { headers });\r\n return response.data;\r\n }\r\n\r\n public async put<T>(endpoint: string, data?: any, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.put<T>(endpoint, data, { headers });\r\n return response.data;\r\n }\r\n\r\n public async delete<T>(endpoint: string, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.delete<T>(endpoint, { headers });\r\n return response.data;\r\n }\r\n\r\n public setAuthToken(token: string): void {\r\n this.axiosInstance.defaults.headers.common['Authorization'] = `Bearer ${token}`;\r\n }\r\n\r\n public removeAuthToken(): void {\r\n delete this.axiosInstance.defaults.headers.common['Authorization'];\r\n }\r\n\r\n public setCsrfToken(token: string): void {\r\n this.csrfToken = token;\r\n }\r\n\r\n public getCsrfToken(): string | null {\r\n return this.csrfToken;\r\n }\r\n\r\n public removeCsrfToken(): void {\r\n this.csrfToken = null;\r\n }\r\n\r\n public setFrontendBaseUrl(url: string): void {\r\n this.frontendBaseUrl = url;\r\n }\r\n\r\n public getFrontendBaseUrl(): string | null {\r\n return this.frontendBaseUrl;\r\n }\r\n\r\n public removeFrontendBaseUrl(): void {\r\n this.frontendBaseUrl = null;\r\n }\r\n\r\n private async refreshCsrfToken(): Promise<void> {\r\n try {\r\n const response = await this.axiosInstance.get<{ csrfToken: string }>('/api/v1/auth/csrf-token');\r\n this.csrfToken = response.data.csrfToken;\r\n } catch (error) {\r\n console.error('Failed to refresh CSRF token:', error);\r\n throw error;\r\n }\r\n }\r\n}","import { io, Socket } from 'socket.io-client';\nimport { User } from '../types';\n\nexport interface SocketConfig {\n baseUrl: string;\n autoConnect?: boolean;\n reconnection?: boolean;\n reconnectionAttempts?: number;\n reconnectionDelay?: number;\n}\n\nexport type SocketEventHandler<T = any> = (data: T) => void;\n\nexport class SocketService {\n private socket: Socket | null = null;\n private config: SocketConfig;\n private token: string | null = null;\n private eventHandlers: Map<string, Set<SocketEventHandler>> = new Map();\n private isConnecting = false;\n\n constructor(config: SocketConfig) {\n this.config = {\n autoConnect: false,\n reconnection: true,\n reconnectionAttempts: 5,\n reconnectionDelay: 1000,\n ...config,\n };\n }\n\n connect(token: string): void {\n if (this.socket?.connected || this.isConnecting) {\n return;\n }\n\n this.token = token;\n this.isConnecting = true;\n\n this.socket = io(this.config.baseUrl, {\n auth: { token },\n autoConnect: true,\n reconnection: this.config.reconnection,\n reconnectionAttempts: this.config.reconnectionAttempts,\n reconnectionDelay: this.config.reconnectionDelay,\n transports: ['websocket', 'polling'],\n });\n\n this.setupEventListeners();\n }\n\n private setupEventListeners(): void {\n if (!this.socket) return;\n\n this.socket.on('connect', () => {\n this.isConnecting = false;\n console.log('[Auth SDK] Socket connected');\n this.emit('connected', {});\n });\n\n this.socket.on('disconnect', (reason) => {\n console.log('[Auth SDK] Socket disconnected:', reason);\n this.emit('disconnected', { reason });\n });\n\n this.socket.on('connect_error', (error) => {\n this.isConnecting = false;\n console.error('[Auth SDK] Socket connection error:', error.message);\n this.emit('error', { error: error.message });\n });\n\n // Auth events\n this.socket.on('user:updated', (data: { user: User }) => {\n this.emit('user:updated', data);\n });\n\n this.socket.on('session:revoked', (data: { sessionId?: string }) => {\n this.emit('session:revoked', data);\n });\n\n this.socket.on('session:all-revoked', () => {\n this.emit('session:all-revoked', {});\n });\n\n this.socket.on('auth:password-changed', () => {\n this.emit('auth:password-changed', {});\n });\n\n this.socket.on('auth:2fa-changed', (data: { enabled: boolean }) => {\n this.emit('auth:2fa-changed', data);\n });\n\n this.socket.on('user:refresh', () => {\n this.emit('user:refresh', {});\n });\n }\n\n disconnect(): void {\n if (this.socket) {\n this.socket.disconnect();\n this.socket = null;\n this.token = null;\n this.isConnecting = false;\n }\n }\n\n isConnected(): boolean {\n return this.socket?.connected ?? false;\n }\n\n // Event subscription\n on<T = any>(event: string, handler: SocketEventHandler<T>): () => void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set());\n }\n this.eventHandlers.get(event)!.add(handler);\n\n // Return unsubscribe function\n return () => {\n this.eventHandlers.get(event)?.delete(handler);\n };\n }\n\n off(event: string, handler?: SocketEventHandler): void {\n if (handler) {\n this.eventHandlers.get(event)?.delete(handler);\n } else {\n this.eventHandlers.delete(event);\n }\n }\n\n private emit(event: string, data: any): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.forEach(handler => {\n try {\n handler(data);\n } catch (error) {\n console.error(`[Auth SDK] Error in event handler for ${event}:`, error);\n }\n });\n }\n }\n\n // Request fresh user data from server\n requestUserRefresh(): void {\n if (this.socket?.connected) {\n this.socket.emit('request:user');\n }\n }\n}\n","import { HttpClient } from './http-client';\r\nimport { SocketService, SocketEventHandler } from './socket-service';\r\nimport {\r\n AuthResponse,\r\n LoginData,\r\n VerifyData,\r\n UpdateUserData,\r\n User,\r\n AuthConfig,\r\n RegisterData,\r\n OAuthProvider,\r\n CsrfTokenResponse\r\n} from '../types';\r\nimport { UpfilesClient } from '@thetechfossil/upfiles';\r\n\r\nexport class AuthService {\r\n private httpClient: HttpClient;\r\n private socketService: SocketService;\r\n private config: AuthConfig;\r\n private token: string | null = null;\r\n private upfilesClient: UpfilesClient | null = null;\r\n private cachedUser: User | null = null;\r\n private userCacheTimestamp: number = 0;\r\n private readonly USER_CACHE_TTL = 5 * 60 * 1000; // 5 minutes cache\r\n\r\n constructor(config: AuthConfig) {\r\n this.config = {\r\n localStorageKey: 'auth_token',\r\n csrfEnabled: true,\r\n enableSocket: true,\r\n ...config\r\n };\r\n\r\n this.httpClient = new HttpClient(this.config.baseUrl);\r\n this.socketService = new SocketService({ baseUrl: this.config.baseUrl });\r\n this.loadTokenFromStorage();\r\n\r\n // Initialize upfiles client if config is provided\r\n if (this.config.upfilesConfig) {\r\n this.upfilesClient = new UpfilesClient({\r\n baseUrl: this.config.upfilesConfig.baseUrl,\r\n apiKey: this.config.upfilesConfig.apiKey,\r\n apiKeyHeader: this.config.upfilesConfig.apiKeyHeader,\r\n presignUrl: this.config.upfilesConfig.presignUrl,\r\n presignPath: this.config.upfilesConfig.presignPath,\r\n });\r\n }\r\n\r\n // Set frontend base URL if available\r\n if (typeof window !== 'undefined') {\r\n const frontendBaseUrl = \r\n process.env.NEXT_PUBLIC_FRONTEND_BASE_URL ||\r\n process.env.REACT_APP_FRONTEND_BASE_URL ||\r\n process.env.NEXT_PUBLIC_APP_URL ||\r\n window.location.origin;\r\n \r\n if (frontendBaseUrl) {\r\n this.httpClient.setFrontendBaseUrl(frontendBaseUrl);\r\n }\r\n }\r\n\r\n // Connect socket if token exists and socket is enabled\r\n if (this.token && this.config.enableSocket !== false) {\r\n this.connectSocket();\r\n }\r\n\r\n // CSRF token will be fetched lazily on first mutating request\r\n // This prevents SSR issues and ensures proper initialization\r\n }\r\n\r\n private loadTokenFromStorage(): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n const token = localStorage.getItem(this.config.localStorageKey);\r\n if (token) {\r\n this.token = token;\r\n this.httpClient.setAuthToken(token);\r\n }\r\n } catch (error) {\r\n console.warn('Failed to load token from storage:', error);\r\n }\r\n }\r\n }\r\n\r\n private saveTokenToStorage(token: string): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n localStorage.setItem(this.config.localStorageKey, token);\r\n } catch (error) {\r\n console.warn('Failed to save token to storage:', error);\r\n }\r\n }\r\n }\r\n\r\n private removeTokenFromStorage(): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n localStorage.removeItem(this.config.localStorageKey);\r\n } catch (error) {\r\n console.warn('Failed to remove token from storage:', error);\r\n }\r\n }\r\n }\r\n\r\n // Socket connection management\r\n private connectSocket(): void {\r\n if (this.token && this.config.enableSocket !== false && typeof window !== 'undefined') {\r\n this.socketService.connect(this.token);\r\n }\r\n }\r\n\r\n private disconnectSocket(): void {\r\n this.socketService.disconnect();\r\n }\r\n\r\n // Socket event subscription\r\n public onUserUpdated(handler: SocketEventHandler<{ user: User }>): () => void {\r\n return this.socketService.on('user:updated', (data) => {\r\n // Update cached user\r\n if (data.user) {\r\n this.cachedUser = data.user;\r\n this.userCacheTimestamp = Date.now();\r\n }\r\n handler(data);\r\n });\r\n }\r\n\r\n public onSessionRevoked(handler: SocketEventHandler<{ sessionId?: string }>): () => void {\r\n return this.socketService.on('session:revoked', handler);\r\n }\r\n\r\n public onAllSessionsRevoked(handler: SocketEventHandler<{}>): () => void {\r\n return this.socketService.on('session:all-revoked', handler);\r\n }\r\n\r\n public onPasswordChanged(handler: SocketEventHandler<{}>): () => void {\r\n return this.socketService.on('auth:password-changed', handler);\r\n }\r\n\r\n public on2FAChanged(handler: SocketEventHandler<{ enabled: boolean }>): () => void {\r\n return this.socketService.on('auth:2fa-changed', handler);\r\n }\r\n\r\n public onSocketConnected(handler: SocketEventHandler<{}>): () => void {\r\n return this.socketService.on('connected', handler);\r\n }\r\n\r\n public onSocketDisconnected(handler: SocketEventHandler<{ reason: string }>): () => void {\r\n return this.socketService.on('disconnected', handler);\r\n }\r\n\r\n public onSocketError(handler: SocketEventHandler<{ error: string }>): () => void {\r\n return this.socketService.on('error', handler);\r\n }\r\n\r\n public isSocketConnected(): boolean {\r\n return this.socketService.isConnected();\r\n }\r\n\r\n // Cache management\r\n public clearUserCache(): void {\r\n this.cachedUser = null;\r\n this.userCacheTimestamp = 0;\r\n }\r\n\r\n private isCacheValid(): boolean {\r\n return this.cachedUser !== null && \r\n (Date.now() - this.userCacheTimestamp) < this.USER_CACHE_TTL;\r\n }\r\n\r\n public isAuthenticated(): boolean {\r\n return !!this.token;\r\n }\r\n\r\n public getToken(): string | null {\r\n return this.token;\r\n }\r\n\r\n public getCurrentUser(): User | null {\r\n if (!this.token) return null;\r\n\r\n try {\r\n const payload = JSON.parse(atob(this.token.split('.')[1]));\r\n return payload.user || null;\r\n } catch (error) {\r\n console.error('Failed to parse user from token:', error);\r\n return null;\r\n }\r\n }\r\n\r\n // CSRF Token Management\r\n public async refreshCsrfToken(): Promise<void> {\r\n if (!this.config.csrfEnabled) return;\r\n\r\n try {\r\n const response = await this.httpClient.get<CsrfTokenResponse>('/api/v1/auth/csrf-token');\r\n if (response.csrfToken) {\r\n this.httpClient.setCsrfToken(response.csrfToken);\r\n }\r\n } catch (error) {\r\n console.error('Failed to get CSRF token:', error);\r\n }\r\n }\r\n\r\n public getCsrfToken(): string | null {\r\n return this.httpClient.getCsrfToken();\r\n }\r\n\r\n // OAuth Methods\r\n public loginWithOAuth(provider: OAuthProvider): void {\r\n if (typeof window === 'undefined') {\r\n throw new Error('OAuth login is only available in browser environments');\r\n }\r\n\r\n const oauthUrl = `${this.config.baseUrl}/api/v1/auth/oauth/${provider}`;\r\n window.location.href = oauthUrl;\r\n }\r\n\r\n public linkOAuthProvider(provider: OAuthProvider): void {\r\n if (typeof window === 'undefined') {\r\n throw new Error('OAuth linking is only available in browser environments');\r\n }\r\n\r\n if (!this.token) {\r\n throw new Error('Must be authenticated to link OAuth provider');\r\n }\r\n\r\n const linkUrl = `${this.config.baseUrl}/api/v1/auth/oauth/${provider}/link`;\r\n window.location.href = linkUrl;\r\n }\r\n\r\n public async unlinkOAuthProvider(provider: OAuthProvider): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.delete<AuthResponse>(\r\n `/api/v1/auth/oauth/${provider}/unlink`\r\n );\r\n return response;\r\n }\r\n\r\n // Standard Auth Methods\r\n public async login(data: LoginData): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/login', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n \r\n // Cache user and connect socket\r\n if (response.user) {\r\n this.cachedUser = response.user;\r\n this.userCacheTimestamp = Date.now();\r\n }\r\n this.connectSocket();\r\n \r\n return response;\r\n }\r\n\r\n if (response.success && (response.message === 'OTP sent to your email.' || response.message === 'OTP sent to your phone number.')) {\r\n return response;\r\n }\r\n\r\n if (response.success && response.message === 'OTP verified successfully.' && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n \r\n // Cache user and connect socket\r\n if (response.user) {\r\n this.cachedUser = response.user;\r\n this.userCacheTimestamp = Date.now();\r\n }\r\n this.connectSocket();\r\n \r\n return response;\r\n }\r\n\r\n throw new Error(response.message || 'Login failed');\r\n }\r\n\r\n public async register(data: RegisterData): Promise<AuthResponse> {\r\n // Frontend base URL is now automatically sent via X-Frontend-URL header\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/register', data);\r\n\r\n if (response.success && response.message === 'Registration data saved. Verification email sent. Please check your inbox.') {\r\n return response;\r\n }\r\n\r\n throw new Error(response.message || 'Registration failed');\r\n }\r\n\r\n public async verify(data: VerifyData): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/verify', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async verifyEmailToken(token: string): Promise<AuthResponse> {\r\n try {\r\n const response = await this.httpClient.get<AuthResponse>(`/api/v1/auth/verify-email?token=${token}`);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n } catch (error: any) {\r\n // Handle axios error response\r\n if (error.response?.data) {\r\n return {\r\n success: false,\r\n message: error.response.data.message || 'Email verification failed',\r\n };\r\n }\r\n \r\n // Handle network or other errors\r\n return {\r\n success: false,\r\n message: error.message || 'Network error occurred',\r\n };\r\n }\r\n }\r\n\r\n public async logout(): Promise<void> {\r\n // Disconnect socket first\r\n this.disconnectSocket();\r\n \r\n // Call backend to clear cookie\r\n try {\r\n await this.httpClient.post('/api/v1/auth/logout', {});\r\n } catch (error) {\r\n console.warn('Failed to call logout endpoint:', error);\r\n }\r\n\r\n this.token = null;\r\n this.cachedUser = null;\r\n this.userCacheTimestamp = 0;\r\n this.httpClient.removeAuthToken();\r\n this.httpClient.removeCsrfToken();\r\n this.removeTokenFromStorage();\r\n }\r\n\r\n public async getProfile(forceRefresh = false): Promise<User> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n // Return cached user if valid and not forcing refresh\r\n if (!forceRefresh && this.isCacheValid() && this.cachedUser) {\r\n return this.cachedUser;\r\n }\r\n\r\n const response = await this.httpClient.get<{ user: User }>('/api/v1/user/me');\r\n \r\n // Update cache\r\n this.cachedUser = response.user;\r\n this.userCacheTimestamp = Date.now();\r\n \r\n return response.user;\r\n }\r\n\r\n public async updateProfile(data: UpdateUserData): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/update/profile', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async getAllUsers(): Promise<User[]> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ users: User[] }>('/api/v1/user/all');\r\n return response.users;\r\n }\r\n\r\n public async getUserById(id: string): Promise<User> {\r\n const response = await this.httpClient.get<{ user: User }>(`/api/v1/user/${id}`);\r\n return response.user;\r\n }\r\n\r\n public async forgotPassword(email: string): Promise<AuthResponse> {\r\n // Frontend base URL is now automatically sent via X-Frontend-URL header\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/forgot-password', { email });\r\n return response;\r\n }\r\n\r\n public async resetPassword(token: string, password: string): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/reset-password', { token, password });\r\n return response;\r\n }\r\n\r\n public async changePassword(oldPassword: string, newPassword: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/change-password', { \r\n oldPassword, \r\n newPassword \r\n });\r\n return response;\r\n }\r\n\r\n public async updateAvatar(avatar: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/update/profile', { avatar });\r\n \r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async uploadAndUpdateAvatar(file: File): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n if (!this.upfilesClient) {\r\n throw new Error('Upfiles configuration is required. Please provide upfilesConfig in AuthConfig.');\r\n }\r\n\r\n try {\r\n // Upload file using upfiles SDK\r\n const folderPath = this.config.upfilesConfig?.folderPath || 'avatars/';\r\n const uploadResult = await this.upfilesClient.upload(file, {\r\n folderPath,\r\n fetchThumbnails: true,\r\n });\r\n\r\n // Update user avatar with the uploaded file URL\r\n const response = await this.updateAvatar(uploadResult.publicUrl);\r\n \r\n return response;\r\n } catch (error: any) {\r\n throw new Error(`Failed to upload avatar: ${error.message || 'Unknown error'}`);\r\n }\r\n }\r\n\r\n public getUpfilesClient(): UpfilesClient | null {\r\n return this.upfilesClient;\r\n }\r\n\r\n public async requestEmailChange(newEmail: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/request-email-change', { \r\n newEmail \r\n });\r\n return response;\r\n }\r\n\r\n public async verifyEmailChange(token: string): Promise<AuthResponse> {\r\n const response = await this.httpClient.get<AuthResponse>(`/api/v1/user/verify-email-change?token=${token}`);\r\n \r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n // 2FA / MFA Methods\r\n public async generate2FA(): Promise<{ success: boolean; qrCode?: string; secret?: string; message: string }> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<{ success: boolean; qrCode?: string; secret?: string; message: string }>(\r\n '/api/v1/mfa/generate', \r\n {}\r\n );\r\n return response;\r\n }\r\n\r\n public async enable2FA(token: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/mfa/enable', { token });\r\n return response;\r\n }\r\n\r\n public async disable2FA(token: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/mfa/disable', { token });\r\n return response;\r\n }\r\n\r\n public async validate2FA(token: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/mfa/validate', { token });\r\n return response;\r\n }\r\n\r\n // Session Management Methods\r\n public async getSessions(): Promise<{ success: boolean; sessions: any[] }> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ success: boolean; sessions: any[] }>('/api/v1/sessions');\r\n return response;\r\n }\r\n\r\n public async revokeSession(sessionId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.delete<AuthResponse>(`/api/v1/sessions/${sessionId}`);\r\n return response;\r\n }\r\n\r\n public async revokeAllSessions(): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.delete<AuthResponse>('/api/v1/sessions/revoke/all');\r\n \r\n // After revoking all sessions, current session is also revoked\r\n this.token = null;\r\n this.httpClient.removeAuthToken();\r\n this.removeTokenFromStorage();\r\n \r\n return response;\r\n }\r\n\r\n // Admin Methods\r\n public async getAuditLogs(filters?: any): Promise<{ success: boolean; logs: any[] }> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ success: boolean; logs: any[] }>(\r\n '/api/v1/admin/audit-logs',\r\n filters\r\n );\r\n return response;\r\n }\r\n\r\n public async adminCreateUser(data: { \r\n email: string; \r\n name: string; \r\n phoneNumber?: string;\r\n password?: string;\r\n }): Promise<AuthResponse & { user?: User }> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse & { user?: User }>(\r\n '/api/v1/admin/create-user', \r\n data\r\n );\r\n return response;\r\n }\r\n\r\n public async adminVerifyUser(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/verify-user/${userId}`, {});\r\n return response;\r\n }\r\n\r\n public async adminForcePasswordReset(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/force-password-reset/${userId}`, {});\r\n return response;\r\n }\r\n\r\n public async adminSuspendUser(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/suspend-user/${userId}`, {});\r\n return response;\r\n }\r\n\r\n public async adminActivateUser(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/activate-user/${userId}`, {});\r\n return response;\r\n }\r\n}","import { AuthService } from '../core/auth-service';\r\nimport { \r\n AuthResponse, \r\n LoginData, \r\n VerifyData, \r\n UpdateUserData, \r\n User,\r\n AuthConfig,\r\n RegisterData\r\n} from '../types';\r\n\r\nexport class AuthClient extends AuthService {\r\n constructor(config: AuthConfig) {\r\n super(config);\r\n }\r\n\r\n // Override methods that require browser-specific features\r\n // For Node.js, token persistence must be handled manually\r\n \r\n public async register(data: RegisterData): Promise<AuthResponse> {\r\n // For Node.js server-side usage, set frontend base URL from environment\r\n const frontendBaseUrl = \r\n process.env.FRONTEND_BASE_URL || \r\n process.env.NEXT_PUBLIC_FRONTEND_BASE_URL ||\r\n process.env.REACT_APP_FRONTEND_BASE_URL;\r\n \r\n if (frontendBaseUrl) {\r\n this['httpClient'].setFrontendBaseUrl(frontendBaseUrl);\r\n }\r\n \r\n // Frontend base URL is now automatically sent via X-Frontend-URL header\r\n const response = await this['httpClient'].post<AuthResponse>('/api/v1/auth/register', data);\r\n \r\n if (response.success && response.message === 'Registration data saved. Verification email sent. Please check your inbox.') {\r\n return response;\r\n }\r\n \r\n throw new Error(response.message || 'Registration failed');\r\n }\r\n\r\n public async login(data: LoginData): Promise<AuthResponse> {\r\n const response = await this['httpClient'].post<AuthResponse>('/api/v1/auth/login', data);\r\n \r\n // Handle successful login with token\r\n if (response.success && response.token) {\r\n this['token'] = response.token;\r\n this['httpClient'].setAuthToken(response.token);\r\n // Note: In Node.js, you need to handle token persistence manually\r\n return response;\r\n }\r\n \r\n // Handle OTP sent response\r\n if (response.success && response.message === 'OTP sent to your email.') {\r\n return response;\r\n }\r\n \r\n // Handle verification response\r\n if (response.success && response.message === 'OTP verified successfully.' && response.token) {\r\n this['token'] = response.token;\r\n this['httpClient'].setAuthToken(response.token);\r\n // Note: In Node.js, you need to handle token persistence manually\r\n return response;\r\n }\r\n \r\n throw new Error(response.message || 'Login failed');\r\n }\r\n\r\n public async verify(data: VerifyData): Promise<AuthResponse> {\r\n const response = await this['httpClient'].post<AuthResponse>('/api/v1/auth/verify', data);\r\n \r\n if (response.success && response.token) {\r\n this['token'] = response.token;\r\n this['httpClient'].setAuthToken(response.token);\r\n // Note: In Node.js, you need to handle token persistence manually\r\n }\r\n \r\n return response;\r\n }\r\n\r\n public async logout(): Promise<void> {\r\n this['token'] = null;\r\n this['httpClient'].removeAuthToken();\r\n // Note: In Node.js, you need to handle token removal manually\r\n }\r\n\r\n public async getProfile(): Promise<User> {\r\n if (!this['token']) {\r\n throw new Error('Not authenticated');\r\n }\r\n \r\n const response = await this['httpClient'].get<{ user: User }>('/api/v1/user/me');\r\n return response.user;\r\n }\r\n\r\n public async getUserById(id: string): Promise<User> {\r\n const response = await this['httpClient'].get<{ user: User }>(`/api/v1/user/${id}`);\r\n return response.user;\r\n }\r\n\r\n public async updateProfile(data: UpdateUserData): Promise<AuthResponse> {\r\n if (!this['token']) {\r\n throw new Error('Not authenticated');\r\n }\r\n \r\n const response = await this['httpClient'].post<AuthResponse>('/api/v1/user/update/name', data);\r\n \r\n if (response.success && response.token) {\r\n this['token'] = response.token;\r\n this['httpClient'].setAuthToken(response.token);\r\n // Note: In Node.js, you need to handle token persistence manually\r\n }\r\n \r\n return response;\r\n }\r\n\r\n public async getAllUsers(): Promise<User[]> {\r\n if (!this['token']) {\r\n throw new Error('Not authenticated');\r\n }\r\n \r\n const response = await this['httpClient'].get<{ users: User[] }>('/api/v1/user/all');\r\n return response.users;\r\n }\r\n}","/**\n * Server-side token verification utility\n * \n * Use this in backend middleware to verify JWT tokens and get user data\n * with built-in caching to reduce auth service calls.\n */\n\nimport { User } from '../types';\n\ninterface TokenVerifierConfig {\n authServiceUrl: string;\n cacheTTL?: number; // Cache TTL in milliseconds (default: 60000 = 1 minute)\n cacheEnabled?: boolean; // Enable/disable caching (default: true)\n}\n\ninterface CacheEntry {\n user: User;\n expiresAt: number;\n}\n\nexport class TokenVerifier {\n private config: Required<TokenVerifierConfig>;\n private cache: Map<string, CacheEntry> = new Map();\n private cleanupInterval: NodeJS.Timeout | null = null;\n\n constructor(config: TokenVerifierConfig) {\n this.config = {\n cacheTTL: 60000, // 1 minute default\n cacheEnabled: true,\n ...config,\n };\n\n // Start cache cleanup interval\n if (this.config.cacheEnabled) {\n this.startCleanup();\n }\n }\n\n /**\n * Verify a JWT token and get user data\n * Returns cached user if available and valid\n */\n async verifyToken(token: string): Promise<User | null> {\n if (!token) {\n return null;\n }\n\n // Check cache first\n if (this.config.cacheEnabled) {\n const cached = this.getFromCache(token);\n if (cached) {\n return cached;\n }\n }\n\n // Fetch from auth service\n try {\n const response = await fetch(`${this.config.authServiceUrl}/api/v1/user/me`, {\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n // Remove from cache if token is invalid\n this.cache.delete(token);\n return null;\n }\n\n const data = await response.json() as { user?: User };\n const user = data.user || null;\n\n // Cache the result\n if (user && this.config.cacheEnabled) {\n this.setCache(token, user);\n }\n\n return user;\n } catch (error) {\n console.error('[TokenVerifier] Auth service verification failed:', error);\n return null;\n }\n }\n\n /**\n * Invalidate cache for a specific token\n */\n invalidateToken(token: string): void {\n this.cache.delete(token);\n }\n\n /**\n * Clear all cached tokens\n */\n clearCache(): void {\n this.cache.clear();\n }\n\n /**\n * Get cache statistics\n */\n getCacheStats(): { size: number; enabled: boolean; ttl: number } {\n return {\n size: this.cache.size,\n enabled: this.config.cacheEnabled,\n ttl: this.config.cacheTTL,\n };\n }\n\n /**\n * Stop the cleanup interval (call when shutting down)\n */\n destroy(): void {\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval);\n this.cleanupInterval = null;\n }\n this.cache.clear();\n }\n\n private getFromCache(token: string): User | null {\n const entry = this.cache.get(token);\n if (!entry) {\n return null;\n }\n\n if (Date.now() > entry.expiresAt) {\n this.cache.delete(token);\n return null;\n }\n\n return entry.user;\n }\n\n private setCache(token: string, user: User): void {\n this.cache.set(token, {\n user,\n expiresAt: Date.now() + this.config.cacheTTL,\n });\n }\n\n private startCleanup(): void {\n // Clean up expired entries every minute\n this.cleanupInterval = setInterval(() => {\n const now = Date.now();\n for (const [token, entry] of this.cache.entries()) {\n if (now > entry.expiresAt) {\n this.cache.delete(token);\n }\n }\n }, 60000) as unknown as NodeJS.Timeout;\n\n // Don't prevent process from exiting\n if (this.cleanupInterval && this.cleanupInterval.unref) {\n this.cleanupInterval.unref();\n }\n }\n}\n\n// Singleton instance for convenience\nlet defaultVerifier: TokenVerifier | null = null;\n\n/**\n * Create or get the default TokenVerifier instance\n */\nexport function createTokenVerifier(config: TokenVerifierConfig): TokenVerifier {\n defaultVerifier = new TokenVerifier(config);\n return defaultVerifier;\n}\n\n/**\n * Get the default TokenVerifier instance\n * Throws if not initialized\n */\nexport function getTokenVerifier(): TokenVerifier {\n if (!defaultVerifier) {\n throw new Error('TokenVerifier not initialized. Call createTokenVerifier() first.');\n }\n return defaultVerifier;\n}\n\n/**\n * Verify a token using the default verifier\n * Convenience function for simple usage\n */\nexport async function verifyToken(token: string): Promise<User | null> {\n return getTokenVerifier().verifyToken(token);\n}\n","import { AuthClient } from '../node/auth-client';\r\nimport { AuthConfig, User, RegisterData } from '../types';\r\n\r\n// Server-side authentication utility for Next.js\r\nexport class NextServerAuth extends AuthClient {\r\n constructor(config: AuthConfig) {\r\n super(config);\r\n }\r\n\r\n // Parse token from request headers\r\n public static parseTokenFromHeaders(headers: Headers): string | null {\r\n const authHeader = headers.get('authorization');\r\n if (!authHeader || !authHeader.startsWith('Bearer ')) {\r\n return null;\r\n }\r\n return authHeader.substring(7); // Remove 'Bearer ' prefix\r\n }\r\n\r\n // Parse token from cookies\r\n public static parseTokenFromCookies(cookies: string): string | null {\r\n const cookieArray = cookies.split(';');\r\n for (const cookie of cookieArray) {\r\n const [name, value] = cookie.trim().split('=');\r\n if (name === 'auth_token') {\r\n return decodeURIComponent(value);\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n // Parse token from Next.js request object\r\n public static parseTokenFromRequest(req: any): string | null {\r\n // Try to get token from headers first\r\n if (req.headers) {\r\n const authHeader = req.headers.authorization || req.headers.Authorization;\r\n if (authHeader && authHeader.startsWith('Bearer ')) {\r\n return authHeader.substring(7);\r\n }\r\n }\r\n\r\n // Try to get token from cookies\r\n if (req.cookies) {\r\n return req.cookies.auth_token || null;\r\n }\r\n\r\n // Try to get token from cookie header\r\n if (req.headers && req.headers.cookie) {\r\n return this.parseTokenFromCookies(req.headers.cookie);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n // Verify token and get user\r\n public async verifyToken(token: string): Promise<User | null> {\r\n try {\r\n // Set the token for this request\r\n (this as any)['httpClient'].setAuthToken(token);\r\n \r\n // Get user profile to verify token\r\n const user = await this.getProfile();\r\n return user;\r\n } catch (error) {\r\n console.error('Token verification failed:', error);\r\n return null;\r\n }\r\n }\r\n\r\n // Create authenticated client with token\r\n public static createAuthenticatedClient(config: AuthConfig, token: string): NextServerAuth {\r\n const client = new NextServerAuth(config);\r\n (client as any)['httpClient'].setAuthToken(token);\r\n (client as any)['token'] = token;\r\n return client;\r\n }\r\n}","import { cookies } from 'next/headers';\r\nimport { redirect } from 'next/navigation';\r\nimport { User } from '../types';\r\n\r\ninterface AuthServerConfig {\r\n authApiUrl?: string;\r\n tokenCookieName?: string;\r\n}\r\n\r\nexport class AuthServer {\r\n private config: AuthServerConfig;\r\n\r\n constructor(config?: AuthServerConfig) {\r\n this.config = {\r\n authApiUrl: config?.authApiUrl || process.env.AUTH_API_URL || 'http://localhost:7000',\r\n tokenCookieName: config?.tokenCookieName || 'auth_token',\r\n };\r\n }\r\n\r\n async getToken(): Promise<string | null> {\r\n const cookieStore = await cookies();\r\n const token = cookieStore.get(this.config.tokenCookieName!);\r\n return token?.value || null;\r\n }\r\n\r\n async getCurrentUser(): Promise<User | null> {\r\n const token = await this.getToken();\r\n if (!token) return null;\r\n\r\n try {\r\n const payload = JSON.parse(Buffer.from(token.split('.')[1], 'base64').toString());\r\n return payload.user || null;\r\n } catch (error) {\r\n console.error('Failed to parse user from token:', error);\r\n return null;\r\n }\r\n }\r\n\r\n async isAuthenticated(): Promise<boolean> {\r\n const token = await this.getToken();\r\n return !!token;\r\n }\r\n\r\n async requireAuth(redirectTo?: string): Promise<User> {\r\n const user = await this.getCurrentUser();\r\n if (!user) {\r\n const loginPath = redirectTo || \r\n process.env.NEXT_PUBLIC_AUTH_REDIRECT_TO_LOGIN || \r\n '/auth/login';\r\n redirect(loginPath);\r\n throw new Error('Redirecting to login'); // This line never executes but satisfies TypeScript\r\n }\r\n return user;\r\n }\r\n\r\n async redirectIfAuthenticated(redirectTo?: string): Promise<void> {\r\n const isAuth = await this.isAuthenticated();\r\n if (isAuth) {\r\n const dashboardPath = redirectTo || \r\n process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_LOGIN || \r\n '/dashboard';\r\n redirect(dashboardPath);\r\n }\r\n }\r\n\r\n async getProfile(): Promise<User | null> {\r\n const token = await this.getToken();\r\n if (!token) return null;\r\n\r\n try {\r\n const response = await fetch(`${this.config.authApiUrl}/api/v1/user/me`, {\r\n headers: {\r\n 'Authorization': `Bearer ${token}`,\r\n },\r\n });\r\n\r\n if (!response.ok) {\r\n return null;\r\n }\r\n\r\n const data = await response.json();\r\n return data.user;\r\n } catch (error) {\r\n console.error('Failed to fetch profile:', error);\r\n return null;\r\n }\r\n }\r\n}\r\n\r\n// Singleton instance\r\nlet authServerInstance: AuthServer | null = null;\r\n\r\nexport function getAuthServer(config?: AuthServerConfig): AuthServer {\r\n if (!authServerInstance) {\r\n authServerInstance = new AuthServer(config);\r\n }\r\n return authServerInstance;\r\n}\r\n\r\n// Convenience functions\r\nexport async function currentUser(): Promise<User | null> {\r\n const auth = getAuthServer();\r\n return auth.getCurrentUser();\r\n}\r\n\r\nexport async function auth() {\r\n const authServer = getAuthServer();\r\n const user = await authServer.getCurrentUser();\r\n const token = await authServer.getToken();\r\n \r\n return {\r\n user,\r\n userId: user?._id || null,\r\n isAuthenticated: !!user,\r\n token,\r\n };\r\n}\r\n\r\nexport async function requireAuth(redirectTo?: string): Promise<User> {\r\n const authServer = getAuthServer();\r\n return authServer.requireAuth(redirectTo);\r\n}\r\n\r\nexport async function redirectIfAuthenticated(redirectTo?: string): Promise<void> {\r\n const authServer = getAuthServer();\r\n return authServer.redirectIfAuthenticated(redirectTo);\r\n}\r\n","// Type definitions for Next.js middleware\r\ninterface NextRequestLike {\r\n nextUrl: URL;\r\n url: string;\r\n cookies: {\r\n get(name: string): { value: string } | undefined;\r\n };\r\n}\r\n\r\ninterface NextResponseLike {\r\n redirect(url: URL): NextResponseLike;\r\n next(): NextResponseLike;\r\n}\r\n\r\n// Dynamic import to avoid type issues at build time\r\nconst getNextResponse = () => {\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n const { NextResponse } = require('next/server');\r\n return NextResponse as {\r\n redirect(url: URL): NextResponseLike;\r\n next(): NextResponseLike;\r\n };\r\n};\r\n\r\ninterface AuthMiddlewareConfig {\r\n publicRoutes?: string[];\r\n protectedRoutes?: string[];\r\n loginUrl?: string;\r\n afterLoginUrl?: string;\r\n tokenCookieName?: string;\r\n}\r\n\r\nexport function authMiddleware(config?: AuthMiddlewareConfig) {\r\n const {\r\n publicRoutes = ['/auth/login', '/auth/register', '/auth/verify-email', '/auth/forgot-password', '/auth/reset-password'],\r\n protectedRoutes = ['/dashboard'],\r\n loginUrl = '/auth/login',\r\n afterLoginUrl = '/dashboard',\r\n tokenCookieName = 'auth_token',\r\n } = config || {};\r\n\r\n return function middleware(request: NextRequestLike) {\r\n const NextResponse = getNextResponse();\r\n const { pathname } = request.nextUrl;\r\n const token = request.cookies.get(tokenCookieName)?.value;\r\n const isAuthenticated = !!token;\r\n\r\n // Check if current path is public\r\n const isPublicRoute = publicRoutes.some(route => {\r\n if (route.endsWith('*')) {\r\n return pathname.startsWith(route.slice(0, -1));\r\n }\r\n return pathname === route || pathname.startsWith(route + '/');\r\n });\r\n\r\n // Check if current path is protected\r\n const isProtectedRoute = protectedRoutes.some(route => {\r\n if (route.endsWith('*')) {\r\n return pathname.startsWith(route.slice(0, -1));\r\n }\r\n return pathname === route || pathname.startsWith(route + '/');\r\n });\r\n\r\n // Redirect authenticated users away from public routes\r\n if (isAuthenticated && isPublicRoute) {\r\n return NextResponse.redirect(new URL(afterLoginUrl, request.url));\r\n }\r\n\r\n // Redirect unauthenticated users away from protected routes\r\n if (!isAuthenticated && isProtectedRoute) {\r\n const loginUrlWithRedirect = new URL(loginUrl, request.url);\r\n loginUrlWithRedirect.searchParams.set('redirect', pathname);\r\n return NextResponse.redirect(loginUrlWithRedirect);\r\n }\r\n\r\n return NextResponse.next();\r\n };\r\n}\r\n\r\n// Helper to create middleware config\r\nexport function createAuthMiddleware(config?: AuthMiddlewareConfig) {\r\n return authMiddleware(config);\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/http-client.ts","../src/core/socket-service.ts","../src/core/auth-service.ts","../src/node/auth-client.ts","../src/node/token-verifier.ts","../src/nextjs/server-auth.ts","../src/nextjs/server.ts","../src/nextjs/middleware.ts"],"names":["axios","io","UpfilesClient","cookies","redirect","auth"],"mappings":"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","file":"index.next.server.js","sourcesContent":["import axios, { AxiosInstance, AxiosRequestConfig, AxiosError } from 'axios';\r\n\r\n// User-friendly error messages\r\nconst ERROR_MESSAGES = {\r\n NETWORK_ERROR: 'Unable to connect to the server. Please check your internet connection and try again.',\r\n TIMEOUT: 'The request took too long. Please try again.',\r\n SERVER_ERROR: 'Something went wrong on our end. Please try again later.',\r\n UNAUTHORIZED: 'Your session has expired. Please log in again.',\r\n FORBIDDEN: 'You do not have permission to perform this action.',\r\n NOT_FOUND: 'The requested resource was not found.',\r\n RATE_LIMITED: 'Too many requests. Please wait a moment and try again.',\r\n UNKNOWN: 'An unexpected error occurred. Please try again.',\r\n};\r\n\r\nexport class HttpClient {\r\n private axiosInstance: AxiosInstance;\r\n private csrfToken: string | null = null;\r\n private frontendBaseUrl: string | null = null;\r\n private baseUrl: string;\r\n\r\n constructor(baseUrl: string, defaultHeaders: Record<string, string> = {}) {\r\n this.baseUrl = baseUrl.replace(/\\/$/, '');\r\n\r\n this.axiosInstance = axios.create({\r\n baseURL: this.baseUrl,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...defaultHeaders\r\n },\r\n withCredentials: true, // Include cookies for CSRF\r\n timeout: 30000 // 30 second timeout\r\n });\r\n\r\n // Request interceptor to add CSRF token and frontend URL\r\n this.axiosInstance.interceptors.request.use(\r\n async (config) => {\r\n // Fetch CSRF token lazily on first mutating request (only on client side)\r\n const isMutatingRequest = ['post', 'put', 'delete', 'patch'].includes(config.method?.toLowerCase() || '');\r\n if (isMutatingRequest && !this.csrfToken && typeof window !== 'undefined') {\r\n try {\r\n await this.refreshCsrfToken();\r\n } catch (error) {\r\n console.warn('Failed to fetch CSRF token:', error);\r\n }\r\n }\r\n\r\n // Add CSRF token to mutating requests\r\n if (this.csrfToken && isMutatingRequest) {\r\n config.headers['x-csrf-token'] = this.csrfToken;\r\n }\r\n\r\n // Add frontend base URL header if available\r\n if (this.frontendBaseUrl) {\r\n config.headers['X-Frontend-URL'] = this.frontendBaseUrl;\r\n }\r\n\r\n return config;\r\n },\r\n (error) => Promise.reject(this.createUserFriendlyError(error))\r\n );\r\n\r\n // Response interceptor for error handling and CSRF token refresh\r\n this.axiosInstance.interceptors.response.use(\r\n (response) => response,\r\n async (error: AxiosError) => {\r\n const originalRequest = error.config as AxiosRequestConfig & { _retry?: boolean };\r\n\r\n // Handle CSRF token refresh on 403\r\n if (error.response?.status === 403 && !originalRequest._retry) {\r\n originalRequest._retry = true;\r\n\r\n try {\r\n await this.refreshCsrfToken();\r\n if (originalRequest.headers) {\r\n originalRequest.headers['x-csrf-token'] = this.csrfToken!;\r\n }\r\n return this.axiosInstance(originalRequest);\r\n } catch (refreshError) {\r\n return Promise.reject(this.createUserFriendlyError(refreshError as AxiosError));\r\n }\r\n }\r\n\r\n // Create user-friendly error\r\n return Promise.reject(this.createUserFriendlyError(error));\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Creates a user-friendly error message from an Axios error\r\n */\r\n private createUserFriendlyError(error: AxiosError | any): Error {\r\n // If it's already a processed error with a message, return it\r\n if (error instanceof Error && !(error as any).isAxiosError) {\r\n return error;\r\n }\r\n\r\n let message: string;\r\n let statusCode: number | undefined;\r\n\r\n // Handle Axios errors\r\n if (axios.isAxiosError(error)) {\r\n statusCode = error.response?.status;\r\n const responseData = error.response?.data as any;\r\n\r\n // If server returned a specific error message, use it\r\n if (responseData?.message) {\r\n message = responseData.message;\r\n }\r\n // Handle network errors (no response)\r\n else if (!error.response) {\r\n if (error.code === 'ECONNABORTED' || error.message.includes('timeout')) {\r\n message = ERROR_MESSAGES.TIMEOUT;\r\n } else if (error.code === 'ERR_NETWORK' || error.message === 'Network Error') {\r\n message = ERROR_MESSAGES.NETWORK_ERROR;\r\n } else {\r\n message = ERROR_MESSAGES.NETWORK_ERROR;\r\n }\r\n }\r\n // Handle HTTP status codes\r\n else {\r\n switch (statusCode) {\r\n case 400:\r\n message = responseData?.message || 'Invalid request. Please check your input.';\r\n break;\r\n case 401:\r\n message = responseData?.message || ERROR_MESSAGES.UNAUTHORIZED;\r\n break;\r\n case 403:\r\n message = responseData?.message || ERROR_MESSAGES.FORBIDDEN;\r\n break;\r\n case 404:\r\n message = responseData?.message || ERROR_MESSAGES.NOT_FOUND;\r\n break;\r\n case 429:\r\n message = ERROR_MESSAGES.RATE_LIMITED;\r\n break;\r\n case 500:\r\n case 502:\r\n case 503:\r\n case 504:\r\n message = ERROR_MESSAGES.SERVER_ERROR;\r\n break;\r\n default:\r\n message = responseData?.message || ERROR_MESSAGES.UNKNOWN;\r\n }\r\n }\r\n } else {\r\n // Non-Axios error\r\n message = error?.message || ERROR_MESSAGES.UNKNOWN;\r\n }\r\n\r\n const customError = new Error(message);\r\n // Attach response and status code for compatibility\r\n (customError as any).response = (error as AxiosError)?.response;\r\n (customError as any).statusCode = statusCode;\r\n (customError as any).originalError = error;\r\n \r\n return customError;\r\n }\r\n\r\n public async get<T>(endpoint: string, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.get<T>(endpoint, { headers });\r\n return response.data;\r\n }\r\n\r\n public async post<T>(endpoint: string, data?: any, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.post<T>(endpoint, data, { headers });\r\n return response.data;\r\n }\r\n\r\n public async put<T>(endpoint: string, data?: any, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.put<T>(endpoint, data, { headers });\r\n return response.data;\r\n }\r\n\r\n public async delete<T>(endpoint: string, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.delete<T>(endpoint, { headers });\r\n return response.data;\r\n }\r\n\r\n public setAuthToken(token: string): void {\r\n this.axiosInstance.defaults.headers.common['Authorization'] = `Bearer ${token}`;\r\n }\r\n\r\n public removeAuthToken(): void {\r\n delete this.axiosInstance.defaults.headers.common['Authorization'];\r\n }\r\n\r\n public setCsrfToken(token: string): void {\r\n this.csrfToken = token;\r\n }\r\n\r\n public getCsrfToken(): string | null {\r\n return this.csrfToken;\r\n }\r\n\r\n public removeCsrfToken(): void {\r\n this.csrfToken = null;\r\n }\r\n\r\n public setFrontendBaseUrl(url: string): void {\r\n this.frontendBaseUrl = url;\r\n }\r\n\r\n public getFrontendBaseUrl(): string | null {\r\n return this.frontendBaseUrl;\r\n }\r\n\r\n public removeFrontendBaseUrl(): void {\r\n this.frontendBaseUrl = null;\r\n }\r\n\r\n private async refreshCsrfToken(): Promise<void> {\r\n try {\r\n const response = await this.axiosInstance.get<{ csrfToken: string }>('/api/v1/auth/csrf-token');\r\n this.csrfToken = response.data.csrfToken;\r\n } catch (error) {\r\n console.error('Failed to refresh CSRF token:', error);\r\n throw error;\r\n }\r\n }\r\n}","import { io, Socket } from 'socket.io-client';\nimport { User } from '../types';\n\nexport interface SocketConfig {\n baseUrl: string;\n autoConnect?: boolean;\n reconnection?: boolean;\n reconnectionAttempts?: number;\n reconnectionDelay?: number;\n}\n\nexport type SocketEventHandler<T = any> = (data: T) => void;\n\nexport class SocketService {\n private socket: Socket | null = null;\n private config: SocketConfig;\n private token: string | null = null;\n private eventHandlers: Map<string, Set<SocketEventHandler>> = new Map();\n private isConnecting = false;\n\n constructor(config: SocketConfig) {\n this.config = {\n autoConnect: false,\n reconnection: true,\n reconnectionAttempts: 5,\n reconnectionDelay: 1000,\n ...config,\n };\n }\n\n connect(token: string): void {\n if (this.socket?.connected || this.isConnecting) {\n return;\n }\n\n this.token = token;\n this.isConnecting = true;\n\n this.socket = io(this.config.baseUrl, {\n auth: { token },\n autoConnect: true,\n reconnection: this.config.reconnection,\n reconnectionAttempts: this.config.reconnectionAttempts,\n reconnectionDelay: this.config.reconnectionDelay,\n transports: ['websocket', 'polling'],\n });\n\n this.setupEventListeners();\n }\n\n private setupEventListeners(): void {\n if (!this.socket) return;\n\n this.socket.on('connect', () => {\n this.isConnecting = false;\n console.log('[Auth SDK] Socket connected');\n this.emit('connected', {});\n });\n\n this.socket.on('disconnect', (reason) => {\n console.log('[Auth SDK] Socket disconnected:', reason);\n this.emit('disconnected', { reason });\n });\n\n this.socket.on('connect_error', (error) => {\n this.isConnecting = false;\n console.error('[Auth SDK] Socket connection error:', error.message);\n this.emit('error', { error: error.message });\n });\n\n // Auth events\n this.socket.on('user:updated', (data: { user: User }) => {\n this.emit('user:updated', data);\n });\n\n this.socket.on('session:revoked', (data: { sessionId?: string }) => {\n this.emit('session:revoked', data);\n });\n\n this.socket.on('session:all-revoked', () => {\n this.emit('session:all-revoked', {});\n });\n\n this.socket.on('auth:password-changed', () => {\n this.emit('auth:password-changed', {});\n });\n\n this.socket.on('auth:2fa-changed', (data: { enabled: boolean }) => {\n this.emit('auth:2fa-changed', data);\n });\n\n this.socket.on('user:refresh', () => {\n this.emit('user:refresh', {});\n });\n }\n\n disconnect(): void {\n if (this.socket) {\n this.socket.disconnect();\n this.socket = null;\n this.token = null;\n this.isConnecting = false;\n }\n }\n\n isConnected(): boolean {\n return this.socket?.connected ?? false;\n }\n\n // Event subscription\n on<T = any>(event: string, handler: SocketEventHandler<T>): () => void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set());\n }\n this.eventHandlers.get(event)!.add(handler);\n\n // Return unsubscribe function\n return () => {\n this.eventHandlers.get(event)?.delete(handler);\n };\n }\n\n off(event: string, handler?: SocketEventHandler): void {\n if (handler) {\n this.eventHandlers.get(event)?.delete(handler);\n } else {\n this.eventHandlers.delete(event);\n }\n }\n\n private emit(event: string, data: any): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.forEach(handler => {\n try {\n handler(data);\n } catch (error) {\n console.error(`[Auth SDK] Error in event handler for ${event}:`, error);\n }\n });\n }\n }\n\n // Request fresh user data from server\n requestUserRefresh(): void {\n if (this.socket?.connected) {\n this.socket.emit('request:user');\n }\n }\n}\n","import { HttpClient } from './http-client';\r\nimport { SocketService, SocketEventHandler } from './socket-service';\r\nimport {\r\n AuthResponse,\r\n LoginData,\r\n VerifyData,\r\n UpdateUserData,\r\n User,\r\n AuthConfig,\r\n RegisterData,\r\n OAuthProvider,\r\n CsrfTokenResponse\r\n} from '../types';\r\nimport { UpfilesClient } from '@thetechfossil/upfiles';\r\n\r\nexport class AuthService {\r\n private httpClient: HttpClient;\r\n private socketService: SocketService;\r\n private config: AuthConfig;\r\n private token: string | null = null;\r\n private upfilesClient: UpfilesClient | null = null;\r\n private cachedUser: User | null = null;\r\n private userCacheTimestamp: number = 0;\r\n private readonly USER_CACHE_TTL = 5 * 60 * 1000; // 5 minutes cache\r\n\r\n constructor(config: AuthConfig) {\r\n this.config = {\r\n localStorageKey: 'auth_token',\r\n csrfEnabled: true,\r\n enableSocket: true,\r\n ...config\r\n };\r\n\r\n this.httpClient = new HttpClient(this.config.baseUrl);\r\n this.socketService = new SocketService({ baseUrl: this.config.baseUrl });\r\n this.loadTokenFromStorage();\r\n\r\n // Initialize upfiles client if config is provided\r\n if (this.config.upfilesConfig) {\r\n this.upfilesClient = new UpfilesClient({\r\n baseUrl: this.config.upfilesConfig.baseUrl,\r\n apiKey: this.config.upfilesConfig.apiKey,\r\n apiKeyHeader: this.config.upfilesConfig.apiKeyHeader,\r\n presignUrl: this.config.upfilesConfig.presignUrl,\r\n presignPath: this.config.upfilesConfig.presignPath,\r\n });\r\n }\r\n\r\n // Set frontend base URL if available\r\n if (typeof window !== 'undefined') {\r\n const frontendBaseUrl = \r\n process.env.NEXT_PUBLIC_FRONTEND_BASE_URL ||\r\n process.env.REACT_APP_FRONTEND_BASE_URL ||\r\n process.env.NEXT_PUBLIC_APP_URL ||\r\n window.location.origin;\r\n \r\n if (frontendBaseUrl) {\r\n this.httpClient.setFrontendBaseUrl(frontendBaseUrl);\r\n }\r\n }\r\n\r\n // Connect socket if token exists and socket is enabled\r\n if (this.token && this.config.enableSocket !== false) {\r\n this.connectSocket();\r\n }\r\n\r\n // CSRF token will be fetched lazily on first mutating request\r\n // This prevents SSR issues and ensures proper initialization\r\n }\r\n\r\n private loadTokenFromStorage(): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n const token = localStorage.getItem(this.config.localStorageKey);\r\n if (token) {\r\n this.token = token;\r\n this.httpClient.setAuthToken(token);\r\n // Ensure cookie is also set for middleware/SSR access\r\n this.setTokenCookie(token);\r\n }\r\n } catch (error) {\r\n console.warn('Failed to load token from storage:', error);\r\n }\r\n }\r\n }\r\n\r\n private saveTokenToStorage(token: string): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n localStorage.setItem(this.config.localStorageKey, token);\r\n // Also set cookie for middleware/SSR access\r\n this.setTokenCookie(token);\r\n } catch (error) {\r\n console.warn('Failed to save token to storage:', error);\r\n }\r\n }\r\n }\r\n\r\n private setTokenCookie(token: string): void {\r\n if (typeof window !== 'undefined') {\r\n // Set cookie with reasonable defaults - 7 days expiry, accessible to JS\r\n const maxAge = 7 * 24 * 60 * 60; // 7 days in seconds\r\n document.cookie = `auth_token=${token}; path=/; max-age=${maxAge}; SameSite=Lax`;\r\n }\r\n }\r\n\r\n private removeTokenCookie(): void {\r\n if (typeof window !== 'undefined') {\r\n document.cookie = 'auth_token=; path=/; max-age=0; SameSite=Lax';\r\n }\r\n }\r\n\r\n private removeTokenFromStorage(): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n localStorage.removeItem(this.config.localStorageKey);\r\n // Also remove the cookie\r\n this.removeTokenCookie();\r\n } catch (error) {\r\n console.warn('Failed to remove token from storage:', error);\r\n }\r\n }\r\n }\r\n\r\n // Socket connection management\r\n private connectSocket(): void {\r\n if (this.token && this.config.enableSocket !== false && typeof window !== 'undefined') {\r\n this.socketService.connect(this.token);\r\n }\r\n }\r\n\r\n private disconnectSocket(): void {\r\n this.socketService.disconnect();\r\n }\r\n\r\n // Socket event subscription\r\n public onUserUpdated(handler: SocketEventHandler<{ user: User }>): () => void {\r\n return this.socketService.on('user:updated', (data) => {\r\n // Update cached user\r\n if (data.user) {\r\n this.cachedUser = data.user;\r\n this.userCacheTimestamp = Date.now();\r\n }\r\n handler(data);\r\n });\r\n }\r\n\r\n public onSessionRevoked(handler: SocketEventHandler<{ sessionId?: string }>): () => void {\r\n return this.socketService.on('session:revoked', handler);\r\n }\r\n\r\n public onAllSessionsRevoked(handler: SocketEventHandler<{}>): () => void {\r\n return this.socketService.on('session:all-revoked', handler);\r\n }\r\n\r\n public onPasswordChanged(handler: SocketEventHandler<{}>): () => void {\r\n return this.socketService.on('auth:password-changed', handler);\r\n }\r\n\r\n public on2FAChanged(handler: SocketEventHandler<{ enabled: boolean }>): () => void {\r\n return this.socketService.on('auth:2fa-changed', handler);\r\n }\r\n\r\n public onSocketConnected(handler: SocketEventHandler<{}>): () => void {\r\n return this.socketService.on('connected', handler);\r\n }\r\n\r\n public onSocketDisconnected(handler: SocketEventHandler<{ reason: string }>): () => void {\r\n return this.socketService.on('disconnected', handler);\r\n }\r\n\r\n public onSocketError(handler: SocketEventHandler<{ error: string }>): () => void {\r\n return this.socketService.on('error', handler);\r\n }\r\n\r\n public isSocketConnected(): boolean {\r\n return this.socketService.isConnected();\r\n }\r\n\r\n // Cache management\r\n public clearUserCache(): void {\r\n this.cachedUser = null;\r\n this.userCacheTimestamp = 0;\r\n }\r\n\r\n private isCacheValid(): boolean {\r\n return this.cachedUser !== null && \r\n (Date.now() - this.userCacheTimestamp) < this.USER_CACHE_TTL;\r\n }\r\n\r\n public isAuthenticated(): boolean {\r\n return !!this.token;\r\n }\r\n\r\n public getToken(): string | null {\r\n return this.token;\r\n }\r\n\r\n public getCurrentUser(): User | null {\r\n if (!this.token) return null;\r\n\r\n try {\r\n const payload = JSON.parse(atob(this.token.split('.')[1]));\r\n return payload.user || null;\r\n } catch (error) {\r\n console.error('Failed to parse user from token:', error);\r\n return null;\r\n }\r\n }\r\n\r\n // CSRF Token Management\r\n public async refreshCsrfToken(): Promise<void> {\r\n if (!this.config.csrfEnabled) return;\r\n\r\n try {\r\n const response = await this.httpClient.get<CsrfTokenResponse>('/api/v1/auth/csrf-token');\r\n if (response.csrfToken) {\r\n this.httpClient.setCsrfToken(response.csrfToken);\r\n }\r\n } catch (error) {\r\n console.error('Failed to get CSRF token:', error);\r\n }\r\n }\r\n\r\n public getCsrfToken(): string | null {\r\n return this.httpClient.getCsrfToken();\r\n }\r\n\r\n // OAuth Methods\r\n public loginWithOAuth(provider: OAuthProvider): void {\r\n if (typeof window === 'undefined') {\r\n throw new Error('OAuth login is only available in browser environments');\r\n }\r\n\r\n const oauthUrl = `${this.config.baseUrl}/api/v1/auth/oauth/${provider}`;\r\n window.location.href = oauthUrl;\r\n }\r\n\r\n public linkOAuthProvider(provider: OAuthProvider): void {\r\n if (typeof window === 'undefined') {\r\n throw new Error('OAuth linking is only available in browser environments');\r\n }\r\n\r\n if (!this.token) {\r\n throw new Error('Must be authenticated to link OAuth provider');\r\n }\r\n\r\n const linkUrl = `${this.config.baseUrl}/api/v1/auth/oauth/${provider}/link`;\r\n window.location.href = linkUrl;\r\n }\r\n\r\n public async unlinkOAuthProvider(provider: OAuthProvider): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.delete<AuthResponse>(\r\n `/api/v1/auth/oauth/${provider}/unlink`\r\n );\r\n return response;\r\n }\r\n\r\n // Standard Auth Methods\r\n public async login(data: LoginData): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/login', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n \r\n // Cache user and connect socket\r\n if (response.user) {\r\n this.cachedUser = response.user;\r\n this.userCacheTimestamp = Date.now();\r\n }\r\n this.connectSocket();\r\n \r\n return response;\r\n }\r\n\r\n if (response.success && (response.message === 'OTP sent to your email.' || response.message === 'OTP sent to your phone number.')) {\r\n return response;\r\n }\r\n\r\n if (response.success && response.message === 'OTP verified successfully.' && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n \r\n // Cache user and connect socket\r\n if (response.user) {\r\n this.cachedUser = response.user;\r\n this.userCacheTimestamp = Date.now();\r\n }\r\n this.connectSocket();\r\n \r\n return response;\r\n }\r\n\r\n throw new Error(response.message || 'Login failed');\r\n }\r\n\r\n public async register(data: RegisterData): Promise<AuthResponse> {\r\n // Frontend base URL is now automatically sent via X-Frontend-URL header\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/register', data);\r\n\r\n if (response.success && response.message === 'Registration data saved. Verification email sent. Please check your inbox.') {\r\n return response;\r\n }\r\n\r\n throw new Error(response.message || 'Registration failed');\r\n }\r\n\r\n public async verify(data: VerifyData): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/verify', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async verifyEmailToken(token: string): Promise<AuthResponse> {\r\n try {\r\n const response = await this.httpClient.get<AuthResponse>(`/api/v1/auth/verify-email?token=${token}`);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n } catch (error: any) {\r\n // Handle axios error response\r\n if (error.response?.data) {\r\n return {\r\n success: false,\r\n message: error.response.data.message || 'Email verification failed',\r\n };\r\n }\r\n \r\n // Handle network or other errors\r\n return {\r\n success: false,\r\n message: error.message || 'Network error occurred',\r\n };\r\n }\r\n }\r\n\r\n public async logout(): Promise<void> {\r\n // Disconnect socket first\r\n this.disconnectSocket();\r\n \r\n // Call backend to clear cookie\r\n try {\r\n await this.httpClient.post('/api/v1/auth/logout', {});\r\n } catch (error) {\r\n console.warn('Failed to call logout endpoint:', error);\r\n }\r\n\r\n this.token = null;\r\n this.cachedUser = null;\r\n this.userCacheTimestamp = 0;\r\n this.httpClient.removeAuthToken();\r\n this.httpClient.removeCsrfToken();\r\n this.removeTokenFromStorage();\r\n }\r\n\r\n public async getProfile(forceRefresh = false): Promise<User> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n // Return cached user if valid and not forcing refresh\r\n if (!forceRefresh && this.isCacheValid() && this.cachedUser) {\r\n return this.cachedUser;\r\n }\r\n\r\n const response = await this.httpClient.get<{ user: User }>('/api/v1/user/me');\r\n \r\n // Update cache\r\n this.cachedUser = response.user;\r\n this.userCacheTimestamp = Date.now();\r\n \r\n return response.user;\r\n }\r\n\r\n public async updateProfile(data: UpdateUserData): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/update/profile', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async getAllUsers(): Promise<User[]> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ users: User[] }>('/api/v1/user/all');\r\n return response.users;\r\n }\r\n\r\n public async getUserById(id: string): Promise<User> {\r\n const response = await this.httpClient.get<{ user: User }>(`/api/v1/user/${id}`);\r\n return response.user;\r\n }\r\n\r\n public async forgotPassword(email: string): Promise<AuthResponse> {\r\n // Frontend base URL is now automatically sent via X-Frontend-URL header\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/forgot-password', { email });\r\n return response;\r\n }\r\n\r\n public async resetPassword(token: string, password: string): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/reset-password', { token, password });\r\n return response;\r\n }\r\n\r\n public async changePassword(oldPassword: string, newPassword: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/change-password', { \r\n oldPassword, \r\n newPassword \r\n });\r\n return response;\r\n }\r\n\r\n public async updateAvatar(avatar: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/update/profile', { avatar });\r\n \r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async uploadAndUpdateAvatar(file: File): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n if (!this.upfilesClient) {\r\n throw new Error('Upfiles configuration is required. Please provide upfilesConfig in AuthConfig.');\r\n }\r\n\r\n try {\r\n // Upload file using upfiles SDK\r\n const folderPath = this.config.upfilesConfig?.folderPath || 'avatars/';\r\n const uploadResult = await this.upfilesClient.upload(file, {\r\n folderPath,\r\n fetchThumbnails: true,\r\n });\r\n\r\n // Update user avatar with the uploaded file URL\r\n const response = await this.updateAvatar(uploadResult.publicUrl);\r\n \r\n return response;\r\n } catch (error: any) {\r\n throw new Error(`Failed to upload avatar: ${error.message || 'Unknown error'}`);\r\n }\r\n }\r\n\r\n public getUpfilesClient(): UpfilesClient | null {\r\n return this.upfilesClient;\r\n }\r\n\r\n public async requestEmailChange(newEmail: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/request-email-change', { \r\n newEmail \r\n });\r\n return response;\r\n }\r\n\r\n public async verifyEmailChange(token: string): Promise<AuthResponse> {\r\n const response = await this.httpClient.get<AuthResponse>(`/api/v1/user/verify-email-change?token=${token}`);\r\n \r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n // 2FA / MFA Methods\r\n public async generate2FA(): Promise<{ success: boolean; qrCode?: string; secret?: string; message: string }> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<{ success: boolean; qrCode?: string; secret?: string; message: string }>(\r\n '/api/v1/mfa/generate', \r\n {}\r\n );\r\n return response;\r\n }\r\n\r\n public async enable2FA(token: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/mfa/enable', { token });\r\n return response;\r\n }\r\n\r\n public async disable2FA(token: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/mfa/disable', { token });\r\n return response;\r\n }\r\n\r\n public async validate2FA(token: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/mfa/validate', { token });\r\n return response;\r\n }\r\n\r\n // Session Management Methods\r\n public async getSessions(): Promise<{ success: boolean; sessions: any[] }> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ success: boolean; sessions: any[] }>('/api/v1/sessions');\r\n return response;\r\n }\r\n\r\n public async revokeSession(sessionId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.delete<AuthResponse>(`/api/v1/sessions/${sessionId}`);\r\n return response;\r\n }\r\n\r\n public async revokeAllSessions(): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.delete<AuthResponse>('/api/v1/sessions/revoke/all');\r\n \r\n // After revoking all sessions, current session is also revoked\r\n this.token = null;\r\n this.httpClient.removeAuthToken();\r\n this.removeTokenFromStorage();\r\n \r\n return response;\r\n }\r\n\r\n // Admin Methods\r\n public async getAuditLogs(filters?: any): Promise<{ success: boolean; logs: any[] }> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ success: boolean; logs: any[] }>(\r\n '/api/v1/admin/audit-logs',\r\n filters\r\n );\r\n return response;\r\n }\r\n\r\n public async adminCreateUser(data: { \r\n email: string; \r\n name: string; \r\n phoneNumber?: string;\r\n password?: string;\r\n }): Promise<AuthResponse & { user?: User }> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse & { user?: User }>(\r\n '/api/v1/admin/create-user', \r\n data\r\n );\r\n return response;\r\n }\r\n\r\n public async adminVerifyUser(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/verify-user/${userId}`, {});\r\n return response;\r\n }\r\n\r\n public async adminForcePasswordReset(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/force-password-reset/${userId}`, {});\r\n return response;\r\n }\r\n\r\n public async adminSuspendUser(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/suspend-user/${userId}`, {});\r\n return response;\r\n }\r\n\r\n public async adminActivateUser(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/activate-user/${userId}`, {});\r\n return response;\r\n }\r\n}","import { AuthService } from '../core/auth-service';\r\nimport { \r\n AuthResponse, \r\n LoginData, \r\n VerifyData, \r\n UpdateUserData, \r\n User,\r\n AuthConfig,\r\n RegisterData\r\n} from '../types';\r\n\r\nexport class AuthClient extends AuthService {\r\n constructor(config: AuthConfig) {\r\n super(config);\r\n }\r\n\r\n // Override methods that require browser-specific features\r\n // For Node.js, token persistence must be handled manually\r\n \r\n public async register(data: RegisterData): Promise<AuthResponse> {\r\n // For Node.js server-side usage, set frontend base URL from environment\r\n const frontendBaseUrl = \r\n process.env.FRONTEND_BASE_URL || \r\n process.env.NEXT_PUBLIC_FRONTEND_BASE_URL ||\r\n process.env.REACT_APP_FRONTEND_BASE_URL;\r\n \r\n if (frontendBaseUrl) {\r\n this['httpClient'].setFrontendBaseUrl(frontendBaseUrl);\r\n }\r\n \r\n // Frontend base URL is now automatically sent via X-Frontend-URL header\r\n const response = await this['httpClient'].post<AuthResponse>('/api/v1/auth/register', data);\r\n \r\n if (response.success && response.message === 'Registration data saved. Verification email sent. Please check your inbox.') {\r\n return response;\r\n }\r\n \r\n throw new Error(response.message || 'Registration failed');\r\n }\r\n\r\n public async login(data: LoginData): Promise<AuthResponse> {\r\n const response = await this['httpClient'].post<AuthResponse>('/api/v1/auth/login', data);\r\n \r\n // Handle successful login with token\r\n if (response.success && response.token) {\r\n this['token'] = response.token;\r\n this['httpClient'].setAuthToken(response.token);\r\n // Note: In Node.js, you need to handle token persistence manually\r\n return response;\r\n }\r\n \r\n // Handle OTP sent response\r\n if (response.success && response.message === 'OTP sent to your email.') {\r\n return response;\r\n }\r\n \r\n // Handle verification response\r\n if (response.success && response.message === 'OTP verified successfully.' && response.token) {\r\n this['token'] = response.token;\r\n this['httpClient'].setAuthToken(response.token);\r\n // Note: In Node.js, you need to handle token persistence manually\r\n return response;\r\n }\r\n \r\n throw new Error(response.message || 'Login failed');\r\n }\r\n\r\n public async verify(data: VerifyData): Promise<AuthResponse> {\r\n const response = await this['httpClient'].post<AuthResponse>('/api/v1/auth/verify', data);\r\n \r\n if (response.success && response.token) {\r\n this['token'] = response.token;\r\n this['httpClient'].setAuthToken(response.token);\r\n // Note: In Node.js, you need to handle token persistence manually\r\n }\r\n \r\n return response;\r\n }\r\n\r\n public async logout(): Promise<void> {\r\n this['token'] = null;\r\n this['httpClient'].removeAuthToken();\r\n // Note: In Node.js, you need to handle token removal manually\r\n }\r\n\r\n public async getProfile(): Promise<User> {\r\n if (!this['token']) {\r\n throw new Error('Not authenticated');\r\n }\r\n \r\n const response = await this['httpClient'].get<{ user: User }>('/api/v1/user/me');\r\n return response.user;\r\n }\r\n\r\n public async getUserById(id: string): Promise<User> {\r\n const response = await this['httpClient'].get<{ user: User }>(`/api/v1/user/${id}`);\r\n return response.user;\r\n }\r\n\r\n public async updateProfile(data: UpdateUserData): Promise<AuthResponse> {\r\n if (!this['token']) {\r\n throw new Error('Not authenticated');\r\n }\r\n \r\n const response = await this['httpClient'].post<AuthResponse>('/api/v1/user/update/name', data);\r\n \r\n if (response.success && response.token) {\r\n this['token'] = response.token;\r\n this['httpClient'].setAuthToken(response.token);\r\n // Note: In Node.js, you need to handle token persistence manually\r\n }\r\n \r\n return response;\r\n }\r\n\r\n public async getAllUsers(): Promise<User[]> {\r\n if (!this['token']) {\r\n throw new Error('Not authenticated');\r\n }\r\n \r\n const response = await this['httpClient'].get<{ users: User[] }>('/api/v1/user/all');\r\n return response.users;\r\n }\r\n}","/**\n * Server-side token verification utility\n * \n * Use this in backend middleware to verify JWT tokens and get user data\n * with built-in caching to reduce auth service calls.\n */\n\nimport { User } from '../types';\n\ninterface TokenVerifierConfig {\n authServiceUrl: string;\n cacheTTL?: number; // Cache TTL in milliseconds (default: 60000 = 1 minute)\n cacheEnabled?: boolean; // Enable/disable caching (default: true)\n}\n\ninterface CacheEntry {\n user: User;\n expiresAt: number;\n}\n\nexport class TokenVerifier {\n private config: Required<TokenVerifierConfig>;\n private cache: Map<string, CacheEntry> = new Map();\n private cleanupInterval: NodeJS.Timeout | null = null;\n\n constructor(config: TokenVerifierConfig) {\n this.config = {\n cacheTTL: 60000, // 1 minute default\n cacheEnabled: true,\n ...config,\n };\n\n // Start cache cleanup interval\n if (this.config.cacheEnabled) {\n this.startCleanup();\n }\n }\n\n /**\n * Verify a JWT token and get user data\n * Returns cached user if available and valid\n */\n async verifyToken(token: string): Promise<User | null> {\n if (!token) {\n return null;\n }\n\n // Check cache first\n if (this.config.cacheEnabled) {\n const cached = this.getFromCache(token);\n if (cached) {\n return cached;\n }\n }\n\n // Fetch from auth service\n try {\n const response = await fetch(`${this.config.authServiceUrl}/api/v1/user/me`, {\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n // Remove from cache if token is invalid\n this.cache.delete(token);\n return null;\n }\n\n const data = await response.json() as { user?: User };\n const user = data.user || null;\n\n // Cache the result\n if (user && this.config.cacheEnabled) {\n this.setCache(token, user);\n }\n\n return user;\n } catch (error) {\n console.error('[TokenVerifier] Auth service verification failed:', error);\n return null;\n }\n }\n\n /**\n * Invalidate cache for a specific token\n */\n invalidateToken(token: string): void {\n this.cache.delete(token);\n }\n\n /**\n * Clear all cached tokens\n */\n clearCache(): void {\n this.cache.clear();\n }\n\n /**\n * Get cache statistics\n */\n getCacheStats(): { size: number; enabled: boolean; ttl: number } {\n return {\n size: this.cache.size,\n enabled: this.config.cacheEnabled,\n ttl: this.config.cacheTTL,\n };\n }\n\n /**\n * Stop the cleanup interval (call when shutting down)\n */\n destroy(): void {\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval);\n this.cleanupInterval = null;\n }\n this.cache.clear();\n }\n\n private getFromCache(token: string): User | null {\n const entry = this.cache.get(token);\n if (!entry) {\n return null;\n }\n\n if (Date.now() > entry.expiresAt) {\n this.cache.delete(token);\n return null;\n }\n\n return entry.user;\n }\n\n private setCache(token: string, user: User): void {\n this.cache.set(token, {\n user,\n expiresAt: Date.now() + this.config.cacheTTL,\n });\n }\n\n private startCleanup(): void {\n // Clean up expired entries every minute\n this.cleanupInterval = setInterval(() => {\n const now = Date.now();\n for (const [token, entry] of this.cache.entries()) {\n if (now > entry.expiresAt) {\n this.cache.delete(token);\n }\n }\n }, 60000) as unknown as NodeJS.Timeout;\n\n // Don't prevent process from exiting\n if (this.cleanupInterval && this.cleanupInterval.unref) {\n this.cleanupInterval.unref();\n }\n }\n}\n\n// Singleton instance for convenience\nlet defaultVerifier: TokenVerifier | null = null;\n\n/**\n * Create or get the default TokenVerifier instance\n */\nexport function createTokenVerifier(config: TokenVerifierConfig): TokenVerifier {\n defaultVerifier = new TokenVerifier(config);\n return defaultVerifier;\n}\n\n/**\n * Get the default TokenVerifier instance\n * Throws if not initialized\n */\nexport function getTokenVerifier(): TokenVerifier {\n if (!defaultVerifier) {\n throw new Error('TokenVerifier not initialized. Call createTokenVerifier() first.');\n }\n return defaultVerifier;\n}\n\n/**\n * Verify a token using the default verifier\n * Convenience function for simple usage\n */\nexport async function verifyToken(token: string): Promise<User | null> {\n return getTokenVerifier().verifyToken(token);\n}\n","import { AuthClient } from '../node/auth-client';\r\nimport { AuthConfig, User, RegisterData } from '../types';\r\n\r\n// Server-side authentication utility for Next.js\r\nexport class NextServerAuth extends AuthClient {\r\n constructor(config: AuthConfig) {\r\n super(config);\r\n }\r\n\r\n // Parse token from request headers\r\n public static parseTokenFromHeaders(headers: Headers): string | null {\r\n const authHeader = headers.get('authorization');\r\n if (!authHeader || !authHeader.startsWith('Bearer ')) {\r\n return null;\r\n }\r\n return authHeader.substring(7); // Remove 'Bearer ' prefix\r\n }\r\n\r\n // Parse token from cookies\r\n public static parseTokenFromCookies(cookies: string): string | null {\r\n const cookieArray = cookies.split(';');\r\n for (const cookie of cookieArray) {\r\n const [name, value] = cookie.trim().split('=');\r\n if (name === 'auth_token') {\r\n return decodeURIComponent(value);\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n // Parse token from Next.js request object\r\n public static parseTokenFromRequest(req: any): string | null {\r\n // Try to get token from headers first\r\n if (req.headers) {\r\n const authHeader = req.headers.authorization || req.headers.Authorization;\r\n if (authHeader && authHeader.startsWith('Bearer ')) {\r\n return authHeader.substring(7);\r\n }\r\n }\r\n\r\n // Try to get token from cookies\r\n if (req.cookies) {\r\n return req.cookies.auth_token || null;\r\n }\r\n\r\n // Try to get token from cookie header\r\n if (req.headers && req.headers.cookie) {\r\n return this.parseTokenFromCookies(req.headers.cookie);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n // Verify token and get user\r\n public async verifyToken(token: string): Promise<User | null> {\r\n try {\r\n // Set the token for this request\r\n (this as any)['httpClient'].setAuthToken(token);\r\n \r\n // Get user profile to verify token\r\n const user = await this.getProfile();\r\n return user;\r\n } catch (error) {\r\n console.error('Token verification failed:', error);\r\n return null;\r\n }\r\n }\r\n\r\n // Create authenticated client with token\r\n public static createAuthenticatedClient(config: AuthConfig, token: string): NextServerAuth {\r\n const client = new NextServerAuth(config);\r\n (client as any)['httpClient'].setAuthToken(token);\r\n (client as any)['token'] = token;\r\n return client;\r\n }\r\n}","import { cookies } from 'next/headers';\r\nimport { redirect } from 'next/navigation';\r\nimport { User } from '../types';\r\n\r\ninterface AuthServerConfig {\r\n authApiUrl?: string;\r\n tokenCookieName?: string;\r\n}\r\n\r\nexport class AuthServer {\r\n private config: AuthServerConfig;\r\n\r\n constructor(config?: AuthServerConfig) {\r\n this.config = {\r\n authApiUrl: config?.authApiUrl || process.env.AUTH_API_URL || 'http://localhost:7000',\r\n tokenCookieName: config?.tokenCookieName || 'auth_token',\r\n };\r\n }\r\n\r\n async getToken(): Promise<string | null> {\r\n const cookieStore = await cookies();\r\n const token = cookieStore.get(this.config.tokenCookieName!);\r\n return token?.value || null;\r\n }\r\n\r\n async getCurrentUser(): Promise<User | null> {\r\n const token = await this.getToken();\r\n if (!token) return null;\r\n\r\n try {\r\n const payload = JSON.parse(Buffer.from(token.split('.')[1], 'base64').toString());\r\n return payload.user || null;\r\n } catch (error) {\r\n console.error('Failed to parse user from token:', error);\r\n return null;\r\n }\r\n }\r\n\r\n async isAuthenticated(): Promise<boolean> {\r\n const token = await this.getToken();\r\n return !!token;\r\n }\r\n\r\n async requireAuth(redirectTo?: string): Promise<User> {\r\n const user = await this.getCurrentUser();\r\n if (!user) {\r\n const loginPath = redirectTo || \r\n process.env.NEXT_PUBLIC_AUTH_REDIRECT_TO_LOGIN || \r\n '/auth/login';\r\n redirect(loginPath);\r\n throw new Error('Redirecting to login'); // This line never executes but satisfies TypeScript\r\n }\r\n return user;\r\n }\r\n\r\n async redirectIfAuthenticated(redirectTo?: string): Promise<void> {\r\n const isAuth = await this.isAuthenticated();\r\n if (isAuth) {\r\n const dashboardPath = redirectTo || \r\n process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_LOGIN || \r\n '/dashboard';\r\n redirect(dashboardPath);\r\n }\r\n }\r\n\r\n async getProfile(): Promise<User | null> {\r\n const token = await this.getToken();\r\n if (!token) return null;\r\n\r\n try {\r\n const response = await fetch(`${this.config.authApiUrl}/api/v1/user/me`, {\r\n headers: {\r\n 'Authorization': `Bearer ${token}`,\r\n },\r\n });\r\n\r\n if (!response.ok) {\r\n return null;\r\n }\r\n\r\n const data = await response.json();\r\n return data.user;\r\n } catch (error) {\r\n console.error('Failed to fetch profile:', error);\r\n return null;\r\n }\r\n }\r\n}\r\n\r\n// Singleton instance\r\nlet authServerInstance: AuthServer | null = null;\r\n\r\nexport function getAuthServer(config?: AuthServerConfig): AuthServer {\r\n if (!authServerInstance) {\r\n authServerInstance = new AuthServer(config);\r\n }\r\n return authServerInstance;\r\n}\r\n\r\n// Convenience functions\r\nexport async function currentUser(): Promise<User | null> {\r\n const auth = getAuthServer();\r\n return auth.getCurrentUser();\r\n}\r\n\r\nexport async function auth() {\r\n const authServer = getAuthServer();\r\n const user = await authServer.getCurrentUser();\r\n const token = await authServer.getToken();\r\n \r\n return {\r\n user,\r\n userId: user?._id || null,\r\n isAuthenticated: !!user,\r\n token,\r\n };\r\n}\r\n\r\nexport async function requireAuth(redirectTo?: string): Promise<User> {\r\n const authServer = getAuthServer();\r\n return authServer.requireAuth(redirectTo);\r\n}\r\n\r\nexport async function redirectIfAuthenticated(redirectTo?: string): Promise<void> {\r\n const authServer = getAuthServer();\r\n return authServer.redirectIfAuthenticated(redirectTo);\r\n}\r\n","// Type definitions for Next.js middleware\r\ninterface NextRequestLike {\r\n nextUrl: URL;\r\n url: string;\r\n cookies: {\r\n get(name: string): { value: string } | undefined;\r\n };\r\n}\r\n\r\ninterface NextResponseLike {\r\n redirect(url: URL): NextResponseLike;\r\n next(): NextResponseLike;\r\n}\r\n\r\n// Dynamic import to avoid type issues at build time\r\nconst getNextResponse = () => {\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n const { NextResponse } = require('next/server');\r\n return NextResponse as {\r\n redirect(url: URL): NextResponseLike;\r\n next(): NextResponseLike;\r\n };\r\n};\r\n\r\ninterface AuthMiddlewareConfig {\r\n publicRoutes?: string[];\r\n protectedRoutes?: string[];\r\n loginUrl?: string;\r\n afterLoginUrl?: string;\r\n tokenCookieName?: string;\r\n}\r\n\r\nexport function authMiddleware(config?: AuthMiddlewareConfig) {\r\n const {\r\n publicRoutes = ['/auth/login', '/auth/register', '/auth/verify-email', '/auth/forgot-password', '/auth/reset-password'],\r\n protectedRoutes = ['/dashboard'],\r\n loginUrl = '/auth/login',\r\n afterLoginUrl = '/dashboard',\r\n tokenCookieName = 'auth_token',\r\n } = config || {};\r\n\r\n return function middleware(request: NextRequestLike) {\r\n const NextResponse = getNextResponse();\r\n const { pathname } = request.nextUrl;\r\n const token = request.cookies.get(tokenCookieName)?.value;\r\n const isAuthenticated = !!token;\r\n\r\n // Check if current path is public\r\n const isPublicRoute = publicRoutes.some(route => {\r\n if (route.endsWith('*')) {\r\n return pathname.startsWith(route.slice(0, -1));\r\n }\r\n return pathname === route || pathname.startsWith(route + '/');\r\n });\r\n\r\n // Check if current path is protected\r\n const isProtectedRoute = protectedRoutes.some(route => {\r\n if (route.endsWith('*')) {\r\n return pathname.startsWith(route.slice(0, -1));\r\n }\r\n return pathname === route || pathname.startsWith(route + '/');\r\n });\r\n\r\n // Redirect authenticated users away from public routes\r\n if (isAuthenticated && isPublicRoute) {\r\n return NextResponse.redirect(new URL(afterLoginUrl, request.url));\r\n }\r\n\r\n // Redirect unauthenticated users away from protected routes\r\n if (!isAuthenticated && isProtectedRoute) {\r\n const loginUrlWithRedirect = new URL(loginUrl, request.url);\r\n loginUrlWithRedirect.searchParams.set('redirect', pathname);\r\n return NextResponse.redirect(loginUrlWithRedirect);\r\n }\r\n\r\n return NextResponse.next();\r\n };\r\n}\r\n\r\n// Helper to create middleware config\r\nexport function createAuthMiddleware(config?: AuthMiddlewareConfig) {\r\n return authMiddleware(config);\r\n}\r\n"]}
|
|
@@ -339,6 +339,7 @@ var AuthService = class {
|
|
|
339
339
|
if (token) {
|
|
340
340
|
this.token = token;
|
|
341
341
|
this.httpClient.setAuthToken(token);
|
|
342
|
+
this.setTokenCookie(token);
|
|
342
343
|
}
|
|
343
344
|
} catch (error) {
|
|
344
345
|
console.warn("Failed to load token from storage:", error);
|
|
@@ -349,15 +350,28 @@ var AuthService = class {
|
|
|
349
350
|
if (typeof window !== "undefined" && this.config.localStorageKey) {
|
|
350
351
|
try {
|
|
351
352
|
localStorage.setItem(this.config.localStorageKey, token);
|
|
353
|
+
this.setTokenCookie(token);
|
|
352
354
|
} catch (error) {
|
|
353
355
|
console.warn("Failed to save token to storage:", error);
|
|
354
356
|
}
|
|
355
357
|
}
|
|
356
358
|
}
|
|
359
|
+
setTokenCookie(token) {
|
|
360
|
+
if (typeof window !== "undefined") {
|
|
361
|
+
const maxAge = 7 * 24 * 60 * 60;
|
|
362
|
+
document.cookie = `auth_token=${token}; path=/; max-age=${maxAge}; SameSite=Lax`;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
removeTokenCookie() {
|
|
366
|
+
if (typeof window !== "undefined") {
|
|
367
|
+
document.cookie = "auth_token=; path=/; max-age=0; SameSite=Lax";
|
|
368
|
+
}
|
|
369
|
+
}
|
|
357
370
|
removeTokenFromStorage() {
|
|
358
371
|
if (typeof window !== "undefined" && this.config.localStorageKey) {
|
|
359
372
|
try {
|
|
360
373
|
localStorage.removeItem(this.config.localStorageKey);
|
|
374
|
+
this.removeTokenCookie();
|
|
361
375
|
} catch (error) {
|
|
362
376
|
console.warn("Failed to remove token from storage:", error);
|
|
363
377
|
}
|