diff --git a/Sources/Pusher/Networking/Client/GetChannelEndpoint.swift b/Sources/Pusher/Networking/Client/GetChannelEndpoint.swift index b06c235..d79f17c 100644 --- a/Sources/Pusher/Networking/Client/GetChannelEndpoint.swift +++ b/Sources/Pusher/Networking/Client/GetChannelEndpoint.swift @@ -8,7 +8,7 @@ struct GetChannelEndpoint: APIotaCodableEndpoint { typealias ErrorResponse = Data typealias Body = String - let encoder: JSONEncoder = JSONEncoder() + let encoder: JSONEncoder = JSONEncoder.iso8601Ordered let headers: HTTPHeaders? = APIClient.defaultHeaders diff --git a/Sources/Pusher/Networking/Client/GetChannelsEndpoint.swift b/Sources/Pusher/Networking/Client/GetChannelsEndpoint.swift index 833d315..aa861f6 100644 --- a/Sources/Pusher/Networking/Client/GetChannelsEndpoint.swift +++ b/Sources/Pusher/Networking/Client/GetChannelsEndpoint.swift @@ -8,7 +8,7 @@ struct GetChannelsEndpoint: APIotaCodableEndpoint { typealias ErrorResponse = Data typealias Body = String - let encoder: JSONEncoder = JSONEncoder() + let encoder: JSONEncoder = JSONEncoder.iso8601Ordered let headers: HTTPHeaders? = APIClient.defaultHeaders diff --git a/Sources/Pusher/Networking/Client/GetUsersEndpoint.swift b/Sources/Pusher/Networking/Client/GetUsersEndpoint.swift index 9abda67..f2a46e5 100644 --- a/Sources/Pusher/Networking/Client/GetUsersEndpoint.swift +++ b/Sources/Pusher/Networking/Client/GetUsersEndpoint.swift @@ -8,7 +8,7 @@ struct GetUsersEndpoint: APIotaCodableEndpoint { typealias ErrorResponse = Data typealias Body = String - let encoder: JSONEncoder = JSONEncoder() + let encoder: JSONEncoder = JSONEncoder.iso8601Ordered let headers: HTTPHeaders? = APIClient.defaultHeaders diff --git a/Sources/Pusher/Networking/Client/TriggerBatchEventsEndpoint.swift b/Sources/Pusher/Networking/Client/TriggerBatchEventsEndpoint.swift index 07e7214..7efe53f 100644 --- a/Sources/Pusher/Networking/Client/TriggerBatchEventsEndpoint.swift +++ b/Sources/Pusher/Networking/Client/TriggerBatchEventsEndpoint.swift @@ -8,7 +8,7 @@ struct TriggerBatchEventsEndpoint: APIotaCodableEndpoint { typealias ErrorResponse = Data typealias Body = EventBatch - let encoder: JSONEncoder = JSONEncoder() + let encoder: JSONEncoder = JSONEncoder.iso8601Ordered var headers: HTTPHeaders? { diff --git a/Sources/Pusher/Networking/Client/TriggerEventEndpoint.swift b/Sources/Pusher/Networking/Client/TriggerEventEndpoint.swift index 0a9ae2f..f07dfbb 100644 --- a/Sources/Pusher/Networking/Client/TriggerEventEndpoint.swift +++ b/Sources/Pusher/Networking/Client/TriggerEventEndpoint.swift @@ -8,7 +8,7 @@ struct TriggerEventEndpoint: APIotaCodableEndpoint { typealias ErrorResponse = Data typealias Body = Event - let encoder: JSONEncoder = JSONEncoder() + let encoder: JSONEncoder = JSONEncoder.iso8601Ordered var headers: HTTPHeaders? { diff --git a/Sources/Pusher/Networking/Models/AuthInfo.swift b/Sources/Pusher/Networking/Models/AuthInfo.swift index b3a0e0d..dec80b1 100644 --- a/Sources/Pusher/Networking/Models/AuthInfo.swift +++ b/Sources/Pusher/Networking/Models/AuthInfo.swift @@ -47,7 +47,7 @@ struct AuthInfo: AuthInfoRecord { version: String = "1.0") where Body: Encodable { // Generate a MD5 digest of the body (if provided) - if let httpBody = httpBody, let bodyData = try? JSONEncoder().encode(httpBody) { + if let httpBody = httpBody, let bodyData = try? JSONEncoder.iso8601Ordered.encode(httpBody) { self.bodyMD5 = CryptoService.md5Digest(data: bodyData).hexEncodedString() } else { self.bodyMD5 = nil diff --git a/Sources/Pusher/Networking/Models/JSONEncoder.swift b/Sources/Pusher/Networking/Models/JSONEncoder.swift new file mode 100644 index 0000000..4468b96 --- /dev/null +++ b/Sources/Pusher/Networking/Models/JSONEncoder.swift @@ -0,0 +1,19 @@ +import Foundation + +extension JSONEncoder { + convenience init(dateEncodingStrategy: DateEncodingStrategy, + outputFormatting: OutputFormatting = [], + keyEncodingStrategy: KeyEncodingStrategy = .useDefaultKeys) { + self.init() + self.dateEncodingStrategy = dateEncodingStrategy + self.outputFormatting = outputFormatting + self.keyEncodingStrategy = keyEncodingStrategy + } +} + +extension JSONEncoder { + static let shared = JSONEncoder() + static let iso8601 = JSONEncoder(dateEncodingStrategy: .iso8601) + static let iso8601Ordered = JSONEncoder(dateEncodingStrategy: .iso8601, outputFormatting: .sortedKeys) + static let iso8601PrettyPrinted = JSONEncoder(dateEncodingStrategy: .iso8601, outputFormatting: .prettyPrinted) +}