Skip to content
This repository was archived by the owner on Mar 19, 2024. It is now read-only.

Commit fbe74ed

Browse files
Merge pull request #25 from Andrea-Scuderi/feature/async-http-client-1_0_0
Update asynch-http-client to 1.0.0
2 parents c463ece + 828e97e commit fbe74ed

File tree

11 files changed

+326
-94
lines changed

11 files changed

+326
-94
lines changed

Examples/HTTPSRequest/Package.resolved

Lines changed: 21 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Examples/HTTPSRequest/Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ let package = Package(
88
dependencies: [
99
// Dependencies declare other packages that this package depends on.
1010
//.package(path: "../../../aws-lambda-swift-sprinter-nio-plugin"),
11-
.package(url: "https://github.com/swift-sprinter/aws-lambda-swift-sprinter-nio-plugin", from: "1.0.0-alpha.2"),
11+
.package(url: "https://github.com/swift-sprinter/aws-lambda-swift-sprinter-nio-plugin", from: "1.0.0-alpha.3"),
1212
.package(url: "https://github.com/apple/swift-log.git", from: "1.0.0"),
1313
],
1414
targets: [

Examples/HTTPSRequest/README.md

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,14 @@ Define an Event and a Response as Codable.
1010
```swift
1111
import AsyncHTTPClient
1212
import Foundation
13+
#if canImport(FoundationNetworking)
14+
import FoundationNetworking
15+
#endif
1316
import LambdaSwiftSprinter
1417
import LambdaSwiftSprinterNioPlugin
1518
import Logging
19+
import NIO
20+
import NIOFoundationCompat
1621

1722
struct Event: Codable {
1823
let url: String
@@ -24,35 +29,27 @@ struct Response: Codable {
2429
}
2530
```
2631

27-
Use this code to allow the conversion of a `ByteBuffer` to `Data`
28-
```swift
29-
extension Array where Element == UInt8 {
30-
var data: Data {
31-
return Data(self)
32-
}
33-
}
34-
```
35-
3632
Add a loger:
3733
```swift
3834
let logger = Logger(label: "AWS.Lambda.HTTPSRequest")
3935
```
4036

4137
Define the lambda:
4238
```swift
43-
let lambda: SyncCodableLambda<Event, Response> = { (input, context) throws -> Response in
44-
45-
let request = try HTTPClient.Request(url: input.url)
46-
let response = try httpClient.execute(request: request).wait()
47-
48-
guard let body = response.body,
49-
let buffer = body.getBytes(at: 0, length: body.readableBytes) else {
50-
throw SprinterError.invalidJSON
51-
}
52-
let data = Data(buffer)
53-
let content = String(data: data, encoding: .utf8) ?? ""
54-
55-
return Response(url: input.url, content: content)
39+
let syncCodableNIOLambda: SyncCodableNIOLambda<Event, Response> = { (event, context) throws -> EventLoopFuture<Response> in
40+
41+
let request = try HTTPClient.Request(url: event.url)
42+
let future = httpClient.execute(request: request, deadline: nil)
43+
.flatMapThrowing { (response) throws -> String in
44+
guard let body = response.body,
45+
let value = body.getString(at: 0, length: body.readableBytes) else {
46+
throw SprinterError.invalidJSON
47+
}
48+
return value
49+
}.map { content -> Response in
50+
return Response(url: event.url, content: content)
51+
}
52+
return future
5653
}
5754
```
5855

@@ -64,10 +61,11 @@ Then use this boilerplate code to run the lambda:
6461
```swift
6562
do {
6663
let sprinter = try SprinterNIO()
67-
sprinter.register(handler: "getHttps", lambda: lambda)
64+
sprinter.register(handler: "getHttps", lambda: syncCodableNIOLambda)
65+
6866
try sprinter.run()
6967
} catch {
70-
logger.error(String(describing: error))
68+
logger.error("\(String(describing: error))")
7169
}
7270
```
7371

Examples/HTTPSRequest/Sources/HTTPSRequest/main.swift

Lines changed: 164 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import Foundation
2020
import LambdaSwiftSprinter
2121
import LambdaSwiftSprinterNioPlugin
2222
import Logging
23+
import NIO
24+
import NIOFoundationCompat
2325

2426
struct Event: Codable {
2527
let url: String
@@ -30,32 +32,182 @@ struct Response: Codable {
3032
let content: String
3133
}
3234

33-
extension Array where Element == UInt8 {
34-
var data: Data {
35-
return Data(self)
36-
}
35+
enum MyError: Error {
36+
case invalidParameters
3737
}
3838

3939
let logger = Logger(label: "AWS.Lambda.HTTPSRequest")
4040

41-
let lambda: SyncCodableLambda<Event, Response> = { (input, context) throws -> Response in
41+
/**
42+
How to use the `SyncCodableNIOLambda<Event, Response>` lambda handler.
4243

43-
let request = try HTTPClient.Request(url: input.url)
44-
let response = try httpClient.execute(request: request).wait()
44+
- The code is used by this example.
45+
- Make sure the handler is registered:
46+
47+
```
48+
sprinter.register(handler: "getHttps", lambda: syncCodableNIOLambda)
49+
```
50+
*/
51+
let syncCodableNIOLambda: SyncCodableNIOLambda<Event, Response> = { (event, context) throws -> EventLoopFuture<Response> in
52+
53+
let request = try HTTPClient.Request(url: event.url)
54+
let future = httpClient.execute(request: request, deadline: nil)
55+
.flatMapThrowing { (response) throws -> String in
56+
guard let body = response.body,
57+
let value = body.getString(at: 0, length: body.readableBytes) else {
58+
throw SprinterError.invalidJSON
59+
}
60+
return value
61+
}.map { content -> Response in
62+
return Response(url: event.url, content: content)
63+
}
64+
return future
65+
}
66+
67+
/**
68+
How to use the `SyncDictionaryNIOLambda` lambda handler.
69+
70+
- The code is unused.
71+
- Make sure the handler is registered.
72+
- If it's required by the lambda implementation, amend the following lines:
73+
74+
```
75+
//sprinter.register(handler: "getHttps", lambda: syncCodableNIOLambda)
76+
sprinter.register(handler: "getHttps", lambda: syncDictionaryNIOLambda)
77+
78+
```
79+
*/
80+
let syncDictionaryNIOLambda: SyncDictionaryNIOLambda = { (event, context) throws -> EventLoopFuture<[String: Any]> in
4581

82+
guard let url = event["url"] as? String else {
83+
throw MyError.invalidParameters
84+
}
85+
86+
let request = try HTTPClient.Request(url: url)
87+
let future = httpClient.execute(request: request, deadline: nil)
88+
.flatMapThrowing { (response) throws -> String in
89+
guard let body = response.body,
90+
let value = body.getString(at: 0, length: body.readableBytes) else {
91+
throw SprinterError.invalidJSON
92+
}
93+
return value
94+
}.map { content -> [String: Any] in
95+
return ["url": url,
96+
"content": content]
97+
}
98+
return future
99+
}
100+
101+
/**
102+
How to use the `AsyncDictionaryNIOLambda` lambda handler.
103+
104+
- The code is unused.
105+
- Make sure the handler is registered.
106+
- If it's required by the lambda implementation, amend the following lines:
107+
108+
```
109+
//sprinter.register(handler: "getHttps", lambda: syncCodableNIOLambda)
110+
sprinter.register(handler: "getHttps", lambda: asynchDictionayNIOLambda)
111+
112+
```
113+
*/
114+
let asynchDictionayNIOLambda: AsyncDictionaryNIOLambda = { (event, context, completion) -> Void in
115+
guard let url = event["url"] as? String else {
116+
completion(.failure(MyError.invalidParameters))
117+
return
118+
}
119+
do {
120+
let request = try HTTPClient.Request(url: url)
121+
let dictionary: [String: Any] = try httpClient.execute(request: request, deadline: nil)
122+
.flatMapThrowing { (response) throws -> String in
123+
guard let body = response.body,
124+
let value = body.getString(at: 0, length: body.readableBytes) else {
125+
throw SprinterError.invalidJSON
126+
}
127+
return value
128+
}.map { content -> [String: Any] in
129+
return ["url": url,
130+
"content": content]
131+
}
132+
.wait()
133+
completion(.success(dictionary))
134+
} catch {
135+
completion(.failure(error))
136+
}
137+
}
138+
139+
/**
140+
How to use the `AsyncCodableNIOLambda<Event, Response>` lambda handler.
141+
142+
- The code is unused.
143+
- Make sure the handler is registered.
144+
- If it's required by the lambda implementation, amend the following lines:
145+
146+
```
147+
//sprinter.register(handler: "getHttps", lambda: syncCodableNIOLambda)
148+
sprinter.register(handler: "getHttps", lambda: asyncCodableNIOLambda)
149+
150+
```
151+
*/
152+
let asyncCodableNIOLambda: AsyncCodableNIOLambda<Event, Response> = { (event, context, completion) -> Void in
153+
do {
154+
let request = try HTTPClient.Request(url: event.url)
155+
let reponse: Response = try httpClient.execute(request: request, deadline: nil)
156+
.flatMapThrowing { (response) throws -> String in
157+
guard let body = response.body,
158+
let value = body.getString(at: 0, length: body.readableBytes) else {
159+
throw SprinterError.invalidJSON
160+
}
161+
return value
162+
}.map { content -> Response in
163+
return Response(url: event.url, content: content)
164+
}
165+
.wait()
166+
completion(.success(reponse))
167+
} catch {
168+
completion(.failure(error))
169+
}
170+
}
171+
172+
/**
173+
Deprecated style of implementing the lambda using the core framework.
174+
175+
- The example has been left to keep the compatibility with the tutorial:
176+
177+
[How to work with aws lambda in swift](https://medium.com/better-programming/how-to-work-with-aws-lambda-in-swift-28326c5cc765)
178+
179+
180+
- The code is unused.
181+
- Make sure the handler is registered.
182+
- If it's required by the lambda implementation, amend the following lines:
183+
184+
```
185+
//sprinter.register(handler: "getHttps", lambda: syncCodableNIOLambda)
186+
sprinter.register(handler: "getHttps", lambda: lambda)
187+
188+
```
189+
*/
190+
let lambda: SyncCodableLambda<Event, Response> = { (input, context) throws -> Response in
191+
192+
let request = try HTTPClient.Request(url: input.url)
193+
let response = try httpClient.execute(request: request, deadline: nil).wait()
194+
46195
guard let body = response.body,
47-
let buffer = body.getBytes(at: 0, length: body.readableBytes) else {
48-
throw SprinterError.invalidJSON
196+
let data = body.getData(at: 0, length: body.readableBytes) else {
197+
throw SprinterError.invalidJSON
49198
}
50-
let data = Data(buffer)
51199
let content = String(data: data, encoding: .utf8) ?? ""
52-
200+
53201
return Response(url: input.url, content: content)
54202
}
55203

204+
205+
/// The following code it's required to setup, register, run the lambda and log errors.
56206
do {
57207
let sprinter = try SprinterNIO()
58-
sprinter.register(handler: "getHttps", lambda: lambda)
208+
//Note amend this line in case if it's required to use a different lambda handler.
209+
sprinter.register(handler: "getHttps", lambda: syncCodableNIOLambda)
210+
59211
try sprinter.run()
60212
} catch {
61213
logger.error("\(String(describing: error))")

Examples/HelloWorld/Package.resolved

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Examples/HelloWorld/Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ let package = Package(
88
dependencies: [
99
// Dependencies declare other packages that this package depends on.
1010
//.package(path: "../../../aws-lambda-swift-sprinter-core"),
11-
.package(url: "https://github.com/swift-sprinter/aws-lambda-swift-sprinter-core", from: "1.0.0-alpha.2")
11+
.package(url: "https://github.com/swift-sprinter/aws-lambda-swift-sprinter-core", from: "1.0.0-alpha.3")
1212
],
1313
targets: [
1414
// Targets are the basic building blocks of a package. A target can define a module or a test suite.

0 commit comments

Comments
 (0)