Choose the module boundary and ownership model
Prerequisites: 11-module-queues, 12-platform-lifecycle
Decision map
Baseline synthesis
List each native capability as a synchronous query, asynchronous operation, stream or view. Identify payload size, required thread, resource owner and platform-specific failure paths.
[S09] [S11] [S12]Choice verified
Use Expo Modules for concise Swift/Kotlin modules and lifecycle/type conversion helpers; use TurboModules for RN Codegen or direct C++ needs; use a Fabric/Expo native View for visual surfaces. SharedObject can expose long-lived native instances where appropriate.
[S10] [S11] [S13]Trade-off synthesis
Every abstraction carries dependency and API-shape choices. Direct JSI maximizes control but makes thread, conversion and lifetime responsibilities more explicit. Benchmark only after a concrete bottleneck appears.
[S04] [S11] [S13]Validation synthesis
Build both platforms, exercise cancellation and lifecycle, measure repeated call/event flows, and ensure native resources release when no JS/native reference remains.
[S12] [S13]Check yourself: When is a SharedObject useful?
When a long-lived native instance such as a decoder or database context should be referenced from JS without repeatedly recreating it.