@oxy.so/core 4.5.0-oxy-one.1 → 4.6.0
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/cjs/HttpService.js +63 -19
- package/dist/cjs/api/accounts.js +10 -3
- package/dist/cjs/api/agency.js +3 -1
- package/dist/cjs/api/apps.js +15 -4
- package/dist/cjs/api/assets.js +39 -11
- package/dist/cjs/api/auth.js +28 -8
- package/dist/cjs/api/billing.js +24 -7
- package/dist/cjs/api/civic.js +14 -4
- package/dist/cjs/api/follows.js +9 -2
- package/dist/cjs/api/identity.js +31 -9
- package/dist/cjs/api/nodes.js +3 -1
- package/dist/cjs/api/privacy.js +8 -2
- package/dist/cjs/api/session.js +15 -4
- package/dist/cjs/api/store.js +15 -5
- package/dist/cjs/api/topics.js +10 -3
- package/dist/cjs/api/users.js +16 -4
- package/dist/cjs/boot/sessionColdBoot.js +40 -13
- package/dist/cjs/constants/version.js +6 -6
- package/dist/cjs/crypto/identityMarker.js +3 -1
- package/dist/cjs/crypto/identityProof.js +6 -1
- package/dist/cjs/crypto/keyManager.js +87 -32
- package/dist/cjs/crypto/recoveryPhrase.js +2 -2
- package/dist/cjs/crypto/signatureService.js +3 -4
- package/dist/cjs/i18n/index.js +16 -3
- package/dist/cjs/i18n/locales/ar-SA.js +366 -366
- package/dist/cjs/i18n/locales/ca-ES.js +366 -366
- package/dist/cjs/i18n/locales/de-DE.js +366 -366
- package/dist/cjs/i18n/locales/en-US.js +1994 -1994
- package/dist/cjs/i18n/locales/es-ES.js +1994 -1994
- package/dist/cjs/i18n/locales/fr-FR.js +366 -366
- package/dist/cjs/i18n/locales/it-IT.js +366 -366
- package/dist/cjs/i18n/locales/ja-JP.js +366 -366
- package/dist/cjs/i18n/locales/ko-KR.js +366 -366
- package/dist/cjs/i18n/locales/pt-PT.js +366 -366
- package/dist/cjs/i18n/locales/zh-CN.js +366 -366
- package/dist/cjs/inference/OxyInferenceClient.js +12 -18
- package/dist/cjs/models/interfaces.js +11 -11
- package/dist/cjs/server/OxyServer.js +86 -28
- package/dist/cjs/server/agentAccount.js +6 -2
- package/dist/cjs/server/aliaMachineCredential.js +39 -14
- package/dist/cjs/server/auth.js +5 -4
- package/dist/cjs/server/capabilityTicket.js +5 -5
- package/dist/cjs/server/index.js +2 -1
- package/dist/cjs/server/liveCapabilityTicket.js +4 -1
- package/dist/cjs/server/middleware.js +61 -42
- package/dist/cjs/server/namespaces.js +28 -7
- package/dist/cjs/server/requesterAssertion.js +36 -30
- package/dist/cjs/server/serviceTokenLifetime.js +7 -4
- package/dist/cjs/server/traffic.js +53 -14
- package/dist/cjs/server/trafficNodeHttp.js +33 -8
- package/dist/cjs/server/workloadIdentity.client.js +4 -0
- package/dist/cjs/server/workloadIdentity.js +28 -1
- package/dist/cjs/session/SessionClient.js +54 -17
- package/dist/cjs/session/accountDelegationAccess.js +4 -6
- package/dist/cjs/session/accountDialogController.js +1 -1
- package/dist/cjs/session/authStateStore.js +18 -9
- package/dist/cjs/session/identityPin.js +6 -2
- package/dist/cjs/session/refresh.js +81 -23
- package/dist/cjs/session/sharedDeviceCredential.js +28 -15
- package/dist/cjs/shared/utils/errorUtils.js +1 -1
- package/dist/cjs/shared/utils/networkUtils.js +1 -1
- package/dist/cjs/shared/utils/themeUtils.js +1 -1
- package/dist/cjs/utils/accountCacheSweep.js +3 -1
- package/dist/cjs/utils/accountUtils.js +1 -3
- package/dist/cjs/utils/asyncUtils.js +1 -1
- package/dist/cjs/utils/authHelpers.js +2 -1
- package/dist/cjs/utils/avatarUtils.js +4 -2
- package/dist/cjs/utils/cache.js +1 -1
- package/dist/cjs/utils/cacheKey.js +3 -1
- package/dist/cjs/utils/deviceManager.js +4 -4
- package/dist/cjs/utils/errorUtils.js +6 -4
- package/dist/cjs/utils/languageUtils.js +404 -57
- package/dist/cjs/utils/profileLinks.js +1 -3
- package/dist/cjs/utils/requestUtils.js +7 -1
- package/dist/cjs/utils/userIdentity.js +1 -1
- package/dist/cjs/utils/validationUtils.js +5 -6
- package/dist/esm/HttpService.js +64 -20
- package/dist/esm/api/accounts.js +11 -4
- package/dist/esm/api/agency.js +3 -1
- package/dist/esm/api/apps.js +15 -4
- package/dist/esm/api/assets.js +39 -11
- package/dist/esm/api/auth.js +28 -8
- package/dist/esm/api/billing.js +25 -8
- package/dist/esm/api/civic.js +14 -4
- package/dist/esm/api/follows.js +9 -2
- package/dist/esm/api/identity.js +31 -9
- package/dist/esm/api/nodes.js +3 -1
- package/dist/esm/api/privacy.js +8 -2
- package/dist/esm/api/session.js +15 -4
- package/dist/esm/api/store.js +15 -5
- package/dist/esm/api/topics.js +10 -3
- package/dist/esm/api/users.js +16 -4
- package/dist/esm/boot/sessionColdBoot.js +41 -14
- package/dist/esm/constants/version.js +6 -6
- package/dist/esm/crypto/identityMarker.js +3 -1
- package/dist/esm/crypto/identityProof.js +6 -1
- package/dist/esm/crypto/internal.js +1 -1
- package/dist/esm/crypto/keyManager.js +87 -32
- package/dist/esm/crypto/recoveryPhrase.js +2 -2
- package/dist/esm/crypto/signatureService.js +3 -4
- package/dist/esm/i18n/index.js +16 -3
- package/dist/esm/i18n/locales/ar-SA.js +366 -366
- package/dist/esm/i18n/locales/ca-ES.js +366 -366
- package/dist/esm/i18n/locales/de-DE.js +366 -366
- package/dist/esm/i18n/locales/en-US.js +1994 -1994
- package/dist/esm/i18n/locales/es-ES.js +1994 -1994
- package/dist/esm/i18n/locales/fr-FR.js +366 -366
- package/dist/esm/i18n/locales/it-IT.js +366 -366
- package/dist/esm/i18n/locales/ja-JP.js +366 -366
- package/dist/esm/i18n/locales/ko-KR.js +366 -366
- package/dist/esm/i18n/locales/pt-PT.js +366 -366
- package/dist/esm/i18n/locales/zh-CN.js +366 -366
- package/dist/esm/index.js +1 -1
- package/dist/esm/inference/OxyInferenceClient.js +13 -19
- package/dist/esm/models/interfaces.js +11 -11
- package/dist/esm/server/OxyServer.js +87 -29
- package/dist/esm/server/agentAccount.js +6 -2
- package/dist/esm/server/aliaMachineCredential.js +39 -14
- package/dist/esm/server/auth.js +6 -5
- package/dist/esm/server/capabilityTicket.js +6 -6
- package/dist/esm/server/index.js +5 -5
- package/dist/esm/server/liveCapabilityTicket.js +6 -3
- package/dist/esm/server/middleware.js +62 -43
- package/dist/esm/server/namespaces.js +31 -10
- package/dist/esm/server/requesterAssertion.js +36 -30
- package/dist/esm/server/serviceTokenLifetime.js +7 -4
- package/dist/esm/server/traffic.js +55 -16
- package/dist/esm/server/trafficNodeHttp.js +34 -9
- package/dist/esm/server/userInvalidation.js +1 -1
- package/dist/esm/server/workloadIdentity.client.js +3 -0
- package/dist/esm/server/workloadIdentity.js +27 -1
- package/dist/esm/session/SessionClient.js +54 -17
- package/dist/esm/session/accountDelegationAccess.js +5 -7
- package/dist/esm/session/accountDialogController.js +1 -1
- package/dist/esm/session/authStateStore.js +18 -9
- package/dist/esm/session/identityPin.js +6 -2
- package/dist/esm/session/refresh.js +82 -24
- package/dist/esm/session/sharedDeviceCredential.js +28 -15
- package/dist/esm/shared/utils/errorUtils.js +1 -1
- package/dist/esm/shared/utils/networkUtils.js +1 -1
- package/dist/esm/shared/utils/themeUtils.js +1 -1
- package/dist/esm/utils/accountCacheSweep.js +3 -1
- package/dist/esm/utils/accountUtils.js +1 -3
- package/dist/esm/utils/asyncUtils.js +1 -1
- package/dist/esm/utils/authHelpers.js +2 -1
- package/dist/esm/utils/avatarUtils.js +4 -2
- package/dist/esm/utils/cache.js +1 -1
- package/dist/esm/utils/cacheKey.js +3 -1
- package/dist/esm/utils/deviceManager.js +4 -4
- package/dist/esm/utils/errorUtils.js +6 -4
- package/dist/esm/utils/languageUtils.js +404 -57
- package/dist/esm/utils/profileLinks.js +1 -3
- package/dist/esm/utils/requestUtils.js +7 -1
- package/dist/esm/utils/userIdentity.js +1 -1
- package/dist/esm/utils/validationUtils.js +5 -6
- package/dist/types/HttpService.d.ts +1 -1
- package/dist/types/api/accounts.d.ts +16 -3
- package/dist/types/api/apps.d.ts +4 -4
- package/dist/types/crypto/internal.d.ts +1 -1
- package/dist/types/index.d.ts +4 -4
- package/dist/types/models/interfaces.d.ts +9 -1
- package/dist/types/server/index.d.ts +6 -6
- package/dist/types/server/workloadIdentity.client.d.ts +5 -1
- package/dist/types/server/workloadIdentity.d.ts +26 -0
- package/dist/types/session/accountDelegationAccess.d.ts +1 -1
- package/dist/types/session/index.d.ts +1 -1
- package/dist/types/utils/userIdentity.d.ts +1 -1
- package/dist/types/utils/validationUtils.d.ts +4 -5
- package/package.json +3 -4
- package/src/HttpService.ts +183 -53
- package/src/OxyServices.errors.ts +7 -3
- package/src/OxyServices.ts +6 -2
- package/src/api/accounts.ts +96 -28
- package/src/api/agency.ts +24 -9
- package/src/api/appData.ts +12 -2
- package/src/api/apps.ts +81 -31
- package/src/api/assets.ts +113 -43
- package/src/api/auth.ts +145 -77
- package/src/api/billing.ts +112 -65
- package/src/api/civic.ts +61 -19
- package/src/api/contacts.ts +4 -1
- package/src/api/devices.ts +54 -21
- package/src/api/follows.ts +88 -31
- package/src/api/identity.ts +101 -33
- package/src/api/linkedAccounts.ts +26 -8
- package/src/api/nodes.ts +18 -6
- package/src/api/notifications.ts +26 -6
- package/src/api/privacy.ts +42 -8
- package/src/api/reputation.ts +18 -7
- package/src/api/session.ts +23 -5
- package/src/api/store.ts +81 -31
- package/src/api/topics.ts +18 -6
- package/src/api/users.ts +98 -35
- package/src/boot/sessionColdBoot.ts +60 -19
- package/src/civic/payloads.ts +1 -4
- package/src/client/context.ts +6 -1
- package/src/constants/version.ts +7 -6
- package/src/crypto/aead.ts +1 -5
- package/src/crypto/ecdh.ts +1 -4
- package/src/crypto/identityDerivations.ts +5 -1
- package/src/crypto/identityMarker.ts +3 -1
- package/src/crypto/identityProof.ts +6 -1
- package/src/crypto/index.ts +11 -11
- package/src/crypto/internal.ts +6 -1
- package/src/crypto/keyManager.ts +348 -98
- package/src/crypto/recoveryPhrase.ts +14 -9
- package/src/crypto/registrationPow.ts +1 -1
- package/src/crypto/signatureService.ts +14 -6
- package/src/i18n/accountCategoryLabels.ts +1 -4
- package/src/i18n/accountRoleLabels.ts +1 -4
- package/src/i18n/index.ts +25 -7
- package/src/i18n/locales/ar-SA.ts +375 -366
- package/src/i18n/locales/ca-ES.ts +382 -366
- package/src/i18n/locales/de-DE.ts +387 -366
- package/src/i18n/locales/en-US.ts +2034 -1994
- package/src/i18n/locales/es-ES.ts +2043 -1994
- package/src/i18n/locales/fr-FR.ts +387 -366
- package/src/i18n/locales/it-IT.ts +380 -366
- package/src/i18n/locales/ja-JP.ts +380 -366
- package/src/i18n/locales/ko-KR.ts +377 -366
- package/src/i18n/locales/pt-PT.ts +383 -366
- package/src/i18n/locales/zh-CN.ts +373 -366
- package/src/i18n/trustTierLabels.ts +1 -4
- package/src/index.ts +371 -349
- package/src/inference/OxyInferenceClient.ts +784 -780
- package/src/models/interfaces.ts +39 -27
- package/src/server/OxyServer.ts +227 -68
- package/src/server/agentAccount.ts +8 -2
- package/src/server/aliaMachineCredential.ts +57 -16
- package/src/server/auth.ts +9 -5
- package/src/server/capabilityTicket.ts +30 -21
- package/src/server/index.ts +29 -6
- package/src/server/liveCapabilityTicket.ts +31 -9
- package/src/server/middleware.ts +212 -121
- package/src/server/namespaces.ts +247 -94
- package/src/server/rateLimit.ts +2 -4
- package/src/server/requesterAssertion.ts +93 -54
- package/src/server/serviceTokenLifetime.ts +9 -4
- package/src/server/traffic.ts +117 -23
- package/src/server/trafficNodeHttp.ts +61 -14
- package/src/server/userInvalidation.ts +1 -4
- package/src/server/workloadIdentity.client.ts +12 -1
- package/src/server/workloadIdentity.ts +52 -5
- package/src/session/SessionClient.ts +170 -49
- package/src/session/accountDelegationAccess.ts +24 -31
- package/src/session/accountDialogController.ts +59 -14
- package/src/session/accountSwitchTargets.ts +10 -15
- package/src/session/authStateStore.ts +121 -81
- package/src/session/deviceDirectory.ts +1 -3
- package/src/session/identityPin.ts +10 -11
- package/src/session/identitySession.ts +3 -1
- package/src/session/index.ts +87 -82
- package/src/session/refresh.ts +138 -44
- package/src/session/sessionClientHost.ts +1 -3
- package/src/session/sharedDeviceCredential.ts +35 -14
- package/src/session/socketLoader.ts +9 -2
- package/src/shared/utils/errorUtils.ts +5 -2
- package/src/shared/utils/networkUtils.ts +5 -8
- package/src/shared/utils/themeUtils.ts +2 -6
- package/src/types/buffer.d.ts +66 -21
- package/src/types/expo-secure-store.d.ts +5 -1
- package/src/utils/accountCacheSweep.ts +4 -5
- package/src/utils/accountUtils.ts +107 -108
- package/src/utils/apiUtils.ts +3 -3
- package/src/utils/asyncUtils.ts +2 -2
- package/src/utils/authHelpers.ts +10 -5
- package/src/utils/avatarUtils.ts +11 -6
- package/src/utils/cache.ts +9 -10
- package/src/utils/cacheKey.ts +5 -1
- package/src/utils/coldBoot.ts +1 -3
- package/src/utils/commonsDelivery.ts +1 -4
- package/src/utils/deviceManager.ts +15 -14
- package/src/utils/errorUtils.ts +68 -86
- package/src/utils/languageUtils.ts +407 -58
- package/src/utils/oauthPkce.ts +1 -4
- package/src/utils/platform.ts +0 -1
- package/src/utils/profileLinks.ts +2 -5
- package/src/utils/requestUtils.ts +18 -14
- package/src/utils/sessionUtils.ts +34 -33
- package/src/utils/userHandle.ts +3 -1
- package/src/utils/userIdentity.ts +1 -1
- package/src/utils/validationUtils.ts +11 -9
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Session management utilities
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* Provides consistent session normalization, deduplication, and sorting
|
|
5
5
|
* to ensure sessions are always displayed in a predictable order.
|
|
6
6
|
*/
|
|
@@ -10,7 +10,9 @@ import type { ClientSession } from '../models/session';
|
|
|
10
10
|
/**
|
|
11
11
|
* Normalize a session to ensure all required fields are present
|
|
12
12
|
*/
|
|
13
|
-
export function normalizeSession(
|
|
13
|
+
export function normalizeSession(
|
|
14
|
+
session: Partial<ClientSession> & { sessionId: string },
|
|
15
|
+
): ClientSession {
|
|
14
16
|
const now = new Date().toISOString();
|
|
15
17
|
return {
|
|
16
18
|
sessionId: session.sessionId,
|
|
@@ -49,7 +51,7 @@ export function sortSessions(sessions: ClientSession[]): ClientSession[] {
|
|
|
49
51
|
*/
|
|
50
52
|
export function deduplicateSessions(sessions: ClientSession[]): ClientSession[] {
|
|
51
53
|
const sessionMap = new Map<string, ClientSession>();
|
|
52
|
-
|
|
54
|
+
|
|
53
55
|
for (const session of sessions) {
|
|
54
56
|
const existing = sessionMap.get(session.sessionId);
|
|
55
57
|
if (!existing) {
|
|
@@ -63,7 +65,7 @@ export function deduplicateSessions(sessions: ClientSession[]): ClientSession[]
|
|
|
63
65
|
}
|
|
64
66
|
}
|
|
65
67
|
}
|
|
66
|
-
|
|
68
|
+
|
|
67
69
|
return Array.from(sessionMap.values());
|
|
68
70
|
}
|
|
69
71
|
|
|
@@ -74,15 +76,15 @@ export function deduplicateSessions(sessions: ClientSession[]): ClientSession[]
|
|
|
74
76
|
*/
|
|
75
77
|
export function deduplicateSessionsByUserId(
|
|
76
78
|
sessions: ClientSession[],
|
|
77
|
-
activeSessionId?: string | null
|
|
79
|
+
activeSessionId?: string | null,
|
|
78
80
|
): ClientSession[] {
|
|
79
81
|
if (!sessions.length) return [];
|
|
80
|
-
|
|
82
|
+
|
|
81
83
|
const userSessionMap = new Map<string, ClientSession>();
|
|
82
|
-
|
|
84
|
+
|
|
83
85
|
for (const session of sessions) {
|
|
84
86
|
if (!session.userId) continue; // Skip sessions without userId
|
|
85
|
-
|
|
87
|
+
|
|
86
88
|
const existing = userSessionMap.get(session.userId);
|
|
87
89
|
if (!existing) {
|
|
88
90
|
userSessionMap.set(session.userId, session);
|
|
@@ -90,7 +92,7 @@ export function deduplicateSessionsByUserId(
|
|
|
90
92
|
// Prioritize active session
|
|
91
93
|
const isCurrentActive = activeSessionId && session.sessionId === activeSessionId;
|
|
92
94
|
const isExistingActive = activeSessionId && existing.sessionId === activeSessionId;
|
|
93
|
-
|
|
95
|
+
|
|
94
96
|
if (isCurrentActive && !isExistingActive) {
|
|
95
97
|
userSessionMap.set(session.userId, session);
|
|
96
98
|
} else if (!isCurrentActive && isExistingActive) {
|
|
@@ -104,14 +106,14 @@ export function deduplicateSessionsByUserId(
|
|
|
104
106
|
}
|
|
105
107
|
}
|
|
106
108
|
}
|
|
107
|
-
|
|
109
|
+
|
|
108
110
|
return Array.from(userSessionMap.values());
|
|
109
111
|
}
|
|
110
112
|
|
|
111
113
|
/**
|
|
112
114
|
* Normalize, deduplicate, and sort sessions
|
|
113
115
|
* This ensures consistent session ordering across the application
|
|
114
|
-
*
|
|
116
|
+
*
|
|
115
117
|
* @param sessions - Array of sessions to normalize
|
|
116
118
|
* @param activeSessionId - Optional active session ID to prioritize
|
|
117
119
|
* @param deduplicateByUserId - If true, deduplicate by userId (one account per user). Default: true
|
|
@@ -119,21 +121,21 @@ export function deduplicateSessionsByUserId(
|
|
|
119
121
|
export function normalizeAndSortSessions(
|
|
120
122
|
sessions: ClientSession[],
|
|
121
123
|
activeSessionId?: string | null,
|
|
122
|
-
deduplicateByUserId = true
|
|
124
|
+
deduplicateByUserId = true,
|
|
123
125
|
): ClientSession[] {
|
|
124
126
|
if (!sessions.length) return [];
|
|
125
|
-
|
|
127
|
+
|
|
126
128
|
// Normalize all sessions
|
|
127
129
|
const normalized = sessions.map(normalizeSession);
|
|
128
|
-
|
|
130
|
+
|
|
129
131
|
// First deduplicate by sessionId (exact duplicates)
|
|
130
132
|
const deduplicatedBySessionId = deduplicateSessions(normalized);
|
|
131
|
-
|
|
133
|
+
|
|
132
134
|
// Then deduplicate by userId if requested (one account per user)
|
|
133
135
|
const finalSessions = deduplicateByUserId
|
|
134
136
|
? deduplicateSessionsByUserId(deduplicatedBySessionId, activeSessionId)
|
|
135
137
|
: deduplicatedBySessionId;
|
|
136
|
-
|
|
138
|
+
|
|
137
139
|
// Sort consistently
|
|
138
140
|
return sortSessions(finalSessions);
|
|
139
141
|
}
|
|
@@ -141,7 +143,7 @@ export function normalizeAndSortSessions(
|
|
|
141
143
|
/**
|
|
142
144
|
* Merge two session arrays, prioritizing newer data
|
|
143
145
|
* Returns normalized, deduplicated, and sorted sessions
|
|
144
|
-
*
|
|
146
|
+
*
|
|
145
147
|
* @param existing - Existing sessions array
|
|
146
148
|
* @param incoming - New sessions to merge in
|
|
147
149
|
* @param activeSessionId - Optional active session ID to prioritize
|
|
@@ -151,37 +153,39 @@ export function mergeSessions(
|
|
|
151
153
|
existing: ClientSession[],
|
|
152
154
|
incoming: ClientSession[],
|
|
153
155
|
activeSessionId?: string | null,
|
|
154
|
-
deduplicateByUserId = true
|
|
156
|
+
deduplicateByUserId = true,
|
|
155
157
|
): ClientSession[] {
|
|
156
158
|
if (!existing.length && !incoming.length) return [];
|
|
157
|
-
if (!existing.length)
|
|
158
|
-
|
|
159
|
-
|
|
159
|
+
if (!existing.length)
|
|
160
|
+
return normalizeAndSortSessions(incoming, activeSessionId, deduplicateByUserId);
|
|
161
|
+
if (!incoming.length)
|
|
162
|
+
return normalizeAndSortSessions(existing, activeSessionId, deduplicateByUserId);
|
|
163
|
+
|
|
160
164
|
// Normalize both arrays
|
|
161
165
|
const normalizedExisting = existing.map(normalizeSession);
|
|
162
166
|
const normalizedIncoming = incoming.map(normalizeSession);
|
|
163
|
-
|
|
167
|
+
|
|
164
168
|
// Create a map with existing sessions (by sessionId)
|
|
165
169
|
const sessionMap = new Map<string, ClientSession>();
|
|
166
|
-
|
|
170
|
+
|
|
167
171
|
// Add existing sessions first
|
|
168
172
|
for (const session of normalizedExisting) {
|
|
169
173
|
sessionMap.set(session.sessionId, session);
|
|
170
174
|
}
|
|
171
|
-
|
|
175
|
+
|
|
172
176
|
// Merge incoming sessions - backend data always replaces existing
|
|
173
177
|
for (const session of normalizedIncoming) {
|
|
174
178
|
sessionMap.set(session.sessionId, session);
|
|
175
179
|
}
|
|
176
|
-
|
|
180
|
+
|
|
177
181
|
// Convert to array
|
|
178
182
|
const merged = Array.from(sessionMap.values());
|
|
179
|
-
|
|
183
|
+
|
|
180
184
|
// Apply userId deduplication if requested
|
|
181
185
|
const finalSessions = deduplicateByUserId
|
|
182
186
|
? deduplicateSessionsByUserId(merged, activeSessionId)
|
|
183
187
|
: merged;
|
|
184
|
-
|
|
188
|
+
|
|
185
189
|
// Sort consistently
|
|
186
190
|
return sortSessions(finalSessions);
|
|
187
191
|
}
|
|
@@ -193,12 +197,9 @@ export function sessionsArraysEqual(a: ClientSession[], b: ClientSession[]): boo
|
|
|
193
197
|
if (a.length !== b.length) {
|
|
194
198
|
return false;
|
|
195
199
|
}
|
|
196
|
-
|
|
200
|
+
|
|
197
201
|
const sortedA = sortSessions(a);
|
|
198
202
|
const sortedB = sortSessions(b);
|
|
199
|
-
|
|
200
|
-
return sortedA.every((session, index) =>
|
|
201
|
-
sessionsEqual(session, sortedB[index])
|
|
202
|
-
);
|
|
203
|
-
}
|
|
204
203
|
|
|
204
|
+
return sortedA.every((session, index) => sessionsEqual(session, sortedB[index]));
|
|
205
|
+
}
|
package/src/utils/userHandle.ts
CHANGED
|
@@ -44,6 +44,8 @@ export function getNormalizedUserHandle(user: UserHandleInput | null | undefined
|
|
|
44
44
|
* Compatibility alias for the first public name shipped with this helper.
|
|
45
45
|
* Prefer {@link getNormalizedUserHandle} in new code.
|
|
46
46
|
*/
|
|
47
|
-
export function getCanonicalUserHandle(
|
|
47
|
+
export function getCanonicalUserHandle(
|
|
48
|
+
user: CanonicalUserHandleInput | null | undefined,
|
|
49
|
+
): string | null {
|
|
48
50
|
return getNormalizedUserHandle(user);
|
|
49
51
|
}
|
|
@@ -29,7 +29,7 @@ function stringifyIdentity(value: unknown): string | null {
|
|
|
29
29
|
|
|
30
30
|
/**
|
|
31
31
|
* Returns the stable SDK user id from API payloads that may use either `id` or
|
|
32
|
-
*
|
|
32
|
+
* a raw `_id`.
|
|
33
33
|
*/
|
|
34
34
|
export function getNormalizedUserId(user: UserIdentityInput | null | undefined): string | null {
|
|
35
35
|
if (!user) {
|
|
@@ -87,10 +87,10 @@ export function isValidPassword(password: string): boolean {
|
|
|
87
87
|
* — script digits (`٠١٢`, `०१२`), 1082 symbols (`֍ ۞ ৳`), 180 punctuation marks
|
|
88
88
|
* (`։ ، ؛ ।`), and 9 INVISIBLE format/control characters, among them U+061C
|
|
89
89
|
* ARABIC LETTER MARK (a bidi control that can visually reorder a name) and
|
|
90
|
-
* U+180E
|
|
90
|
+
* U+180E (the Mong-script vowel separator). Without it the rejections listed above held
|
|
91
91
|
* for ASCII input only. It is the set of scripts Unicode UTS #39 marks
|
|
92
92
|
* "Recommended" for general interchange / identifiers, plus Cherokee and
|
|
93
|
-
*
|
|
93
|
+
* the Mong script, ISO 15924 (both in real modern name use). "Common" script is deliberately
|
|
94
94
|
* EXCLUDED — that is where ASCII digits and general punctuation live, and this
|
|
95
95
|
* policy excludes those; the space separators, combining marks, and apostrophe a
|
|
96
96
|
* name needs are added back explicitly. Limited-use / excluded / historic
|
|
@@ -351,15 +351,14 @@ export function sanitizeHTML(input: string): string {
|
|
|
351
351
|
}
|
|
352
352
|
|
|
353
353
|
/**
|
|
354
|
-
* Validate
|
|
355
|
-
*
|
|
356
|
-
* This function works in environments where mongoose may not be available (e.g., client-side)
|
|
354
|
+
* Validate the legacy 24-hex id format (a format check only; it does not
|
|
355
|
+
* prove the id exists).
|
|
357
356
|
*/
|
|
358
357
|
export function isValidObjectId(id: string): boolean {
|
|
359
358
|
if (typeof id !== 'string') {
|
|
360
359
|
return false;
|
|
361
360
|
}
|
|
362
|
-
//
|
|
361
|
+
// A legacy id is 24 hex characters
|
|
363
362
|
const OBJECT_ID_REGEX = /^[0-9a-fA-F]{24}$/;
|
|
364
363
|
return OBJECT_ID_REGEX.test(id);
|
|
365
364
|
}
|
|
@@ -367,13 +366,16 @@ export function isValidObjectId(id: string): boolean {
|
|
|
367
366
|
/**
|
|
368
367
|
* Validate and sanitize user input
|
|
369
368
|
*/
|
|
370
|
-
export function validateAndSanitizeUserInput(
|
|
369
|
+
export function validateAndSanitizeUserInput(
|
|
370
|
+
input: unknown,
|
|
371
|
+
type: 'string' | 'email' | 'username',
|
|
372
|
+
): string | null {
|
|
371
373
|
if (typeof input !== 'string') {
|
|
372
374
|
return null;
|
|
373
375
|
}
|
|
374
376
|
|
|
375
377
|
const sanitized = sanitizeString(input);
|
|
376
|
-
|
|
378
|
+
|
|
377
379
|
switch (type) {
|
|
378
380
|
case 'email':
|
|
379
381
|
return isValidEmail(sanitized) ? sanitized : null;
|
|
@@ -387,4 +389,4 @@ export function validateAndSanitizeUserInput(input: unknown, type: 'string' | 'e
|
|
|
387
389
|
default:
|
|
388
390
|
return null;
|
|
389
391
|
}
|
|
390
|
-
}
|
|
392
|
+
}
|