@@ -3,11 +3,45 @@ import JSONRPC
3
3
4
4
#if compiler(>=5.9)
5
5
6
+ actor PredefinedMessageRelay {
7
+ private var messages : [ Data ]
8
+ private let continuation : DataChannel . DataSequence . Continuation
9
+ public nonisolated let sequence : DataChannel . DataSequence
10
+
11
+ init ( messages: [ Data ] ) {
12
+ self . messages = messages
13
+
14
+ ( self . sequence, self . continuation) = DataChannel . DataSequence. makeStream ( )
15
+ }
16
+
17
+ init < T: Encodable > ( content: [ T ] ) throws {
18
+ let messages = try content. map { try JSONEncoder ( ) . encode ( $0) }
19
+
20
+ self . init ( messages: messages)
21
+ }
22
+
23
+ func write( ) {
24
+ continuation. yield ( messages. removeFirst ( ) )
25
+ }
26
+ }
27
+
28
+ extension DataChannel {
29
+ static func predefinedMessagesChannel< T: Encodable > ( _ content: [ T ] ) throws -> DataChannel {
30
+ let relay = try PredefinedMessageRelay ( content: content)
31
+
32
+ return DataChannel (
33
+ writeHandler: { _ in
34
+ // strong-ref here to keep relay alive
35
+ await relay. write ( )
36
+ } ,
37
+ dataSequence: relay. sequence)
38
+ }
39
+ }
40
+
6
41
final class JSONRPCSessionTests : XCTestCase {
7
42
typealias TestResponse = JSONRPCResponse < String ? >
8
- typealias TestResult = Result < TestResponse , Error >
9
43
10
- func testThing ( ) async throws {
44
+ func testResultResponse ( ) async throws {
11
45
let pair = DataChannel . DataSequence. makeStream ( )
12
46
13
47
let channel = DataChannel ( writeHandler: { _ in } ,
@@ -27,6 +61,30 @@ final class JSONRPCSessionTests: XCTestCase {
27
61
28
62
XCTAssertEqual ( response. result, " goodbye " )
29
63
}
64
+
65
+ func testManySendRequestsWithResponses( ) async throws {
66
+ let iterations = 1000
67
+
68
+ // be sure to start at 1, to match id generation
69
+ let responses = ( 1 ... iterations) . map { i in
70
+ let responseParam = " goodbye- \( i) "
71
+
72
+ return TestResponse ( id: JSONId ( i) , result: responseParam)
73
+ }
74
+
75
+ let channel = try DataChannel . predefinedMessagesChannel ( responses)
76
+ let session = JSONRPCSession ( channel: channel)
77
+
78
+ let params = " hello "
79
+
80
+ for i in 1 ... iterations {
81
+ let expectedResponse = " goodbye- \( i) "
82
+
83
+ let response : TestResponse = try await session. sendRequest ( params, method: " mymethod " )
84
+
85
+ XCTAssertEqual ( try ! response. content. get ( ) , expectedResponse)
86
+ }
87
+ }
30
88
}
31
89
32
90
#endif
0 commit comments