iOS: emitOnBrownfieldMessage: can crash with std::bad_function_call when native posts before JS requires the TurboModule (cold-start race)
I maintainer di solito rispondono entro 4 giorni
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 48/100
- Tipo di issue
- Bug
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Tranquilla
- Stack tecnologico
- cpp, ios, objective-c, react-native
- Ambito
- api, mobile-dev
Direzione di ricerca
Inizia in ReactNativeBrownfieldModule.mm con -handleNativeToJSMessage: e +emitMessageFromNative:, quindi segui emitOnBrownfieldMessage: fino all’inizializzazione del callback di SpecBase generato. Riproduci o strumenta un post nativo prima che JS richieda il TurboModule e verifica che questo percorso di avvio a freddo non vada più in crash quando il callback non è disponibile.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
ReactNativeBrownfieldModule.mm's +emitMessageFromNative: only checks that the Obj-C singleton exists before calling emitOnBrownfieldMessage::
+ (void)emitMessageFromNative:(NSString *)message {
if (_sharedInstance) {
[_sharedInstance emitOnBrownfieldMessage:@{ @"text": message }];
} else {
NSLog(@"ReactNativeBrownfieldModule is not initialized, dropping message");
}
}
_sharedInstance is set in -init, which runs as soon as the bridge/TurboModuleManager instantiates the Obj-C module. But the codegen SpecBase's _eventEmitterCallback (the std::function that emitOnBrownfieldMessage: invokes) is only populated inside the C++ SpecJSI constructor, which only runs when getTurboModule: fires — i.e. when JS actually evaluates TurboModuleRegistry.getEnforcing('ReactNativeBrownfield').
If a host app calls ReactNativeBrownfield.shared.postMessage(...) (→ posts BrownfieldMessageToJSNotification → handleNativeToJSMessage: → emitMessageFromNative:) after the Obj-C module exists but before JS has required the module — e.g. right as a hosting view controller's viewDidAppear fires on a cold app launch, racing bundle evaluation — _eventEmitterCallback is still empty, and calling it throws std::bad_function_call, crashing the whole app (uncaught C++ exception).
Confirmed still present on main (4.0.0) as of 2026-07-06 — emitMessageFromNative:'s guard is unchanged from what's below (also reproduced against 3.3.0 in our own app):
- (void)handleNativeToJSMessage:(NSNotification *)notification {
NSString *message = notification.userInfo[@"message"];
if (message) {
[ReactNativeBrownfieldModule emitMessageFromNative:message];
}
}
Suggested fixes
- Wrap the
_eventEmitterCallbackinvocation in a readiness check (or try/catch) inside the generatedemitOnBrownfieldMessage:, or - Expose a callback/promise so host apps can gate native→JS
postMessagecalls on "TurboModule ready" rather than just "bundle loaded" (the closest signalstartReactNative(onBundleLoaded:)currently offers).
Repro
Timing-dependent — we haven't produced a deterministic repro case, but the code path is unambiguous from source, and we hit it in production (Crashlytics, std::__1::bad_function_call: std::exception, 100% of occurrences within the first second of a session). Happy to share a sanitized stack trace if useful.
Environment
@callstack/react-native-brownfield: 3.3.0 (also read againstmain/4.0.0 source)- iOS 26.x, React Native new architecture (TurboModules/Fabric)
- Lingua principale
- TypeScript
- Stelle
- 552
- Fork
- 53
- Merge medio
- 5g 9h
- PR unite (30g)
- 17
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di callstack/react-native-brownfield
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 55/100
callstack/react-native-brownfield#468 ·
I maintainer di solito rispondono entro 4 giorni
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 38/100
callstack/react-native-brownfield#406 ·
I maintainer di solito rispondono entro 4 giorni
-
Common network layerForse di nuovo libera @dratwas l’ha presa 2537 giorni fa e non c’è nessuna pull request aperta. Aperta
callstack/react-native-brownfield#23 · 1 assegnatario ·
I maintainer di solito rispondono entro 4 giorni
-
Add support for bottom tabsForse di nuovo libera @krizzu l’ha presa 2537 giorni fa e non c’è nessuna pull request aperta. Aperta
callstack/react-native-brownfield#22 · 1 assegnatario ·
I maintainer di solito rispondono entro 4 giorni
-
Tests for libraryAperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 42/100
callstack/react-native-brownfield#11 · 2 commenti ·
I maintainer di solito rispondono entro 4 giorni
Tutte le issue di callstack/react-native-brownfield
Issue simili
-
area: desktop area: website priority: P2 type: feature
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
appandflow/stim#3411 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
needs triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
rjsf-team/react-jsonschema-form#5485 ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
I maintainer di solito rispondono entro 1 giorno
-
community first-timers-only good first issue hacktoberfest help wanted low hanging fruit up-for-grabs
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 65/100
lingdojo/kana-dojo#32090 · 1 commento · 5 reazioni ·
I maintainer di solito rispondono entro 1 giorno
-
Friction: Org home and org switcher copy still say repositories and connected agents live in the personal accountForse già presa Una pull request collegata a questa issue è aperta o già unita. Apertafriction
Difficoltà 2/5 1-3 ore Idoneità per principianti 80/100
kentcdodds/kody#3265 ·
I maintainer di solito rispondono entro 1 giorno