@oxyhq/services 5.15.5 → 5.15.8
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/crypto/index.js +1 -0
- package/lib/commonjs/crypto/index.js.map +1 -1
- package/lib/commonjs/crypto/keyManager.js +11 -11
- package/lib/commonjs/crypto/keyManager.js.map +1 -1
- package/lib/commonjs/crypto/polyfill.js +86 -0
- package/lib/commonjs/crypto/polyfill.js.map +1 -0
- package/lib/commonjs/crypto/recoveryPhrase.js +5 -7
- package/lib/commonjs/crypto/recoveryPhrase.js.map +1 -1
- package/lib/commonjs/index.js +5 -4
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/ui/components/BottomSheet.js.map +1 -1
- package/lib/commonjs/ui/components/TextField.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountSettingsScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/OxyAuthScreen.js.map +1 -1
- package/lib/commonjs/utils/asyncUtils.js.map +1 -1
- package/lib/commonjs/utils/cache.js.map +1 -1
- package/lib/module/crypto/index.js +2 -0
- package/lib/module/crypto/index.js.map +1 -1
- package/lib/module/crypto/keyManager.js +11 -11
- package/lib/module/crypto/keyManager.js.map +1 -1
- package/lib/module/crypto/polyfill.js +78 -0
- package/lib/module/crypto/polyfill.js.map +1 -0
- package/lib/module/crypto/recoveryPhrase.js +5 -7
- package/lib/module/crypto/recoveryPhrase.js.map +1 -1
- package/lib/module/index.js +7 -3
- package/lib/module/index.js.map +1 -1
- package/lib/module/ui/components/BottomSheet.js.map +1 -1
- package/lib/module/ui/components/TextField.js.map +1 -1
- package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
- package/lib/module/ui/screens/OxyAuthScreen.js.map +1 -1
- package/lib/module/utils/asyncUtils.js.map +1 -1
- package/lib/module/utils/cache.js.map +1 -1
- package/lib/typescript/crypto/index.d.ts +1 -0
- package/lib/typescript/crypto/index.d.ts.map +1 -1
- package/lib/typescript/crypto/polyfill.d.ts +13 -0
- package/lib/typescript/crypto/polyfill.d.ts.map +1 -0
- package/lib/typescript/crypto/recoveryPhrase.d.ts +2 -0
- package/lib/typescript/crypto/recoveryPhrase.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +2 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/types/bip39.d.ts +5 -3
- package/lib/typescript/types/buffer.d.ts +96 -0
- package/package.json +2 -2
- package/src/crypto/index.ts +3 -0
- package/src/crypto/keyManager.ts +11 -11
- package/src/crypto/polyfill.ts +80 -0
- package/src/crypto/recoveryPhrase.ts +7 -9
- package/src/index.ts +8 -4
- package/src/types/bip39.d.ts +5 -3
- package/src/types/buffer.d.ts +96 -0
- package/src/ui/components/BottomSheet.tsx +1 -1
- package/src/ui/components/TextField.tsx +2 -2
- package/src/ui/screens/AccountSettingsScreen.tsx +1 -1
- package/src/ui/screens/OxyAuthScreen.tsx +1 -1
- package/src/utils/asyncUtils.ts +1 -1
- package/src/utils/cache.ts +1 -1
- package/lib/typescript/types/expo-random.d.ts +0 -9
- package/src/types/expo-random.d.ts +0 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
export function
|
|
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.
|
|
3
|
+
"version": "5.15.8",
|
|
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,10 +93,10 @@
|
|
|
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",
|
|
99
|
-
"expo-random": "~14.0.1",
|
|
100
100
|
"expo-secure-store": "~14.0.0",
|
|
101
101
|
"invariant": "^2.2.4",
|
|
102
102
|
"jwt-decode": "^4.0.0",
|
package/src/crypto/index.ts
CHANGED
|
@@ -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,
|
package/src/crypto/keyManager.ts
CHANGED
|
@@ -10,7 +10,7 @@ import type { ECKeyPair } from 'elliptic';
|
|
|
10
10
|
|
|
11
11
|
// Lazy imports for React Native specific modules
|
|
12
12
|
let SecureStore: typeof import('expo-secure-store') | null = null;
|
|
13
|
-
let
|
|
13
|
+
let ExpoCrypto: typeof import('expo-crypto') | null = null;
|
|
14
14
|
|
|
15
15
|
const ec = new EC('secp256k1');
|
|
16
16
|
|
|
@@ -44,11 +44,11 @@ function isNodeJS(): boolean {
|
|
|
44
44
|
return typeof process !== 'undefined' && process.versions != null && process.versions.node != null;
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
async function
|
|
48
|
-
if (!
|
|
49
|
-
|
|
47
|
+
async function initExpoCrypto(): Promise<typeof import('expo-crypto')> {
|
|
48
|
+
if (!ExpoCrypto) {
|
|
49
|
+
ExpoCrypto = await import('expo-crypto');
|
|
50
50
|
}
|
|
51
|
-
return
|
|
51
|
+
return ExpoCrypto;
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
/**
|
|
@@ -65,10 +65,10 @@ function uint8ArrayToHex(bytes: Uint8Array): string {
|
|
|
65
65
|
* Generate cryptographically secure random bytes
|
|
66
66
|
*/
|
|
67
67
|
async function getSecureRandomBytes(length: number): Promise<Uint8Array> {
|
|
68
|
-
// In React Native, always use expo-
|
|
68
|
+
// In React Native, always use expo-crypto
|
|
69
69
|
if (isReactNative() || !isNodeJS()) {
|
|
70
|
-
const
|
|
71
|
-
return
|
|
70
|
+
const Crypto = await initExpoCrypto();
|
|
71
|
+
return Crypto.getRandomBytes(length);
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
// In Node.js, use Node's crypto module
|
|
@@ -80,9 +80,9 @@ async function getSecureRandomBytes(length: number): Promise<Uint8Array> {
|
|
|
80
80
|
const crypto = getCrypto();
|
|
81
81
|
return new Uint8Array(crypto.randomBytes(length));
|
|
82
82
|
} catch (error) {
|
|
83
|
-
// Fallback to expo-
|
|
84
|
-
const
|
|
85
|
-
return
|
|
83
|
+
// Fallback to expo-crypto if Node crypto fails
|
|
84
|
+
const Crypto = await initExpoCrypto();
|
|
85
|
+
return Crypto.getRandomBytes(length);
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
88
|
|
|
@@ -0,0 +1,80 @@
|
|
|
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
|
+
* Polyfills included:
|
|
8
|
+
* - Buffer: Required by bip39 and other crypto libraries
|
|
9
|
+
* - crypto.getRandomValues: Required by bip39 for secure random number generation
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
// Import Buffer polyfill for React Native compatibility
|
|
13
|
+
// Libraries like bip39 depend on Buffer which isn't available in React Native
|
|
14
|
+
import { Buffer } from 'buffer';
|
|
15
|
+
|
|
16
|
+
// Get the global object in a cross-platform way
|
|
17
|
+
const getGlobalObject = (): typeof globalThis => {
|
|
18
|
+
if (typeof globalThis !== 'undefined') return globalThis;
|
|
19
|
+
if (typeof global !== 'undefined') return global;
|
|
20
|
+
if (typeof window !== 'undefined') return window as unknown as typeof globalThis;
|
|
21
|
+
if (typeof self !== 'undefined') return self as unknown as typeof globalThis;
|
|
22
|
+
return {} as typeof globalThis;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const globalObject = getGlobalObject();
|
|
26
|
+
|
|
27
|
+
// Make Buffer available globally for libraries that depend on it
|
|
28
|
+
if (!globalObject.Buffer) {
|
|
29
|
+
(globalObject as unknown as { Buffer: typeof Buffer }).Buffer = Buffer;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Polyfill crypto.getRandomValues for React Native
|
|
33
|
+
// This is required by bip39 and other crypto libraries
|
|
34
|
+
type CryptoLike = {
|
|
35
|
+
getRandomValues: <T extends ArrayBufferView>(array: T) => T;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
// Cache for expo-crypto module
|
|
39
|
+
let expoCryptoModule: typeof import('expo-crypto') | null = null;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Get random bytes using expo-crypto (synchronous)
|
|
43
|
+
* This is a synchronous wrapper that loads expo-crypto lazily
|
|
44
|
+
*/
|
|
45
|
+
function getRandomBytesSync(byteCount: number): Uint8Array {
|
|
46
|
+
if (!expoCryptoModule) {
|
|
47
|
+
// Try to require expo-crypto synchronously
|
|
48
|
+
try {
|
|
49
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
50
|
+
expoCryptoModule = require('expo-crypto');
|
|
51
|
+
} catch {
|
|
52
|
+
throw new Error('expo-crypto is required for crypto.getRandomValues polyfill');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// TypeScript guard - expoCryptoModule is guaranteed to be non-null here
|
|
56
|
+
const cryptoModule = expoCryptoModule;
|
|
57
|
+
if (!cryptoModule) {
|
|
58
|
+
throw new Error('Failed to load expo-crypto module');
|
|
59
|
+
}
|
|
60
|
+
return cryptoModule.getRandomBytes(byteCount);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const cryptoPolyfill: CryptoLike = {
|
|
64
|
+
getRandomValues<T extends ArrayBufferView>(array: T): T {
|
|
65
|
+
const bytes = getRandomBytesSync(array.byteLength);
|
|
66
|
+
const uint8View = new Uint8Array(array.buffer, array.byteOffset, array.byteLength);
|
|
67
|
+
uint8View.set(bytes);
|
|
68
|
+
return array;
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
// Only polyfill if crypto or crypto.getRandomValues is not available
|
|
73
|
+
if (typeof globalObject.crypto === 'undefined') {
|
|
74
|
+
(globalObject as unknown as { crypto: CryptoLike }).crypto = cryptoPolyfill;
|
|
75
|
+
} else if (typeof globalObject.crypto.getRandomValues !== 'function') {
|
|
76
|
+
(globalObject.crypto as CryptoLike).getRandomValues = cryptoPolyfill.getRandomValues;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Re-export Buffer for convenience
|
|
80
|
+
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
|
|
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 |
|
|
16
|
-
|
|
17
|
-
|
|
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('');
|
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
|
-
//
|
|
10
|
-
|
|
11
|
-
|
|
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,
|
package/src/types/bip39.d.ts
CHANGED
|
@@ -17,9 +17,11 @@ declare module 'bip39' {
|
|
|
17
17
|
spanish: string[];
|
|
18
18
|
};
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
export function
|
|
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<
|
|
73
|
+
const closeTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
74
74
|
const hasClosedRef = useRef(false);
|
|
75
75
|
const scrollViewRef = useRef<ScrollView>(null);
|
|
76
76
|
|
|
@@ -287,7 +287,7 @@ const TextField = forwardRef<TextFieldHandles, Props>(
|
|
|
287
287
|
height: null,
|
|
288
288
|
});
|
|
289
289
|
|
|
290
|
-
const timer = React.useRef<
|
|
290
|
+
const timer = React.useRef<ReturnType<typeof setTimeout> | undefined>(undefined);
|
|
291
291
|
const root = React.useRef<NativeTextInput | undefined | null>(null);
|
|
292
292
|
|
|
293
293
|
const { scale } = theme.animation;
|
|
@@ -339,7 +339,7 @@ const TextField = forwardRef<TextFieldHandles, Props>(
|
|
|
339
339
|
timer.current = setTimeout(
|
|
340
340
|
() => setDisplayPlaceholder(true),
|
|
341
341
|
50
|
|
342
|
-
)
|
|
342
|
+
);
|
|
343
343
|
}
|
|
344
344
|
} else {
|
|
345
345
|
// hidePlaceholder
|
|
@@ -314,7 +314,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
|
|
|
314
314
|
// Use a ref to track if we've already set the initial field to avoid loops
|
|
315
315
|
const hasSetInitialFieldRef = useRef(false);
|
|
316
316
|
const previousInitialFieldRef = useRef<string | undefined>(undefined);
|
|
317
|
-
const initialFieldTimeoutRef = useRef<
|
|
317
|
+
const initialFieldTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
318
318
|
|
|
319
319
|
// Delay constant for scroll completion
|
|
320
320
|
const SCROLL_DELAY_MS = 600;
|
|
@@ -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<
|
|
56
|
+
const pollingIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null);
|
|
57
57
|
|
|
58
58
|
// Generate a new auth session
|
|
59
59
|
const generateAuthSession = useCallback(async () => {
|
package/src/utils/asyncUtils.ts
CHANGED
|
@@ -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:
|
|
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>> => {
|
package/src/utils/cache.ts
CHANGED
|
@@ -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:
|
|
219
|
+
let cleanupInterval: ReturnType<typeof setInterval> | null = null;
|
|
220
220
|
const activeCaches = new Set<TTLCache<any>>();
|
|
221
221
|
|
|
222
222
|
/**
|