@oxyhq/services 5.16.34 → 5.16.35
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/lib/commonjs/core/services/SessionTransportService.js +1 -1
- package/lib/commonjs/crypto/keyManager.js +2 -4
- package/lib/commonjs/crypto/keyManager.js.map +1 -1
- package/lib/commonjs/crypto/signatureService.js +8 -17
- package/lib/commonjs/crypto/signatureService.js.map +1 -1
- package/lib/commonjs/index.js +12 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/models/interfaces.js +7 -7
- package/lib/commonjs/shared/crypto/messageBuilders.js +79 -0
- package/lib/commonjs/shared/crypto/messageBuilders.js.map +1 -0
- package/lib/commonjs/shared/crypto/platform.js +118 -0
- package/lib/commonjs/shared/crypto/platform.js.map +1 -0
- package/lib/commonjs/shared/crypto/signature.js +191 -0
- package/lib/commonjs/shared/crypto/signature.js.map +1 -0
- package/lib/commonjs/shared/index.js +94 -0
- package/lib/commonjs/shared/index.js.map +1 -0
- package/lib/commonjs/shared/models/index.js +2 -0
- package/lib/commonjs/shared/models/index.js.map +1 -0
- package/lib/commonjs/shared/transport/index.js +260 -0
- package/lib/commonjs/shared/transport/index.js.map +1 -0
- package/lib/commonjs/shared/utils/index.js +82 -0
- package/lib/commonjs/shared/utils/index.js.map +1 -0
- package/lib/commonjs/ui/index.js +1 -1
- package/lib/commonjs/ui/screens/OxyAuthScreen.js +6 -11
- package/lib/commonjs/ui/screens/OxyAuthScreen.js.map +1 -1
- package/lib/module/core/services/SessionTransportService.js +1 -1
- package/lib/module/core/services/SessionTransportService.js.map +1 -1
- package/lib/module/crypto/keyManager.js +2 -4
- package/lib/module/crypto/keyManager.js.map +1 -1
- package/lib/module/crypto/signatureService.js +2 -12
- package/lib/module/crypto/signatureService.js.map +1 -1
- package/lib/module/index.js +2 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/models/interfaces.js +7 -7
- package/lib/module/shared/crypto/messageBuilders.js +70 -0
- package/lib/module/shared/crypto/messageBuilders.js.map +1 -0
- package/lib/module/shared/crypto/platform.js +112 -0
- package/lib/module/shared/crypto/platform.js.map +1 -0
- package/lib/module/shared/crypto/signature.js +186 -0
- package/lib/module/shared/crypto/signature.js.map +1 -0
- package/lib/module/shared/index.js +30 -0
- package/lib/module/shared/index.js.map +1 -0
- package/lib/module/shared/models/index.js +2 -0
- package/lib/module/shared/models/index.js.map +1 -0
- package/lib/module/shared/transport/index.js +254 -0
- package/lib/module/shared/transport/index.js.map +1 -0
- package/lib/module/shared/utils/index.js +74 -0
- package/lib/module/shared/utils/index.js.map +1 -0
- package/lib/module/ui/index.js +1 -1
- package/lib/module/ui/screens/OxyAuthScreen.js +2 -9
- package/lib/module/ui/screens/OxyAuthScreen.js.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.analytics.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.assets.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.auth.d.ts +1 -1
- package/lib/typescript/core/mixins/OxyServices.auth.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.developer.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.devices.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.karma.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.language.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.location.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.payment.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.privacy.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.security.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.user.d.ts +1 -1
- package/lib/typescript/core/mixins/OxyServices.user.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.utility.d.ts.map +1 -1
- package/lib/typescript/core/mixins/index.d.ts +13 -13
- package/lib/typescript/core/mixins/index.d.ts.map +1 -1
- package/lib/typescript/core/services/AuthService.d.ts +1 -1
- package/lib/typescript/core/services/AuthService.d.ts.map +1 -1
- package/lib/typescript/core/services/SessionService.d.ts +1 -1
- package/lib/typescript/core/services/SessionService.d.ts.map +1 -1
- package/lib/typescript/core/services/SessionTransportService.d.ts +1 -1
- package/lib/typescript/core/services/SessionTransportService.d.ts.map +1 -1
- package/lib/typescript/core/services/UserService.d.ts +1 -1
- package/lib/typescript/core/services/UserService.d.ts.map +1 -1
- package/lib/typescript/crypto/keyManager.d.ts.map +1 -1
- package/lib/typescript/crypto/signatureService.d.ts +3 -3
- package/lib/typescript/crypto/signatureService.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +1 -0
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/models/interfaces.d.ts +2 -2
- package/lib/typescript/shared/crypto/messageBuilders.d.ts +38 -0
- package/lib/typescript/shared/crypto/messageBuilders.d.ts.map +1 -0
- package/lib/typescript/shared/crypto/platform.d.ts +54 -0
- package/lib/typescript/shared/crypto/platform.d.ts.map +1 -0
- package/lib/typescript/shared/crypto/signature.d.ts +72 -0
- package/lib/typescript/shared/crypto/signature.d.ts.map +1 -0
- package/lib/typescript/shared/index.d.ts +20 -0
- package/lib/typescript/shared/index.d.ts.map +1 -0
- package/lib/typescript/shared/models/index.d.ts +163 -0
- package/lib/typescript/shared/models/index.d.ts.map +1 -0
- package/lib/typescript/shared/transport/index.d.ts +73 -0
- package/lib/typescript/shared/transport/index.d.ts.map +1 -0
- package/lib/typescript/shared/utils/index.d.ts +28 -0
- package/lib/typescript/shared/utils/index.d.ts.map +1 -0
- package/lib/typescript/ui/context/OxyContext.d.ts +1 -1
- package/lib/typescript/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/ui/context/hooks/useAuthOperations.d.ts +1 -1
- package/lib/typescript/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
- package/lib/typescript/ui/context/hooks/useLanguageManagement.d.ts +1 -1
- package/lib/typescript/ui/context/hooks/useLanguageManagement.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/mutations/useAccountMutations.d.ts +1 -1
- package/lib/typescript/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/queries/useAccountQueries.d.ts +1 -1
- package/lib/typescript/ui/hooks/queries/useAccountQueries.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/useLanguageManagement.d.ts +1 -1
- package/lib/typescript/ui/hooks/useLanguageManagement.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/useSessionManagement.d.ts +1 -1
- package/lib/typescript/ui/hooks/useSessionManagement.d.ts.map +1 -1
- package/lib/typescript/ui/screens/OxyAuthScreen.d.ts.map +1 -1
- package/lib/typescript/ui/stores/authStore.d.ts +1 -1
- package/lib/typescript/ui/stores/authStore.d.ts.map +1 -1
- package/lib/typescript/ui/utils/avatarUtils.d.ts +1 -1
- package/lib/typescript/ui/utils/avatarUtils.d.ts.map +1 -1
- package/package.json +1 -2
- package/src/core/OxyServices.base.ts +1 -1
- package/src/core/mixins/OxyServices.auth.ts +1 -1
- package/src/core/mixins/OxyServices.user.ts +1 -1
- package/src/core/mixins/OxyServices.utility.ts +1 -1
- package/src/core/services/AuthService.ts +1 -1
- package/src/core/services/SessionService.ts +1 -1
- package/src/core/services/SessionTransportService.ts +1 -1
- package/src/core/services/UserService.ts +1 -1
- package/src/crypto/keyManager.ts +2 -2
- package/src/crypto/signatureService.ts +5 -6
- package/src/index.ts +3 -1
- package/src/models/interfaces.ts +8 -8
- package/src/shared/crypto/messageBuilders.ts +89 -0
- package/src/shared/crypto/platform.ts +140 -0
- package/src/shared/crypto/signature.ts +235 -0
- package/src/shared/index.ts +28 -0
- package/src/shared/models/index.ts +173 -0
- package/src/shared/transport/index.ts +349 -0
- package/src/shared/utils/index.ts +73 -0
- package/src/ui/context/OxyContext.tsx +1 -1
- package/src/ui/context/hooks/useAuthOperations.ts +1 -1
- package/src/ui/context/hooks/useLanguageManagement.ts +1 -1
- package/src/ui/hooks/mutations/useAccountMutations.ts +1 -1
- package/src/ui/hooks/mutations/useServicesMutations.ts +1 -1
- package/src/ui/hooks/queries/useAccountQueries.ts +1 -1
- package/src/ui/hooks/useLanguageManagement.ts +1 -1
- package/src/ui/hooks/useSessionManagement.ts +1 -1
- package/src/ui/index.ts +1 -1
- package/src/ui/screens/AccountSwitcherScreen.tsx +1 -1
- package/src/ui/screens/OxyAuthScreen.tsx +2 -7
- package/src/ui/screens/ProfileScreen.tsx +1 -1
- package/src/ui/stores/authStore.ts +1 -1
- package/src/ui/types/navigation.ts +1 -1
- package/src/ui/utils/avatarUtils.ts +1 -1
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Signature Verification Service
|
|
5
|
+
*
|
|
6
|
+
* Unified signature verification used by both backend (API) and SDK.
|
|
7
|
+
* Uses platform adapters for crypto operations while keeping message construction shared.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { ec as EC } from 'elliptic';
|
|
11
|
+
import { getCryptoAdapter, PlatformDetector } from './platform';
|
|
12
|
+
import { buildAuthMessage, buildRegistrationMessage, buildRequestMessage, isTimestampFresh } from './messageBuilders';
|
|
13
|
+
const ec = new EC('secp256k1');
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Maximum age for signed messages (5 minutes)
|
|
17
|
+
*/
|
|
18
|
+
export const MAX_SIGNATURE_AGE_MS = 5 * 60 * 1000;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Challenge TTL (5 minutes)
|
|
22
|
+
*/
|
|
23
|
+
export const CHALLENGE_TTL_MS = 5 * 60 * 1000;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Signature Service
|
|
27
|
+
* Provides signature verification that works across all platforms
|
|
28
|
+
*/
|
|
29
|
+
export class SignatureService {
|
|
30
|
+
/**
|
|
31
|
+
* Verify an ECDSA signature
|
|
32
|
+
*
|
|
33
|
+
* @param message - The original message that was signed
|
|
34
|
+
* @param signature - The signature in DER format (hex encoded)
|
|
35
|
+
* @param publicKey - The public key (hex encoded, uncompressed)
|
|
36
|
+
* @returns true if the signature is valid
|
|
37
|
+
*/
|
|
38
|
+
static async verify(message, signature, publicKey) {
|
|
39
|
+
try {
|
|
40
|
+
const key = ec.keyFromPublic(publicKey, 'hex');
|
|
41
|
+
const adapter = await getCryptoAdapter();
|
|
42
|
+
const messageHash = await adapter.sha256(message);
|
|
43
|
+
return key.verify(messageHash, signature);
|
|
44
|
+
} catch {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Synchronous signature verification (Node.js only)
|
|
51
|
+
* Uses Node.js crypto module directly for hashing
|
|
52
|
+
*/
|
|
53
|
+
static verifySync(message, signature, publicKey) {
|
|
54
|
+
if (!PlatformDetector.isNode()) {
|
|
55
|
+
throw new Error('verifySync should only be used in Node.js. Use verify() in other environments.');
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
// eslint-disable-next-line @typescript-eslint/no-implied-eval
|
|
59
|
+
const getCrypto = new Function('return require("crypto")');
|
|
60
|
+
const crypto = getCrypto();
|
|
61
|
+
const key = ec.keyFromPublic(publicKey, 'hex');
|
|
62
|
+
const messageHash = crypto.createHash('sha256').update(message).digest('hex');
|
|
63
|
+
return key.verify(messageHash, signature);
|
|
64
|
+
} catch {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Verify an authentication challenge response
|
|
71
|
+
*
|
|
72
|
+
* @param publicKey - The user's public key
|
|
73
|
+
* @param challenge - The original challenge string
|
|
74
|
+
* @param signature - The signature of the auth message
|
|
75
|
+
* @param timestamp - The timestamp when the signature was created
|
|
76
|
+
* @param maxAgeMs - Maximum age of the signature in milliseconds
|
|
77
|
+
* @returns true if the challenge response is valid
|
|
78
|
+
*/
|
|
79
|
+
static async verifyChallengeResponse(publicKey, challenge, signature, timestamp, maxAgeMs = CHALLENGE_TTL_MS) {
|
|
80
|
+
// Check timestamp freshness
|
|
81
|
+
if (!isTimestampFresh(timestamp, maxAgeMs)) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Build the canonical message
|
|
86
|
+
const message = buildAuthMessage(publicKey, challenge, timestamp);
|
|
87
|
+
|
|
88
|
+
// Verify the signature
|
|
89
|
+
return this.verify(message, signature, publicKey);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Synchronous challenge response verification (Node.js only)
|
|
94
|
+
*/
|
|
95
|
+
static verifyChallengeResponseSync(publicKey, challenge, signature, timestamp, maxAgeMs = CHALLENGE_TTL_MS) {
|
|
96
|
+
// Check timestamp freshness
|
|
97
|
+
if (!isTimestampFresh(timestamp, maxAgeMs)) {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Build the canonical message
|
|
102
|
+
const message = buildAuthMessage(publicKey, challenge, timestamp);
|
|
103
|
+
|
|
104
|
+
// Verify the signature
|
|
105
|
+
return this.verifySync(message, signature, publicKey);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Verify a registration signature
|
|
110
|
+
* Signature format: oxy:register:{publicKey}:{timestamp}
|
|
111
|
+
*/
|
|
112
|
+
static async verifyRegistrationSignature(publicKey, signature, timestamp, maxAgeMs = MAX_SIGNATURE_AGE_MS) {
|
|
113
|
+
// Check timestamp freshness
|
|
114
|
+
if (!isTimestampFresh(timestamp, maxAgeMs)) {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Build the canonical message
|
|
119
|
+
const message = buildRegistrationMessage(publicKey, timestamp);
|
|
120
|
+
|
|
121
|
+
// Verify the signature
|
|
122
|
+
return this.verify(message, signature, publicKey);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Synchronous registration signature verification (Node.js only)
|
|
127
|
+
*/
|
|
128
|
+
static verifyRegistrationSignatureSync(publicKey, signature, timestamp, maxAgeMs = MAX_SIGNATURE_AGE_MS) {
|
|
129
|
+
// Check timestamp freshness
|
|
130
|
+
if (!isTimestampFresh(timestamp, maxAgeMs)) {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Build the canonical message
|
|
135
|
+
const message = buildRegistrationMessage(publicKey, timestamp);
|
|
136
|
+
|
|
137
|
+
// Verify the signature
|
|
138
|
+
return this.verifySync(message, signature, publicKey);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Verify a signed request
|
|
143
|
+
* Used for authenticated API operations
|
|
144
|
+
*/
|
|
145
|
+
static async verifyRequestSignature(publicKey, data, signature, timestamp, maxAgeMs = MAX_SIGNATURE_AGE_MS) {
|
|
146
|
+
// Check timestamp freshness
|
|
147
|
+
if (!isTimestampFresh(timestamp, maxAgeMs)) {
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Build the canonical message
|
|
152
|
+
const message = buildRequestMessage(publicKey, timestamp, data);
|
|
153
|
+
|
|
154
|
+
// Verify the signature
|
|
155
|
+
return this.verify(message, signature, publicKey);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Synchronous request signature verification (Node.js only)
|
|
160
|
+
*/
|
|
161
|
+
static verifyRequestSignatureSync(publicKey, data, signature, timestamp, maxAgeMs = MAX_SIGNATURE_AGE_MS) {
|
|
162
|
+
// Check timestamp freshness
|
|
163
|
+
if (!isTimestampFresh(timestamp, maxAgeMs)) {
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Build the canonical message
|
|
168
|
+
const message = buildRequestMessage(publicKey, timestamp, data);
|
|
169
|
+
|
|
170
|
+
// Verify the signature
|
|
171
|
+
return this.verifySync(message, signature, publicKey);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Validate that a string is a valid public key
|
|
176
|
+
*/
|
|
177
|
+
static isValidPublicKey(publicKey) {
|
|
178
|
+
try {
|
|
179
|
+
ec.keyFromPublic(publicKey, 'hex');
|
|
180
|
+
return true;
|
|
181
|
+
} catch {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=signature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["ec","EC","getCryptoAdapter","PlatformDetector","buildAuthMessage","buildRegistrationMessage","buildRequestMessage","isTimestampFresh","MAX_SIGNATURE_AGE_MS","CHALLENGE_TTL_MS","SignatureService","verify","message","signature","publicKey","key","keyFromPublic","adapter","messageHash","sha256","verifySync","isNode","Error","getCrypto","Function","crypto","createHash","update","digest","verifyChallengeResponse","challenge","timestamp","maxAgeMs","verifyChallengeResponseSync","verifyRegistrationSignature","verifyRegistrationSignatureSync","verifyRequestSignature","data","verifyRequestSignatureSync","isValidPublicKey"],"sourceRoot":"../../../../src","sources":["shared/crypto/signature.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @oxyhq/shared
|
|
5
|
+
*
|
|
6
|
+
* Shared utilities, models, and crypto primitives for OxyHQ packages.
|
|
7
|
+
*
|
|
8
|
+
* This package provides:
|
|
9
|
+
* - Canonical data models (User, Session, ChallengePayload, etc.)
|
|
10
|
+
* - Unified signature verification across platforms
|
|
11
|
+
* - Platform-agnostic crypto adapters
|
|
12
|
+
* - Shared utility functions
|
|
13
|
+
* - Canonical message builders for signing
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
// Models
|
|
17
|
+
export * from './models/index';
|
|
18
|
+
|
|
19
|
+
// Crypto
|
|
20
|
+
export * from './crypto/signature';
|
|
21
|
+
export * from './crypto/messageBuilders';
|
|
22
|
+
export * from './crypto/platform';
|
|
23
|
+
export { getCryptoAdapter, PlatformDetector } from './crypto/platform';
|
|
24
|
+
|
|
25
|
+
// Utils
|
|
26
|
+
export * from './utils/index';
|
|
27
|
+
|
|
28
|
+
// Transport
|
|
29
|
+
export * from './transport/index';
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getCryptoAdapter","PlatformDetector"],"sourceRoot":"../../../src","sources":["shared/index.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,cAAc,gBAAgB;;AAE9B;AACA,cAAc,oBAAoB;AAClC,cAAc,0BAA0B;AACxC,cAAc,mBAAmB;AACjC,SAASA,gBAAgB,EAAEC,gBAAgB,QAAQ,mBAAmB;;AAEtE;AACA,cAAc,eAAe;;AAE7B;AACA,cAAc,mBAAmB","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../../../src","sources":["shared/models/index.ts"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Transport Abstraction
|
|
5
|
+
*
|
|
6
|
+
* Unified transport layer for WebSocket, SSE, and polling.
|
|
7
|
+
* Provides automatic fallback and unified configuration.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Transport Interface
|
|
12
|
+
* All transport implementations must implement this
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Transport Factory
|
|
17
|
+
* Creates the appropriate transport based on availability and configuration
|
|
18
|
+
*/
|
|
19
|
+
export class TransportFactory {
|
|
20
|
+
/**
|
|
21
|
+
* Create a transport with automatic fallback
|
|
22
|
+
* Tries WebSocket first, then SSE, then polling
|
|
23
|
+
*/
|
|
24
|
+
static async create(config, callbacks) {
|
|
25
|
+
// Try WebSocket first (best for real-time)
|
|
26
|
+
if (await this.isWebSocketAvailable()) {
|
|
27
|
+
try {
|
|
28
|
+
return new WebSocketTransport(config, callbacks);
|
|
29
|
+
} catch (error) {
|
|
30
|
+
// Fall through to SSE
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Try SSE second (good for one-way updates)
|
|
35
|
+
if (await this.isSSEAvailable()) {
|
|
36
|
+
try {
|
|
37
|
+
return new SSETransport(config, callbacks);
|
|
38
|
+
} catch (error) {
|
|
39
|
+
// Fall through to polling
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Fall back to polling (always available)
|
|
44
|
+
return new PollingTransport(config, callbacks);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Check if WebSocket is available
|
|
49
|
+
*/
|
|
50
|
+
static async isWebSocketAvailable() {
|
|
51
|
+
// WebSocket is available in browsers and Node.js with socket.io-client
|
|
52
|
+
return typeof window !== 'undefined' || typeof process !== 'undefined';
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Check if SSE is available
|
|
57
|
+
*/
|
|
58
|
+
static async isSSEAvailable() {
|
|
59
|
+
// SSE is available in browsers via EventSource
|
|
60
|
+
// In Node.js, would need a polyfill or library
|
|
61
|
+
return typeof EventSource !== 'undefined' || typeof window !== 'undefined' && 'EventSource' in window;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* WebSocket Transport Implementation
|
|
67
|
+
* Uses socket.io-client for WebSocket connections
|
|
68
|
+
*/
|
|
69
|
+
class WebSocketTransport {
|
|
70
|
+
socket = null;
|
|
71
|
+
connected = false;
|
|
72
|
+
constructor(config, callbacks) {
|
|
73
|
+
this.config = config;
|
|
74
|
+
this.callbacks = callbacks;
|
|
75
|
+
}
|
|
76
|
+
async connect() {
|
|
77
|
+
// Dynamic import to avoid bundling socket.io-client if not needed
|
|
78
|
+
let io;
|
|
79
|
+
try {
|
|
80
|
+
io = (await import('socket.io-client')).default;
|
|
81
|
+
} catch (error) {
|
|
82
|
+
throw new Error('socket.io-client is required for WebSocket transport. Install it as a dependency.');
|
|
83
|
+
}
|
|
84
|
+
const url = this.config.namespace ? `${this.config.baseURL}/${this.config.namespace}` : this.config.baseURL;
|
|
85
|
+
const socketOptions = {
|
|
86
|
+
transports: ['websocket', 'polling'],
|
|
87
|
+
reconnection: true,
|
|
88
|
+
reconnectionAttempts: this.config.reconnectAttempts ?? 3,
|
|
89
|
+
reconnectionDelay: this.config.reconnectDelay ?? 1000
|
|
90
|
+
};
|
|
91
|
+
if (this.config.accessToken) {
|
|
92
|
+
socketOptions.auth = {
|
|
93
|
+
token: this.config.accessToken
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
this.socket = io(url, socketOptions);
|
|
97
|
+
this.socket.on('connect', () => {
|
|
98
|
+
this.connected = true;
|
|
99
|
+
if (this.config.sessionToken) {
|
|
100
|
+
this.socket.emit('join', this.config.sessionToken);
|
|
101
|
+
}
|
|
102
|
+
this.callbacks.onConnect?.();
|
|
103
|
+
});
|
|
104
|
+
this.socket.on('auth_update', payload => {
|
|
105
|
+
this.callbacks.onUpdate?.(payload);
|
|
106
|
+
});
|
|
107
|
+
this.socket.on('connect_error', error => {
|
|
108
|
+
this.callbacks.onError?.(error);
|
|
109
|
+
});
|
|
110
|
+
this.socket.on('disconnect', () => {
|
|
111
|
+
this.connected = false;
|
|
112
|
+
this.callbacks.onDisconnect?.();
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
disconnect() {
|
|
116
|
+
if (this.socket) {
|
|
117
|
+
this.socket.disconnect();
|
|
118
|
+
this.socket = null;
|
|
119
|
+
this.connected = false;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
isConnected() {
|
|
123
|
+
return this.connected && this.socket?.connected === true;
|
|
124
|
+
}
|
|
125
|
+
getType() {
|
|
126
|
+
return 'websocket';
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* SSE Transport Implementation
|
|
132
|
+
* Uses EventSource for Server-Sent Events
|
|
133
|
+
*/
|
|
134
|
+
class SSETransport {
|
|
135
|
+
eventSource = null;
|
|
136
|
+
connected = false;
|
|
137
|
+
constructor(config, callbacks) {
|
|
138
|
+
this.config = config;
|
|
139
|
+
this.callbacks = callbacks;
|
|
140
|
+
}
|
|
141
|
+
async connect() {
|
|
142
|
+
if (typeof EventSource === 'undefined') {
|
|
143
|
+
throw new Error('EventSource is not available in this environment');
|
|
144
|
+
}
|
|
145
|
+
const url = this.config.sessionToken ? `${this.config.baseURL}/auth/session/stream/${this.config.sessionToken}` : `${this.config.baseURL}/auth/session/stream`;
|
|
146
|
+
this.eventSource = new EventSource(url);
|
|
147
|
+
this.eventSource.onopen = () => {
|
|
148
|
+
this.connected = true;
|
|
149
|
+
this.callbacks.onConnect?.();
|
|
150
|
+
};
|
|
151
|
+
this.eventSource.onmessage = event => {
|
|
152
|
+
try {
|
|
153
|
+
const update = JSON.parse(event.data);
|
|
154
|
+
this.callbacks.onUpdate?.(update);
|
|
155
|
+
} catch (error) {
|
|
156
|
+
this.callbacks.onError?.(error);
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
this.eventSource.onerror = error => {
|
|
160
|
+
this.callbacks.onError?.(new Error('SSE connection error'));
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
disconnect() {
|
|
164
|
+
if (this.eventSource) {
|
|
165
|
+
this.eventSource.close();
|
|
166
|
+
this.eventSource = null;
|
|
167
|
+
this.connected = false;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
isConnected() {
|
|
171
|
+
return this.connected && this.eventSource?.readyState === EventSource.OPEN;
|
|
172
|
+
}
|
|
173
|
+
getType() {
|
|
174
|
+
return 'sse';
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Polling Transport Implementation
|
|
180
|
+
* Uses HTTP polling as fallback
|
|
181
|
+
*/
|
|
182
|
+
class PollingTransport {
|
|
183
|
+
intervalId = null;
|
|
184
|
+
connected = false;
|
|
185
|
+
abortController = null;
|
|
186
|
+
constructor(config, callbacks) {
|
|
187
|
+
this.config = config;
|
|
188
|
+
this.callbacks = callbacks;
|
|
189
|
+
}
|
|
190
|
+
async connect() {
|
|
191
|
+
this.connected = true;
|
|
192
|
+
this.callbacks.onConnect?.();
|
|
193
|
+
const poll = async () => {
|
|
194
|
+
if (!this.config.sessionToken) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
try {
|
|
198
|
+
this.abortController = new AbortController();
|
|
199
|
+
const response = await fetch(`${this.config.baseURL}/api/auth/session/status/${this.config.sessionToken}`, {
|
|
200
|
+
signal: this.abortController.signal,
|
|
201
|
+
headers: this.config.accessToken ? {
|
|
202
|
+
Authorization: `Bearer ${this.config.accessToken}`
|
|
203
|
+
} : {}
|
|
204
|
+
});
|
|
205
|
+
if (!response.ok) {
|
|
206
|
+
throw new Error(`Polling failed: ${response.statusText}`);
|
|
207
|
+
}
|
|
208
|
+
const data = await response.json();
|
|
209
|
+
if (data.authorized && data.sessionId) {
|
|
210
|
+
this.callbacks.onUpdate?.({
|
|
211
|
+
status: 'authorized',
|
|
212
|
+
sessionId: data.sessionId,
|
|
213
|
+
publicKey: data.publicKey
|
|
214
|
+
});
|
|
215
|
+
} else if (data.status === 'expired') {
|
|
216
|
+
this.callbacks.onUpdate?.({
|
|
217
|
+
status: 'expired'
|
|
218
|
+
});
|
|
219
|
+
} else if (data.status === 'cancelled') {
|
|
220
|
+
this.callbacks.onUpdate?.({
|
|
221
|
+
status: 'cancelled'
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
} catch (error) {
|
|
225
|
+
if (error instanceof Error && error.name !== 'AbortError') {
|
|
226
|
+
this.callbacks.onError?.(error);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
// Poll immediately, then at intervals
|
|
232
|
+
await poll();
|
|
233
|
+
this.intervalId = setInterval(poll, this.config.pollingInterval ?? 3000);
|
|
234
|
+
}
|
|
235
|
+
disconnect() {
|
|
236
|
+
if (this.intervalId) {
|
|
237
|
+
clearInterval(this.intervalId);
|
|
238
|
+
this.intervalId = null;
|
|
239
|
+
}
|
|
240
|
+
if (this.abortController) {
|
|
241
|
+
this.abortController.abort();
|
|
242
|
+
this.abortController = null;
|
|
243
|
+
}
|
|
244
|
+
this.connected = false;
|
|
245
|
+
this.callbacks.onDisconnect?.();
|
|
246
|
+
}
|
|
247
|
+
isConnected() {
|
|
248
|
+
return this.connected && this.intervalId !== null;
|
|
249
|
+
}
|
|
250
|
+
getType() {
|
|
251
|
+
return 'polling';
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["TransportFactory","create","config","callbacks","isWebSocketAvailable","WebSocketTransport","error","isSSEAvailable","SSETransport","PollingTransport","window","process","EventSource","socket","connected","constructor","connect","io","default","Error","url","namespace","baseURL","socketOptions","transports","reconnection","reconnectionAttempts","reconnectAttempts","reconnectionDelay","reconnectDelay","accessToken","auth","token","on","sessionToken","emit","onConnect","payload","onUpdate","onError","onDisconnect","disconnect","isConnected","getType","eventSource","onopen","onmessage","event","update","JSON","parse","data","onerror","close","readyState","OPEN","intervalId","abortController","poll","AbortController","response","fetch","signal","headers","Authorization","ok","statusText","json","authorized","sessionId","status","publicKey","name","setInterval","pollingInterval","clearInterval","abort"],"sourceRoot":"../../../../src","sources":["shared/transport/index.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Shared Utilities
|
|
5
|
+
*
|
|
6
|
+
* Common utility functions used across Accounts, Services SDK, and API packages.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Get a shortened display version of a public key
|
|
11
|
+
* Format: first 8 chars ... last 8 chars
|
|
12
|
+
*/
|
|
13
|
+
export function shortenPublicKey(publicKey) {
|
|
14
|
+
if (publicKey.length <= 16) return publicKey;
|
|
15
|
+
return `${publicKey.slice(0, 8)}...${publicKey.slice(-8)}`;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Generate a secure random session token
|
|
20
|
+
* Uses crypto.randomBytes (Node) or Web Crypto API (Browser/RN)
|
|
21
|
+
*/
|
|
22
|
+
export async function generateSessionToken(size = 32) {
|
|
23
|
+
// Use platform-appropriate random bytes
|
|
24
|
+
if (typeof window !== 'undefined' && window.crypto) {
|
|
25
|
+
// Web platform
|
|
26
|
+
const array = new Uint8Array(size);
|
|
27
|
+
window.crypto.getRandomValues(array);
|
|
28
|
+
return Array.from(array, byte => byte.toString(16).padStart(2, '0')).join('');
|
|
29
|
+
}
|
|
30
|
+
if (typeof process !== 'undefined' && process.versions?.node) {
|
|
31
|
+
// Node.js platform
|
|
32
|
+
// eslint-disable-next-line @typescript-eslint/no-implied-eval
|
|
33
|
+
const getCrypto = new Function('return require("crypto")');
|
|
34
|
+
const crypto = getCrypto();
|
|
35
|
+
return crypto.randomBytes(size).toString('hex');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// React Native - will be handled by platform adapter
|
|
39
|
+
// For now, throw an error if we can't determine platform
|
|
40
|
+
throw new Error('Unable to generate session token: no crypto implementation available');
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Generate a session token synchronously (Node.js only)
|
|
45
|
+
*/
|
|
46
|
+
export function generateSessionTokenSync(size = 32) {
|
|
47
|
+
if (typeof process === 'undefined' || !process.versions?.node) {
|
|
48
|
+
throw new Error('generateSessionTokenSync can only be used in Node.js');
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// eslint-disable-next-line @typescript-eslint/no-implied-eval
|
|
52
|
+
const getCrypto = new Function('return require("crypto")');
|
|
53
|
+
const crypto = getCrypto();
|
|
54
|
+
return crypto.randomBytes(size).toString('hex');
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Convert bytes to hex string
|
|
59
|
+
*/
|
|
60
|
+
export function bytesToHex(bytes) {
|
|
61
|
+
return Array.from(bytes, byte => byte.toString(16).padStart(2, '0')).join('');
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Convert hex string to bytes
|
|
66
|
+
*/
|
|
67
|
+
export function hexToBytes(hex) {
|
|
68
|
+
const bytes = new Uint8Array(hex.length / 2);
|
|
69
|
+
for (let i = 0; i < hex.length; i += 2) {
|
|
70
|
+
bytes[i / 2] = parseInt(hex.substr(i, 2), 16);
|
|
71
|
+
}
|
|
72
|
+
return bytes;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["shortenPublicKey","publicKey","length","slice","generateSessionToken","size","window","crypto","array","Uint8Array","getRandomValues","Array","from","byte","toString","padStart","join","process","versions","node","getCrypto","Function","randomBytes","Error","generateSessionTokenSync","bytesToHex","bytes","hexToBytes","hex","i","parseInt","substr"],"sourceRoot":"../../../../src","sources":["shared/utils/index.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASA,gBAAgBA,CAACC,SAAiB,EAAU;EAC1D,IAAIA,SAAS,CAACC,MAAM,IAAI,EAAE,EAAE,OAAOD,SAAS;EAC5C,OAAO,GAAGA,SAAS,CAACE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAMF,SAAS,CAACE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;AAC5D;;AAEA;AACA;AACA;AACA;AACA,OAAO,eAAeC,oBAAoBA,CAACC,IAAY,GAAG,EAAE,EAAmB;EAC7E;EACA,IAAI,OAAOC,MAAM,KAAK,WAAW,IAAIA,MAAM,CAACC,MAAM,EAAE;IAClD;IACA,MAAMC,KAAK,GAAG,IAAIC,UAAU,CAACJ,IAAI,CAAC;IAClCC,MAAM,CAACC,MAAM,CAACG,eAAe,CAACF,KAAK,CAAC;IACpC,OAAOG,KAAK,CAACC,IAAI,CAACJ,KAAK,EAAEK,IAAI,IAAIA,IAAI,CAACC,QAAQ,CAAC,EAAE,CAAC,CAACC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAACC,IAAI,CAAC,EAAE,CAAC;EAC/E;EAEA,IAAI,OAAOC,OAAO,KAAK,WAAW,IAAIA,OAAO,CAACC,QAAQ,EAAEC,IAAI,EAAE;IAC5D;IACA;IACA,MAAMC,SAAS,GAAG,IAAIC,QAAQ,CAAC,0BAA0B,CAAC;IAC1D,MAAMd,MAAM,GAAGa,SAAS,CAAC,CAAC;IAC1B,OAAOb,MAAM,CAACe,WAAW,CAACjB,IAAI,CAAC,CAACS,QAAQ,CAAC,KAAK,CAAC;EACjD;;EAEA;EACA;EACA,MAAM,IAAIS,KAAK,CAAC,sEAAsE,CAAC;AACzF;;AAEA;AACA;AACA;AACA,OAAO,SAASC,wBAAwBA,CAACnB,IAAY,GAAG,EAAE,EAAU;EAClE,IAAI,OAAOY,OAAO,KAAK,WAAW,IAAI,CAACA,OAAO,CAACC,QAAQ,EAAEC,IAAI,EAAE;IAC7D,MAAM,IAAII,KAAK,CAAC,sDAAsD,CAAC;EACzE;;EAEA;EACA,MAAMH,SAAS,GAAG,IAAIC,QAAQ,CAAC,0BAA0B,CAAC;EAC1D,MAAMd,MAAM,GAAGa,SAAS,CAAC,CAAC;EAC1B,OAAOb,MAAM,CAACe,WAAW,CAACjB,IAAI,CAAC,CAACS,QAAQ,CAAC,KAAK,CAAC;AACjD;;AAEA;AACA;AACA;AACA,OAAO,SAASW,UAAUA,CAACC,KAAiB,EAAU;EACpD,OAAOf,KAAK,CAACC,IAAI,CAACc,KAAK,EAAEb,IAAI,IAAIA,IAAI,CAACC,QAAQ,CAAC,EAAE,CAAC,CAACC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAACC,IAAI,CAAC,EAAE,CAAC;AAC/E;;AAEA;AACA;AACA;AACA,OAAO,SAASW,UAAUA,CAACC,GAAW,EAAc;EAClD,MAAMF,KAAK,GAAG,IAAIjB,UAAU,CAACmB,GAAG,CAAC1B,MAAM,GAAG,CAAC,CAAC;EAC5C,KAAK,IAAI2B,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGD,GAAG,CAAC1B,MAAM,EAAE2B,CAAC,IAAI,CAAC,EAAE;IACtCH,KAAK,CAACG,CAAC,GAAG,CAAC,CAAC,GAAGC,QAAQ,CAACF,GAAG,CAACG,MAAM,CAACF,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;EAC/C;EACA,OAAOH,KAAK;AACd","ignoreList":[]}
|
package/lib/module/ui/index.js
CHANGED
|
@@ -60,5 +60,5 @@ export { OxyProvider, OxySignInButton, OxyLogo, Avatar, FollowButton, OxyPayButt
|
|
|
60
60
|
|
|
61
61
|
// Re-export core services for convenience in UI context
|
|
62
62
|
export { OxyServices } from '../core';
|
|
63
|
-
// Note: User and LoginResponse
|
|
63
|
+
// Note: User and LoginResponse are available from the shared module (exported from main index)
|
|
64
64
|
//# sourceMappingURL=index.js.map
|
|
@@ -20,6 +20,7 @@ import { useThemeColors } from '../styles';
|
|
|
20
20
|
import { useOxy } from '../context/OxyContext';
|
|
21
21
|
import QRCode from 'react-native-qrcode-svg';
|
|
22
22
|
import OxyLogo from '../components/OxyLogo';
|
|
23
|
+
import { generateSessionToken } from '../../shared';
|
|
23
24
|
|
|
24
25
|
// Deep link scheme for Oxy Accounts app
|
|
25
26
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
@@ -184,7 +185,7 @@ const OxyAuthScreen = ({
|
|
|
184
185
|
isProcessingRef.current = false;
|
|
185
186
|
try {
|
|
186
187
|
// Generate a unique session token for this auth request
|
|
187
|
-
const sessionToken = await generateSessionToken();
|
|
188
|
+
const sessionToken = await generateSessionToken(32);
|
|
188
189
|
const expiresAt = Date.now() + AUTH_SESSION_EXPIRY_MS;
|
|
189
190
|
|
|
190
191
|
// Register the auth session with the server
|
|
@@ -210,14 +211,6 @@ const OxyAuthScreen = ({
|
|
|
210
211
|
}
|
|
211
212
|
}, [oxyServices, connectSocket]);
|
|
212
213
|
|
|
213
|
-
// Generate a random session token using secure random bytes
|
|
214
|
-
const generateSessionToken = async () => {
|
|
215
|
-
const {
|
|
216
|
-
generateSessionToken: sharedGenerate
|
|
217
|
-
} = await import('@oxyhq/shared');
|
|
218
|
-
return sharedGenerate(32); // 32 bytes = 64 hex characters
|
|
219
|
-
};
|
|
220
|
-
|
|
221
214
|
// Clean up on unmount
|
|
222
215
|
useEffect(() => {
|
|
223
216
|
return () => {
|