@thetechfossil/auth2 1.2.18 → 1.2.20

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.
Files changed (38) hide show
  1. package/README.md +1 -1
  2. package/dist/index.components.d.mts +1 -0
  3. package/dist/index.components.d.ts +1 -0
  4. package/dist/index.components.js +204 -39
  5. package/dist/index.components.js.map +1 -1
  6. package/dist/index.components.mjs +204 -39
  7. package/dist/index.components.mjs.map +1 -1
  8. package/dist/index.d.mts +110 -3
  9. package/dist/index.d.ts +110 -3
  10. package/dist/index.js +399 -58
  11. package/dist/index.js.map +1 -1
  12. package/dist/index.mjs +400 -60
  13. package/dist/index.mjs.map +1 -1
  14. package/dist/index.next.d.mts +53 -1
  15. package/dist/index.next.d.ts +53 -1
  16. package/dist/index.next.js +261 -54
  17. package/dist/index.next.js.map +1 -1
  18. package/dist/index.next.mjs +261 -54
  19. package/dist/index.next.mjs.map +1 -1
  20. package/dist/index.next.server.d.mts +80 -2
  21. package/dist/index.next.server.d.ts +80 -2
  22. package/dist/index.next.server.js +335 -1
  23. package/dist/index.next.server.js.map +1 -1
  24. package/dist/index.next.server.mjs +332 -2
  25. package/dist/index.next.server.mjs.map +1 -1
  26. package/dist/index.node.d.mts +80 -2
  27. package/dist/index.node.d.ts +80 -2
  28. package/dist/index.node.js +335 -1
  29. package/dist/index.node.js.map +1 -1
  30. package/dist/index.node.mjs +332 -2
  31. package/dist/index.node.mjs.map +1 -1
  32. package/dist/index.react-native.d.mts +227 -0
  33. package/dist/index.react-native.d.ts +227 -0
  34. package/dist/index.react-native.js +1684 -0
  35. package/dist/index.react-native.js.map +1 -0
  36. package/dist/index.react-native.mjs +1648 -0
  37. package/dist/index.react-native.mjs.map +1 -0
  38. package/package.json +119 -102
@@ -14,6 +14,8 @@ interface User {
14
14
  phoneNumber?: string;
15
15
  avatar?: string;
16
16
  role: string;
17
+ emailVerified?: boolean;
18
+ twoFactorEnabled?: boolean;
17
19
  linkedAccounts?: LinkedAccount[];
18
20
  createdAt: string;
19
21
  updatedAt: string;
@@ -63,6 +65,7 @@ interface AuthConfig {
63
65
  localStorageKey?: string;
64
66
  token?: string;
65
67
  csrfEnabled?: boolean;
68
+ enableSocket?: boolean;
66
69
  upfilesConfig?: UpfilesConfig;
67
70
  }
68
71
  interface UpfilesConfig {
@@ -130,17 +133,57 @@ interface UseAuthReturn {
130
133
  }>;
131
134
  revokeSession: (sessionId: string) => Promise<AuthResponse>;
132
135
  revokeAllSessions: () => Promise<AuthResponse>;
136
+ adminCreateUser: (data: {
137
+ email: string;
138
+ name: string;
139
+ phoneNumber?: string;
140
+ password?: string;
141
+ }) => Promise<AuthResponse & {
142
+ user?: User;
143
+ }>;
144
+ adminVerifyUser: (userId: string) => Promise<AuthResponse>;
145
+ adminSuspendUser: (userId: string) => Promise<AuthResponse>;
146
+ adminActivateUser: (userId: string) => Promise<AuthResponse>;
133
147
  }
134
148
 
149
+ type SocketEventHandler<T = any> = (data: T) => void;
150
+
135
151
  declare class AuthService {
136
152
  private httpClient;
153
+ private socketService;
137
154
  private config;
138
155
  private token;
139
156
  private upfilesClient;
157
+ private cachedUser;
158
+ private userCacheTimestamp;
159
+ private readonly USER_CACHE_TTL;
140
160
  constructor(config: AuthConfig);
141
161
  private loadTokenFromStorage;
142
162
  private saveTokenToStorage;
143
163
  private removeTokenFromStorage;
164
+ private connectSocket;
165
+ private disconnectSocket;
166
+ onUserUpdated(handler: SocketEventHandler<{
167
+ user: User;
168
+ }>): () => void;
169
+ onSessionRevoked(handler: SocketEventHandler<{
170
+ sessionId?: string;
171
+ }>): () => void;
172
+ onAllSessionsRevoked(handler: SocketEventHandler<{}>): () => void;
173
+ onPasswordChanged(handler: SocketEventHandler<{}>): () => void;
174
+ on2FAChanged(handler: SocketEventHandler<{
175
+ enabled: boolean;
176
+ }>): () => void;
177
+ onSocketConnected(handler: SocketEventHandler<{}>): () => void;
178
+ onSocketDisconnected(handler: SocketEventHandler<{
179
+ reason: string;
180
+ }>): () => void;
181
+ onSocketError(handler: SocketEventHandler<{
182
+ error: string;
183
+ }>): () => void;
184
+ isSocketConnected(): boolean;
185
+ clearUserCache(): void;
186
+ private isCacheValid;
144
187
  isAuthenticated(): boolean;
145
188
  getToken(): string | null;
146
189
  getCurrentUser(): User | null;
@@ -154,7 +197,7 @@ declare class AuthService {
154
197
  verify(data: VerifyData): Promise<AuthResponse>;
155
198
  verifyEmailToken(token: string): Promise<AuthResponse>;
156
199
  logout(): Promise<void>;
157
- getProfile(): Promise<User>;
200
+ getProfile(forceRefresh?: boolean): Promise<User>;
158
201
  updateProfile(data: UpdateUserData): Promise<AuthResponse>;
159
202
  getAllUsers(): Promise<User[]>;
160
203
  getUserById(id: string): Promise<User>;
@@ -185,6 +228,14 @@ declare class AuthService {
185
228
  success: boolean;
186
229
  logs: any[];
187
230
  }>;
231
+ adminCreateUser(data: {
232
+ email: string;
233
+ name: string;
234
+ phoneNumber?: string;
235
+ password?: string;
236
+ }): Promise<AuthResponse & {
237
+ user?: User;
238
+ }>;
188
239
  adminVerifyUser(userId: string): Promise<AuthResponse>;
189
240
  adminForcePasswordReset(userId: string): Promise<AuthResponse>;
190
241
  adminSuspendUser(userId: string): Promise<AuthResponse>;
@@ -224,6 +275,33 @@ declare class AuthClient extends AuthService {
224
275
  getAllUsers(): Promise<User[]>;
225
276
  }
226
277
 
278
+ interface TokenVerifierConfig {
279
+ authServiceUrl: string;
280
+ cacheTTL?: number;
281
+ cacheEnabled?: boolean;
282
+ }
283
+ declare class TokenVerifier {
284
+ private config;
285
+ private cache;
286
+ private cleanupInterval;
287
+ constructor(config: TokenVerifierConfig);
288
+ verifyToken(token: string): Promise<User | null>;
289
+ invalidateToken(token: string): void;
290
+ clearCache(): void;
291
+ getCacheStats(): {
292
+ size: number;
293
+ enabled: boolean;
294
+ ttl: number;
295
+ };
296
+ destroy(): void;
297
+ private getFromCache;
298
+ private setCache;
299
+ private startCleanup;
300
+ }
301
+ declare function createTokenVerifier(config: TokenVerifierConfig): TokenVerifier;
302
+ declare function getTokenVerifier(): TokenVerifier;
303
+ declare function verifyToken(token: string): Promise<User | null>;
304
+
227
305
  declare class NextServerAuth extends AuthClient {
228
306
  constructor(config: AuthConfig);
229
307
  static parseTokenFromHeaders(headers: Headers): string | null;
@@ -281,4 +359,4 @@ interface AuthMiddlewareConfig {
281
359
  declare function authMiddleware(config?: AuthMiddlewareConfig): (request: NextRequestLike) => NextResponseLike;
282
360
  declare function createAuthMiddleware(config?: AuthMiddlewareConfig): (request: NextRequestLike) => NextResponseLike;
283
361
 
284
- export { type AuditLog, AuthClient, type AuthConfig, type AuthResponse, AuthServer, AuthService, type CsrfTokenResponse, HttpClient, type LinkedAccount, type LoginData, type MFASetup, NextServerAuth, type OAuthConfig, type OAuthProvider, type RegisterData, type Session, type UpdateUserData, type UpfilesConfig, type UseAuthReturn, type User, type VerifyData, auth, authMiddleware, createAuthMiddleware, currentUser, getAuthServer, redirectIfAuthenticated, requireAuth };
362
+ export { type AuditLog, AuthClient, type AuthConfig, type AuthResponse, AuthServer, AuthService, type CsrfTokenResponse, HttpClient, type LinkedAccount, type LoginData, type MFASetup, NextServerAuth, type OAuthConfig, type OAuthProvider, type RegisterData, type Session, TokenVerifier, type UpdateUserData, type UpfilesConfig, type UseAuthReturn, type User, type VerifyData, auth, authMiddleware, createAuthMiddleware, createTokenVerifier, currentUser, getAuthServer, getTokenVerifier, redirectIfAuthenticated, requireAuth, verifyToken };
@@ -14,6 +14,8 @@ interface User {
14
14
  phoneNumber?: string;
15
15
  avatar?: string;
16
16
  role: string;
17
+ emailVerified?: boolean;
18
+ twoFactorEnabled?: boolean;
17
19
  linkedAccounts?: LinkedAccount[];
18
20
  createdAt: string;
19
21
  updatedAt: string;
@@ -63,6 +65,7 @@ interface AuthConfig {
63
65
  localStorageKey?: string;
64
66
  token?: string;
65
67
  csrfEnabled?: boolean;
68
+ enableSocket?: boolean;
66
69
  upfilesConfig?: UpfilesConfig;
67
70
  }
68
71
  interface UpfilesConfig {
@@ -130,17 +133,57 @@ interface UseAuthReturn {
130
133
  }>;
131
134
  revokeSession: (sessionId: string) => Promise<AuthResponse>;
132
135
  revokeAllSessions: () => Promise<AuthResponse>;
136
+ adminCreateUser: (data: {
137
+ email: string;
138
+ name: string;
139
+ phoneNumber?: string;
140
+ password?: string;
141
+ }) => Promise<AuthResponse & {
142
+ user?: User;
143
+ }>;
144
+ adminVerifyUser: (userId: string) => Promise<AuthResponse>;
145
+ adminSuspendUser: (userId: string) => Promise<AuthResponse>;
146
+ adminActivateUser: (userId: string) => Promise<AuthResponse>;
133
147
  }
134
148
 
149
+ type SocketEventHandler<T = any> = (data: T) => void;
150
+
135
151
  declare class AuthService {
136
152
  private httpClient;
153
+ private socketService;
137
154
  private config;
138
155
  private token;
139
156
  private upfilesClient;
157
+ private cachedUser;
158
+ private userCacheTimestamp;
159
+ private readonly USER_CACHE_TTL;
140
160
  constructor(config: AuthConfig);
141
161
  private loadTokenFromStorage;
142
162
  private saveTokenToStorage;
143
163
  private removeTokenFromStorage;
164
+ private connectSocket;
165
+ private disconnectSocket;
166
+ onUserUpdated(handler: SocketEventHandler<{
167
+ user: User;
168
+ }>): () => void;
169
+ onSessionRevoked(handler: SocketEventHandler<{
170
+ sessionId?: string;
171
+ }>): () => void;
172
+ onAllSessionsRevoked(handler: SocketEventHandler<{}>): () => void;
173
+ onPasswordChanged(handler: SocketEventHandler<{}>): () => void;
174
+ on2FAChanged(handler: SocketEventHandler<{
175
+ enabled: boolean;
176
+ }>): () => void;
177
+ onSocketConnected(handler: SocketEventHandler<{}>): () => void;
178
+ onSocketDisconnected(handler: SocketEventHandler<{
179
+ reason: string;
180
+ }>): () => void;
181
+ onSocketError(handler: SocketEventHandler<{
182
+ error: string;
183
+ }>): () => void;
184
+ isSocketConnected(): boolean;
185
+ clearUserCache(): void;
186
+ private isCacheValid;
144
187
  isAuthenticated(): boolean;
145
188
  getToken(): string | null;
146
189
  getCurrentUser(): User | null;
@@ -154,7 +197,7 @@ declare class AuthService {
154
197
  verify(data: VerifyData): Promise<AuthResponse>;
155
198
  verifyEmailToken(token: string): Promise<AuthResponse>;
156
199
  logout(): Promise<void>;
157
- getProfile(): Promise<User>;
200
+ getProfile(forceRefresh?: boolean): Promise<User>;
158
201
  updateProfile(data: UpdateUserData): Promise<AuthResponse>;
159
202
  getAllUsers(): Promise<User[]>;
160
203
  getUserById(id: string): Promise<User>;
@@ -185,6 +228,14 @@ declare class AuthService {
185
228
  success: boolean;
186
229
  logs: any[];
187
230
  }>;
231
+ adminCreateUser(data: {
232
+ email: string;
233
+ name: string;
234
+ phoneNumber?: string;
235
+ password?: string;
236
+ }): Promise<AuthResponse & {
237
+ user?: User;
238
+ }>;
188
239
  adminVerifyUser(userId: string): Promise<AuthResponse>;
189
240
  adminForcePasswordReset(userId: string): Promise<AuthResponse>;
190
241
  adminSuspendUser(userId: string): Promise<AuthResponse>;
@@ -224,6 +275,33 @@ declare class AuthClient extends AuthService {
224
275
  getAllUsers(): Promise<User[]>;
225
276
  }
226
277
 
278
+ interface TokenVerifierConfig {
279
+ authServiceUrl: string;
280
+ cacheTTL?: number;
281
+ cacheEnabled?: boolean;
282
+ }
283
+ declare class TokenVerifier {
284
+ private config;
285
+ private cache;
286
+ private cleanupInterval;
287
+ constructor(config: TokenVerifierConfig);
288
+ verifyToken(token: string): Promise<User | null>;
289
+ invalidateToken(token: string): void;
290
+ clearCache(): void;
291
+ getCacheStats(): {
292
+ size: number;
293
+ enabled: boolean;
294
+ ttl: number;
295
+ };
296
+ destroy(): void;
297
+ private getFromCache;
298
+ private setCache;
299
+ private startCleanup;
300
+ }
301
+ declare function createTokenVerifier(config: TokenVerifierConfig): TokenVerifier;
302
+ declare function getTokenVerifier(): TokenVerifier;
303
+ declare function verifyToken(token: string): Promise<User | null>;
304
+
227
305
  declare class NextServerAuth extends AuthClient {
228
306
  constructor(config: AuthConfig);
229
307
  static parseTokenFromHeaders(headers: Headers): string | null;
@@ -281,4 +359,4 @@ interface AuthMiddlewareConfig {
281
359
  declare function authMiddleware(config?: AuthMiddlewareConfig): (request: NextRequestLike) => NextResponseLike;
282
360
  declare function createAuthMiddleware(config?: AuthMiddlewareConfig): (request: NextRequestLike) => NextResponseLike;
283
361
 
284
- export { type AuditLog, AuthClient, type AuthConfig, type AuthResponse, AuthServer, AuthService, type CsrfTokenResponse, HttpClient, type LinkedAccount, type LoginData, type MFASetup, NextServerAuth, type OAuthConfig, type OAuthProvider, type RegisterData, type Session, type UpdateUserData, type UpfilesConfig, type UseAuthReturn, type User, type VerifyData, auth, authMiddleware, createAuthMiddleware, currentUser, getAuthServer, redirectIfAuthenticated, requireAuth };
362
+ export { type AuditLog, AuthClient, type AuthConfig, type AuthResponse, AuthServer, AuthService, type CsrfTokenResponse, HttpClient, type LinkedAccount, type LoginData, type MFASetup, NextServerAuth, type OAuthConfig, type OAuthProvider, type RegisterData, type Session, TokenVerifier, type UpdateUserData, type UpfilesConfig, type UseAuthReturn, type User, type VerifyData, auth, authMiddleware, createAuthMiddleware, createTokenVerifier, currentUser, getAuthServer, getTokenVerifier, redirectIfAuthenticated, requireAuth, verifyToken };
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var axios = require('axios');
4
+ var socket_ioClient = require('socket.io-client');
4
5
  var upfiles = require('@thetechfossil/upfiles');
5
6
  var headers = require('next/headers');
6
7
  var navigation = require('next/navigation');
@@ -126,16 +127,134 @@ var HttpClient = class {
126
127
  }
127
128
  }
128
129
  };
130
+ var SocketService = class {
131
+ constructor(config) {
132
+ this.socket = null;
133
+ this.token = null;
134
+ this.eventHandlers = /* @__PURE__ */ new Map();
135
+ this.isConnecting = false;
136
+ this.config = {
137
+ autoConnect: false,
138
+ reconnection: true,
139
+ reconnectionAttempts: 5,
140
+ reconnectionDelay: 1e3,
141
+ ...config
142
+ };
143
+ }
144
+ connect(token) {
145
+ if (this.socket?.connected || this.isConnecting) {
146
+ return;
147
+ }
148
+ this.token = token;
149
+ this.isConnecting = true;
150
+ this.socket = socket_ioClient.io(this.config.baseUrl, {
151
+ auth: { token },
152
+ autoConnect: true,
153
+ reconnection: this.config.reconnection,
154
+ reconnectionAttempts: this.config.reconnectionAttempts,
155
+ reconnectionDelay: this.config.reconnectionDelay,
156
+ transports: ["websocket", "polling"]
157
+ });
158
+ this.setupEventListeners();
159
+ }
160
+ setupEventListeners() {
161
+ if (!this.socket) return;
162
+ this.socket.on("connect", () => {
163
+ this.isConnecting = false;
164
+ console.log("[Auth SDK] Socket connected");
165
+ this.emit("connected", {});
166
+ });
167
+ this.socket.on("disconnect", (reason) => {
168
+ console.log("[Auth SDK] Socket disconnected:", reason);
169
+ this.emit("disconnected", { reason });
170
+ });
171
+ this.socket.on("connect_error", (error) => {
172
+ this.isConnecting = false;
173
+ console.error("[Auth SDK] Socket connection error:", error.message);
174
+ this.emit("error", { error: error.message });
175
+ });
176
+ this.socket.on("user:updated", (data) => {
177
+ this.emit("user:updated", data);
178
+ });
179
+ this.socket.on("session:revoked", (data) => {
180
+ this.emit("session:revoked", data);
181
+ });
182
+ this.socket.on("session:all-revoked", () => {
183
+ this.emit("session:all-revoked", {});
184
+ });
185
+ this.socket.on("auth:password-changed", () => {
186
+ this.emit("auth:password-changed", {});
187
+ });
188
+ this.socket.on("auth:2fa-changed", (data) => {
189
+ this.emit("auth:2fa-changed", data);
190
+ });
191
+ this.socket.on("user:refresh", () => {
192
+ this.emit("user:refresh", {});
193
+ });
194
+ }
195
+ disconnect() {
196
+ if (this.socket) {
197
+ this.socket.disconnect();
198
+ this.socket = null;
199
+ this.token = null;
200
+ this.isConnecting = false;
201
+ }
202
+ }
203
+ isConnected() {
204
+ return this.socket?.connected ?? false;
205
+ }
206
+ // Event subscription
207
+ on(event, handler) {
208
+ if (!this.eventHandlers.has(event)) {
209
+ this.eventHandlers.set(event, /* @__PURE__ */ new Set());
210
+ }
211
+ this.eventHandlers.get(event).add(handler);
212
+ return () => {
213
+ this.eventHandlers.get(event)?.delete(handler);
214
+ };
215
+ }
216
+ off(event, handler) {
217
+ if (handler) {
218
+ this.eventHandlers.get(event)?.delete(handler);
219
+ } else {
220
+ this.eventHandlers.delete(event);
221
+ }
222
+ }
223
+ emit(event, data) {
224
+ const handlers = this.eventHandlers.get(event);
225
+ if (handlers) {
226
+ handlers.forEach((handler) => {
227
+ try {
228
+ handler(data);
229
+ } catch (error) {
230
+ console.error(`[Auth SDK] Error in event handler for ${event}:`, error);
231
+ }
232
+ });
233
+ }
234
+ }
235
+ // Request fresh user data from server
236
+ requestUserRefresh() {
237
+ if (this.socket?.connected) {
238
+ this.socket.emit("request:user");
239
+ }
240
+ }
241
+ };
129
242
  var AuthService = class {
243
+ // 5 minutes cache
130
244
  constructor(config) {
131
245
  this.token = null;
132
246
  this.upfilesClient = null;
247
+ this.cachedUser = null;
248
+ this.userCacheTimestamp = 0;
249
+ this.USER_CACHE_TTL = 5 * 60 * 1e3;
133
250
  this.config = {
134
251
  localStorageKey: "auth_token",
135
252
  csrfEnabled: true,
253
+ enableSocket: true,
136
254
  ...config
137
255
  };
138
256
  this.httpClient = new HttpClient(this.config.baseUrl);
257
+ this.socketService = new SocketService({ baseUrl: this.config.baseUrl });
139
258
  this.loadTokenFromStorage();
140
259
  if (this.config.upfilesConfig) {
141
260
  this.upfilesClient = new upfiles.UpfilesClient({
@@ -152,6 +271,9 @@ var AuthService = class {
152
271
  this.httpClient.setFrontendBaseUrl(frontendBaseUrl);
153
272
  }
154
273
  }
274
+ if (this.token && this.config.enableSocket !== false) {
275
+ this.connectSocket();
276
+ }
155
277
  }
156
278
  loadTokenFromStorage() {
157
279
  if (typeof window !== "undefined" && this.config.localStorageKey) {
@@ -184,6 +306,57 @@ var AuthService = class {
184
306
  }
185
307
  }
186
308
  }
309
+ // Socket connection management
310
+ connectSocket() {
311
+ if (this.token && this.config.enableSocket !== false && typeof window !== "undefined") {
312
+ this.socketService.connect(this.token);
313
+ }
314
+ }
315
+ disconnectSocket() {
316
+ this.socketService.disconnect();
317
+ }
318
+ // Socket event subscription
319
+ onUserUpdated(handler) {
320
+ return this.socketService.on("user:updated", (data) => {
321
+ if (data.user) {
322
+ this.cachedUser = data.user;
323
+ this.userCacheTimestamp = Date.now();
324
+ }
325
+ handler(data);
326
+ });
327
+ }
328
+ onSessionRevoked(handler) {
329
+ return this.socketService.on("session:revoked", handler);
330
+ }
331
+ onAllSessionsRevoked(handler) {
332
+ return this.socketService.on("session:all-revoked", handler);
333
+ }
334
+ onPasswordChanged(handler) {
335
+ return this.socketService.on("auth:password-changed", handler);
336
+ }
337
+ on2FAChanged(handler) {
338
+ return this.socketService.on("auth:2fa-changed", handler);
339
+ }
340
+ onSocketConnected(handler) {
341
+ return this.socketService.on("connected", handler);
342
+ }
343
+ onSocketDisconnected(handler) {
344
+ return this.socketService.on("disconnected", handler);
345
+ }
346
+ onSocketError(handler) {
347
+ return this.socketService.on("error", handler);
348
+ }
349
+ isSocketConnected() {
350
+ return this.socketService.isConnected();
351
+ }
352
+ // Cache management
353
+ clearUserCache() {
354
+ this.cachedUser = null;
355
+ this.userCacheTimestamp = 0;
356
+ }
357
+ isCacheValid() {
358
+ return this.cachedUser !== null && Date.now() - this.userCacheTimestamp < this.USER_CACHE_TTL;
359
+ }
187
360
  isAuthenticated() {
188
361
  return !!this.token;
189
362
  }
@@ -249,6 +422,11 @@ var AuthService = class {
249
422
  this.token = response.token;
250
423
  this.httpClient.setAuthToken(response.token);
251
424
  this.saveTokenToStorage(response.token);
425
+ if (response.user) {
426
+ this.cachedUser = response.user;
427
+ this.userCacheTimestamp = Date.now();
428
+ }
429
+ this.connectSocket();
252
430
  return response;
253
431
  }
254
432
  if (response.success && (response.message === "OTP sent to your email." || response.message === "OTP sent to your phone number.")) {
@@ -258,6 +436,11 @@ var AuthService = class {
258
436
  this.token = response.token;
259
437
  this.httpClient.setAuthToken(response.token);
260
438
  this.saveTokenToStorage(response.token);
439
+ if (response.user) {
440
+ this.cachedUser = response.user;
441
+ this.userCacheTimestamp = Date.now();
442
+ }
443
+ this.connectSocket();
261
444
  return response;
262
445
  }
263
446
  throw new Error(response.message || "Login failed");
@@ -301,21 +484,29 @@ var AuthService = class {
301
484
  }
302
485
  }
303
486
  async logout() {
487
+ this.disconnectSocket();
304
488
  try {
305
489
  await this.httpClient.post("/api/v1/auth/logout", {});
306
490
  } catch (error) {
307
491
  console.warn("Failed to call logout endpoint:", error);
308
492
  }
309
493
  this.token = null;
494
+ this.cachedUser = null;
495
+ this.userCacheTimestamp = 0;
310
496
  this.httpClient.removeAuthToken();
311
497
  this.httpClient.removeCsrfToken();
312
498
  this.removeTokenFromStorage();
313
499
  }
314
- async getProfile() {
500
+ async getProfile(forceRefresh = false) {
315
501
  if (!this.token) {
316
502
  throw new Error("Not authenticated");
317
503
  }
504
+ if (!forceRefresh && this.isCacheValid() && this.cachedUser) {
505
+ return this.cachedUser;
506
+ }
318
507
  const response = await this.httpClient.get("/api/v1/user/me");
508
+ this.cachedUser = response.user;
509
+ this.userCacheTimestamp = Date.now();
319
510
  return response.user;
320
511
  }
321
512
  async updateProfile(data) {
@@ -479,6 +670,16 @@ var AuthService = class {
479
670
  );
480
671
  return response;
481
672
  }
673
+ async adminCreateUser(data) {
674
+ if (!this.token) {
675
+ throw new Error("Not authenticated");
676
+ }
677
+ const response = await this.httpClient.post(
678
+ "/api/v1/admin/create-user",
679
+ data
680
+ );
681
+ return response;
682
+ }
482
683
  async adminVerifyUser(userId) {
483
684
  if (!this.token) {
484
685
  throw new Error("Not authenticated");
@@ -587,6 +788,135 @@ var AuthClient = class extends AuthService {
587
788
  }
588
789
  };
589
790
 
791
+ // src/node/token-verifier.ts
792
+ var TokenVerifier = class {
793
+ constructor(config) {
794
+ this.cache = /* @__PURE__ */ new Map();
795
+ this.cleanupInterval = null;
796
+ this.config = {
797
+ cacheTTL: 6e4,
798
+ // 1 minute default
799
+ cacheEnabled: true,
800
+ ...config
801
+ };
802
+ if (this.config.cacheEnabled) {
803
+ this.startCleanup();
804
+ }
805
+ }
806
+ /**
807
+ * Verify a JWT token and get user data
808
+ * Returns cached user if available and valid
809
+ */
810
+ async verifyToken(token) {
811
+ if (!token) {
812
+ return null;
813
+ }
814
+ if (this.config.cacheEnabled) {
815
+ const cached = this.getFromCache(token);
816
+ if (cached) {
817
+ return cached;
818
+ }
819
+ }
820
+ try {
821
+ const response = await fetch(`${this.config.authServiceUrl}/api/v1/user/me`, {
822
+ headers: {
823
+ "Authorization": `Bearer ${token}`,
824
+ "Content-Type": "application/json"
825
+ }
826
+ });
827
+ if (!response.ok) {
828
+ this.cache.delete(token);
829
+ return null;
830
+ }
831
+ const data = await response.json();
832
+ const user = data.user || null;
833
+ if (user && this.config.cacheEnabled) {
834
+ this.setCache(token, user);
835
+ }
836
+ return user;
837
+ } catch (error) {
838
+ console.error("[TokenVerifier] Auth service verification failed:", error);
839
+ return null;
840
+ }
841
+ }
842
+ /**
843
+ * Invalidate cache for a specific token
844
+ */
845
+ invalidateToken(token) {
846
+ this.cache.delete(token);
847
+ }
848
+ /**
849
+ * Clear all cached tokens
850
+ */
851
+ clearCache() {
852
+ this.cache.clear();
853
+ }
854
+ /**
855
+ * Get cache statistics
856
+ */
857
+ getCacheStats() {
858
+ return {
859
+ size: this.cache.size,
860
+ enabled: this.config.cacheEnabled,
861
+ ttl: this.config.cacheTTL
862
+ };
863
+ }
864
+ /**
865
+ * Stop the cleanup interval (call when shutting down)
866
+ */
867
+ destroy() {
868
+ if (this.cleanupInterval) {
869
+ clearInterval(this.cleanupInterval);
870
+ this.cleanupInterval = null;
871
+ }
872
+ this.cache.clear();
873
+ }
874
+ getFromCache(token) {
875
+ const entry = this.cache.get(token);
876
+ if (!entry) {
877
+ return null;
878
+ }
879
+ if (Date.now() > entry.expiresAt) {
880
+ this.cache.delete(token);
881
+ return null;
882
+ }
883
+ return entry.user;
884
+ }
885
+ setCache(token, user) {
886
+ this.cache.set(token, {
887
+ user,
888
+ expiresAt: Date.now() + this.config.cacheTTL
889
+ });
890
+ }
891
+ startCleanup() {
892
+ this.cleanupInterval = setInterval(() => {
893
+ const now = Date.now();
894
+ for (const [token, entry] of this.cache.entries()) {
895
+ if (now > entry.expiresAt) {
896
+ this.cache.delete(token);
897
+ }
898
+ }
899
+ }, 6e4);
900
+ if (this.cleanupInterval && this.cleanupInterval.unref) {
901
+ this.cleanupInterval.unref();
902
+ }
903
+ }
904
+ };
905
+ var defaultVerifier = null;
906
+ function createTokenVerifier(config) {
907
+ defaultVerifier = new TokenVerifier(config);
908
+ return defaultVerifier;
909
+ }
910
+ function getTokenVerifier() {
911
+ if (!defaultVerifier) {
912
+ throw new Error("TokenVerifier not initialized. Call createTokenVerifier() first.");
913
+ }
914
+ return defaultVerifier;
915
+ }
916
+ async function verifyToken(token) {
917
+ return getTokenVerifier().verifyToken(token);
918
+ }
919
+
590
920
  // src/nextjs/server-auth.ts
591
921
  var NextServerAuth = class _NextServerAuth extends AuthClient {
592
922
  constructor(config) {
@@ -790,12 +1120,16 @@ exports.AuthServer = AuthServer;
790
1120
  exports.AuthService = AuthService;
791
1121
  exports.HttpClient = HttpClient;
792
1122
  exports.NextServerAuth = NextServerAuth;
1123
+ exports.TokenVerifier = TokenVerifier;
793
1124
  exports.auth = auth;
794
1125
  exports.authMiddleware = authMiddleware;
795
1126
  exports.createAuthMiddleware = createAuthMiddleware;
1127
+ exports.createTokenVerifier = createTokenVerifier;
796
1128
  exports.currentUser = currentUser;
797
1129
  exports.getAuthServer = getAuthServer;
1130
+ exports.getTokenVerifier = getTokenVerifier;
798
1131
  exports.redirectIfAuthenticated = redirectIfAuthenticated;
799
1132
  exports.requireAuth = requireAuth;
1133
+ exports.verifyToken = verifyToken;
800
1134
  //# sourceMappingURL=index.next.server.js.map
801
1135
  //# sourceMappingURL=index.next.server.js.map