starpc 0.46.1 → 0.47.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/echo/client-test.js +4 -2
- package/dist/integration/cross-language/ts-client.d.ts +1 -0
- package/dist/integration/cross-language/ts-client.js +67 -0
- package/dist/integration/cross-language/ts-server.d.ts +1 -0
- package/dist/integration/cross-language/ts-server.js +60 -0
- package/echo/Cargo.toml +8 -0
- package/echo/client-test.ts +4 -2
- package/echo/integration_client.rs +168 -0
- package/echo/integration_server.rs +87 -0
- package/echo/server.go +1 -1
- package/go.mod +11 -35
- package/go.sum +10 -45
- package/integration/cross-language/cpp-client.cpp +448 -0
- package/integration/cross-language/cpp-server.cpp +221 -0
- package/integration/cross-language/go-client/main.go +151 -0
- package/integration/cross-language/go-server/main.go +47 -0
- package/integration/cross-language/run.bash +196 -0
- package/integration/cross-language/ts-client.ts +84 -0
- package/integration/cross-language/ts-server.ts +75 -0
- package/integration/integration.bash +2 -0
- package/package.json +19 -10
- package/srpc/client-invoker.go +1 -5
- package/srpc/errors.go +2 -0
- package/srpc/mux.go +6 -5
- package/srpc/muxed-conn.go +12 -10
- package/srpc/muxed-yamux.go +51 -0
- package/srpc/muxed.go +46 -0
- package/srpc/server.go +1 -3
- package/srpc/stream-yamux.go +72 -0
- package/srpc/websocket.go +1 -2
package/dist/echo/client-test.js
CHANGED
|
@@ -48,7 +48,7 @@ export async function runAbortControllerTest(client) {
|
|
|
48
48
|
const errMsg = err.message;
|
|
49
49
|
errorReturned = true;
|
|
50
50
|
if (errMsg !== ERR_RPC_ABORT) {
|
|
51
|
-
throw new Error('unexpected error: ' + errMsg);
|
|
51
|
+
throw new Error('unexpected error: ' + errMsg, { cause: err });
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
54
|
if (!errorReturned) {
|
|
@@ -69,7 +69,9 @@ export async function runAbortControllerTest(client) {
|
|
|
69
69
|
}
|
|
70
70
|
catch (err) {
|
|
71
71
|
if (msgs.length < 3) {
|
|
72
|
-
throw new Error('expected at least three messages before error'
|
|
72
|
+
throw new Error('expected at least three messages before error', {
|
|
73
|
+
cause: err,
|
|
74
|
+
});
|
|
73
75
|
}
|
|
74
76
|
throw err;
|
|
75
77
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import net from 'net';
|
|
2
|
+
import { pipe } from 'it-pipe';
|
|
3
|
+
import { pushable } from 'it-pushable';
|
|
4
|
+
import { Client } from '../../srpc/client.js';
|
|
5
|
+
import { parseLengthPrefixTransform, prependLengthPrefixTransform, } from '../../srpc/packet.js';
|
|
6
|
+
import { combineUint8ArrayListTransform } from '../../srpc/array-list.js';
|
|
7
|
+
import { runClientTest } from '../../echo/client-test.js';
|
|
8
|
+
// tcpSocketToPacketStream wraps a Node.js TCP socket into a PacketStream.
|
|
9
|
+
function tcpSocketToPacketStream(socket) {
|
|
10
|
+
const socketSource = async function* () {
|
|
11
|
+
const source = pushable({ objectMode: true });
|
|
12
|
+
socket.on('data', (data) => {
|
|
13
|
+
source.push(new Uint8Array(data));
|
|
14
|
+
});
|
|
15
|
+
socket.on('end', () => source.end());
|
|
16
|
+
socket.on('error', (err) => source.end(err));
|
|
17
|
+
socket.on('close', () => source.end());
|
|
18
|
+
yield* pipe(source, parseLengthPrefixTransform(), combineUint8ArrayListTransform());
|
|
19
|
+
};
|
|
20
|
+
return {
|
|
21
|
+
source: socketSource(),
|
|
22
|
+
sink: async (source) => {
|
|
23
|
+
for await (const chunk of pipe(source, prependLengthPrefixTransform())) {
|
|
24
|
+
const data = chunk instanceof Uint8Array ? chunk : chunk.subarray();
|
|
25
|
+
await new Promise((resolve, reject) => {
|
|
26
|
+
socket.write(data, (err) => {
|
|
27
|
+
if (err)
|
|
28
|
+
reject(err);
|
|
29
|
+
else
|
|
30
|
+
resolve();
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
socket.end();
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
async function main() {
|
|
39
|
+
const addr = process.argv[2];
|
|
40
|
+
if (!addr) {
|
|
41
|
+
console.error('usage: ts-client <host:port>');
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
const [host, portStr] = addr.split(':');
|
|
45
|
+
const port = parseInt(portStr, 10);
|
|
46
|
+
const openStream = async () => {
|
|
47
|
+
return new Promise((resolve, reject) => {
|
|
48
|
+
const socket = net.connect(port, host, () => {
|
|
49
|
+
resolve(tcpSocketToPacketStream(socket));
|
|
50
|
+
});
|
|
51
|
+
socket.on('error', reject);
|
|
52
|
+
});
|
|
53
|
+
};
|
|
54
|
+
const client = new Client(openStream);
|
|
55
|
+
console.log('Running client test via TCP...');
|
|
56
|
+
await runClientTest(client);
|
|
57
|
+
console.log('All tests passed.');
|
|
58
|
+
process.exit(0);
|
|
59
|
+
}
|
|
60
|
+
process.on('unhandledRejection', (ev) => {
|
|
61
|
+
console.error('Unhandled rejection', ev);
|
|
62
|
+
process.exit(1);
|
|
63
|
+
});
|
|
64
|
+
main().catch((err) => {
|
|
65
|
+
console.error('Error:', err);
|
|
66
|
+
process.exit(1);
|
|
67
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import net from 'net';
|
|
2
|
+
import { pipe } from 'it-pipe';
|
|
3
|
+
import { pushable } from 'it-pushable';
|
|
4
|
+
import { createMux, createHandler, Server } from '../../srpc/index.js';
|
|
5
|
+
import { parseLengthPrefixTransform, prependLengthPrefixTransform, } from '../../srpc/packet.js';
|
|
6
|
+
import { combineUint8ArrayListTransform } from '../../srpc/array-list.js';
|
|
7
|
+
import { EchoerServer } from '../../echo/server.js';
|
|
8
|
+
import { EchoerDefinition } from '../../echo/echo_srpc.pb.js';
|
|
9
|
+
// tcpSocketToPacketStream wraps a Node.js TCP socket into a PacketStream.
|
|
10
|
+
// Each Uint8Array in source/sink is one packet (no length prefix).
|
|
11
|
+
function tcpSocketToPacketStream(socket) {
|
|
12
|
+
// Source: read from socket, strip length prefix, yield individual packets.
|
|
13
|
+
const socketSource = async function* () {
|
|
14
|
+
const source = pushable({ objectMode: true });
|
|
15
|
+
socket.on('data', (data) => {
|
|
16
|
+
source.push(new Uint8Array(data));
|
|
17
|
+
});
|
|
18
|
+
socket.on('end', () => source.end());
|
|
19
|
+
socket.on('error', (err) => source.end(err));
|
|
20
|
+
socket.on('close', () => source.end());
|
|
21
|
+
yield* pipe(source, parseLengthPrefixTransform(), combineUint8ArrayListTransform());
|
|
22
|
+
};
|
|
23
|
+
return {
|
|
24
|
+
source: socketSource(),
|
|
25
|
+
sink: async (source) => {
|
|
26
|
+
for await (const chunk of pipe(source, prependLengthPrefixTransform())) {
|
|
27
|
+
const data = chunk instanceof Uint8Array ? chunk : chunk.subarray();
|
|
28
|
+
await new Promise((resolve, reject) => {
|
|
29
|
+
socket.write(data, (err) => {
|
|
30
|
+
if (err)
|
|
31
|
+
reject(err);
|
|
32
|
+
else
|
|
33
|
+
resolve();
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
socket.end();
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
const mux = createMux();
|
|
42
|
+
const server = new Server(mux.lookupMethod);
|
|
43
|
+
const echoer = new EchoerServer(server);
|
|
44
|
+
mux.register(createHandler(EchoerDefinition, echoer));
|
|
45
|
+
const tcpServer = net.createServer((socket) => {
|
|
46
|
+
const stream = tcpSocketToPacketStream(socket);
|
|
47
|
+
server.handlePacketStream(stream);
|
|
48
|
+
});
|
|
49
|
+
tcpServer.listen(0, '127.0.0.1', () => {
|
|
50
|
+
const addr = tcpServer.address();
|
|
51
|
+
console.log(`LISTENING ${addr.address}:${addr.port}`);
|
|
52
|
+
});
|
|
53
|
+
process.on('SIGINT', () => {
|
|
54
|
+
tcpServer.close();
|
|
55
|
+
process.exit(0);
|
|
56
|
+
});
|
|
57
|
+
process.on('SIGTERM', () => {
|
|
58
|
+
tcpServer.close();
|
|
59
|
+
process.exit(0);
|
|
60
|
+
});
|
package/echo/Cargo.toml
CHANGED
|
@@ -10,6 +10,14 @@ publish = false
|
|
|
10
10
|
name = "echo-example"
|
|
11
11
|
path = "main.rs"
|
|
12
12
|
|
|
13
|
+
[[bin]]
|
|
14
|
+
name = "integration-server"
|
|
15
|
+
path = "integration_server.rs"
|
|
16
|
+
|
|
17
|
+
[[bin]]
|
|
18
|
+
name = "integration-client"
|
|
19
|
+
path = "integration_client.rs"
|
|
20
|
+
|
|
13
21
|
[dependencies]
|
|
14
22
|
starpc = { workspace = true }
|
|
15
23
|
prost = { workspace = true }
|
package/echo/client-test.ts
CHANGED
|
@@ -58,7 +58,7 @@ export async function runAbortControllerTest(client: Client) {
|
|
|
58
58
|
const errMsg = (err as Error).message
|
|
59
59
|
errorReturned = true
|
|
60
60
|
if (errMsg !== ERR_RPC_ABORT) {
|
|
61
|
-
throw new Error('unexpected error: ' + errMsg)
|
|
61
|
+
throw new Error('unexpected error: ' + errMsg, { cause: err })
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
if (!errorReturned) {
|
|
@@ -80,7 +80,9 @@ export async function runAbortControllerTest(client: Client) {
|
|
|
80
80
|
}
|
|
81
81
|
} catch (err) {
|
|
82
82
|
if (msgs.length < 3) {
|
|
83
|
-
throw new Error('expected at least three messages before error'
|
|
83
|
+
throw new Error('expected at least three messages before error', {
|
|
84
|
+
cause: err,
|
|
85
|
+
})
|
|
84
86
|
}
|
|
85
87
|
throw err
|
|
86
88
|
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
#[allow(dead_code)]
|
|
2
|
+
mod gen;
|
|
3
|
+
|
|
4
|
+
use std::sync::Arc;
|
|
5
|
+
|
|
6
|
+
use async_trait::async_trait;
|
|
7
|
+
use starpc::client::{OpenStream, PacketReceiver, SrpcClient};
|
|
8
|
+
use starpc::rpc::PacketWriter;
|
|
9
|
+
use starpc::transport::create_packet_channel;
|
|
10
|
+
use starpc::{Error, Result};
|
|
11
|
+
// Use Error::Remote for test assertion errors since there's no Error::Remote.
|
|
12
|
+
use tokio::net::TcpStream;
|
|
13
|
+
|
|
14
|
+
use gen::{EchoMsg, EchoerClient, EchoerClientImpl};
|
|
15
|
+
|
|
16
|
+
const BODY_TXT: &str = "hello world via starpc cross-language e2e test";
|
|
17
|
+
|
|
18
|
+
/// Opens a new TCP connection per RPC call.
|
|
19
|
+
struct TcpStreamOpener {
|
|
20
|
+
addr: String,
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
impl TcpStreamOpener {
|
|
24
|
+
fn new(addr: String) -> Self {
|
|
25
|
+
Self { addr }
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
#[async_trait]
|
|
30
|
+
impl OpenStream for TcpStreamOpener {
|
|
31
|
+
async fn open_stream(&self) -> Result<(Arc<dyn PacketWriter>, PacketReceiver)> {
|
|
32
|
+
let stream = TcpStream::connect(&self.addr).await?;
|
|
33
|
+
let (read, write) = tokio::io::split(stream);
|
|
34
|
+
Ok(create_packet_channel(read, write))
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
#[tokio::main]
|
|
39
|
+
async fn main() {
|
|
40
|
+
let addr = std::env::args()
|
|
41
|
+
.nth(1)
|
|
42
|
+
.expect("usage: integration-client <addr>");
|
|
43
|
+
|
|
44
|
+
let opener = TcpStreamOpener::new(addr);
|
|
45
|
+
let client = SrpcClient::new(opener);
|
|
46
|
+
let echo = EchoerClientImpl::new(client);
|
|
47
|
+
|
|
48
|
+
if let Err(e) = test_unary(&echo).await {
|
|
49
|
+
eprintln!("unary test failed: {}", e);
|
|
50
|
+
std::process::exit(1);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if let Err(e) = test_server_stream(&echo).await {
|
|
54
|
+
eprintln!("server stream test failed: {}", e);
|
|
55
|
+
std::process::exit(1);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if let Err(e) = test_client_stream(&echo).await {
|
|
59
|
+
eprintln!("client stream test failed: {}", e);
|
|
60
|
+
std::process::exit(1);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if let Err(e) = test_bidi_stream(&echo).await {
|
|
64
|
+
eprintln!("bidi stream test failed: {}", e);
|
|
65
|
+
std::process::exit(1);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
println!("All tests passed.");
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async fn test_unary(echo: &dyn EchoerClient) -> Result<()> {
|
|
72
|
+
println!("Testing Unary RPC...");
|
|
73
|
+
let req = EchoMsg {
|
|
74
|
+
body: BODY_TXT.to_string(),
|
|
75
|
+
};
|
|
76
|
+
let resp = echo.echo(&req).await?;
|
|
77
|
+
if resp.body != BODY_TXT {
|
|
78
|
+
return Err(Error::Remote(format!(
|
|
79
|
+
"expected {:?} got {:?}",
|
|
80
|
+
BODY_TXT, resp.body
|
|
81
|
+
)));
|
|
82
|
+
}
|
|
83
|
+
println!(" PASSED");
|
|
84
|
+
Ok(())
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async fn test_server_stream(echo: &dyn EchoerClient) -> Result<()> {
|
|
88
|
+
println!("Testing ServerStream RPC...");
|
|
89
|
+
let req = EchoMsg {
|
|
90
|
+
body: BODY_TXT.to_string(),
|
|
91
|
+
};
|
|
92
|
+
let stream = echo.echo_server_stream(&req).await?;
|
|
93
|
+
let mut received = 0;
|
|
94
|
+
loop {
|
|
95
|
+
match stream.recv().await {
|
|
96
|
+
Ok(msg) => {
|
|
97
|
+
if msg.body != BODY_TXT {
|
|
98
|
+
return Err(Error::Remote(format!(
|
|
99
|
+
"expected {:?} got {:?}",
|
|
100
|
+
BODY_TXT, msg.body
|
|
101
|
+
)));
|
|
102
|
+
}
|
|
103
|
+
received += 1;
|
|
104
|
+
}
|
|
105
|
+
Err(Error::StreamClosed) => break,
|
|
106
|
+
Err(e) => return Err(e),
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if received != 5 {
|
|
110
|
+
return Err(Error::Remote(format!(
|
|
111
|
+
"expected 5 messages, got {}",
|
|
112
|
+
received
|
|
113
|
+
)));
|
|
114
|
+
}
|
|
115
|
+
println!(" PASSED");
|
|
116
|
+
Ok(())
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
async fn test_client_stream(echo: &dyn EchoerClient) -> Result<()> {
|
|
120
|
+
println!("Testing ClientStream RPC...");
|
|
121
|
+
let stream = echo.echo_client_stream().await?;
|
|
122
|
+
stream
|
|
123
|
+
.send(&EchoMsg {
|
|
124
|
+
body: BODY_TXT.to_string(),
|
|
125
|
+
})
|
|
126
|
+
.await?;
|
|
127
|
+
let resp = stream.close_and_recv().await?;
|
|
128
|
+
if resp.body != BODY_TXT {
|
|
129
|
+
return Err(Error::Remote(format!(
|
|
130
|
+
"expected {:?} got {:?}",
|
|
131
|
+
BODY_TXT, resp.body
|
|
132
|
+
)));
|
|
133
|
+
}
|
|
134
|
+
println!(" PASSED");
|
|
135
|
+
Ok(())
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
async fn test_bidi_stream(echo: &dyn EchoerClient) -> Result<()> {
|
|
139
|
+
println!("Testing BidiStream RPC...");
|
|
140
|
+
let stream = echo.echo_bidi_stream().await?;
|
|
141
|
+
|
|
142
|
+
// Receive initial message from server.
|
|
143
|
+
let msg = stream.recv().await?;
|
|
144
|
+
if msg.body != "hello from server" {
|
|
145
|
+
return Err(Error::Remote(format!(
|
|
146
|
+
"expected {:?} got {:?}",
|
|
147
|
+
"hello from server", msg.body
|
|
148
|
+
)));
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Send a message and expect echo.
|
|
152
|
+
stream
|
|
153
|
+
.send(&EchoMsg {
|
|
154
|
+
body: BODY_TXT.to_string(),
|
|
155
|
+
})
|
|
156
|
+
.await?;
|
|
157
|
+
let resp = stream.recv().await?;
|
|
158
|
+
if resp.body != BODY_TXT {
|
|
159
|
+
return Err(Error::Remote(format!(
|
|
160
|
+
"expected {:?} got {:?}",
|
|
161
|
+
BODY_TXT, resp.body
|
|
162
|
+
)));
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
stream.close().await?;
|
|
166
|
+
println!(" PASSED");
|
|
167
|
+
Ok(())
|
|
168
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
#[allow(dead_code)]
|
|
2
|
+
mod gen;
|
|
3
|
+
|
|
4
|
+
use std::sync::Arc;
|
|
5
|
+
|
|
6
|
+
use async_trait::async_trait;
|
|
7
|
+
use starpc::{Error, Mux, Result, Server, Stream, StreamExt};
|
|
8
|
+
use tokio::net::TcpListener;
|
|
9
|
+
|
|
10
|
+
use gen::{EchoMsg, EchoerHandler, EchoerServer, Empty};
|
|
11
|
+
|
|
12
|
+
struct EchoServerImpl;
|
|
13
|
+
|
|
14
|
+
#[async_trait]
|
|
15
|
+
impl EchoerServer for EchoServerImpl {
|
|
16
|
+
async fn echo(&self, request: EchoMsg) -> Result<EchoMsg> {
|
|
17
|
+
Ok(EchoMsg {
|
|
18
|
+
body: request.body,
|
|
19
|
+
})
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async fn echo_server_stream(
|
|
23
|
+
&self,
|
|
24
|
+
request: EchoMsg,
|
|
25
|
+
stream: Box<dyn Stream>,
|
|
26
|
+
) -> Result<()> {
|
|
27
|
+
for _ in 0..5 {
|
|
28
|
+
let response = EchoMsg {
|
|
29
|
+
body: request.body.clone(),
|
|
30
|
+
};
|
|
31
|
+
stream.msg_send(&response).await?;
|
|
32
|
+
}
|
|
33
|
+
Ok(())
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async fn echo_client_stream(&self, stream: &dyn Stream) -> Result<EchoMsg> {
|
|
37
|
+
match stream.msg_recv::<EchoMsg>().await {
|
|
38
|
+
Ok(msg) => Ok(msg),
|
|
39
|
+
Err(e) => Err(e),
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async fn echo_bidi_stream(&self, stream: Box<dyn Stream>) -> Result<()> {
|
|
44
|
+
// Send initial message (matches Go server behavior).
|
|
45
|
+
stream
|
|
46
|
+
.msg_send(&EchoMsg {
|
|
47
|
+
body: "hello from server".to_string(),
|
|
48
|
+
})
|
|
49
|
+
.await?;
|
|
50
|
+
loop {
|
|
51
|
+
match stream.msg_recv::<EchoMsg>().await {
|
|
52
|
+
Ok(msg) => {
|
|
53
|
+
stream.msg_send(&msg).await?;
|
|
54
|
+
}
|
|
55
|
+
Err(Error::StreamClosed) => break,
|
|
56
|
+
Err(e) => return Err(e),
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
Ok(())
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async fn rpc_stream(&self, _stream: Box<dyn Stream>) -> Result<()> {
|
|
63
|
+
Err(Error::Unimplemented)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async fn do_nothing(&self, _request: Empty) -> Result<Empty> {
|
|
67
|
+
Ok(Empty {})
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
#[tokio::main]
|
|
72
|
+
async fn main() -> Result<()> {
|
|
73
|
+
let listener = TcpListener::bind("127.0.0.1:0").await?;
|
|
74
|
+
let addr = listener.local_addr()?;
|
|
75
|
+
println!("LISTENING {}", addr);
|
|
76
|
+
|
|
77
|
+
let mux = Arc::new(Mux::new());
|
|
78
|
+
mux.register(Arc::new(EchoerHandler::new(EchoServerImpl)))?;
|
|
79
|
+
|
|
80
|
+
loop {
|
|
81
|
+
let (stream, _) = listener.accept().await?;
|
|
82
|
+
let server = Server::with_arc(mux.clone());
|
|
83
|
+
tokio::spawn(async move {
|
|
84
|
+
let _ = server.handle_stream(stream).await;
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
package/echo/server.go
CHANGED
|
@@ -37,7 +37,7 @@ func (*EchoServer) EchoServerStream(msg *EchoMsg, strm SRPCEchoer_EchoServerStre
|
|
|
37
37
|
responses := 5
|
|
38
38
|
tkr := time.NewTicker(time.Millisecond * 200)
|
|
39
39
|
defer tkr.Stop()
|
|
40
|
-
for
|
|
40
|
+
for range responses {
|
|
41
41
|
if err := strm.MsgSend(msg); err != nil {
|
|
42
42
|
return err
|
|
43
43
|
}
|
package/go.mod
CHANGED
|
@@ -2,23 +2,22 @@ module github.com/aperturerobotics/starpc
|
|
|
2
2
|
|
|
3
3
|
go 1.25
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
github.com/
|
|
8
|
-
|
|
9
|
-
// This fork uses go-protobuf-lite.
|
|
10
|
-
github.com/libp2p/go-msgio => github.com/aperturerobotics/go-libp2p-msgio v0.0.0-20240511033615-1b69178aa5c8 // aperture
|
|
5
|
+
require (
|
|
6
|
+
github.com/aperturerobotics/common v0.30.7 // latest
|
|
7
|
+
github.com/aperturerobotics/protobuf-go-lite v0.12.2 // latest
|
|
8
|
+
github.com/aperturerobotics/util v1.32.4 // latest
|
|
11
9
|
)
|
|
12
10
|
|
|
13
11
|
require (
|
|
14
|
-
github.com/aperturerobotics/
|
|
15
|
-
github.com/aperturerobotics/
|
|
16
|
-
github.com/aperturerobotics/
|
|
12
|
+
github.com/aperturerobotics/abseil-cpp v0.0.0-20260131110040-4bb56e2f9017 // aperture-2
|
|
13
|
+
github.com/aperturerobotics/cli v1.1.0 // indirect
|
|
14
|
+
github.com/aperturerobotics/go-protoc-wasi v0.0.0-20260131050911-b5f94b044584 // indirect
|
|
15
|
+
github.com/aperturerobotics/json-iterator-lite v1.0.1-0.20251104042408-0c9eb8a3f726 // indirect
|
|
16
|
+
github.com/aperturerobotics/protobuf v0.0.0-20260203024654-8201686529c4 // wasi
|
|
17
17
|
)
|
|
18
18
|
|
|
19
19
|
require (
|
|
20
20
|
github.com/coder/websocket v1.8.14 // latest
|
|
21
|
-
github.com/libp2p/go-libp2p v0.47.0 // latest
|
|
22
21
|
github.com/libp2p/go-yamux/v4 v4.0.2 // latest
|
|
23
22
|
github.com/pkg/errors v0.9.1 // latest
|
|
24
23
|
github.com/sirupsen/logrus v1.9.4 // latest
|
|
@@ -26,33 +25,10 @@ require (
|
|
|
26
25
|
)
|
|
27
26
|
|
|
28
27
|
require (
|
|
29
|
-
github.com/aperturerobotics/
|
|
30
|
-
github.com/aperturerobotics/cli v1.1.0 // indirect
|
|
31
|
-
github.com/aperturerobotics/go-protoc-wasi v0.0.0-20260131050911-b5f94b044584 // indirect
|
|
32
|
-
github.com/aperturerobotics/json-iterator-lite v1.0.1-0.20251104042408-0c9eb8a3f726 // indirect
|
|
33
|
-
github.com/aperturerobotics/protobuf v0.0.0-20260203024654-8201686529c4 // wasi
|
|
34
|
-
)
|
|
35
|
-
|
|
36
|
-
require (
|
|
37
|
-
github.com/aperturerobotics/go-protoc-gen-prost v0.0.0-20260203094828-3faf47d2c868 // indirect
|
|
38
|
-
github.com/ipfs/go-cid v0.4.1 // indirect
|
|
39
|
-
github.com/klauspost/cpuid/v2 v2.2.8 // indirect
|
|
28
|
+
github.com/aperturerobotics/go-protoc-gen-prost v0.0.0-20260204215916-dc1f0fed8cfc // indirect
|
|
40
29
|
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
|
|
41
|
-
github.com/minio/sha256-simd v1.0.1 // indirect
|
|
42
|
-
github.com/mr-tron/base58 v1.2.0 // indirect
|
|
43
|
-
github.com/multiformats/go-base32 v0.1.0 // indirect
|
|
44
|
-
github.com/multiformats/go-base36 v0.2.0 // indirect
|
|
45
|
-
github.com/multiformats/go-multiaddr v0.13.0 // indirect
|
|
46
|
-
github.com/multiformats/go-multibase v0.2.0 // indirect
|
|
47
|
-
github.com/multiformats/go-multihash v0.2.3 // indirect
|
|
48
|
-
github.com/multiformats/go-multistream v0.5.0 // indirect
|
|
49
|
-
github.com/multiformats/go-varint v0.0.7 // indirect
|
|
50
|
-
github.com/spaolacci/murmur3 v1.1.0 // indirect
|
|
51
30
|
github.com/tetratelabs/wazero v1.11.0 // indirect
|
|
52
31
|
github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342 // indirect
|
|
53
|
-
golang.org/x/
|
|
54
|
-
golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 // indirect
|
|
55
|
-
golang.org/x/mod v0.32.0 // indirect
|
|
32
|
+
golang.org/x/mod v0.33.0 // indirect
|
|
56
33
|
golang.org/x/sys v0.40.0 // indirect
|
|
57
|
-
lukechampine.com/blake3 v1.3.0 // indirect
|
|
58
34
|
)
|
package/go.sum
CHANGED
|
@@ -2,82 +2,47 @@ github.com/aperturerobotics/abseil-cpp v0.0.0-20260131110040-4bb56e2f9017 h1:3U7
|
|
|
2
2
|
github.com/aperturerobotics/abseil-cpp v0.0.0-20260131110040-4bb56e2f9017/go.mod h1:lNSJTKECIUFAnfeSqy01kXYTYe1BHubW7198jNX3nEw=
|
|
3
3
|
github.com/aperturerobotics/cli v1.1.0 h1:7a+YRC+EY3npAnTzhHV5gLCiw91KS0Ts3XwLILGOsT8=
|
|
4
4
|
github.com/aperturerobotics/cli v1.1.0/go.mod h1:M7BFP9wow5ytTzMyJQOOO991fGfsUqdTI7gGEsHfTQ8=
|
|
5
|
-
github.com/aperturerobotics/common v0.30.
|
|
6
|
-
github.com/aperturerobotics/common v0.30.
|
|
7
|
-
github.com/aperturerobotics/go-
|
|
8
|
-
github.com/aperturerobotics/go-
|
|
9
|
-
github.com/aperturerobotics/go-protoc-gen-prost v0.0.0-20260203094828-3faf47d2c868 h1:r2j7F1tGHkchPBLL55e44g/DfYqK2JV0Ed8suMAxmlU=
|
|
10
|
-
github.com/aperturerobotics/go-protoc-gen-prost v0.0.0-20260203094828-3faf47d2c868/go.mod h1:OBb/beWmr/pDIZAUfi86j/4tBh2v5ctTxKMqSnh9c/4=
|
|
5
|
+
github.com/aperturerobotics/common v0.30.7 h1:MfbgBHwRnCFPCWVXjKiqEBkFGpMf8Nk2pRsUiSuzxSc=
|
|
6
|
+
github.com/aperturerobotics/common v0.30.7/go.mod h1:rdhYmixjslfBT0lEMADQHWjgRKIDxZ+8Paxv4lGZfp0=
|
|
7
|
+
github.com/aperturerobotics/go-protoc-gen-prost v0.0.0-20260204215916-dc1f0fed8cfc h1:MQKYvrnue6iT6DlQdGbaBYvyY/WuR63cbhUtRZjx4OM=
|
|
8
|
+
github.com/aperturerobotics/go-protoc-gen-prost v0.0.0-20260204215916-dc1f0fed8cfc/go.mod h1:OBb/beWmr/pDIZAUfi86j/4tBh2v5ctTxKMqSnh9c/4=
|
|
11
9
|
github.com/aperturerobotics/go-protoc-wasi v0.0.0-20260131050911-b5f94b044584 h1:ER8DYYL71cTg39uZ+Gi699tL/hZoscUWDOw4DbizqhI=
|
|
12
10
|
github.com/aperturerobotics/go-protoc-wasi v0.0.0-20260131050911-b5f94b044584/go.mod h1:vEq8i7EKb32+KXGtIEZjjhNns+BdsL2dUMw4uhy3578=
|
|
13
11
|
github.com/aperturerobotics/json-iterator-lite v1.0.1-0.20251104042408-0c9eb8a3f726 h1:4B1F0DzuqPzb6WqgCjWaqDD7JU9RDsevQG5OP0DFBgs=
|
|
14
12
|
github.com/aperturerobotics/json-iterator-lite v1.0.1-0.20251104042408-0c9eb8a3f726/go.mod h1:SvGGBv3OVxUyqO0ZxA/nvs6z3cg7NIbZ64TnbV2OISo=
|
|
15
13
|
github.com/aperturerobotics/protobuf v0.0.0-20260203024654-8201686529c4 h1:4Dy3BAHh2kgVdHAqtlwcFsgY0kAwUe2m3rfFcaGwGQg=
|
|
16
14
|
github.com/aperturerobotics/protobuf v0.0.0-20260203024654-8201686529c4/go.mod h1:tMgO7y6SJo/d9ZcvrpNqIQtdYT9de+QmYaHOZ4KnhOg=
|
|
17
|
-
github.com/aperturerobotics/protobuf-go-lite v0.12.
|
|
18
|
-
github.com/aperturerobotics/protobuf-go-lite v0.12.
|
|
19
|
-
github.com/aperturerobotics/util v1.32.
|
|
20
|
-
github.com/aperturerobotics/util v1.32.
|
|
15
|
+
github.com/aperturerobotics/protobuf-go-lite v0.12.2 h1:ujwTKgpIYAVsv8VljB6PPMY5SI8i8m/NlIHAkkuxQcU=
|
|
16
|
+
github.com/aperturerobotics/protobuf-go-lite v0.12.2/go.mod h1:lGH3s5ArCTXKI4wJdlNpaybUtwSjfAG0vdWjxOfMcF8=
|
|
17
|
+
github.com/aperturerobotics/util v1.32.4 h1:+f4rZuGC0AfgvA6bEwxSiW3Px9awyqr/CB2ltHyX4a8=
|
|
18
|
+
github.com/aperturerobotics/util v1.32.4/go.mod h1:qfRZZUDn0sEfc43JRA6rKP8bwFxliqGqJZX+p1jeOnQ=
|
|
21
19
|
github.com/coder/websocket v1.8.14 h1:9L0p0iKiNOibykf283eHkKUHHrpG7f65OE3BhhO7v9g=
|
|
22
20
|
github.com/coder/websocket v1.8.14/go.mod h1:NX3SzP+inril6yawo5CQXx8+fk145lPDC6pumgx0mVg=
|
|
23
21
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
|
24
22
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
|
25
23
|
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
|
26
24
|
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
|
27
|
-
github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s=
|
|
28
|
-
github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk=
|
|
29
|
-
github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM=
|
|
30
|
-
github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
|
|
31
25
|
github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8=
|
|
32
26
|
github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg=
|
|
33
|
-
github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA=
|
|
34
|
-
github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg=
|
|
35
27
|
github.com/libp2p/go-yamux/v4 v4.0.2 h1:nrLh89LN/LEiqcFiqdKDRHjGstN300C1269K/EX0CPU=
|
|
36
28
|
github.com/libp2p/go-yamux/v4 v4.0.2/go.mod h1:C808cCRgOs1iBwY4S71T5oxgMxgLmqUw56qh4AeBW2o=
|
|
37
|
-
github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM=
|
|
38
|
-
github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8=
|
|
39
|
-
github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
|
|
40
|
-
github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
|
|
41
|
-
github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE=
|
|
42
|
-
github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI=
|
|
43
|
-
github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0=
|
|
44
|
-
github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4=
|
|
45
|
-
github.com/multiformats/go-multiaddr v0.13.0 h1:BCBzs61E3AGHcYYTv8dqRH43ZfyrqM8RXVPT8t13tLQ=
|
|
46
|
-
github.com/multiformats/go-multiaddr v0.13.0/go.mod h1:sBXrNzucqkFJhvKOiwwLyqamGa/P5EIXNPLovyhQCII=
|
|
47
|
-
github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g=
|
|
48
|
-
github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk=
|
|
49
|
-
github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U=
|
|
50
|
-
github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM=
|
|
51
|
-
github.com/multiformats/go-multistream v0.5.0 h1:5htLSLl7lvJk3xx3qT/8Zm9J4K8vEOf/QGkvOGQAyiE=
|
|
52
|
-
github.com/multiformats/go-multistream v0.5.0/go.mod h1:n6tMZiwiP2wUsR8DgfDWw1dydlEqV3l6N3/GBsX6ILA=
|
|
53
|
-
github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8=
|
|
54
|
-
github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU=
|
|
55
29
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
|
56
30
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
|
57
31
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
|
58
32
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
|
59
33
|
github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w=
|
|
60
34
|
github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g=
|
|
61
|
-
github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
|
|
62
|
-
github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
|
63
35
|
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
|
|
64
36
|
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
|
|
65
37
|
github.com/tetratelabs/wazero v1.11.0 h1:+gKemEuKCTevU4d7ZTzlsvgd1uaToIDtlQlmNbwqYhA=
|
|
66
38
|
github.com/tetratelabs/wazero v1.11.0/go.mod h1:eV28rsN8Q+xwjogd7f4/Pp4xFxO7uOGbLcD/LzB1wiU=
|
|
67
39
|
github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342 h1:FnBeRrxr7OU4VvAzt5X7s6266i6cSVkkFPS0TuXWbIg=
|
|
68
40
|
github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM=
|
|
69
|
-
golang.org/x/
|
|
70
|
-
golang.org/x/
|
|
71
|
-
golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 h1:nDVHiLt8aIbd/VzvPWN6kSOPE7+F/fNFDSXLVYkE/Iw=
|
|
72
|
-
golang.org/x/exp v0.0.0-20250305212735-054e65f0b394/go.mod h1:sIifuuw/Yco/y6yb6+bDNfyeQ/MdPUy/hKEMYQV17cM=
|
|
73
|
-
golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c=
|
|
74
|
-
golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU=
|
|
75
|
-
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
41
|
+
golang.org/x/mod v0.33.0 h1:tHFzIWbBifEmbwtGz65eaWyGiGZatSrT9prnU8DbVL8=
|
|
42
|
+
golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w=
|
|
76
43
|
golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ=
|
|
77
44
|
golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
|
78
45
|
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
|
|
79
46
|
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
|
|
80
47
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
|
81
48
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
|
82
|
-
lukechampine.com/blake3 v1.3.0 h1:sJ3XhFINmHSrYCgl958hscfIa3bw8x4DqMP3u1YvoYE=
|
|
83
|
-
lukechampine.com/blake3 v1.3.0/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k=
|