Skip to content

Commit

Permalink
fix: more updates
Browse files Browse the repository at this point in the history
  • Loading branch information
gtokman committed Aug 29, 2024
1 parent 4c4bf10 commit 765e662
Show file tree
Hide file tree
Showing 27 changed files with 450 additions and 90 deletions.
49 changes: 35 additions & 14 deletions packages/npm/send/example/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,16 @@ import {
const serializeError = (error: unknown) => {
console.log('SERIALIZING ERROR', error, error instanceof Error)
if (error instanceof Error) {
return JSON.stringify({
...error,
message: error.message,
stack: error.stack ?? 'NOT_INCLUDED',
name: error.name,
})
return JSON.stringify(
{
...error,
message: error.message,
stack: error.stack ?? 'NOT_INCLUDED',
name: error.name,
},
null,
2
)
} else {
return JSON.stringify(error)
}
Expand All @@ -35,7 +39,7 @@ const App = () => {

React.useEffect(() => {
send({
baseURL: 'https://itunes.apple.com',
baseURL: 'tps://itunes.apple.com',
method: 'GET',
path: '/lookup',
query: {
Expand All @@ -53,14 +57,31 @@ const App = () => {
'Accept': 'application/json',
},
},
}).then((response) => {
console.log('SUCCESS', response)
switch (response.kind) {
case 'success': {
console.log('SUCCESS', response.body)
if (response.body !== null) {
const json = JSON.parse(response.body)
const result = json.results[0]
setData({
trackName: result.trackName,
artistName: result.artistName,
artworkUrl100: result.artworkUrl100,
description: result.description,
version: result.version,
screenshotUrls: result.screenshotUrls,
})
}
break
}
case 'error': {
console.log('ERROR', serializeError(response))
break
}
}
})
.then((response) => {
console.log('SUCCESS', response)
setData(JSON.parse(response.body as any).results[0])
})
.catch((error) => {
console.log('FAILURE', serializeError(error))
})
}, [])

if (!data) {
Expand Down
120 changes: 85 additions & 35 deletions packages/npm/send/ios/Send.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,32 +8,18 @@ private func bodyIsUTF8(contentTypeHeader: String?, utf8ContentTypes: [String])
return utf8ContentTypes.contains(String(contentType))
}

enum SendError: Error {
case nonBase64RequestBody

case nonUTF8RequestBody
case nonUTF8ResponseBody

case invalidRequestBaseURL
case invalidRequestPathOrQueryParameters
case invalidResponseHeaderParameters

case decodingError
case encodingError

case unknown
}

final class IgnoreRedirectsDelegate: NSObject, URLSessionTaskDelegate {
func urlSession(_ session: URLSession, task: URLSessionTask, willPerformHTTPRedirection response: HTTPURLResponse, newRequest request: URLRequest) async -> URLRequest? {
return nil
}
}

extension SendError: Error {}

extension Request {
var url: Result<URL, SendError> {
guard var urlComponents = URLComponents(string: baseURL) else {
return .failure(.invalidRequestBaseURL)
return .failure(SendError(code: .ivnalid_request_base_url, message: ""))
}
urlComponents.path = path

Expand All @@ -44,7 +30,7 @@ extension Request {
}

guard let url = urlComponents.url else {
return .failure(.invalidRequestPathOrQueryParameters)
return .failure(SendError(code: .invalid_request_path_or_query_parameters, message: ""))
}
return .success(url)
}
Expand All @@ -62,12 +48,12 @@ extension Request {
let contentTypeHeader = header.parameters.first(where: { $0.key.caseInsensitiveCompare("Content-Type") == .orderedSame })?.value
if bodyIsUTF8(contentTypeHeader: contentTypeHeader, utf8ContentTypes: utf8ContentTypes) {
guard let utf8Body = body.data(using: .utf8) else {
return .failure(.nonUTF8RequestBody)
return .failure(SendError(code: .non_utf8_request_body, message: ""))
}
urlRequest.httpBody = utf8Body
} else {
guard let base64Body = Data(base64Encoded: body) else {
return .failure(.nonBase64RequestBody)
return .failure(SendError(code: .non_base64_request_body, message: ""))
}
urlRequest.httpBody = base64Body
}
Expand All @@ -80,7 +66,7 @@ extension Request {
extension Response {
init(request: Request, data: Data, httpURLResponse: HTTPURLResponse) throws {
guard let headerParameters = httpURLResponse.allHeaderFields as? [String: String] else {
throw SendError.invalidResponseHeaderParameters
throw SendError(code: .invalid_response_header_parameters, message: "")
}
let body: String?
if (data.isEmpty) {
Expand All @@ -92,7 +78,7 @@ extension Response {
)
if (bodyIsUTF8) {
guard let utf8Body = String(data: data, encoding: .utf8) else {
throw SendError.nonUTF8ResponseBody
throw SendError(code: .non_utf8_response_body, message: "")
}
body = utf8Body
} else {
Expand Down Expand Up @@ -132,24 +118,88 @@ final class Send: HybridSendSpec {

lazy var session = NetworkManager.shared.session

func send(request: Request) throws -> NitroModules.Promise<Response> {
func send(request: Request) throws -> NitroModules.Promise<Variant_Response_SendError> {
return Promise.async { [weak self] in
if let self {
let urlRequest = try request.urlRequest.get()
let (data, urlResponse) = try await session.data(for: urlRequest)
guard let httpURLResponse = urlResponse as? HTTPURLResponse else {
throw SendError.nonUTF8ResponseBody
do {
let urlRequest = try request.urlRequest.get()
let (data, urlResponse) = try await session.data(for: urlRequest)
guard let httpURLResponse = urlResponse as? HTTPURLResponse else {
throw SendError(code: .non_utf8_response_body, message: "")
}
let response = try Response(
request: request,
data: data,
httpURLResponse: httpURLResponse
)
return .someResponse(response)
} catch let sendError as SendError {
return .someSendError(sendError)
} catch let decodingError as DecodingError {
return .someSendError(SendError(code: .request_invalid, message: decodingError.failureReason ?? decodingError.localizedDescription))
} catch let encodingError as EncodingError {
return .someSendError(.init(code: .response_invalid, message: encodingError.failureReason ?? encodingError.localizedDescription))
} catch let urlError as URLError {
switch (urlError.code) {
case .appTransportSecurityRequiresSecureConnection,
.badURL,
.cancelled,
.cannotConnectToHost,
.cannotFindHost,
.clientCertificateRejected,
.clientCertificateRequired,
.dataLengthExceedsMaximum,
.dataNotAllowed,
.dnsLookupFailed,
.fileDoesNotExist,
.fileIsDirectory,
.noPermissionsToReadFile,
.requestBodyStreamExhausted,
.unsupportedURL,
.userAuthenticationRequired,
.userCancelledAuthentication:
return .someSendError(.init(code: .request_invalid, message: urlError.localizedDescription))
case .callIsActive,
.internationalRoamingOff,
.networkConnectionLost,
.notConnectedToInternet,
.resourceUnavailable,
.serverCertificateHasBadDate,
.serverCertificateHasUnknownRoot,
.serverCertificateNotYetValid,
.serverCertificateUntrusted,
.secureConnectionFailed,
.timedOut,
.appTransportSecurityRequiresSecureConnection:
return .someSendError(.init(code: .no_response, message: urlError.localizedDescription))
case .backgroundSessionInUseByAnotherProcess,
.backgroundSessionRequiresSharedContainer,
.backgroundSessionWasDisconnected,
.badServerResponse,
.cannotCloseFile,
.cannotCreateFile,
.cannotDecodeContentData,
.cannotDecodeRawData,
.cannotMoveFile,
.cannotOpenFile,
.cannotParseResponse,
.cannotRemoveFile,
.cannotWriteToFile,
.downloadDecodingFailedMidStream,
.downloadDecodingFailedToComplete,
.httpTooManyRedirects,
.redirectToNonExistentLocation,
.zeroByteResource:
return .someSendError(.init(code: .response_invalid, message: urlError.localizedDescription))
default:
return .someSendError(.init(code: .unexpected, message: "Something went wrong. Please file an issue on GitHub or try again."))
}
} catch let error {
return .someSendError(.init(code: .unexpected, message: "Something went wrong. Please file an issue on GitHub or try again."))
}
let response = try Response(
request: request,
data: data,
httpURLResponse: httpURLResponse
)
return response
} else {
throw SendError.unknown
throw SendError(code: .unexpected, message: "Something went wrong. Please file an issue on GitHub or try again.")
}
}
}

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#
# send+autolinking.cmake
# Wed Aug 28 2024
# Thu Aug 29 2024
# This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
# https://github.com/mrousavy/react-native-nitro
# Copyright © 2024 Marc Rousavy @ Margelo
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
///
/// send+autolinking.gradle
/// Wed Aug 28 2024
/// Thu Aug 29 2024
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
/// https://github.com/mrousavy/react-native-nitro
/// Copyright © 2024 Marc Rousavy @ Margelo
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
///
/// HybridSendSpecSwift.cpp
/// Wed Aug 28 2024
/// Thu Aug 29 2024
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
/// https://github.com/mrousavy/react-native-nitro
/// Copyright © 2024 Marc Rousavy @ Margelo
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
///
/// HybridSendSpecSwift.hpp
/// Wed Aug 28 2024
/// Thu Aug 29 2024
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
/// https://github.com/mrousavy/react-native-nitro
/// Copyright © 2024 Marc Rousavy @ Margelo
Expand All @@ -15,18 +15,25 @@ namespace candlefinance_send { class HybridSendSpecCxx; }

// Forward declaration of `Response` to properly resolve imports.
namespace margelo::nitro::send { struct Response; }
// Forward declaration of `SendError` to properly resolve imports.
namespace margelo::nitro::send { struct SendError; }
// Forward declaration of `Parameters` to properly resolve imports.
namespace margelo::nitro::send { struct Parameters; }
// Forward declaration of `Code` to properly resolve imports.
namespace margelo::nitro::send { enum class Code; }
// Forward declaration of `Request` to properly resolve imports.
namespace margelo::nitro::send { struct Request; }

#include <future>
#include <variant>
#include "Response.hpp"
#include "SendError.hpp"
#include <NitroModules/PromiseHolder.hpp>
#include "Parameters.hpp"
#include <unordered_map>
#include <string>
#include <optional>
#include "Code.hpp"
#include "Request.hpp"
#include <vector>

Expand Down Expand Up @@ -71,7 +78,7 @@ namespace margelo::nitro::send {

public:
// Methods
inline std::future<Response> send(const Request& request) override {
inline std::future<std::variant<Response, SendError>> send(const Request& request) override {
auto value = _swiftPart.send(request);
return value.getFuture();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#
# candlefinance_send+autolinking.rb
# Wed Aug 28 2024
# Thu Aug 29 2024
# This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
# https://github.com/mrousavy/react-native-nitro
# Copyright © 2024 Marc Rousavy @ Margelo
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
///
/// candlefinance_send-Swift-Cxx-Bridge.cpp
/// Wed Aug 28 2024
/// Thu Aug 29 2024
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
/// https://github.com/mrousavy/react-native-nitro
/// Copyright © 2024 Marc Rousavy @ Margelo
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
///
/// candlefinance_send-Swift-Cxx-Bridge.hpp
/// Wed Aug 28 2024
/// Thu Aug 29 2024
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
/// https://github.com/mrousavy/react-native-nitro
/// Copyright © 2024 Marc Rousavy @ Margelo
Expand All @@ -11,14 +11,18 @@
// Forward declarations of C++ defined types
// Forward declaration of `Response` to properly resolve imports.
namespace margelo::nitro::send { struct Response; }
// Forward declaration of `SendError` to properly resolve imports.
namespace margelo::nitro::send { struct SendError; }

// Include C++ defined types
#include "Response.hpp"
#include "SendError.hpp"
#include <NitroModules/PromiseHolder.hpp>
#include <future>
#include <optional>
#include <string>
#include <unordered_map>
#include <variant>
#include <vector>

/**
Expand Down Expand Up @@ -54,11 +58,28 @@ namespace margelo::nitro::send::bridge::swift {
}

/**
* Specialized version of `PromiseHolder<Response>`.
* Specialized version of `std::variant<Response, SendError>`.
*/
using PromiseHolder_Response_ = PromiseHolder<Response>;
inline PromiseHolder<Response> create_PromiseHolder_Response_() {
return PromiseHolder<Response>();
using std__variant_Response__SendError_ = std::variant<Response, SendError>;
inline std::variant<Response, SendError> create_std__variant_Response__SendError_(const Response& value) {
return value;
}
inline std::variant<Response, SendError> create_std__variant_Response__SendError_(const SendError& value) {
return value;
}
inline Response get_std__variant_Response__SendError__0(const std::variant<Response, SendError>& variant) {
return std::get<0>(variant);
}
inline SendError get_std__variant_Response__SendError__1(const std::variant<Response, SendError>& variant) {
return std::get<1>(variant);
}

/**
* Specialized version of `PromiseHolder<std::variant<Response, SendError>>`.
*/
using PromiseHolder_std__variant_Response__SendError__ = PromiseHolder<std::variant<Response, SendError>>;
inline PromiseHolder<std::variant<Response, SendError>> create_PromiseHolder_std__variant_Response__SendError__() {
return PromiseHolder<std::variant<Response, SendError>>();
}

/**
Expand Down
Loading

0 comments on commit 765e662

Please sign in to comment.