aboutsummaryrefslogtreecommitdiff
path: root/Sources/swiftGopherClient/gopherClient.swift
diff options
context:
space:
mode:
Diffstat (limited to 'Sources/swiftGopherClient/gopherClient.swift')
-rw-r--r--Sources/swiftGopherClient/gopherClient.swift48
1 files changed, 48 insertions, 0 deletions
diff --git a/Sources/swiftGopherClient/gopherClient.swift b/Sources/swiftGopherClient/gopherClient.swift
new file mode 100644
index 0000000..6b76d94
--- /dev/null
+++ b/Sources/swiftGopherClient/gopherClient.swift
@@ -0,0 +1,48 @@
+//
+// gopherClient.swift
+//
+//
+// Created by Navan Chauhan on 12/12/23.
+//
+
+import Foundation
+import NIO
+
+public class GopherClient {
+ private let group: EventLoopGroup
+
+ public init() {
+ self.group = MultiThreadedEventLoopGroup(numberOfThreads: System.coreCount)
+ }
+
+ deinit {
+ try? group.syncShutdownGracefully()
+ }
+
+ public func sendRequest(to host: String, port: Int = 70, message: String, completion: @escaping (Result<String, Error>) -> Void) {
+ let bootstrap = ClientBootstrap(group: group)
+ .channelOption(ChannelOptions.socketOption(.so_reuseaddr), value: 1)
+ .channelInitializer { channel in
+ channel.pipeline.addHandler(GopherRequestResponseHandler(message: message, completion: completion))
+ }
+
+ bootstrap.connect(host: host, port: port).whenComplete { result in
+ switch result {
+ case .success(let channel):
+ channel.closeFuture.whenComplete { _ in
+ print("Connection closed")
+ }
+ case .failure(let error):
+ completion(.failure(error))
+ }
+ }
+ }
+
+ private func shutdownEventLoopGroup() {
+ do {
+ try group.syncShutdownGracefully()
+ } catch {
+ print("Error shutting down event loop group: \(error)")
+ }
+ }
+}