@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.
Files changed (150) hide show
  1. package/lib/commonjs/core/services/SessionTransportService.js +1 -1
  2. package/lib/commonjs/crypto/keyManager.js +2 -4
  3. package/lib/commonjs/crypto/keyManager.js.map +1 -1
  4. package/lib/commonjs/crypto/signatureService.js +8 -17
  5. package/lib/commonjs/crypto/signatureService.js.map +1 -1
  6. package/lib/commonjs/index.js +12 -0
  7. package/lib/commonjs/index.js.map +1 -1
  8. package/lib/commonjs/models/interfaces.js +7 -7
  9. package/lib/commonjs/shared/crypto/messageBuilders.js +79 -0
  10. package/lib/commonjs/shared/crypto/messageBuilders.js.map +1 -0
  11. package/lib/commonjs/shared/crypto/platform.js +118 -0
  12. package/lib/commonjs/shared/crypto/platform.js.map +1 -0
  13. package/lib/commonjs/shared/crypto/signature.js +191 -0
  14. package/lib/commonjs/shared/crypto/signature.js.map +1 -0
  15. package/lib/commonjs/shared/index.js +94 -0
  16. package/lib/commonjs/shared/index.js.map +1 -0
  17. package/lib/commonjs/shared/models/index.js +2 -0
  18. package/lib/commonjs/shared/models/index.js.map +1 -0
  19. package/lib/commonjs/shared/transport/index.js +260 -0
  20. package/lib/commonjs/shared/transport/index.js.map +1 -0
  21. package/lib/commonjs/shared/utils/index.js +82 -0
  22. package/lib/commonjs/shared/utils/index.js.map +1 -0
  23. package/lib/commonjs/ui/index.js +1 -1
  24. package/lib/commonjs/ui/screens/OxyAuthScreen.js +6 -11
  25. package/lib/commonjs/ui/screens/OxyAuthScreen.js.map +1 -1
  26. package/lib/module/core/services/SessionTransportService.js +1 -1
  27. package/lib/module/core/services/SessionTransportService.js.map +1 -1
  28. package/lib/module/crypto/keyManager.js +2 -4
  29. package/lib/module/crypto/keyManager.js.map +1 -1
  30. package/lib/module/crypto/signatureService.js +2 -12
  31. package/lib/module/crypto/signatureService.js.map +1 -1
  32. package/lib/module/index.js +2 -1
  33. package/lib/module/index.js.map +1 -1
  34. package/lib/module/models/interfaces.js +7 -7
  35. package/lib/module/shared/crypto/messageBuilders.js +70 -0
  36. package/lib/module/shared/crypto/messageBuilders.js.map +1 -0
  37. package/lib/module/shared/crypto/platform.js +112 -0
  38. package/lib/module/shared/crypto/platform.js.map +1 -0
  39. package/lib/module/shared/crypto/signature.js +186 -0
  40. package/lib/module/shared/crypto/signature.js.map +1 -0
  41. package/lib/module/shared/index.js +30 -0
  42. package/lib/module/shared/index.js.map +1 -0
  43. package/lib/module/shared/models/index.js +2 -0
  44. package/lib/module/shared/models/index.js.map +1 -0
  45. package/lib/module/shared/transport/index.js +254 -0
  46. package/lib/module/shared/transport/index.js.map +1 -0
  47. package/lib/module/shared/utils/index.js +74 -0
  48. package/lib/module/shared/utils/index.js.map +1 -0
  49. package/lib/module/ui/index.js +1 -1
  50. package/lib/module/ui/screens/OxyAuthScreen.js +2 -9
  51. package/lib/module/ui/screens/OxyAuthScreen.js.map +1 -1
  52. package/lib/typescript/core/mixins/OxyServices.analytics.d.ts.map +1 -1
  53. package/lib/typescript/core/mixins/OxyServices.assets.d.ts.map +1 -1
  54. package/lib/typescript/core/mixins/OxyServices.auth.d.ts +1 -1
  55. package/lib/typescript/core/mixins/OxyServices.auth.d.ts.map +1 -1
  56. package/lib/typescript/core/mixins/OxyServices.developer.d.ts.map +1 -1
  57. package/lib/typescript/core/mixins/OxyServices.devices.d.ts.map +1 -1
  58. package/lib/typescript/core/mixins/OxyServices.karma.d.ts.map +1 -1
  59. package/lib/typescript/core/mixins/OxyServices.language.d.ts.map +1 -1
  60. package/lib/typescript/core/mixins/OxyServices.location.d.ts.map +1 -1
  61. package/lib/typescript/core/mixins/OxyServices.payment.d.ts.map +1 -1
  62. package/lib/typescript/core/mixins/OxyServices.privacy.d.ts.map +1 -1
  63. package/lib/typescript/core/mixins/OxyServices.security.d.ts.map +1 -1
  64. package/lib/typescript/core/mixins/OxyServices.user.d.ts +1 -1
  65. package/lib/typescript/core/mixins/OxyServices.user.d.ts.map +1 -1
  66. package/lib/typescript/core/mixins/OxyServices.utility.d.ts.map +1 -1
  67. package/lib/typescript/core/mixins/index.d.ts +13 -13
  68. package/lib/typescript/core/mixins/index.d.ts.map +1 -1
  69. package/lib/typescript/core/services/AuthService.d.ts +1 -1
  70. package/lib/typescript/core/services/AuthService.d.ts.map +1 -1
  71. package/lib/typescript/core/services/SessionService.d.ts +1 -1
  72. package/lib/typescript/core/services/SessionService.d.ts.map +1 -1
  73. package/lib/typescript/core/services/SessionTransportService.d.ts +1 -1
  74. package/lib/typescript/core/services/SessionTransportService.d.ts.map +1 -1
  75. package/lib/typescript/core/services/UserService.d.ts +1 -1
  76. package/lib/typescript/core/services/UserService.d.ts.map +1 -1
  77. package/lib/typescript/crypto/keyManager.d.ts.map +1 -1
  78. package/lib/typescript/crypto/signatureService.d.ts +3 -3
  79. package/lib/typescript/crypto/signatureService.d.ts.map +1 -1
  80. package/lib/typescript/index.d.ts +1 -0
  81. package/lib/typescript/index.d.ts.map +1 -1
  82. package/lib/typescript/models/interfaces.d.ts +2 -2
  83. package/lib/typescript/shared/crypto/messageBuilders.d.ts +38 -0
  84. package/lib/typescript/shared/crypto/messageBuilders.d.ts.map +1 -0
  85. package/lib/typescript/shared/crypto/platform.d.ts +54 -0
  86. package/lib/typescript/shared/crypto/platform.d.ts.map +1 -0
  87. package/lib/typescript/shared/crypto/signature.d.ts +72 -0
  88. package/lib/typescript/shared/crypto/signature.d.ts.map +1 -0
  89. package/lib/typescript/shared/index.d.ts +20 -0
  90. package/lib/typescript/shared/index.d.ts.map +1 -0
  91. package/lib/typescript/shared/models/index.d.ts +163 -0
  92. package/lib/typescript/shared/models/index.d.ts.map +1 -0
  93. package/lib/typescript/shared/transport/index.d.ts +73 -0
  94. package/lib/typescript/shared/transport/index.d.ts.map +1 -0
  95. package/lib/typescript/shared/utils/index.d.ts +28 -0
  96. package/lib/typescript/shared/utils/index.d.ts.map +1 -0
  97. package/lib/typescript/ui/context/OxyContext.d.ts +1 -1
  98. package/lib/typescript/ui/context/OxyContext.d.ts.map +1 -1
  99. package/lib/typescript/ui/context/hooks/useAuthOperations.d.ts +1 -1
  100. package/lib/typescript/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
  101. package/lib/typescript/ui/context/hooks/useLanguageManagement.d.ts +1 -1
  102. package/lib/typescript/ui/context/hooks/useLanguageManagement.d.ts.map +1 -1
  103. package/lib/typescript/ui/hooks/mutations/useAccountMutations.d.ts +1 -1
  104. package/lib/typescript/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  105. package/lib/typescript/ui/hooks/queries/useAccountQueries.d.ts +1 -1
  106. package/lib/typescript/ui/hooks/queries/useAccountQueries.d.ts.map +1 -1
  107. package/lib/typescript/ui/hooks/useLanguageManagement.d.ts +1 -1
  108. package/lib/typescript/ui/hooks/useLanguageManagement.d.ts.map +1 -1
  109. package/lib/typescript/ui/hooks/useSessionManagement.d.ts +1 -1
  110. package/lib/typescript/ui/hooks/useSessionManagement.d.ts.map +1 -1
  111. package/lib/typescript/ui/screens/OxyAuthScreen.d.ts.map +1 -1
  112. package/lib/typescript/ui/stores/authStore.d.ts +1 -1
  113. package/lib/typescript/ui/stores/authStore.d.ts.map +1 -1
  114. package/lib/typescript/ui/utils/avatarUtils.d.ts +1 -1
  115. package/lib/typescript/ui/utils/avatarUtils.d.ts.map +1 -1
  116. package/package.json +1 -2
  117. package/src/core/OxyServices.base.ts +1 -1
  118. package/src/core/mixins/OxyServices.auth.ts +1 -1
  119. package/src/core/mixins/OxyServices.user.ts +1 -1
  120. package/src/core/mixins/OxyServices.utility.ts +1 -1
  121. package/src/core/services/AuthService.ts +1 -1
  122. package/src/core/services/SessionService.ts +1 -1
  123. package/src/core/services/SessionTransportService.ts +1 -1
  124. package/src/core/services/UserService.ts +1 -1
  125. package/src/crypto/keyManager.ts +2 -2
  126. package/src/crypto/signatureService.ts +5 -6
  127. package/src/index.ts +3 -1
  128. package/src/models/interfaces.ts +8 -8
  129. package/src/shared/crypto/messageBuilders.ts +89 -0
  130. package/src/shared/crypto/platform.ts +140 -0
  131. package/src/shared/crypto/signature.ts +235 -0
  132. package/src/shared/index.ts +28 -0
  133. package/src/shared/models/index.ts +173 -0
  134. package/src/shared/transport/index.ts +349 -0
  135. package/src/shared/utils/index.ts +73 -0
  136. package/src/ui/context/OxyContext.tsx +1 -1
  137. package/src/ui/context/hooks/useAuthOperations.ts +1 -1
  138. package/src/ui/context/hooks/useLanguageManagement.ts +1 -1
  139. package/src/ui/hooks/mutations/useAccountMutations.ts +1 -1
  140. package/src/ui/hooks/mutations/useServicesMutations.ts +1 -1
  141. package/src/ui/hooks/queries/useAccountQueries.ts +1 -1
  142. package/src/ui/hooks/useLanguageManagement.ts +1 -1
  143. package/src/ui/hooks/useSessionManagement.ts +1 -1
  144. package/src/ui/index.ts +1 -1
  145. package/src/ui/screens/AccountSwitcherScreen.tsx +1 -1
  146. package/src/ui/screens/OxyAuthScreen.tsx +2 -7
  147. package/src/ui/screens/ProfileScreen.tsx +1 -1
  148. package/src/ui/stores/authStore.ts +1 -1
  149. package/src/ui/types/navigation.ts +1 -1
  150. 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,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=index.js.map
@@ -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":[]}
@@ -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 should be imported from @oxyhq/shared
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 () => {