diff --git a/Sources/StreamCore/Utils/Atomic.swift b/Sources/StreamCore/Concurrency/Atomic.swift similarity index 100% rename from Sources/StreamCore/Utils/Atomic.swift rename to Sources/StreamCore/Concurrency/Atomic.swift diff --git a/Sources/StreamCore/Utils/StreamConcurrency.swift b/Sources/StreamCore/Concurrency/StreamConcurrency.swift similarity index 100% rename from Sources/StreamCore/Utils/StreamConcurrency.swift rename to Sources/StreamCore/Concurrency/StreamConcurrency.swift diff --git a/Sources/StreamCore/Utils/Data+Gzip.swift b/Sources/StreamCore/Utils/Data+Gzip.swift index 7b834fa..007b19b 100644 --- a/Sources/StreamCore/Utils/Data+Gzip.swift +++ b/Sources/StreamCore/Utils/Data+Gzip.swift @@ -35,7 +35,7 @@ extension Data { /// /// - Returns: Gzip-compressed `Data` instance. /// - Throws: `GzipError` - func gzipped() throws -> Data { + public func gzipped() throws -> Data { guard !isEmpty else { return Data() } diff --git a/Sources/StreamCore/Utils/HTTPUtils.swift b/Sources/StreamCore/Utils/HTTPUtils.swift index cb3a3d1..0e988e3 100644 --- a/Sources/StreamCore/Utils/HTTPUtils.swift +++ b/Sources/StreamCore/Utils/HTTPUtils.swift @@ -5,7 +5,7 @@ import Foundation extension URLRequest { - var queryItems: [URLQueryItem] { + public var queryItems: [URLQueryItem] { if let url, let urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false), let queryItems = urlComponents.queryItems { @@ -16,7 +16,7 @@ extension URLRequest { } extension Array where Element == URLQueryItem { - var prettyPrinted: String { + public var prettyPrinted: String { var message = "" forEach { item in diff --git a/Sources/StreamCore/Utils/RawJSON.swift b/Sources/StreamCore/Utils/RawJSON.swift index edd8bfb..7f9a367 100644 --- a/Sources/StreamCore/Utils/RawJSON.swift +++ b/Sources/StreamCore/Utils/RawJSON.swift @@ -15,7 +15,7 @@ public indirect enum RawJSON: Codable, Hashable, Sendable { case array([RawJSON]) case `nil` - static let double = number + public static let double = number public init(from decoder: Decoder) throws { let singleValueContainer = try decoder.singleValueContainer() @@ -294,7 +294,7 @@ extension RawJSON { /// let price = customData["flight"]?["price"].numberValue /// let destination = customData["flight"]?["destination"].stringValue /// ``` - subscript(key: String) -> RawJSON? { + public subscript(key: String) -> RawJSON? { get { guard case let .dictionary(dict) = self else { return nil @@ -320,7 +320,7 @@ extension RawJSON { /// let customData = message.customData /// let secondFlightPrice = customData["flights"]?[1]?["price"] ?? 0 /// ``` - subscript(index: Int) -> RawJSON? { + public subscript(index: Int) -> RawJSON? { get { guard case let .array(array) = self else { return nil diff --git a/Sources/StreamCore/Utils/StreamRuntimeCheck.swift b/Sources/StreamCore/Utils/StreamRuntimeCheck.swift index 7ad1009..0e48e83 100644 --- a/Sources/StreamCore/Utils/StreamRuntimeCheck.swift +++ b/Sources/StreamCore/Utils/StreamRuntimeCheck.swift @@ -9,26 +9,4 @@ public enum StreamRuntimeCheck { /// /// When set to false, a message will be logged on console, but the assertion will not be thrown. public nonisolated(unsafe) static var assertionsEnabled = false - - /// For *internal use* only - /// - /// Established the maximum depth of relationships to fetch when performing a mapping - /// - /// Eg. - /// Relationship: Message ---> QuotedMessage ---> QuotedMessage ---X--- NIL - /// Relationship: Channel ---> Message ---> QuotedMessage ---X--- NIL - /// Depth: 0 1 2 3 - nonisolated(unsafe) static var _backgroundMappingRelationshipsMaxDepth = 2 - - /// For *internal use* only - /// - /// Returns true if the maximum depth of relationships to fetch when performing a mapping is not yet met - static func _canFetchRelationship(currentDepth: Int) -> Bool { - currentDepth <= _backgroundMappingRelationshipsMaxDepth - } - - /// For *internal use* only - /// - /// Core Data prefetches data used for creating immutable model objects (faulting is disabled). - public nonisolated(unsafe) static var _isDatabasePrefetchingEnabled = false } diff --git a/Sources/StreamCore/Utils/StringExtensions.swift b/Sources/StreamCore/Utils/StringExtensions.swift index fd71356..37d4d0c 100644 --- a/Sources/StreamCore/Utils/StringExtensions.swift +++ b/Sources/StreamCore/Utils/StringExtensions.swift @@ -53,7 +53,7 @@ extension String { } extension StringProtocol { - func ranges(of string: S, options: String.CompareOptions = []) -> [Range] { + public func ranges(of string: S, options: String.CompareOptions = []) -> [Range] { var result: [Range] = [] var startIndex = startIndex while startIndex < endIndex, let range = self[startIndex...].range(of: string, options: options) { diff --git a/Sources/StreamCore/Utils/Timers.swift b/Sources/StreamCore/Utils/Timers.swift index b604ca0..2526b63 100644 --- a/Sources/StreamCore/Utils/Timers.swift +++ b/Sources/StreamCore/Utils/Timers.swift @@ -55,6 +55,7 @@ public protocol TimerControl { } extension DispatchWorkItem: TimerControl {} +extension DispatchWorkItem: @retroactive @unchecked Sendable {} /// Default real-world implementations of timers. public struct DefaultTimer: StreamTimer { @@ -116,7 +117,11 @@ private class RepeatingTimer: RepeatingTimerControl, @unchecked Sendable { private let queue = DispatchQueue(label: "io.getstream.repeating-timer") private var state: State = .suspended + #if compiler(>=6.1) private let timer: DispatchSourceTimer + #else + private nonisolated(unsafe) let timer: DispatchSourceTimer + #endif init(timeInterval: TimeInterval, queue: DispatchQueue, onFire: @escaping () -> Void) { timer = DispatchSource.makeTimerSource(queue: queue)