@oxyhq/services 5.15.4 → 5.15.6

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 (56) hide show
  1. package/lib/commonjs/core/mixins/OxyServices.assets.js +23 -2
  2. package/lib/commonjs/core/mixins/OxyServices.assets.js.map +1 -1
  3. package/lib/commonjs/crypto/index.js +1 -0
  4. package/lib/commonjs/crypto/index.js.map +1 -1
  5. package/lib/commonjs/crypto/polyfill.js +39 -0
  6. package/lib/commonjs/crypto/polyfill.js.map +1 -0
  7. package/lib/commonjs/crypto/recoveryPhrase.js +9 -9
  8. package/lib/commonjs/crypto/recoveryPhrase.js.map +1 -1
  9. package/lib/commonjs/index.js +5 -4
  10. package/lib/commonjs/index.js.map +1 -1
  11. package/lib/commonjs/ui/components/BottomSheet.js.map +1 -1
  12. package/lib/commonjs/ui/screens/OxyAuthScreen.js.map +1 -1
  13. package/lib/commonjs/utils/asyncUtils.js.map +1 -1
  14. package/lib/commonjs/utils/cache.js.map +1 -1
  15. package/lib/module/core/mixins/OxyServices.assets.js +23 -2
  16. package/lib/module/core/mixins/OxyServices.assets.js.map +1 -1
  17. package/lib/module/crypto/index.js +2 -0
  18. package/lib/module/crypto/index.js.map +1 -1
  19. package/lib/module/crypto/polyfill.js +31 -0
  20. package/lib/module/crypto/polyfill.js.map +1 -0
  21. package/lib/module/crypto/recoveryPhrase.js +9 -9
  22. package/lib/module/crypto/recoveryPhrase.js.map +1 -1
  23. package/lib/module/index.js +7 -3
  24. package/lib/module/index.js.map +1 -1
  25. package/lib/module/ui/components/BottomSheet.js.map +1 -1
  26. package/lib/module/ui/screens/OxyAuthScreen.js.map +1 -1
  27. package/lib/module/utils/asyncUtils.js.map +1 -1
  28. package/lib/module/utils/cache.js.map +1 -1
  29. package/lib/typescript/core/OxyServices.d.ts +1 -1
  30. package/lib/typescript/core/OxyServices.d.ts.map +1 -1
  31. package/lib/typescript/core/mixins/OxyServices.assets.d.ts +4 -0
  32. package/lib/typescript/core/mixins/OxyServices.assets.d.ts.map +1 -1
  33. package/lib/typescript/core/mixins/index.d.ts +1 -0
  34. package/lib/typescript/core/mixins/index.d.ts.map +1 -1
  35. package/lib/typescript/crypto/index.d.ts +1 -0
  36. package/lib/typescript/crypto/index.d.ts.map +1 -1
  37. package/lib/typescript/crypto/polyfill.d.ts +9 -0
  38. package/lib/typescript/crypto/polyfill.d.ts.map +1 -0
  39. package/lib/typescript/crypto/recoveryPhrase.d.ts +2 -0
  40. package/lib/typescript/crypto/recoveryPhrase.d.ts.map +1 -1
  41. package/lib/typescript/index.d.ts +2 -1
  42. package/lib/typescript/index.d.ts.map +1 -1
  43. package/lib/typescript/types/bip39.d.ts +5 -3
  44. package/lib/typescript/types/buffer.d.ts +96 -0
  45. package/package.json +2 -1
  46. package/src/core/mixins/OxyServices.assets.ts +27 -2
  47. package/src/crypto/index.ts +3 -0
  48. package/src/crypto/polyfill.ts +28 -0
  49. package/src/crypto/recoveryPhrase.ts +11 -11
  50. package/src/index.ts +8 -4
  51. package/src/types/bip39.d.ts +5 -3
  52. package/src/types/buffer.d.ts +96 -0
  53. package/src/ui/components/BottomSheet.tsx +1 -1
  54. package/src/ui/screens/OxyAuthScreen.tsx +1 -1
  55. package/src/utils/asyncUtils.ts +1 -1
  56. package/src/utils/cache.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,6BAA6B,EAAE,MAAM,QAAQ,CAAC;AAC5F,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAGlD,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,qBAAqB,EACtB,MAAM,UAAU,CAAC;AAClB,YAAY,EACV,OAAO,EACP,aAAa,EACb,aAAa,EACb,oBAAoB,EACrB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,kBAAkB,EAAE,yBAAyB;AAC7C,MAAM,EACP,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAGrE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGjF,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACtB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAG9D,YAAY,EACV,SAAS,EACT,IAAI,EACJ,aAAa,EACb,YAAY,EACZ,MAAM,EACN,WAAW,EACX,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,SAAS,EACT,YAAY,EACZ,qBAAqB,EACrB,iBAAiB,EACjB,QAAQ,EACR,aAAa,EACb,cAAc,EACd,eAAe,EACf,aAAa,EACb,eAAe,EACf,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,sBAAsB,EACtB,2BAA2B,EAC3B,wBAAwB,EAExB,WAAW,EAEX,cAAc,EAEd,cAAc,EACd,SAAS,EACT,YAAY,EACZ,KAAK,EACL,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,4BAA4B,EAC5B,6BAA6B,EAC9B,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EACV,oBAAoB,EACpB,aAAa,EACb,eAAe,EAChB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,SAAS,IAAI,cAAc,EAAE,QAAQ,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC3N,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAG1F,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAG7C,cAAc,kBAAkB,CAAC;AACjC,OAAO,EACL,UAAU,EACV,cAAc,EACd,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EACjB,MAAM,oBAAoB,CAAC;AAC5B,cAAc,yBAAyB,CAAC;AACxC,OAAO,EACL,MAAM,EACN,QAAQ,EACR,UAAU,EACV,OAAO,EACP,MAAM,EACN,UAAU,EACV,OAAO,EACP,SAAS,EACT,UAAU,EACV,cAAc,EACf,MAAM,qBAAqB,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -17,9 +17,11 @@ declare module 'bip39' {
17
17
  spanish: string[];
18
18
  };
19
19
 
20
- export function generateMnemonic(strength?: number, rng?: (size: number) => Buffer, wordlist?: string[]): string;
21
- export function mnemonicToSeed(mnemonic: string, passphrase?: string): Promise<Buffer>;
22
- export function mnemonicToSeedSync(mnemonic: string, passphrase?: string): Buffer;
20
+ // Use Uint8Array instead of Buffer for React Native compatibility
21
+ // In Node.js, Buffer extends Uint8Array so this is compatible
22
+ export function generateMnemonic(strength?: number, rng?: (size: number) => Uint8Array, wordlist?: string[]): string;
23
+ export function mnemonicToSeed(mnemonic: string, passphrase?: string): Promise<Uint8Array>;
24
+ export function mnemonicToSeedSync(mnemonic: string, passphrase?: string): Uint8Array;
23
25
  export function mnemonicToEntropy(mnemonic: string, wordlist?: string[]): string;
24
26
  export function entropyToMnemonic(entropy: string, wordlist?: string[]): string;
25
27
  export function validateMnemonic(mnemonic: string, wordlist?: string[]): boolean;
@@ -0,0 +1,96 @@
1
+ declare module 'buffer' {
2
+ export class Buffer extends Uint8Array {
3
+ constructor(str: string, encoding?: string);
4
+ constructor(size: number);
5
+ constructor(array: Uint8Array);
6
+ constructor(arrayBuffer: ArrayBuffer);
7
+ constructor(array: ReadonlyArray<number>);
8
+ constructor(buffer: Buffer);
9
+
10
+ static from(arrayBuffer: ArrayBuffer, byteOffset?: number, length?: number): Buffer;
11
+ static from(data: Uint8Array | ReadonlyArray<number>): Buffer;
12
+ static from(str: string, encoding?: BufferEncoding): Buffer;
13
+ static from(object: { valueOf(): string | object } | { [Symbol.toPrimitive](hint: 'string'): string }, offsetOrEncoding?: number | string, length?: number): Buffer;
14
+
15
+ static alloc(size: number, fill?: string | Buffer | number, encoding?: BufferEncoding): Buffer;
16
+ static allocUnsafe(size: number): Buffer;
17
+ static allocUnsafeSlow(size: number): Buffer;
18
+
19
+ static isBuffer(obj: unknown): obj is Buffer;
20
+ static isEncoding(encoding: string): encoding is BufferEncoding;
21
+ static byteLength(string: string | Buffer | ArrayBuffer | SharedArrayBuffer, encoding?: BufferEncoding): number;
22
+ static concat(list: ReadonlyArray<Uint8Array>, totalLength?: number): Buffer;
23
+ static compare(buf1: Uint8Array, buf2: Uint8Array): number;
24
+
25
+ write(string: string, encoding?: BufferEncoding): number;
26
+ write(string: string, offset: number, encoding?: BufferEncoding): number;
27
+ write(string: string, offset: number, length: number, encoding?: BufferEncoding): number;
28
+
29
+ toString(encoding?: BufferEncoding, start?: number, end?: number): string;
30
+ toJSON(): { type: 'Buffer'; data: number[] };
31
+
32
+ equals(otherBuffer: Uint8Array): boolean;
33
+ compare(target: Uint8Array, targetStart?: number, targetEnd?: number, sourceStart?: number, sourceEnd?: number): number;
34
+ copy(target: Uint8Array, targetStart?: number, sourceStart?: number, sourceEnd?: number): number;
35
+
36
+ slice(start?: number, end?: number): Buffer;
37
+ subarray(start?: number, end?: number): Buffer;
38
+
39
+ readBigInt64BE(offset?: number): bigint;
40
+ readBigInt64LE(offset?: number): bigint;
41
+ readBigUInt64BE(offset?: number): bigint;
42
+ readBigUInt64LE(offset?: number): bigint;
43
+ readDoubleBE(offset?: number): number;
44
+ readDoubleLE(offset?: number): number;
45
+ readFloatBE(offset?: number): number;
46
+ readFloatLE(offset?: number): number;
47
+ readInt8(offset?: number): number;
48
+ readInt16BE(offset?: number): number;
49
+ readInt16LE(offset?: number): number;
50
+ readInt32BE(offset?: number): number;
51
+ readInt32LE(offset?: number): number;
52
+ readIntBE(offset: number, byteLength: number): number;
53
+ readIntLE(offset: number, byteLength: number): number;
54
+ readUInt8(offset?: number): number;
55
+ readUInt16BE(offset?: number): number;
56
+ readUInt16LE(offset?: number): number;
57
+ readUInt32BE(offset?: number): number;
58
+ readUInt32LE(offset?: number): number;
59
+ readUIntBE(offset: number, byteLength: number): number;
60
+ readUIntLE(offset: number, byteLength: number): number;
61
+
62
+ swap16(): Buffer;
63
+ swap32(): Buffer;
64
+ swap64(): Buffer;
65
+
66
+ writeBigInt64BE(value: bigint, offset?: number): number;
67
+ writeBigInt64LE(value: bigint, offset?: number): number;
68
+ writeBigUInt64BE(value: bigint, offset?: number): number;
69
+ writeBigUInt64LE(value: bigint, offset?: number): number;
70
+ writeDoubleBE(value: number, offset?: number): number;
71
+ writeDoubleLE(value: number, offset?: number): number;
72
+ writeFloatBE(value: number, offset?: number): number;
73
+ writeFloatLE(value: number, offset?: number): number;
74
+ writeInt8(value: number, offset?: number): number;
75
+ writeInt16BE(value: number, offset?: number): number;
76
+ writeInt16LE(value: number, offset?: number): number;
77
+ writeInt32BE(value: number, offset?: number): number;
78
+ writeInt32LE(value: number, offset?: number): number;
79
+ writeIntBE(value: number, offset: number, byteLength: number): number;
80
+ writeIntLE(value: number, offset: number, byteLength: number): number;
81
+ writeUInt8(value: number, offset?: number): number;
82
+ writeUInt16BE(value: number, offset?: number): number;
83
+ writeUInt16LE(value: number, offset?: number): number;
84
+ writeUInt32BE(value: number, offset?: number): number;
85
+ writeUInt32LE(value: number, offset?: number): number;
86
+ writeUIntBE(value: number, offset: number, byteLength: number): number;
87
+ writeUIntLE(value: number, offset: number, byteLength: number): number;
88
+
89
+ fill(value: string | Uint8Array | number, offset?: number, end?: number, encoding?: BufferEncoding): this;
90
+ indexOf(value: string | number | Uint8Array, byteOffset?: number, encoding?: BufferEncoding): number;
91
+ lastIndexOf(value: string | number | Uint8Array, byteOffset?: number, encoding?: BufferEncoding): number;
92
+ includes(value: string | number | Buffer, byteOffset?: number, encoding?: BufferEncoding): boolean;
93
+ }
94
+
95
+ type BufferEncoding = 'ascii' | 'utf8' | 'utf-8' | 'utf16le' | 'ucs2' | 'ucs-2' | 'base64' | 'base64url' | 'latin1' | 'binary' | 'hex';
96
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oxyhq/services",
3
- "version": "5.15.4",
3
+ "version": "5.15.6",
4
4
  "description": "Reusable OxyHQ module to handle authentication, user management, karma system, device-based session management and more 🚀",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
@@ -93,6 +93,7 @@
93
93
  "@tanstack/react-query": "^5.59.0",
94
94
  "axios": "^1.9.0",
95
95
  "bip39": "^3.1.0",
96
+ "buffer": "^6.0.3",
96
97
  "elliptic": "^6.6.1",
97
98
  "expo-blur": "~15.0.8",
98
99
  "expo-crypto": "~14.0.1",
@@ -255,6 +255,30 @@ export function OxyServicesAssetsMixin<T extends typeof OxyServicesBase>(Base: T
255
255
  return bytes.buffer;
256
256
  }
257
257
 
258
+ /**
259
+ * Convert binary string to base64 (manual implementation for Node.js when btoa is not available)
260
+ */
261
+ binaryToBase64(binary: string): string {
262
+ const base64Chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
263
+ let result = '';
264
+ let i = 0;
265
+
266
+ while (i < binary.length) {
267
+ const a = binary.charCodeAt(i++);
268
+ const b = i < binary.length ? binary.charCodeAt(i++) : 0;
269
+ const c = i < binary.length ? binary.charCodeAt(i++) : 0;
270
+
271
+ const bitmap = (a << 16) | (b << 8) | c;
272
+
273
+ result += base64Chars.charAt((bitmap >> 18) & 63);
274
+ result += base64Chars.charAt((bitmap >> 12) & 63);
275
+ result += i - 2 < binary.length ? base64Chars.charAt((bitmap >> 6) & 63) : '=';
276
+ result += i - 1 < binary.length ? base64Chars.charAt(bitmap & 63) : '=';
277
+ }
278
+
279
+ return result;
280
+ }
281
+
258
282
  /**
259
283
  * Convert ArrayBuffer to base64 string (safe chunked approach to avoid stack overflow)
260
284
  */
@@ -269,12 +293,13 @@ export function OxyServicesAssetsMixin<T extends typeof OxyServicesBase>(Base: T
269
293
  const chunk = bytes.slice(i, i + chunkSize);
270
294
  binary += String.fromCharCode.apply(null, Array.from(chunk));
271
295
  }
272
- return typeof btoa !== 'undefined' ? btoa(binary) : Buffer.from(binary, 'binary').toString('base64');
296
+ // Use btoa if available (browser/React Native), otherwise use manual encoding
297
+ return typeof btoa !== 'undefined' ? btoa(binary) : this.binaryToBase64(binary);
273
298
  }
274
299
 
275
300
  // Small buffers can use direct conversion
276
301
  const binary = String.fromCharCode.apply(null, Array.from(bytes));
277
- return typeof btoa !== 'undefined' ? btoa(binary) : Buffer.from(binary, 'binary').toString('base64');
302
+ return typeof btoa !== 'undefined' ? btoa(binary) : this.binaryToBase64(binary);
278
303
  }
279
304
 
280
305
  /**
@@ -5,6 +5,9 @@
5
5
  * Handles key generation, secure storage, digital signatures, and recovery phrases.
6
6
  */
7
7
 
8
+ // Import polyfills first - this ensures Buffer is available for bip39 and other libraries
9
+ import './polyfill';
10
+
8
11
  export { KeyManager, type KeyPair } from './keyManager';
9
12
  export {
10
13
  SignatureService,
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Crypto Polyfills for React Native
3
+ *
4
+ * This file ensures that required polyfills are available
5
+ * before any crypto operations are performed.
6
+ */
7
+
8
+ // Import Buffer polyfill for React Native compatibility
9
+ // Libraries like bip39 depend on Buffer which isn't available in React Native
10
+ import { Buffer } from 'buffer';
11
+
12
+ // Get the global object in a cross-platform way
13
+ const getGlobalObject = (): typeof globalThis => {
14
+ if (typeof globalThis !== 'undefined') return globalThis;
15
+ if (typeof global !== 'undefined') return global;
16
+ if (typeof window !== 'undefined') return window as unknown as typeof globalThis;
17
+ if (typeof self !== 'undefined') return self as unknown as typeof globalThis;
18
+ return {} as typeof globalThis;
19
+ };
20
+
21
+ // Make Buffer available globally for libraries that depend on it
22
+ const globalObject = getGlobalObject();
23
+ if (!globalObject.Buffer) {
24
+ (globalObject as unknown as { Buffer: typeof Buffer }).Buffer = Buffer;
25
+ }
26
+
27
+ // Re-export Buffer for convenience
28
+ export { Buffer };
@@ -3,22 +3,20 @@
3
3
  *
4
4
  * Handles generation and restoration of recovery phrases (mnemonic seeds)
5
5
  * for backing up and restoring user identities.
6
+ *
7
+ * Note: This module requires the polyfill to be loaded first (done via crypto/index.ts)
6
8
  */
7
9
 
8
10
  import * as bip39 from 'bip39';
9
11
  import { KeyManager } from './keyManager';
10
12
 
11
13
  /**
12
- * Convert Buffer or Uint8Array to hexadecimal string
13
- * Works in both Node.js and React Native
14
+ * Convert Uint8Array or array-like to hexadecimal string
15
+ * Works in both Node.js and React Native without depending on Buffer
14
16
  */
15
- function toHex(data: Uint8Array | Buffer | ArrayLike<number>): string {
16
- if (typeof (data as Buffer).toString === 'function' && (data as Buffer).toString.length === 1) {
17
- // It's a Buffer with toString('hex') method (Node.js)
18
- return (data as Buffer).toString('hex');
19
- }
20
- // It's a Uint8Array or array-like (React Native/browser)
21
- const bytes = data instanceof Uint8Array ? data : new Uint8Array(data as ArrayLike<number>);
17
+ function toHex(data: Uint8Array | ArrayLike<number>): string {
18
+ // Convert to array of numbers if needed
19
+ const bytes = data instanceof Uint8Array ? data : new Uint8Array(data);
22
20
  return Array.from(bytes)
23
21
  .map(b => b.toString(16).padStart(2, '0'))
24
22
  .join('');
@@ -89,7 +87,8 @@ export class RecoveryPhraseService {
89
87
 
90
88
  // Derive the same private key from the mnemonic
91
89
  const seed = await bip39.mnemonicToSeed(normalizedPhrase);
92
- const privateKeyHex = seed.subarray(0, 32).toString('hex');
90
+ const seedSlice = seed.subarray ? seed.subarray(0, 32) : seed.slice(0, 32);
91
+ const privateKeyHex = toHex(seedSlice);
93
92
 
94
93
  // Import and store the key pair
95
94
  const publicKey = await KeyManager.importKeyPair(privateKeyHex);
@@ -141,7 +140,8 @@ export class RecoveryPhraseService {
141
140
  }
142
141
 
143
142
  const seed = await bip39.mnemonicToSeed(normalizedPhrase);
144
- const privateKeyHex = seed.subarray(0, 32).toString('hex');
143
+ const seedSlice = seed.subarray ? seed.subarray(0, 32) : seed.slice(0, 32);
144
+ const privateKeyHex = toHex(seedSlice);
145
145
 
146
146
  return KeyManager.derivePublicKey(privateKeyHex);
147
147
  }
package/src/index.ts CHANGED
@@ -6,16 +6,20 @@
6
6
  * - Backend: Core functionality only (UI components are no-ops)
7
7
  */
8
8
 
9
- // Core exports
10
- export { OxyServices, OxyAuthenticationError, OxyAuthenticationTimeoutError } from './core';
11
- export { OXY_CLOUD_URL, oxyClient } from './core';
9
+ // IMPORTANT: Import crypto module first to ensure polyfills are loaded
10
+ // before any other code that might use Buffer or other polyfilled APIs
11
+ import './crypto/polyfill';
12
12
 
13
- // Crypto/Identity exports
13
+ // Crypto/Identity exports (must be before core to ensure polyfills are available)
14
14
  export {
15
15
  KeyManager,
16
16
  SignatureService,
17
17
  RecoveryPhraseService
18
18
  } from './crypto';
19
+
20
+ // Core exports
21
+ export { OxyServices, OxyAuthenticationError, OxyAuthenticationTimeoutError } from './core';
22
+ export { OXY_CLOUD_URL, oxyClient } from './core';
19
23
  export type {
20
24
  KeyPair,
21
25
  SignedMessage,
@@ -17,9 +17,11 @@ declare module 'bip39' {
17
17
  spanish: string[];
18
18
  };
19
19
 
20
- export function generateMnemonic(strength?: number, rng?: (size: number) => Buffer, wordlist?: string[]): string;
21
- export function mnemonicToSeed(mnemonic: string, passphrase?: string): Promise<Buffer>;
22
- export function mnemonicToSeedSync(mnemonic: string, passphrase?: string): Buffer;
20
+ // Use Uint8Array instead of Buffer for React Native compatibility
21
+ // In Node.js, Buffer extends Uint8Array so this is compatible
22
+ export function generateMnemonic(strength?: number, rng?: (size: number) => Uint8Array, wordlist?: string[]): string;
23
+ export function mnemonicToSeed(mnemonic: string, passphrase?: string): Promise<Uint8Array>;
24
+ export function mnemonicToSeedSync(mnemonic: string, passphrase?: string): Uint8Array;
23
25
  export function mnemonicToEntropy(mnemonic: string, wordlist?: string[]): string;
24
26
  export function entropyToMnemonic(entropy: string, wordlist?: string[]): string;
25
27
  export function validateMnemonic(mnemonic: string, wordlist?: string[]): boolean;
@@ -0,0 +1,96 @@
1
+ declare module 'buffer' {
2
+ export class Buffer extends Uint8Array {
3
+ constructor(str: string, encoding?: string);
4
+ constructor(size: number);
5
+ constructor(array: Uint8Array);
6
+ constructor(arrayBuffer: ArrayBuffer);
7
+ constructor(array: ReadonlyArray<number>);
8
+ constructor(buffer: Buffer);
9
+
10
+ static from(arrayBuffer: ArrayBuffer, byteOffset?: number, length?: number): Buffer;
11
+ static from(data: Uint8Array | ReadonlyArray<number>): Buffer;
12
+ static from(str: string, encoding?: BufferEncoding): Buffer;
13
+ static from(object: { valueOf(): string | object } | { [Symbol.toPrimitive](hint: 'string'): string }, offsetOrEncoding?: number | string, length?: number): Buffer;
14
+
15
+ static alloc(size: number, fill?: string | Buffer | number, encoding?: BufferEncoding): Buffer;
16
+ static allocUnsafe(size: number): Buffer;
17
+ static allocUnsafeSlow(size: number): Buffer;
18
+
19
+ static isBuffer(obj: unknown): obj is Buffer;
20
+ static isEncoding(encoding: string): encoding is BufferEncoding;
21
+ static byteLength(string: string | Buffer | ArrayBuffer | SharedArrayBuffer, encoding?: BufferEncoding): number;
22
+ static concat(list: ReadonlyArray<Uint8Array>, totalLength?: number): Buffer;
23
+ static compare(buf1: Uint8Array, buf2: Uint8Array): number;
24
+
25
+ write(string: string, encoding?: BufferEncoding): number;
26
+ write(string: string, offset: number, encoding?: BufferEncoding): number;
27
+ write(string: string, offset: number, length: number, encoding?: BufferEncoding): number;
28
+
29
+ toString(encoding?: BufferEncoding, start?: number, end?: number): string;
30
+ toJSON(): { type: 'Buffer'; data: number[] };
31
+
32
+ equals(otherBuffer: Uint8Array): boolean;
33
+ compare(target: Uint8Array, targetStart?: number, targetEnd?: number, sourceStart?: number, sourceEnd?: number): number;
34
+ copy(target: Uint8Array, targetStart?: number, sourceStart?: number, sourceEnd?: number): number;
35
+
36
+ slice(start?: number, end?: number): Buffer;
37
+ subarray(start?: number, end?: number): Buffer;
38
+
39
+ readBigInt64BE(offset?: number): bigint;
40
+ readBigInt64LE(offset?: number): bigint;
41
+ readBigUInt64BE(offset?: number): bigint;
42
+ readBigUInt64LE(offset?: number): bigint;
43
+ readDoubleBE(offset?: number): number;
44
+ readDoubleLE(offset?: number): number;
45
+ readFloatBE(offset?: number): number;
46
+ readFloatLE(offset?: number): number;
47
+ readInt8(offset?: number): number;
48
+ readInt16BE(offset?: number): number;
49
+ readInt16LE(offset?: number): number;
50
+ readInt32BE(offset?: number): number;
51
+ readInt32LE(offset?: number): number;
52
+ readIntBE(offset: number, byteLength: number): number;
53
+ readIntLE(offset: number, byteLength: number): number;
54
+ readUInt8(offset?: number): number;
55
+ readUInt16BE(offset?: number): number;
56
+ readUInt16LE(offset?: number): number;
57
+ readUInt32BE(offset?: number): number;
58
+ readUInt32LE(offset?: number): number;
59
+ readUIntBE(offset: number, byteLength: number): number;
60
+ readUIntLE(offset: number, byteLength: number): number;
61
+
62
+ swap16(): Buffer;
63
+ swap32(): Buffer;
64
+ swap64(): Buffer;
65
+
66
+ writeBigInt64BE(value: bigint, offset?: number): number;
67
+ writeBigInt64LE(value: bigint, offset?: number): number;
68
+ writeBigUInt64BE(value: bigint, offset?: number): number;
69
+ writeBigUInt64LE(value: bigint, offset?: number): number;
70
+ writeDoubleBE(value: number, offset?: number): number;
71
+ writeDoubleLE(value: number, offset?: number): number;
72
+ writeFloatBE(value: number, offset?: number): number;
73
+ writeFloatLE(value: number, offset?: number): number;
74
+ writeInt8(value: number, offset?: number): number;
75
+ writeInt16BE(value: number, offset?: number): number;
76
+ writeInt16LE(value: number, offset?: number): number;
77
+ writeInt32BE(value: number, offset?: number): number;
78
+ writeInt32LE(value: number, offset?: number): number;
79
+ writeIntBE(value: number, offset: number, byteLength: number): number;
80
+ writeIntLE(value: number, offset: number, byteLength: number): number;
81
+ writeUInt8(value: number, offset?: number): number;
82
+ writeUInt16BE(value: number, offset?: number): number;
83
+ writeUInt16LE(value: number, offset?: number): number;
84
+ writeUInt32BE(value: number, offset?: number): number;
85
+ writeUInt32LE(value: number, offset?: number): number;
86
+ writeUIntBE(value: number, offset: number, byteLength: number): number;
87
+ writeUIntLE(value: number, offset: number, byteLength: number): number;
88
+
89
+ fill(value: string | Uint8Array | number, offset?: number, end?: number, encoding?: BufferEncoding): this;
90
+ indexOf(value: string | number | Uint8Array, byteOffset?: number, encoding?: BufferEncoding): number;
91
+ lastIndexOf(value: string | number | Uint8Array, byteOffset?: number, encoding?: BufferEncoding): number;
92
+ includes(value: string | number | Buffer, byteOffset?: number, encoding?: BufferEncoding): boolean;
93
+ }
94
+
95
+ type BufferEncoding = 'ascii' | 'utf8' | 'utf-8' | 'utf16le' | 'ucs2' | 'ucs-2' | 'base64' | 'base64url' | 'latin1' | 'binary' | 'hex';
96
+ }
@@ -70,7 +70,7 @@ const BottomSheet = forwardRef((props: BottomSheetProps, ref: React.ForwardedRef
70
70
  const colors = useThemeColors();
71
71
  const [visible, setVisible] = useState(false);
72
72
  const [rendered, setRendered] = useState(false); // keep mounted for exit animation
73
- const closeTimeoutRef = useRef<NodeJS.Timeout | null>(null);
73
+ const closeTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
74
74
  const hasClosedRef = useRef(false);
75
75
  const scrollViewRef = useRef<ScrollView>(null);
76
76
 
@@ -53,7 +53,7 @@ const OxyAuthScreen: React.FC<BaseScreenProps> = ({
53
53
  const [isLoading, setIsLoading] = useState(true);
54
54
  const [error, setError] = useState<string | null>(null);
55
55
  const [isPolling, setIsPolling] = useState(false);
56
- const pollingIntervalRef = useRef<NodeJS.Timeout | null>(null);
56
+ const pollingIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null);
57
57
 
58
58
  // Generate a new auth session
59
59
  const generateAuthSession = useCallback(async () => {
@@ -102,7 +102,7 @@ export function debounceAsync<T extends (...args: any[]) => Promise<any>>(
102
102
  func: T,
103
103
  delay: number
104
104
  ): (...args: Parameters<T>) => Promise<ReturnType<T>> {
105
- let timeoutId: NodeJS.Timeout;
105
+ let timeoutId: ReturnType<typeof setTimeout>;
106
106
  const lastPromise: Promise<ReturnType<T>> | null = null;
107
107
 
108
108
  return (...args: Parameters<T>): Promise<ReturnType<T>> => {
@@ -216,7 +216,7 @@ export function createCache<T>(ttl: number = 5 * 60 * 1000): TTLCache<T> {
216
216
  * Global cache cleanup interval (runs every minute)
217
217
  * This helps prevent memory leaks from expired cache entries
218
218
  */
219
- let cleanupInterval: NodeJS.Timeout | null = null;
219
+ let cleanupInterval: ReturnType<typeof setInterval> | null = null;
220
220
  const activeCaches = new Set<TTLCache<any>>();
221
221
 
222
222
  /**