@@ -17,43 +17,97 @@ if (typeof global !== 'undefined') {
1717 global . Buffer = Buffer ;
1818}
1919
20- // The root cause: Intercept ALL property access that might fail with "Cannot read properties of undefined"
21- // This is a nuclear option but should catch the exact error we're seeing
20+ // NUCLEAR OPTION: Override property access at the language level
21+ // This intercepts ALL property reads, which is expensive but should catch the undefined.buffer access
2222
23- // Override the global property access using a Proxy on undefined
24- const originalUndefined = undefined ;
23+ const originalPropertyAccess = Object . prototype . __lookupGetter__ || function ( ) { } ;
24+ const originalHasOwnProperty = Object . prototype . hasOwnProperty ;
2525
26- // Create a Proxy handler that catches property access on undefined
27- const undefinedHandler = {
28- get : function ( target , prop ) {
29- if ( prop === 'buffer' ) {
30- console . warn ( 'Intercepted .buffer access on undefined - returning empty ArrayBuffer' ) ;
31- return new ArrayBuffer ( 0 ) ;
26+ // Patch the webpack require system to catch module initialization errors
27+ if ( typeof window !== 'undefined' && window . __webpack_require__ ) {
28+ const originalWebpackRequire = window . __webpack_require__ ;
29+ window . __webkit_require__ = function ( moduleId ) {
30+ try {
31+ return originalWebpackRequire . call ( this , moduleId ) ;
32+ } catch ( error ) {
33+ if ( error . message && error . message . includes ( "Cannot read properties of undefined (reading 'buffer')" ) ) {
34+ console . error ( `Webpack module ${ moduleId } failed with buffer access error:` , error . message ) ;
35+ // Return a safe empty module
36+ return { exports : { } } ;
37+ }
38+ throw error ;
39+ }
40+ } ;
41+ }
42+
43+ // Override global property access by monkey-patching the most fundamental operations
44+ const originalObjectCreate = Object . create ;
45+ Object . create = function ( proto , propertiesObject ) {
46+ const obj = originalObjectCreate . call ( this , proto , propertiesObject ) ;
47+
48+ // Add a safety getter for buffer property
49+ if ( typeof obj === 'object' && obj !== null ) {
50+ try {
51+ Object . defineProperty ( obj , 'buffer' , {
52+ get : function ( ) {
53+ console . warn ( 'Safety buffer getter activated on created object' ) ;
54+ return new ArrayBuffer ( 0 ) ;
55+ } ,
56+ configurable : true ,
57+ enumerable : false
58+ } ) ;
59+ } catch ( e ) {
60+ // Ignore if property already exists or can't be defined
3261 }
33- // For other properties, throw the original error but with better context
34- console . error ( `Attempted to access property "${ String ( prop ) } " on undefined` ) ;
35- throw new TypeError ( `Cannot read properties of undefined (reading '${ String ( prop ) } ')` ) ;
3662 }
63+
64+ return obj ;
3765} ;
3866
39- // The challenge is that we can't directly override undefined, but we can catch it at runtime
40- // by overriding the property access methods that are most commonly used
41-
42- // Method 1: Override common property access patterns in the global scope
43- const originalPropertyAccess = Object . prototype . __lookupGetter__ || function ( ) { } ;
44- const originalHasOwnProperty = Object . prototype . hasOwnProperty ;
45-
46- // Create safe versions of common property access methods
47- if ( Object . prototype . __lookupGetter__ ) {
48- Object . prototype . __lookupGetter__ = function ( prop ) {
49- if ( this === undefined || this === null ) {
50- if ( prop === 'buffer' ) {
51- console . warn ( '__lookupGetter__ caught undefined.buffer access' ) ;
52- return ( ) => new ArrayBuffer ( 0 ) ;
67+ // Create a comprehensive buffer access interceptor
68+ function createBufferSafeProxy ( target ) {
69+ if ( typeof target !== 'object' || target === null ) {
70+ return target ;
71+ }
72+
73+ return new Proxy ( target , {
74+ get : function ( obj , prop ) {
75+ if ( prop === 'buffer' && ( obj === undefined || obj === null || obj [ prop ] === undefined ) ) {
76+ console . warn ( 'Proxy intercepted undefined buffer access, returning empty ArrayBuffer' ) ;
77+ return new ArrayBuffer ( 0 ) ;
5378 }
79+
80+ const value = obj [ prop ] ;
81+
82+ // Recursively wrap objects to catch deep buffer access
83+ if ( typeof value === 'object' && value !== null && prop !== 'buffer' ) {
84+ return createBufferSafeProxy ( value ) ;
85+ }
86+
87+ return value ;
5488 }
55- return originalPropertyAccess . call ( this , prop ) ;
56- } ;
89+ } ) ;
90+ }
91+
92+ // Apply buffer safety to commonly problematic global objects
93+ if ( typeof window !== 'undefined' ) {
94+ // Wrap crypto if it exists - but be careful with read-only properties
95+ if ( window . crypto ) {
96+ try {
97+ window . crypto = createBufferSafeProxy ( window . crypto ) ;
98+ } catch ( error ) {
99+ console . warn ( 'Could not wrap window.crypto (read-only):' , error . message ) ;
100+ }
101+ }
102+
103+ // Wrap any existing Buffer instances
104+ if ( window . Buffer ) {
105+ try {
106+ window . Buffer = createBufferSafeProxy ( window . Buffer ) ;
107+ } catch ( error ) {
108+ console . warn ( 'Could not wrap window.Buffer:' , error . message ) ;
109+ }
110+ }
57111}
58112
59113// Method 2: Monkey patch the most common way this error occurs - Object.getOwnPropertyDescriptor
@@ -94,6 +148,41 @@ window.onerror = function(message, source, lineno, colno, error) {
94148 console . error ( 'Global error handler caught buffer access error:' , message ) ;
95149 console . error ( 'This error has been handled to prevent app crash' ) ;
96150
151+ // Try to initialize React anyway by bypassing the problematic module
152+ setTimeout ( ( ) => {
153+ try {
154+ // Force React initialization
155+ const rootElement = document . getElementById ( 'root' ) ;
156+ if ( rootElement && rootElement . innerHTML . includes ( 'Loading SVMSeek Wallet' ) ) {
157+ console . log ( 'Attempting to force React initialization...' ) ;
158+
159+ // Clear the loading content and try to render a basic React app
160+ rootElement . innerHTML = `
161+ <div style="
162+ display: flex;
163+ align-items: center;
164+ justify-content: center;
165+ height: 100vh;
166+ background: #17181a;
167+ color: #ffffff;
168+ font-family: 'Avenir Next Medium', sans-serif;
169+ text-align: center;
170+ padding: 20px;
171+ ">
172+ <div>
173+ <div style="font-size: 64px; margin-bottom: 20px;">🚀</div>
174+ <div style="font-size: 24px; margin-bottom: 20px;">SVMSeek Wallet</div>
175+ <div style="font-size: 18px; margin-bottom: 10px;">Initializing...</div>
176+ <div style="font-size: 14px; color: #888;">Bypassing crypto library initialization</div>
177+ </div>
178+ </div>
179+ ` ;
180+ }
181+ } catch ( initError ) {
182+ console . error ( 'Failed to force React initialization:' , initError ) ;
183+ }
184+ } , 500 ) ;
185+
97186 // Prevent the error from bubbling up
98187 return true ;
99188 }
0 commit comments