Skip to content

Add ArrayBuffer support for React Native TurboModules - copies data between JavaScript and native (#56689)#56689

Open
christophpurrer wants to merge 1 commit intofacebook:mainfrom
christophpurrer:export-D95649873
Open

Add ArrayBuffer support for React Native TurboModules - copies data between JavaScript and native (#56689)#56689
christophpurrer wants to merge 1 commit intofacebook:mainfrom
christophpurrer:export-D95649873

Conversation

@christophpurrer
Copy link
Copy Markdown
Contributor

@christophpurrer christophpurrer commented May 5, 2026

Summary:

Changelog:

[General] [Added] - Add ArrayBuffer support for React Native Turbo Modules

react-native-community/discussions-and-proposals#947

Adds first-class ArrayBuffer support across the entire TurboModule pipeline, enabling efficient binary data transfer between JavaScript and native code without base64 encoding overhead.

Schema & Parser:

  • Added NativeModuleArrayBufferTypeAnnotation to CodegenSchema.js and .d.ts
  • Added emitArrayBuffer to parsers-primitives.js type map

C++ (Bridging & Generator):

  • Added ArrayBufferKind to TurboModuleMethodValueKind enum
  • Created ArrayBuffer.h bridging header with OwnedMutableBuffer and Bridging<std::vector<uint8_t>>
  • Added jsi::ArrayBuffer conversion operators to Convert.h
  • Mapped ArrayBufferTypeAnnotationjsi::ArrayBuffer in GenerateModuleH.js

Android (Java/JNI):

  • Mapped ArrayBufferTypeAnnotationjava.nio.ByteBuffer in Java spec generator
  • Mapped to Ljava/nio/ByteBuffer; JNI signature in JNI generator
  • Added ByteBuffer arg/return handling in JavaTurboModule.cpp via NewDirectByteBuffer/GetDirectBufferAddress

iOS (ObjC):

  • Mapped ArrayBufferTypeAnnotationNSData * in ObjC spec generator
  • Added ArrayBuffer→NSData conversion in convertJSIValueToObjCObject()
  • Added NSData→ArrayBuffer conversion in convertReturnIdToJSIValue()

Flow-Schema:

  • Added ArrayBuffer to JAVASCRIPT_BUILTINS in BoundaryTypes.js

Tests:

  • Added Flow and TypeScript parser fixtures (NATIVE_MODULE_WITH_ARRAYBUFFER)
  • Added generator schema fixture (ARRAYBUFFER_MODULE)
  • Added emitArrayBuffer unit tests

Differential Revision: D95649873

@meta-cla meta-cla Bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label May 5, 2026
@meta-codesync
Copy link
Copy Markdown

meta-codesync Bot commented May 5, 2026

@christophpurrer has exported this pull request. If you are a Meta employee, you can view the originating Diff in D95649873.

@facebook-github-tools facebook-github-tools Bot added p: Facebook Partner: Facebook Partner labels May 5, 2026
@meta-codesync meta-codesync Bot changed the title Add ArrayBuffer support for React Native TurboModules - copies data between JavaScript and native Add ArrayBuffer support for React Native TurboModules - copies data between JavaScript and native (#56689) May 5, 2026
christophpurrer added a commit to christophpurrer/react-native-macos that referenced this pull request May 5, 2026
…etween JavaScript and native (facebook#56689)

Summary:
Pull Request resolved: facebook#56689

## Changelog:
[General] [Added] - Add ArrayBuffer support for React Native Turbo Modules

react-native-community/discussions-and-proposals#947

Adds first-class `ArrayBuffer` support across the entire TurboModule pipeline, enabling efficient binary data transfer between JavaScript and native code without base64 encoding overhead.

**Schema & Parser:**
- Added `NativeModuleArrayBufferTypeAnnotation` to `CodegenSchema.js` and `.d.ts`
- Added `emitArrayBuffer` to `parsers-primitives.js` type map

**C++ (Bridging & Generator):**
- Added `ArrayBufferKind` to `TurboModuleMethodValueKind` enum
- Created `ArrayBuffer.h` bridging header with `OwnedMutableBuffer` and `Bridging<std::vector<uint8_t>>`
- Added `jsi::ArrayBuffer` conversion operators to `Convert.h`
- Mapped `ArrayBufferTypeAnnotation` → `jsi::ArrayBuffer` in `GenerateModuleH.js`

**Android (Java/JNI):**
- Mapped `ArrayBufferTypeAnnotation` → `java.nio.ByteBuffer` in Java spec generator
- Mapped to `Ljava/nio/ByteBuffer;` JNI signature in JNI generator
- Added `ByteBuffer` arg/return handling in `JavaTurboModule.cpp` via `NewDirectByteBuffer`/`GetDirectBufferAddress`

**iOS (ObjC):**
- Mapped `ArrayBufferTypeAnnotation` → `NSData *` in ObjC spec generator
- Added ArrayBuffer→NSData conversion in `convertJSIValueToObjCObject()`
- Added NSData→ArrayBuffer conversion in `convertReturnIdToJSIValue()`

**Flow-Schema:**
- Added `ArrayBuffer` to `JAVASCRIPT_BUILTINS` in `BoundaryTypes.js`

**Tests:**
- Added Flow and TypeScript parser fixtures (`NATIVE_MODULE_WITH_ARRAYBUFFER`)
- Added generator schema fixture (`ARRAYBUFFER_MODULE`)
- Added `emitArrayBuffer` unit tests

Differential Revision: D95649873
…etween JavaScript and native (facebook#56689)

Summary:
Pull Request resolved: facebook#56689

## Changelog:
[General] [Added] - Add ArrayBuffer support for React Native Turbo Modules

react-native-community/discussions-and-proposals#947

Adds first-class `ArrayBuffer` support across the entire TurboModule pipeline, enabling efficient binary data transfer between JavaScript and native code without base64 encoding overhead.

**Schema & Parser:**
- Added `NativeModuleArrayBufferTypeAnnotation` to `CodegenSchema.js` and `.d.ts`
- Added `emitArrayBuffer` to `parsers-primitives.js` type map

**C++ (Bridging & Generator):**
- Added `ArrayBufferKind` to `TurboModuleMethodValueKind` enum
- Created `ArrayBuffer.h` bridging header with `OwnedMutableBuffer` and `Bridging<std::vector<uint8_t>>`
- Added `jsi::ArrayBuffer` conversion operators to `Convert.h`
- Mapped `ArrayBufferTypeAnnotation` → `jsi::ArrayBuffer` in `GenerateModuleH.js`

**Android (Java/JNI):**
- Mapped `ArrayBufferTypeAnnotation` → `java.nio.ByteBuffer` in Java spec generator
- Mapped to `Ljava/nio/ByteBuffer;` JNI signature in JNI generator
- Added `ByteBuffer` arg/return handling in `JavaTurboModule.cpp` via `NewDirectByteBuffer`/`GetDirectBufferAddress`

**iOS (ObjC):**
- Mapped `ArrayBufferTypeAnnotation` → `NSData *` in ObjC spec generator
- Added ArrayBuffer→NSData conversion in `convertJSIValueToObjCObject()`
- Added NSData→ArrayBuffer conversion in `convertReturnIdToJSIValue()`

**Flow-Schema:**
- Added `ArrayBuffer` to `JAVASCRIPT_BUILTINS` in `BoundaryTypes.js`

**Tests:**
- Added Flow and TypeScript parser fixtures (`NATIVE_MODULE_WITH_ARRAYBUFFER`)
- Added generator schema fixture (`ARRAYBUFFER_MODULE`)
- Added `emitArrayBuffer` unit tests

Differential Revision: D95649873
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. fb-exported meta-exported p: Facebook Partner: Facebook Partner

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant