react-nitro-core 0.0.0-stage → 0.0.1-alpha.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/LICENSE +21 -0
  2. package/Package.swift +100 -0
  3. package/Sources/ReactNitroCore/AnimationFrameDisplayLink.swift +83 -0
  4. package/Sources/ReactNitroCore/HybridAnimationFrameScheduler.swift +78 -0
  5. package/Sources/ReactNitroCore/HybridLogger.swift +26 -0
  6. package/Sources/ReactNitroCore/HybridPerformance.swift +19 -0
  7. package/Sources/ReactNitroCore/HybridTimers.swift +79 -0
  8. package/nitrogen/generated/.gitattributes +1 -0
  9. package/nitrogen/generated/apple/ReactNitroCore-Swift-Cxx-Bridge.cpp +90 -0
  10. package/nitrogen/generated/apple/ReactNitroCoreAppleCxx/ReactNitroCoreAppleCxx.cpp +9 -0
  11. package/nitrogen/generated/apple/ReactNitroCoreAppleCxx/include/ReactNitroCoreAppleCxx/ReactNitroCoreAppleCxx.h +74 -0
  12. package/nitrogen/generated/apple/ReactNitroCoreAutolinking.cpp +26 -0
  13. package/nitrogen/generated/apple/ReactNitroCoreAutolinking.mm +24 -0
  14. package/nitrogen/generated/apple/c++/HybridAnimationFrameSchedulerSpecSwift.cpp +59 -0
  15. package/nitrogen/generated/apple/c++/HybridAnimationFrameSchedulerSpec_cxx-Swift.cpp +28 -0
  16. package/nitrogen/generated/apple/c++/HybridLoggerSpecSwift.cpp +63 -0
  17. package/nitrogen/generated/apple/c++/HybridLoggerSpec_cxx-Swift.cpp +28 -0
  18. package/nitrogen/generated/apple/c++/HybridPerformanceSpecSwift.cpp +54 -0
  19. package/nitrogen/generated/apple/c++/HybridPerformanceSpec_cxx-Swift.cpp +28 -0
  20. package/nitrogen/generated/apple/c++/HybridTimersSpecSwift.cpp +78 -0
  21. package/nitrogen/generated/apple/c++/HybridTimersSpec_cxx-Swift.cpp +28 -0
  22. package/nitrogen/generated/apple/c++/include/ReactNitroCore/ReactNitroCoreAutolinking.hpp +13 -0
  23. package/nitrogen/generated/apple/c++/include/ReactNitroCore/private/HybridAnimationFrameSchedulerSpecSwift.hpp +74 -0
  24. package/nitrogen/generated/apple/c++/include/ReactNitroCore/private/HybridAnimationFrameSchedulerSpec_cxx-Swift.hpp +23 -0
  25. package/nitrogen/generated/apple/c++/include/ReactNitroCore/private/HybridLoggerSpecSwift.hpp +75 -0
  26. package/nitrogen/generated/apple/c++/include/ReactNitroCore/private/HybridLoggerSpec_cxx-Swift.hpp +23 -0
  27. package/nitrogen/generated/apple/c++/include/ReactNitroCore/private/HybridPerformanceSpecSwift.hpp +74 -0
  28. package/nitrogen/generated/apple/c++/include/ReactNitroCore/private/HybridPerformanceSpec_cxx-Swift.hpp +23 -0
  29. package/nitrogen/generated/apple/c++/include/ReactNitroCore/private/HybridTimersSpecSwift.hpp +76 -0
  30. package/nitrogen/generated/apple/c++/include/ReactNitroCore/private/HybridTimersSpec_cxx-Swift.hpp +23 -0
  31. package/nitrogen/generated/apple/c++/include/ReactNitroCore/private/ReactNitroCore-Swift-Cxx-Umbrella.hpp +37 -0
  32. package/nitrogen/generated/apple/c++/include/module.modulemap +12 -0
  33. package/nitrogen/generated/apple/swift/Callback_void.swift +60 -0
  34. package/nitrogen/generated/apple/swift/Callback_void_double.swift +60 -0
  35. package/nitrogen/generated/apple/swift/HybridAnimationFrameSchedulerSpec.swift +66 -0
  36. package/nitrogen/generated/apple/swift/HybridAnimationFrameSchedulerSpec_cxx.swift +160 -0
  37. package/nitrogen/generated/apple/swift/HybridLoggerSpec.swift +68 -0
  38. package/nitrogen/generated/apple/swift/HybridLoggerSpec_cxx.swift +169 -0
  39. package/nitrogen/generated/apple/swift/HybridPerformanceSpec.swift +65 -0
  40. package/nitrogen/generated/apple/swift/HybridPerformanceSpec_cxx.swift +156 -0
  41. package/nitrogen/generated/apple/swift/HybridTimersSpec.swift +68 -0
  42. package/nitrogen/generated/apple/swift/HybridTimersSpec_cxx.swift +178 -0
  43. package/nitrogen/generated/apple/swift/Promise_void.swift +100 -0
  44. package/nitrogen/generated/hybrid-classes.json +37 -0
  45. package/nitrogen/generated/shared/c++/ReactNitroCoreCxxModule.cpp +2 -0
  46. package/nitrogen/generated/shared/c++/include/ReactNitroCore/ReactNitroCoreCxxModule.hpp +2 -0
  47. package/nitrogen/generated/shared/javascript/AnimationFrameScheduler.cjs +19 -0
  48. package/nitrogen/generated/shared/javascript/AnimationFrameScheduler.d.cts +9 -0
  49. package/nitrogen/generated/shared/javascript/Logger.cjs +19 -0
  50. package/nitrogen/generated/shared/javascript/Logger.d.cts +9 -0
  51. package/nitrogen/generated/shared/javascript/Performance.cjs +19 -0
  52. package/nitrogen/generated/shared/javascript/Performance.d.cts +9 -0
  53. package/nitrogen/generated/shared/javascript/Timers.cjs +19 -0
  54. package/nitrogen/generated/shared/javascript/Timers.d.cts +9 -0
  55. package/package.json +34 -4
  56. package/src/index.ts +4 -0
  57. package/src/specs/AnimationFrameScheduler.nitro.ts +29 -0
  58. package/src/specs/Logger.nitro.ts +29 -0
  59. package/src/specs/Performance.nitro.ts +30 -0
  60. package/src/specs/Timers.nitro.ts +39 -0
  61. package/README.md +0 -3
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Margelo
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
9
+ of the Software, and to permit persons to whom the Software is furnished to do
10
+ so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/Package.swift ADDED
@@ -0,0 +1,100 @@
1
+ // swift-tools-version: 6.4
2
+
3
+ import Foundation
4
+ import PackageDescription
5
+
6
+ let name = "ReactNitroCore"
7
+ let generated = "nitrogen/generated"
8
+ let nitroDependencies: [Target.Dependency] = [
9
+ .product(name: "NitroModules", package: "nitro-core")
10
+ ]
11
+ let cxxSettings: [CXXSetting] = [
12
+ .define("DEBUG", .when(configuration: .debug)),
13
+ .define("NDEBUG", .when(configuration: .release)),
14
+ .disableWarning("nullability-extension"),
15
+ ]
16
+ let swiftSources = ["Sources/ReactNitroCore", "\(generated)/apple/swift"]
17
+ let bridgeSources = ["c++", "ReactNitroCore-Swift-Cxx-Bridge.cpp", "ReactNitroCoreAutolinking.cpp"]
18
+
19
+ // Bare-host integration. Nitrogen generates the bindings; this manifest owns the targets.
20
+ let package = Package(
21
+ name: name,
22
+ platforms: [.iOS(.v16), .macOS(.v13)],
23
+ products: [
24
+ .library(name: name, targets: ["\(name)Cxx", name, "\(name)SwiftBridge"])
25
+ ],
26
+ dependencies: [
27
+ .package(path: "../nitro-core")
28
+ ],
29
+ targets: [
30
+ .target(
31
+ name: "\(name)Cxx",
32
+ dependencies: nitroDependencies,
33
+ path: "\(generated)/shared/c++",
34
+ exclude: ["include"],
35
+ publicHeadersPath: "include",
36
+ cxxSettings: cxxSettings
37
+ ),
38
+ .target(
39
+ name: "\(name)AppleCxx",
40
+ dependencies: [.target(name: "\(name)Cxx")] + nitroDependencies,
41
+ path: "\(generated)/apple/\(name)AppleCxx",
42
+ cxxSettings: cxxSettings
43
+ ),
44
+ .target(
45
+ name: name,
46
+ dependencies: [.target(name: "\(name)AppleCxx")] + nitroDependencies,
47
+ path: ".",
48
+ exclude: excludes(in: ".", keeping: swiftSources),
49
+ sources: swiftSources,
50
+ cxxSettings: cxxSettings,
51
+ swiftSettings: [
52
+ // UIKit implementations run synchronously on the host's main thread.
53
+ .swiftLanguageMode(.v5),
54
+ .unsafeFlags(["-strict-concurrency=minimal"]),
55
+ .enableUpcomingFeature("InternalImportsByDefault"),
56
+ .enableUpcomingFeature("MemberImportVisibility"),
57
+ .interoperabilityMode(.Cxx),
58
+ .unsafeFlags(["-Xfrontend", "-clang-header-expose-decls=has-expose-attr-or-stdlib"]),
59
+ .unsafeFlags([
60
+ "-Xfrontend", "-clang-header-expose-module",
61
+ "-Xfrontend", "NitroModules=NitroModules-Swift.h",
62
+ ]),
63
+ ]
64
+ ),
65
+ .target(
66
+ name: "\(name)SwiftBridge",
67
+ dependencies: [.target(name: name), .target(name: "\(name)AppleCxx")] + nitroDependencies,
68
+ path: "\(generated)/apple",
69
+ exclude: excludes(in: "\(generated)/apple", keeping: bridgeSources) + ["c++/include"],
70
+ sources: bridgeSources,
71
+ publicHeadersPath: "c++/include",
72
+ cxxSettings: cxxSettings + [
73
+ .unsafeFlags(["-I${GENERATED_MODULEMAP_DIR}", "-fno-modules"])
74
+ ]
75
+ ),
76
+ ],
77
+ cxxLanguageStandard: .cxx20
78
+ )
79
+
80
+ func excludes(in path: String, keeping sources: [String]) -> [String] {
81
+ var parents: Set<String> = [""]
82
+ for source in sources {
83
+ var components = source.split(separator: "/").dropLast()
84
+ while !components.isEmpty {
85
+ parents.insert(components.joined(separator: "/"))
86
+ components = components.dropLast()
87
+ }
88
+ }
89
+ let root = URL(fileURLWithPath: Context.packageDirectory).appendingPathComponent(path)
90
+ return parents.sorted().flatMap { parent in
91
+ let entries =
92
+ (try? FileManager.default.contentsOfDirectory(
93
+ atPath: root.appendingPathComponent(parent).path)) ?? []
94
+ return entries.sorted().compactMap { entry in
95
+ let entryPath = parent.isEmpty ? entry : "\(parent)/\(entry)"
96
+ return entry.hasPrefix(".") || sources.contains(entryPath) || parents.contains(entryPath)
97
+ ? nil : entryPath
98
+ }
99
+ }
100
+ }
@@ -0,0 +1,83 @@
1
+ internal import Foundation
2
+ internal import NitroModules
3
+ internal import QuartzCore
4
+
5
+ #if os(macOS)
6
+ internal import CoreVideo
7
+ #endif
8
+
9
+ /// Delivers native display timestamps on the main queue.
10
+ /// The owner serializes start/stop; iOS link mutations and all callbacks run on
11
+ /// the main queue. The Core Video thread only enqueues a timestamp.
12
+ final class AnimationFrameDisplayLink: NSObject, @unchecked Sendable {
13
+ private let callback: (Double) -> Void
14
+
15
+ #if os(macOS)
16
+ private var displayLink: CVDisplayLink?
17
+ #else
18
+ // Accessed only on the main queue, where the run loop owns the display link.
19
+ private var displayLink: CADisplayLink?
20
+ #endif
21
+
22
+ init(callback: @escaping (Double) -> Void) throws {
23
+ self.callback = callback
24
+ super.init()
25
+
26
+ #if os(macOS)
27
+ let result = CVDisplayLinkCreateWithActiveCGDisplays(&displayLink)
28
+ guard result == kCVReturnSuccess, let displayLink else {
29
+ throw RuntimeError("Could not create a display link (\(result)).")
30
+ }
31
+ let handlerResult = CVDisplayLinkSetOutputHandler(displayLink) {
32
+ [weak self] _, now, _, _, _ in
33
+ let timestamp = Double(now.pointee.hostTime) / CVGetHostClockFrequency()
34
+ DispatchQueue.main.async(
35
+ execute: DispatchWorkItem { [weak self] in
36
+ self?.callback(timestamp)
37
+ })
38
+ return kCVReturnSuccess
39
+ }
40
+ guard handlerResult == kCVReturnSuccess else {
41
+ throw RuntimeError("Could not configure a display link (\(handlerResult)).")
42
+ }
43
+ #endif
44
+ }
45
+
46
+ func start() throws {
47
+ #if os(macOS)
48
+ guard let displayLink, !CVDisplayLinkIsRunning(displayLink) else { return }
49
+ let result = CVDisplayLinkStart(displayLink)
50
+ guard result == kCVReturnSuccess else {
51
+ throw RuntimeError("Could not start a display link (\(result)).")
52
+ }
53
+ #else
54
+ DispatchQueue.main.async(
55
+ execute: DispatchWorkItem { [self] in
56
+ guard displayLink == nil else { return }
57
+ let link = CADisplayLink(target: self, selector: #selector(onFrame(_:)))
58
+ displayLink = link
59
+ link.add(to: .main, forMode: .common)
60
+ })
61
+ #endif
62
+ }
63
+
64
+ func stop() {
65
+ #if os(macOS)
66
+ if let displayLink, CVDisplayLinkIsRunning(displayLink) {
67
+ CVDisplayLinkStop(displayLink)
68
+ }
69
+ #else
70
+ DispatchQueue.main.async(
71
+ execute: DispatchWorkItem { [self] in
72
+ displayLink?.invalidate()
73
+ displayLink = nil
74
+ })
75
+ #endif
76
+ }
77
+
78
+ #if !os(macOS)
79
+ @objc private func onFrame(_ displayLink: CADisplayLink) {
80
+ callback(displayLink.timestamp)
81
+ }
82
+ #endif
83
+ }
@@ -0,0 +1,78 @@
1
+ internal import Foundation
2
+ internal import NitroModules
3
+ internal import NitroModulesCxx
4
+ internal import QuartzCore
5
+
6
+ /// Owns frame requests separately from the platform display link.
7
+ final class HybridAnimationFrameScheduler: HybridAnimationFrameSchedulerSpec {
8
+ private let timeOrigin = CACurrentMediaTime()
9
+ private let lock = NSLock()
10
+ private var callbacks: [Double: any Callback<(Double), Void>] = [:]
11
+ private var nextId: Double = 1
12
+ private var displayLink: AnimationFrameDisplayLink?
13
+
14
+ func requestAnimationFrame(callback: any Callback<(Double), Void>) throws -> Double {
15
+ lock.lock()
16
+ defer { lock.unlock() }
17
+
18
+ if displayLink == nil {
19
+ displayLink = try AnimationFrameDisplayLink { [weak self] timestamp in
20
+ self?.fire(timestamp: timestamp)
21
+ }
22
+ }
23
+ if callbacks.isEmpty {
24
+ try displayLink?.start()
25
+ }
26
+ let id = nextId
27
+ nextId += 1
28
+ callbacks[id] = callback
29
+ return id
30
+ }
31
+
32
+ func cancelAnimationFrame(id: Double) throws {
33
+ lock.lock()
34
+ defer { lock.unlock() }
35
+ callbacks.removeValue(forKey: id)
36
+ if callbacks.isEmpty {
37
+ displayLink?.stop()
38
+ }
39
+ }
40
+
41
+ private func fire(timestamp: Double) {
42
+ lock.lock()
43
+ let ids = callbacks.keys.sorted()
44
+ lock.unlock()
45
+
46
+ let timestampMs = max(0, timestamp - timeOrigin) * 1_000
47
+ for id in ids {
48
+ lock.lock()
49
+ let callback = callbacks.removeValue(forKey: id)
50
+ lock.unlock()
51
+ // Remove each request just before calling it so cancellation can affect
52
+ // later callbacks, and newly requested callbacks wait for the next frame.
53
+ do {
54
+ try callback?.callSync(timestampMs)
55
+ } catch {
56
+ margelo.nitro.GlobalErrorHandler.reportError(.AnimationFrame, error.toCpp())
57
+ }
58
+ }
59
+
60
+ lock.lock()
61
+ if callbacks.isEmpty {
62
+ displayLink?.stop()
63
+ }
64
+ lock.unlock()
65
+ }
66
+
67
+ func dispose() {
68
+ lock.lock()
69
+ callbacks.removeAll()
70
+ displayLink?.stop()
71
+ displayLink = nil
72
+ lock.unlock()
73
+ }
74
+
75
+ deinit {
76
+ dispose()
77
+ }
78
+ }
@@ -0,0 +1,26 @@
1
+ internal import Foundation
2
+ internal import NitroModules
3
+ internal import OSLog
4
+
5
+ final class HybridLogger: HybridLoggerSpec {
6
+ private static let logger = Logger(
7
+ subsystem: Bundle.main.bundleIdentifier ?? "com.margelo.nitro",
8
+ category: "JavaScript"
9
+ )
10
+
11
+ static func debug(message: String) throws {
12
+ logger.debug("\(message, privacy: .public)")
13
+ }
14
+
15
+ static func info(message: String) throws {
16
+ logger.info("\(message, privacy: .public)")
17
+ }
18
+
19
+ static func warn(message: String) throws {
20
+ logger.warning("\(message, privacy: .public)")
21
+ }
22
+
23
+ static func error(message: String) throws {
24
+ logger.error("\(message, privacy: .public)")
25
+ }
26
+ }
@@ -0,0 +1,19 @@
1
+ internal import Darwin
2
+ internal import Foundation
3
+ internal import NitroModules
4
+
5
+ final class HybridPerformance: HybridPerformanceSpec {
6
+ private let monotonicOrigin: UInt64
7
+ let timeOrigin: Double
8
+
9
+ override init() throws {
10
+ monotonicOrigin = clock_gettime_nsec_np(CLOCK_MONOTONIC_RAW)
11
+ timeOrigin = Date().timeIntervalSince1970 * 1_000
12
+ try super.init()
13
+ }
14
+
15
+ func now() throws -> Double {
16
+ let elapsedNanoseconds = clock_gettime_nsec_np(CLOCK_MONOTONIC_RAW) - monotonicOrigin
17
+ return Double(elapsedNanoseconds) / 1_000_000
18
+ }
19
+ }
@@ -0,0 +1,79 @@
1
+ internal import Foundation
2
+ internal import NitroModules
3
+ internal import NitroModulesCxx
4
+
5
+ final class HybridTimers: HybridTimersSpec {
6
+ // Timer events run on the main queue like JavaScript, but deinit can run on
7
+ // Hermes' finalizer thread.
8
+ private let lock = NSLock()
9
+ private var timers: [Double: DispatchSourceTimer] = [:]
10
+ private var nextId: Double = 1
11
+
12
+ func setTimeout(callback: any Callback<(), Void>, ms: Double) throws -> Double {
13
+ return scheduleTimer(ms: ms, repeats: false, callback: callback)
14
+ }
15
+
16
+ func setInterval(callback: any Callback<(), Void>, ms: Double) throws -> Double {
17
+ return scheduleTimer(ms: ms, repeats: true, callback: callback)
18
+ }
19
+
20
+ private func scheduleTimer(ms: Double, repeats: Bool, callback: any Callback<(), Void>) -> Double {
21
+ let normalizedMs = ms.isFinite && ms > 0 && ms <= Double(Int32.max) ? ms : 0
22
+ let delay = (repeats ? max(normalizedMs, 1) : normalizedMs) / 1_000
23
+ let timer = DispatchSource.makeTimerSource(queue: .main)
24
+
25
+ lock.lock()
26
+ defer { lock.unlock() }
27
+
28
+ let id = nextId
29
+ nextId += 1
30
+ timer.setEventHandler { [weak self] in
31
+ guard let timer = self?.getTimer(id: id, remove: !repeats) else { return }
32
+ if !repeats {
33
+ timer.cancel()
34
+ }
35
+ do {
36
+ try callback.callSync()
37
+ } catch {
38
+ margelo.nitro.GlobalErrorHandler.reportError(.Timer, error.toCpp())
39
+ }
40
+ }
41
+ if repeats {
42
+ timer.schedule(deadline: .now() + delay, repeating: delay)
43
+ } else {
44
+ timer.schedule(deadline: .now() + delay)
45
+ }
46
+ timers[id] = timer
47
+ timer.activate()
48
+ return id
49
+ }
50
+
51
+ func clearTimeout(id: Double) throws {
52
+ getTimer(id: id, remove: true)?.cancel()
53
+ }
54
+
55
+ func clearInterval(id: Double) throws {
56
+ try clearTimeout(id: id)
57
+ }
58
+
59
+ private func getTimer(id: Double, remove: Bool) -> DispatchSourceTimer? {
60
+ lock.lock()
61
+ defer { lock.unlock() }
62
+ return remove ? timers.removeValue(forKey: id) : timers[id]
63
+ }
64
+
65
+ func dispose() {
66
+ lock.lock()
67
+ let pendingTimers = timers
68
+ timers.removeAll()
69
+ lock.unlock()
70
+
71
+ for timer in pendingTimers.values {
72
+ timer.cancel()
73
+ }
74
+ }
75
+
76
+ deinit {
77
+ dispose()
78
+ }
79
+ }
@@ -0,0 +1 @@
1
+ ** linguist-generated=true
@@ -0,0 +1,90 @@
1
+ ///
2
+ /// ReactNitroCore-Swift-Cxx-Bridge.cpp
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/margelo/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+ #include <ReactNitroCore/private/ReactNitroCore-Swift-Cxx-Umbrella.hpp>
8
+ #include <ReactNitroCore/private/HybridAnimationFrameSchedulerSpecSwift.hpp>
9
+ #include <NitroModules/Callback.hpp>
10
+ #include <ReactNitroCore/private/HybridLoggerSpecSwift.hpp>
11
+ #include <ReactNitroCore/private/HybridPerformanceSpecSwift.hpp>
12
+ #include <ReactNitroCore/private/HybridTimersSpecSwift.hpp>
13
+
14
+ namespace margelo::nitro::core::swift_bridge {
15
+ std__shared_ptr_margelo__nitro__core__HybridAnimationFrameSchedulerSpec_ create_std__shared_ptr_margelo__nitro__core__HybridAnimationFrameSchedulerSpec_(void* NON_NULL pointer) {
16
+ return std::make_shared<margelo::nitro::core::HybridAnimationFrameSchedulerSpecSwift>(::ReactNitroCore::HybridAnimationFrameSchedulerSpec_cxx::fromUnsafe(pointer));
17
+ }
18
+
19
+ void* NON_NULL get_std__shared_ptr_margelo__nitro__core__HybridAnimationFrameSchedulerSpec_(const std::shared_ptr<HybridObject>& value) {
20
+ auto wrapper = std::dynamic_pointer_cast<margelo::nitro::core::HybridAnimationFrameSchedulerSpecSwift>(value);
21
+ if (!wrapper) throw std::runtime_error("HybridAnimationFrameSchedulerSpec is not implemented in Swift");
22
+ return wrapper->getSwiftPart().toUnsafe();
23
+ }
24
+
25
+ Result<void, margelo::nitro::core::swift_bridge::ResultTag> callSync_Callback_void_double(const Callback_void_double& callback, double param0) noexcept {
26
+ try {
27
+ callback.callSync(param0);
28
+ return Result<void, margelo::nitro::core::swift_bridge::ResultTag>::withValue();
29
+ } catch (...) {
30
+ return Result<void, margelo::nitro::core::swift_bridge::ResultTag>::withError(std::current_exception());
31
+ }
32
+ }
33
+
34
+ Callback_void_double create_Callback_void_double(std::function<Result<void, margelo::nitro::core::swift_bridge::ResultTag>(double param0)> closure) {
35
+ return Callback_void_double::make([closure = std::move(closure)](double param0) -> void {
36
+ auto __result = closure(param0);
37
+ if (__result.hasError()) [[unlikely]] {
38
+ std::rethrow_exception(__result.error());
39
+ }
40
+ });
41
+ }
42
+
43
+ std__shared_ptr_margelo__nitro__core__HybridLoggerSpec_ create_std__shared_ptr_margelo__nitro__core__HybridLoggerSpec_(void* NON_NULL pointer) {
44
+ return std::make_shared<margelo::nitro::core::HybridLoggerSpecSwift>(::ReactNitroCore::HybridLoggerSpec_cxx::fromUnsafe(pointer));
45
+ }
46
+
47
+ void* NON_NULL get_std__shared_ptr_margelo__nitro__core__HybridLoggerSpec_(const std::shared_ptr<HybridObject>& value) {
48
+ auto wrapper = std::dynamic_pointer_cast<margelo::nitro::core::HybridLoggerSpecSwift>(value);
49
+ if (!wrapper) throw std::runtime_error("HybridLoggerSpec is not implemented in Swift");
50
+ return wrapper->getSwiftPart().toUnsafe();
51
+ }
52
+
53
+ std__shared_ptr_margelo__nitro__core__HybridPerformanceSpec_ create_std__shared_ptr_margelo__nitro__core__HybridPerformanceSpec_(void* NON_NULL pointer) {
54
+ return std::make_shared<margelo::nitro::core::HybridPerformanceSpecSwift>(::ReactNitroCore::HybridPerformanceSpec_cxx::fromUnsafe(pointer));
55
+ }
56
+
57
+ void* NON_NULL get_std__shared_ptr_margelo__nitro__core__HybridPerformanceSpec_(const std::shared_ptr<HybridObject>& value) {
58
+ auto wrapper = std::dynamic_pointer_cast<margelo::nitro::core::HybridPerformanceSpecSwift>(value);
59
+ if (!wrapper) throw std::runtime_error("HybridPerformanceSpec is not implemented in Swift");
60
+ return wrapper->getSwiftPart().toUnsafe();
61
+ }
62
+
63
+ std__shared_ptr_margelo__nitro__core__HybridTimersSpec_ create_std__shared_ptr_margelo__nitro__core__HybridTimersSpec_(void* NON_NULL pointer) {
64
+ return std::make_shared<margelo::nitro::core::HybridTimersSpecSwift>(::ReactNitroCore::HybridTimersSpec_cxx::fromUnsafe(pointer));
65
+ }
66
+
67
+ void* NON_NULL get_std__shared_ptr_margelo__nitro__core__HybridTimersSpec_(const std::shared_ptr<HybridObject>& value) {
68
+ auto wrapper = std::dynamic_pointer_cast<margelo::nitro::core::HybridTimersSpecSwift>(value);
69
+ if (!wrapper) throw std::runtime_error("HybridTimersSpec is not implemented in Swift");
70
+ return wrapper->getSwiftPart().toUnsafe();
71
+ }
72
+
73
+ Result<void, margelo::nitro::core::swift_bridge::ResultTag> callSync_Callback_void(const Callback_void& callback) noexcept {
74
+ try {
75
+ callback.callSync();
76
+ return Result<void, margelo::nitro::core::swift_bridge::ResultTag>::withValue();
77
+ } catch (...) {
78
+ return Result<void, margelo::nitro::core::swift_bridge::ResultTag>::withError(std::current_exception());
79
+ }
80
+ }
81
+
82
+ Callback_void create_Callback_void(std::function<Result<void, margelo::nitro::core::swift_bridge::ResultTag>()> closure) {
83
+ return Callback_void::make([closure = std::move(closure)]() -> void {
84
+ auto __result = closure();
85
+ if (__result.hasError()) [[unlikely]] {
86
+ std::rethrow_exception(__result.error());
87
+ }
88
+ });
89
+ }
90
+ } // namespace margelo::nitro::core::swift_bridge
@@ -0,0 +1,9 @@
1
+ ///
2
+ /// ReactNitroCoreAppleCxx.cpp
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/margelo/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ // Swift packages require at least one source file per C++ target.
9
+ #include <ReactNitroCoreAppleCxx/ReactNitroCoreAppleCxx.h>
@@ -0,0 +1,74 @@
1
+ ///
2
+ /// ReactNitroCoreAppleCxx.h
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/margelo/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ #pragma once
9
+
10
+ // Forward declaration of `HybridAnimationFrameSchedulerSpec_cxx` to properly resolve imports.
11
+ namespace ReactNitroCore { class HybridAnimationFrameSchedulerSpec_cxx; }
12
+ #include <NitroModules/Callback.hpp>
13
+ #include <NitroModules/Result.hpp>
14
+ // Forward declaration of `HybridLoggerSpec_cxx` to properly resolve imports.
15
+ namespace ReactNitroCore { class HybridLoggerSpec_cxx; }
16
+ namespace swift { class String; }
17
+ // Forward declaration of `HybridPerformanceSpec_cxx` to properly resolve imports.
18
+ namespace ReactNitroCore { class HybridPerformanceSpec_cxx; }
19
+ // Forward declaration of `HybridTimersSpec_cxx` to properly resolve imports.
20
+ namespace ReactNitroCore { class HybridTimersSpec_cxx; }
21
+ #include <NitroModules/HybridObject.hpp>
22
+ // Forward declaration of `HybridAnimationFrameSchedulerSpecSwift` to properly resolve imports.
23
+ namespace margelo::nitro::core { class HybridAnimationFrameSchedulerSpecSwift; }
24
+ #include <NitroModules/NitroDefines.hpp>
25
+ #include <NitroModules/Promise.hpp>
26
+ // Forward declaration of `HybridLoggerSpecSwift` to properly resolve imports.
27
+ namespace margelo::nitro::core { class HybridLoggerSpecSwift; }
28
+ // Forward declaration of `HybridPerformanceSpecSwift` to properly resolve imports.
29
+ namespace margelo::nitro::core { class HybridPerformanceSpecSwift; }
30
+ // Forward declaration of `HybridTimersSpecSwift` to properly resolve imports.
31
+ namespace margelo::nitro::core { class HybridTimersSpecSwift; }
32
+
33
+ namespace margelo::nitro::core::swift_bridge {
34
+ using std__shared_ptr_margelo__nitro__core__HybridAnimationFrameSchedulerSpec_ = std::shared_ptr<margelo::nitro::core::HybridAnimationFrameSchedulerSpecSwift>;
35
+ using std__weak_ptr_margelo__nitro__core__HybridAnimationFrameSchedulerSpec_ = std::weak_ptr<margelo::nitro::core::HybridAnimationFrameSchedulerSpecSwift>;
36
+ inline std__weak_ptr_margelo__nitro__core__HybridAnimationFrameSchedulerSpec_ weakify_std__shared_ptr_margelo__nitro__core__HybridAnimationFrameSchedulerSpec_(const std__shared_ptr_margelo__nitro__core__HybridAnimationFrameSchedulerSpec_& value) {
37
+ return value;
38
+ }
39
+ std__shared_ptr_margelo__nitro__core__HybridAnimationFrameSchedulerSpec_ create_std__shared_ptr_margelo__nitro__core__HybridAnimationFrameSchedulerSpec_(void* NON_NULL pointer);
40
+ void* NON_NULL get_std__shared_ptr_margelo__nitro__core__HybridAnimationFrameSchedulerSpec_(const std::shared_ptr<HybridObject>& value);
41
+ using Promise_void = Promise<void>;
42
+ // Distinct specializations prevent duplicate Swift metadata across module headers.
43
+ struct ResultTag {};
44
+ using Result_void = Result<void, margelo::nitro::core::swift_bridge::ResultTag>;
45
+ using Callback_void_double = Callback<void(double)>;
46
+ Result<void, margelo::nitro::core::swift_bridge::ResultTag> callSync_Callback_void_double(const Callback_void_double& callback, double param0) noexcept;
47
+ Callback_void_double create_Callback_void_double(std::function<Result<void, margelo::nitro::core::swift_bridge::ResultTag>(double param0)> closure);
48
+ using Result_double = Result<double, margelo::nitro::core::swift_bridge::ResultTag>;
49
+ using Result_void_ = Result<void*, margelo::nitro::core::swift_bridge::ResultTag>;
50
+ using std__shared_ptr_margelo__nitro__core__HybridLoggerSpec_ = std::shared_ptr<margelo::nitro::core::HybridLoggerSpecSwift>;
51
+ using std__weak_ptr_margelo__nitro__core__HybridLoggerSpec_ = std::weak_ptr<margelo::nitro::core::HybridLoggerSpecSwift>;
52
+ inline std__weak_ptr_margelo__nitro__core__HybridLoggerSpec_ weakify_std__shared_ptr_margelo__nitro__core__HybridLoggerSpec_(const std__shared_ptr_margelo__nitro__core__HybridLoggerSpec_& value) {
53
+ return value;
54
+ }
55
+ std__shared_ptr_margelo__nitro__core__HybridLoggerSpec_ create_std__shared_ptr_margelo__nitro__core__HybridLoggerSpec_(void* NON_NULL pointer);
56
+ void* NON_NULL get_std__shared_ptr_margelo__nitro__core__HybridLoggerSpec_(const std::shared_ptr<HybridObject>& value);
57
+ using std__shared_ptr_margelo__nitro__core__HybridPerformanceSpec_ = std::shared_ptr<margelo::nitro::core::HybridPerformanceSpecSwift>;
58
+ using std__weak_ptr_margelo__nitro__core__HybridPerformanceSpec_ = std::weak_ptr<margelo::nitro::core::HybridPerformanceSpecSwift>;
59
+ inline std__weak_ptr_margelo__nitro__core__HybridPerformanceSpec_ weakify_std__shared_ptr_margelo__nitro__core__HybridPerformanceSpec_(const std__shared_ptr_margelo__nitro__core__HybridPerformanceSpec_& value) {
60
+ return value;
61
+ }
62
+ std__shared_ptr_margelo__nitro__core__HybridPerformanceSpec_ create_std__shared_ptr_margelo__nitro__core__HybridPerformanceSpec_(void* NON_NULL pointer);
63
+ void* NON_NULL get_std__shared_ptr_margelo__nitro__core__HybridPerformanceSpec_(const std::shared_ptr<HybridObject>& value);
64
+ using std__shared_ptr_margelo__nitro__core__HybridTimersSpec_ = std::shared_ptr<margelo::nitro::core::HybridTimersSpecSwift>;
65
+ using std__weak_ptr_margelo__nitro__core__HybridTimersSpec_ = std::weak_ptr<margelo::nitro::core::HybridTimersSpecSwift>;
66
+ inline std__weak_ptr_margelo__nitro__core__HybridTimersSpec_ weakify_std__shared_ptr_margelo__nitro__core__HybridTimersSpec_(const std__shared_ptr_margelo__nitro__core__HybridTimersSpec_& value) {
67
+ return value;
68
+ }
69
+ std__shared_ptr_margelo__nitro__core__HybridTimersSpec_ create_std__shared_ptr_margelo__nitro__core__HybridTimersSpec_(void* NON_NULL pointer);
70
+ void* NON_NULL get_std__shared_ptr_margelo__nitro__core__HybridTimersSpec_(const std::shared_ptr<HybridObject>& value);
71
+ using Callback_void = Callback<void()>;
72
+ Result<void, margelo::nitro::core::swift_bridge::ResultTag> callSync_Callback_void(const Callback_void& callback) noexcept;
73
+ Callback_void create_Callback_void(std::function<Result<void, margelo::nitro::core::swift_bridge::ResultTag>()> closure);
74
+ } // namespace margelo::nitro::core::swift_bridge
@@ -0,0 +1,26 @@
1
+ ///
2
+ /// ReactNitroCoreAutolinking.cpp
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/margelo/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ #include <ReactNitroCore/ReactNitroCoreAutolinking.hpp>
9
+ #include <NitroModules/HybridClassRegistry.hpp>
10
+
11
+ #include <ReactNitroCore/private/HybridAnimationFrameSchedulerSpecSwift.hpp>
12
+ #include <ReactNitroCore/private/HybridLoggerSpecSwift.hpp>
13
+ #include <ReactNitroCore/private/HybridPerformanceSpecSwift.hpp>
14
+ #include <ReactNitroCore/private/HybridTimersSpecSwift.hpp>
15
+
16
+ namespace margelo::nitro::core {
17
+ void registerHybridClasses() {
18
+ using namespace margelo::nitro;
19
+ using namespace margelo::nitro::core;
20
+
21
+ HybridClassRegistry::registerHybridClass("core.AnimationFrameScheduler", HybridAnimationFrameSchedulerSpecSwift::Class::get());
22
+ HybridClassRegistry::registerHybridClass("core.Logger", HybridLoggerSpecSwift::Class::get());
23
+ HybridClassRegistry::registerHybridClass("core.Performance", HybridPerformanceSpecSwift::Class::get());
24
+ HybridClassRegistry::registerHybridClass("core.Timers", HybridTimersSpecSwift::Class::get());
25
+ }
26
+ } // namespace margelo::nitro::core
@@ -0,0 +1,24 @@
1
+ ///
2
+ /// ReactNitroCoreAutolinking.mm
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/margelo/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ #import <Foundation/Foundation.h>
9
+ #include <ReactNitroCore/ReactNitroCoreAutolinking.hpp>
10
+
11
+ /**
12
+ * Registers all HybridObject classes of ReactNitroCore
13
+ * when the app loads, so JS can look them up by name.
14
+ */
15
+ @interface ReactNitroCoreAutolinking : NSObject
16
+ @end
17
+
18
+ @implementation ReactNitroCoreAutolinking
19
+
20
+ + (void)load {
21
+ margelo::nitro::core::registerHybridClasses();
22
+ }
23
+
24
+ @end