@@ -2,9 +2,10 @@ import NitroModules
22import RiveRuntime
33
44final class HybridRiveFileFactory : HybridRiveFileFactorySpec {
5+ let assetLoader = ReferencedAssetLoader ( )
6+
57 private func buildRiveFile( data: Data , loadCdn: Bool , referencedAssets: ReferencedAssetsType ? ) throws -> ( file: RiveFile , cache: ReferencedAssetCache , loader: ReferencedAssetLoader ? ) {
6- var referencedAssetCache = Ref ( ReferencedAssetCache ( ) )
7- let assetLoader = ReferencedAssetLoader ( )
8+ var referencedAssetCache = SendableRef ( ReferencedAssetCache ( ) )
89 let customLoader = assetLoader. createCustomLoader ( referencedAssets: referencedAssets, cache: referencedAssetCache)
910
1011 let riveFile = if let customLoader = customLoader {
@@ -17,21 +18,20 @@ final class HybridRiveFileFactory: HybridRiveFileFactorySpec {
1718 }
1819
1920 // MARK: Public Methods
20- func fromURL( url: String , loadCdn: Bool ) throws -> Promise < ( any HybridRiveFileSpec ) > {
21- // TODO: should we make use of the underlying Rive iOS URL asset loading instead
21+ func fromURL( url: String , loadCdn: Bool , referencedAssets: ReferencedAssetsType ? ) throws -> Promise < ( any HybridRiveFileSpec ) > {
2222 return Promise . async {
2323 do {
2424 guard let url = URL ( string: url) else {
2525 throw RuntimeError . error ( withMessage: " Invalid URL: \( url) " )
2626 }
2727
28- let riveFile = try await withCheckedThrowingContinuation { continuation in
28+ let result = try await withCheckedThrowingContinuation { continuation in
2929 DispatchQueue . global ( qos: . userInitiated) . async {
3030 do {
3131 let riveData = try Data ( contentsOf: url)
32- let riveFile = try RiveFile ( data: riveData, loadCdn: true )
32+ let result = try self . buildRiveFile ( data: riveData, loadCdn: loadCdn , referencedAssets : referencedAssets )
3333 DispatchQueue . main. async {
34- continuation. resume ( returning: riveFile )
34+ continuation. resume ( returning: result )
3535 }
3636 } catch {
3737 DispatchQueue . main. async {
@@ -42,7 +42,9 @@ final class HybridRiveFileFactory: HybridRiveFileFactorySpec {
4242 }
4343
4444 let hybridRiveFile = HybridRiveFile ( )
45- hybridRiveFile. riveFile = riveFile
45+ hybridRiveFile. riveFile = result. file
46+ hybridRiveFile. referencedAssetCache = result. cache
47+ hybridRiveFile. assetLoader = result. loader
4648 return hybridRiveFile
4749 } catch let error as NSError {
4850 throw RuntimeError . error (
@@ -53,7 +55,7 @@ final class HybridRiveFileFactory: HybridRiveFileFactorySpec {
5355 }
5456 }
5557
56- func fromFileURL( fileURL: String , loadCdn: Bool ) throws -> Promise < ( any HybridRiveFileSpec ) > {
58+ func fromFileURL( fileURL: String , loadCdn: Bool , referencedAssets : ReferencedAssetsType ? ) throws -> Promise < ( any HybridRiveFileSpec ) > {
5759 guard let url = URL ( string: fileURL) else {
5860 throw RuntimeError . error ( withMessage: " fromFileURL: Invalid URL: \( fileURL) " )
5961 }
@@ -64,18 +66,30 @@ final class HybridRiveFileFactory: HybridRiveFileFactorySpec {
6466
6567 return Promise . async {
6668 do {
67- let riveFile = try await withCheckedThrowingContinuation { continuation in
69+ let result = try await withCheckedThrowingContinuation { continuation in
6870 DispatchQueue . global ( qos: . userInitiated) . async {
6971 do {
7072 let data = try Data ( contentsOf: url)
73+ let result = try self . buildRiveFile ( data: data, loadCdn: loadCdn, referencedAssets: referencedAssets)
74+ DispatchQueue . main. async {
75+ continuation. resume ( returning: result)
76+ }
77+ } catch {
78+ DispatchQueue . main. async {
79+ continuation. resume ( throwing: error)
80+ }
81+ }
82+ }
83+ }
7184
7285 let hybridRiveFile = HybridRiveFile ( )
73- hybridRiveFile. riveFile = riveFile . file
74- hybridRiveFile. referencedAssetCache = riveFile . cache
75- hybridRiveFile. assetLoader = riveFile . loader
86+ hybridRiveFile. riveFile = result . file
87+ hybridRiveFile. referencedAssetCache = result . cache
88+ hybridRiveFile. assetLoader = result . loader
7689 return hybridRiveFile
7790 } catch let error as NSError {
78- throw RuntimeError . error ( withMessage: " Failed to load Rive file: \( error. localizedDescription) " )
91+ throw RuntimeError . error (
92+ withMessage: " Failed to load Rive file: \( error. localizedDescription) " )
7993 } catch {
8094 throw RuntimeError . error ( withMessage: " Unknown error occurred while loading Rive file " )
8195 }
@@ -89,13 +103,13 @@ final class HybridRiveFileFactory: HybridRiveFileFactorySpec {
89103
90104 return Promise . async {
91105 do {
92-
106+ let assetLoader = self . assetLoader
107+ let referencedAssetCache = SendableRef ( ReferencedAssetCache ( ) )
93108 let riveFile = try await withCheckedThrowingContinuation { continuation in
94109 DispatchQueue . global ( qos: . userInitiated) . async {
95110 do {
96- var referencedAssetCache = Ref ( ReferencedAssetCache ( ) )
97111 let riveFile =
98- if let customLoader = self . assetLoader. createCustomLoader ( referencedAssets: referencedAssets, cache: referencedAssetCache) {
112+ if let customLoader = assetLoader. createCustomLoader ( referencedAssets: referencedAssets, cache: referencedAssetCache) {
99113 try RiveFile ( resource: resource, loadCdn: loadCdn, customAssetLoader: customLoader)
100114 } else {
101115 try RiveFile ( resource: resource, loadCdn: loadCdn)
@@ -113,6 +127,10 @@ final class HybridRiveFileFactory: HybridRiveFileFactorySpec {
113127
114128 let hybridRiveFile = HybridRiveFile ( )
115129 hybridRiveFile. riveFile = riveFile
130+ if referencedAssets != nil {
131+ hybridRiveFile. referencedAssetCache = referencedAssetCache. value
132+ hybridRiveFile. assetLoader = assetLoader
133+ }
116134 return hybridRiveFile
117135 } catch let error as NSError {
118136 throw RuntimeError . error (
@@ -157,25 +175,18 @@ final class HybridRiveFileFactory: HybridRiveFileFactorySpec {
157175 }
158176 }
159177
160- func fromBytes( bytes: ArrayBufferHolder , loadCdn: Bool ) throws -> Promise <
178+ func fromBytes( bytes: ArrayBufferHolder , loadCdn: Bool , referencedAssets : ReferencedAssetsType ? ) throws -> Promise <
161179 ( any HybridRiveFileSpec )
162180 > {
163181 let data = bytes. toData ( copyIfNeeded: false )
164182 return Promise . async {
165183 do {
166- let riveFile = try await withCheckedThrowingContinuation { continuation in
184+ let result = try await withCheckedThrowingContinuation { continuation in
167185 DispatchQueue . global ( qos: . userInitiated) . async {
168186 do {
169- var referencedAssetCache = Ref ( ReferencedAssetCache ( ) )
170- let riveFile =
171- if let customLoader = self . assetLoader. createCustomLoader ( referencedAssets: referencedAssets, cache: referencedAssetCache) {
172- try RiveFile ( data: data, loadCdn: loadCdn, customAssetLoader: customLoader)
173- } else {
174- try RiveFile ( data: data, loadCdn: loadCdn)
175- }
176-
187+ let result = try self . buildRiveFile ( data: data, loadCdn: loadCdn, referencedAssets: referencedAssets)
177188 DispatchQueue . main. async {
178- continuation. resume ( returning: riveFile )
189+ continuation. resume ( returning: result )
179190 }
180191 } catch {
181192 DispatchQueue . main. async {
@@ -186,7 +197,9 @@ final class HybridRiveFileFactory: HybridRiveFileFactorySpec {
186197 }
187198
188199 let hybridRiveFile = HybridRiveFile ( )
189- hybridRiveFile. riveFile = riveFile
200+ hybridRiveFile. riveFile = result. file
201+ hybridRiveFile. referencedAssetCache = result. cache
202+ hybridRiveFile. assetLoader = result. loader
190203 return hybridRiveFile
191204 } catch let error as NSError {
192205 throw RuntimeError . error (
0 commit comments