diff --git a/packages/react-native-nitro-modules/ios/core/ArrayBufferHolder.swift b/packages/react-native-nitro-modules/ios/core/ArrayBufferHolder.swift index ef75ff645..d15e88bc9 100644 --- a/packages/react-native-nitro-modules/ios/core/ArrayBufferHolder.swift +++ b/packages/react-native-nitro-modules/ios/core/ArrayBufferHolder.swift @@ -46,7 +46,7 @@ public extension ArrayBufferHolder { } return ArrayBufferHolder.makeBuffer(data, size, deleteFunc) } - + /** * Copy the given `ArrayBufferHolder` into a new **owning** `ArrayBufferHolder`. */ @@ -60,4 +60,14 @@ public extension ArrayBufferHolder { } return ArrayBufferHolder.makeBuffer(data, other.size, deleteFunc) } + + /** + * Copy the given `Data` into a new **owning** `ArrayBufferHolder`. + */ + static func copy(data: Data) throws -> ArrayBufferHolder { + let pointer = try UnsafeMutablePointer.init(copyData: data) + return .wrap(dataWithoutCopy: pointer, size: data.count) { + pointer.deallocate() + } + } } diff --git a/packages/react-native-nitro-modules/ios/utils/UnsafeMutablePointer+Data.swift b/packages/react-native-nitro-modules/ios/utils/UnsafeMutablePointer+Data.swift new file mode 100644 index 000000000..ae04c115d --- /dev/null +++ b/packages/react-native-nitro-modules/ios/utils/UnsafeMutablePointer+Data.swift @@ -0,0 +1,28 @@ +// +// SwiftClosure.swift +// NitroModules +// +// Created by Marc Rousavy on 07.01.24. +// + +import Foundation + +public extension UnsafeMutablePointer { + /** + * Create a new `UnsafeMutablePointer` by copying + * the contents of the given `data`. + */ + init(copyData data: Data) throws { + let byteCount = data.count + let newPointer = UnsafeMutablePointer.allocate(capacity: byteCount) + + try data.withUnsafeBytes { (rawBufferPointer) in + guard let baseAddress = rawBufferPointer.baseAddress else { + throw RuntimeError.error(withMessage: "Cannot get baseAddress of Data!") + } + memcpy(newPointer, baseAddress, byteCount) + } + + self.init(newPointer) + } +}