mirror of
https://github.com/DocNR/POWR.git
synced 2025-04-19 10:51:19 +00:00
91 lines
2.9 KiB
TypeScript
91 lines
2.9 KiB
TypeScript
// lib/crypto-polyfill.ts
|
|
import 'react-native-get-random-values';
|
|
import * as Crypto from 'expo-crypto';
|
|
|
|
// Set up a more reliable polyfill
|
|
export function setupCryptoPolyfill() {
|
|
console.log('Setting up crypto polyfill...');
|
|
|
|
// Instead of using Object.defineProperty, let's use a different approach
|
|
try {
|
|
// First check if crypto exists and has getRandomValues
|
|
if (typeof global.crypto === 'undefined') {
|
|
(global as any).crypto = {};
|
|
}
|
|
|
|
// Only define getRandomValues if it doesn't exist or isn't working
|
|
if (!global.crypto.getRandomValues) {
|
|
console.log('Defining getRandomValues implementation');
|
|
(global.crypto as any).getRandomValues = function(array: Uint8Array) {
|
|
console.log('Custom getRandomValues called');
|
|
try {
|
|
return Crypto.getRandomBytes(array.length);
|
|
} catch (e) {
|
|
console.error('Error in getRandomValues:', e);
|
|
throw e;
|
|
}
|
|
};
|
|
}
|
|
|
|
// Test if it works
|
|
const testArray = new Uint8Array(8);
|
|
try {
|
|
const result = global.crypto.getRandomValues(testArray);
|
|
console.log('Crypto polyfill test result:', !!result);
|
|
return true;
|
|
} catch (testError) {
|
|
console.error('Crypto test failed:', testError);
|
|
return false;
|
|
}
|
|
} catch (error) {
|
|
console.error('Error setting up crypto polyfill:', error);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Also expose a monkey-patching function for the specific libraries
|
|
export function monkeyPatchNostrLibraries() {
|
|
try {
|
|
console.log('Attempting to monkey-patch nostr libraries...');
|
|
|
|
// Direct monkey patching of the randomBytes function in nostr libraries
|
|
// This is an extreme approach but might be necessary
|
|
const customRandomBytes = function(length: number): Uint8Array {
|
|
console.log('Using custom randomBytes implementation');
|
|
return Crypto.getRandomBytes(length);
|
|
};
|
|
|
|
// Try to locate and patch the randomBytes function
|
|
try {
|
|
// Try to access the module using require
|
|
const nobleHashes = require('@noble/hashes/utils');
|
|
if (nobleHashes && nobleHashes.randomBytes) {
|
|
console.log('Patching @noble/hashes/utils randomBytes');
|
|
(nobleHashes as any).randomBytes = customRandomBytes;
|
|
}
|
|
} catch (e) {
|
|
console.log('Could not patch @noble/hashes/utils:', e);
|
|
}
|
|
|
|
// Also try to patch nostr-tools if available
|
|
try {
|
|
const nostrTools = require('nostr-tools');
|
|
if (nostrTools && nostrTools.crypto && nostrTools.crypto.randomBytes) {
|
|
console.log('Patching nostr-tools crypto.randomBytes');
|
|
(nostrTools.crypto as any).randomBytes = customRandomBytes;
|
|
}
|
|
} catch (e) {
|
|
console.log('Could not patch nostr-tools:', e);
|
|
}
|
|
|
|
return true;
|
|
} catch (error) {
|
|
console.error('Error in monkey patching:', error);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Set up the polyfill
|
|
setupCryptoPolyfill();
|
|
// Try monkey patching as well
|
|
monkeyPatchNostrLibraries(); |