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.
@@ -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 }
@@ -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 i := 0; i < responses; i++ {
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
- replace (
6
- // This fork uses go-protobuf-lite and adds post-quantum crypto support.
7
- github.com/libp2p/go-libp2p => github.com/aperturerobotics/go-libp2p v0.37.1-0.20241111002741-5cfbb50b74e0 // aperture
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/common v0.30.1-0.20260203095300-e0754eb22a37 // latest
15
- github.com/aperturerobotics/protobuf-go-lite v0.12.1 // latest
16
- github.com/aperturerobotics/util v1.32.3 // latest
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/abseil-cpp v0.0.0-20260131110040-4bb56e2f9017 // aperture-2
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/crypto v0.45.0 // indirect
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.1-0.20260203095300-e0754eb22a37 h1:ia/PiOkGovJUA2Evo3Qjn6mARVbpeACO5ENs5EKH3aQ=
6
- github.com/aperturerobotics/common v0.30.1-0.20260203095300-e0754eb22a37/go.mod h1:o3LkfVkdyNtWz31nGkCKuMP7H2dxarmYCYgXmy1zjtg=
7
- github.com/aperturerobotics/go-libp2p v0.37.1-0.20241111002741-5cfbb50b74e0 h1:tGwbeDoEeQCrUQL+ClUywldqvz9eRmhcVrGwGxz2xJg=
8
- github.com/aperturerobotics/go-libp2p v0.37.1-0.20241111002741-5cfbb50b74e0/go.mod h1:FJkAtQcP9XxqG1NNLNHKm+wLVIGSCQX2s6CEoD+w97g=
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.1 h1:o9of87F/LFS2p5xfq32CrU99dvfqIAalTP7ZzoZK6Kg=
18
- github.com/aperturerobotics/protobuf-go-lite v0.12.1/go.mod h1:lGH3s5ArCTXKI4wJdlNpaybUtwSjfAG0vdWjxOfMcF8=
19
- github.com/aperturerobotics/util v1.32.3 h1:wBc6L2guYMgLEzFwORH3CLMoMpfEqbV6pDqYervo3S0=
20
- github.com/aperturerobotics/util v1.32.3/go.mod h1:qfRZZUDn0sEfc43JRA6rKP8bwFxliqGqJZX+p1jeOnQ=
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/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q=
70
- golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
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=