@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.
- package/README.md +1 -1
- package/dist/index.components.d.mts +1 -0
- package/dist/index.components.d.ts +1 -0
- package/dist/index.components.js +204 -39
- package/dist/index.components.js.map +1 -1
- package/dist/index.components.mjs +204 -39
- package/dist/index.components.mjs.map +1 -1
- package/dist/index.d.mts +110 -3
- package/dist/index.d.ts +110 -3
- package/dist/index.js +399 -58
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +400 -60
- package/dist/index.mjs.map +1 -1
- package/dist/index.next.d.mts +53 -1
- package/dist/index.next.d.ts +53 -1
- package/dist/index.next.js +261 -54
- package/dist/index.next.js.map +1 -1
- package/dist/index.next.mjs +261 -54
- package/dist/index.next.mjs.map +1 -1
- package/dist/index.next.server.d.mts +80 -2
- package/dist/index.next.server.d.ts +80 -2
- package/dist/index.next.server.js +335 -1
- package/dist/index.next.server.js.map +1 -1
- package/dist/index.next.server.mjs +332 -2
- package/dist/index.next.server.mjs.map +1 -1
- package/dist/index.node.d.mts +80 -2
- package/dist/index.node.d.ts +80 -2
- package/dist/index.node.js +335 -1
- package/dist/index.node.js.map +1 -1
- package/dist/index.node.mjs +332 -2
- package/dist/index.node.mjs.map +1 -1
- package/dist/index.react-native.d.mts +227 -0
- package/dist/index.react-native.d.ts +227 -0
- package/dist/index.react-native.js +1684 -0
- package/dist/index.react-native.js.map +1 -0
- package/dist/index.react-native.mjs +1648 -0
- package/dist/index.react-native.mjs.map +1 -0
- 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
|