From f737300dd0881b0344b4ba2e2a88710734530c07 Mon Sep 17 00:00:00 2001 From: chmjkb Date: Sat, 24 Jan 2026 12:40:12 +0100 Subject: [PATCH 1/2] fix: ensure controller is ready before calling delete --- .../src/hooks/computer_vision/useOCR.ts | 4 +++- .../src/hooks/computer_vision/useVerticalOCR.ts | 4 +++- .../src/hooks/natural_language_processing/useLLM.ts | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/react-native-executorch/src/hooks/computer_vision/useOCR.ts b/packages/react-native-executorch/src/hooks/computer_vision/useOCR.ts index 1790023c3..8ab83d2c4 100644 --- a/packages/react-native-executorch/src/hooks/computer_vision/useOCR.ts +++ b/packages/react-native-executorch/src/hooks/computer_vision/useOCR.ts @@ -50,7 +50,9 @@ export const useOCR = ({ })(); return () => { - controllerInstance.delete(); + if (controllerInstance.isReady) { + controllerInstance.delete(); + } }; }, [ controllerInstance, diff --git a/packages/react-native-executorch/src/hooks/computer_vision/useVerticalOCR.ts b/packages/react-native-executorch/src/hooks/computer_vision/useVerticalOCR.ts index bf7da6e03..acd7c627e 100644 --- a/packages/react-native-executorch/src/hooks/computer_vision/useVerticalOCR.ts +++ b/packages/react-native-executorch/src/hooks/computer_vision/useVerticalOCR.ts @@ -53,7 +53,9 @@ export const useVerticalOCR = ({ })(); return () => { - controllerInstance.delete(); + if (controllerInstance.isReady) { + controllerInstance.delete(); + } }; }, [ controllerInstance, diff --git a/packages/react-native-executorch/src/hooks/natural_language_processing/useLLM.ts b/packages/react-native-executorch/src/hooks/natural_language_processing/useLLM.ts index 23882e65c..852441556 100644 --- a/packages/react-native-executorch/src/hooks/natural_language_processing/useLLM.ts +++ b/packages/react-native-executorch/src/hooks/natural_language_processing/useLLM.ts @@ -68,7 +68,9 @@ export const useLLM = ({ })(); return () => { - controllerInstance.delete(); + if (controllerInstance.isReady) { + controllerInstance.delete(); + } }; }, [ controllerInstance, From bcb7a46869ea9c12252b5dcdb32228050168d6d8 Mon Sep 17 00:00:00 2001 From: chmjkb Date: Mon, 26 Jan 2026 09:05:05 +0100 Subject: [PATCH 2/2] fix: add a null-check for nativemodule in controllers --- .../src/controllers/LLMController.ts | 16 +++++++++++++++- .../src/controllers/OCRController.ts | 4 +++- .../src/controllers/VerticalOCRController.ts | 4 +++- .../src/hooks/computer_vision/useOCR.ts | 4 +--- .../src/hooks/computer_vision/useVerticalOCR.ts | 4 +--- 5 files changed, 23 insertions(+), 9 deletions(-) diff --git a/packages/react-native-executorch/src/controllers/LLMController.ts b/packages/react-native-executorch/src/controllers/LLMController.ts index 7dcc51528..6be8d6fc9 100644 --- a/packages/react-native-executorch/src/controllers/LLMController.ts +++ b/packages/react-native-executorch/src/controllers/LLMController.ts @@ -215,7 +215,9 @@ export class LLMController { ); } this.onToken = () => {}; - this.nativeModule.unload(); + if (this.nativeModule) { + this.nativeModule.unload(); + } this.isReadyCallback(false); this.isGeneratingCallback(false); } @@ -245,10 +247,22 @@ export class LLMController { } public interrupt() { + if (!this.nativeModule) { + throw new RnExecutorchError( + RnExecutorchErrorCode.ModuleNotLoaded, + "Cannot interrupt a model that's not loaded." + ); + } this.nativeModule.interrupt(); } public getGeneratedTokenCount(): number { + if (!this.nativeModule) { + throw new RnExecutorchError( + RnExecutorchErrorCode.ModuleNotLoaded, + "Cannot get token count for a model that's not loaded." + ); + } return this.nativeModule.getGeneratedTokenCount(); } diff --git a/packages/react-native-executorch/src/controllers/OCRController.ts b/packages/react-native-executorch/src/controllers/OCRController.ts index 4cac5d891..57f1e3489 100644 --- a/packages/react-native-executorch/src/controllers/OCRController.ts +++ b/packages/react-native-executorch/src/controllers/OCRController.ts @@ -103,7 +103,9 @@ export class OCRController { 'The model is currently generating. Please wait until previous model run is complete.' ); } - this.nativeModule.unload(); + if (this.nativeModule) { + this.nativeModule.unload(); + } this.isReadyCallback(false); this.isGeneratingCallback(false); } diff --git a/packages/react-native-executorch/src/controllers/VerticalOCRController.ts b/packages/react-native-executorch/src/controllers/VerticalOCRController.ts index 73ea54429..eaf4b0849 100644 --- a/packages/react-native-executorch/src/controllers/VerticalOCRController.ts +++ b/packages/react-native-executorch/src/controllers/VerticalOCRController.ts @@ -106,7 +106,9 @@ export class VerticalOCRController { 'The model is currently generating. Please wait until previous model run is complete.' ); } - this.ocrNativeModule.unload(); + if (this.ocrNativeModule) { + this.ocrNativeModule.unload(); + } this.isReadyCallback(false); this.isGeneratingCallback(false); } diff --git a/packages/react-native-executorch/src/hooks/computer_vision/useOCR.ts b/packages/react-native-executorch/src/hooks/computer_vision/useOCR.ts index 8ab83d2c4..1790023c3 100644 --- a/packages/react-native-executorch/src/hooks/computer_vision/useOCR.ts +++ b/packages/react-native-executorch/src/hooks/computer_vision/useOCR.ts @@ -50,9 +50,7 @@ export const useOCR = ({ })(); return () => { - if (controllerInstance.isReady) { - controllerInstance.delete(); - } + controllerInstance.delete(); }; }, [ controllerInstance, diff --git a/packages/react-native-executorch/src/hooks/computer_vision/useVerticalOCR.ts b/packages/react-native-executorch/src/hooks/computer_vision/useVerticalOCR.ts index acd7c627e..bf7da6e03 100644 --- a/packages/react-native-executorch/src/hooks/computer_vision/useVerticalOCR.ts +++ b/packages/react-native-executorch/src/hooks/computer_vision/useVerticalOCR.ts @@ -53,9 +53,7 @@ export const useVerticalOCR = ({ })(); return () => { - if (controllerInstance.isReady) { - controllerInstance.delete(); - } + controllerInstance.delete(); }; }, [ controllerInstance,