starpc 0.49.20 → 0.51.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.
Files changed (78) hide show
  1. package/dist/integration/cross-language/ts-client.js +5 -79
  2. package/dist/integration/cross-language/ts-server.js +4 -84
  3. package/dist/mock/index.d.ts +2 -2
  4. package/dist/mock/index.js +2 -2
  5. package/dist/srpc/client.d.ts +1 -3
  6. package/dist/srpc/client.js +2 -22
  7. package/dist/srpc/common-rpc.d.ts +1 -11
  8. package/dist/srpc/common-rpc.js +5 -66
  9. package/dist/srpc/handler.d.ts +1 -2
  10. package/dist/srpc/index.d.ts +0 -4
  11. package/dist/srpc/index.js +0 -2
  12. package/dist/srpc/invoker.d.ts +1 -2
  13. package/dist/srpc/server-rpc.js +1 -3
  14. package/dist/srpc/server.test.js +35 -1
  15. package/echo/echo.go +8 -8
  16. package/echo/echo.pb.go +12 -36
  17. package/echo/echo_srpc.pb.cpp +1 -1
  18. package/echo/echo_srpc.pb.go +1 -1
  19. package/echo/echo_srpc.pb.hpp +1 -1
  20. package/echo/echo_srpc.pb.rs +1 -1
  21. package/echo/server.go +1 -1
  22. package/go.mod +13 -12
  23. package/go.sum +26 -24
  24. package/integration/cross-language/go-client/main.go +4 -142
  25. package/integration/cross-language/go-server/main.go +3 -149
  26. package/integration/cross-language/run.bash +5 -105
  27. package/integration/cross-language/ts-client.ts +5 -90
  28. package/integration/cross-language/ts-server.ts +6 -94
  29. package/mock/index.ts +2 -2
  30. package/mock/mock.go +1 -1
  31. package/mock/mock.pb.go +12 -36
  32. package/mock/mock_srpc.pb.cpp +1 -1
  33. package/mock/mock_srpc.pb.go +1 -1
  34. package/mock/mock_srpc.pb.hpp +1 -1
  35. package/mock/mock_srpc.pb.rs +1 -1
  36. package/package.json +19 -26
  37. package/srpc/accept.go +1 -1
  38. package/srpc/client-prefix.go +1 -1
  39. package/srpc/client-set.go +1 -1
  40. package/srpc/client.go +1 -1
  41. package/srpc/client.ts +4 -31
  42. package/srpc/common-rpc.go +15 -69
  43. package/srpc/common-rpc.ts +6 -78
  44. package/srpc/common-rpc_test.go +81 -0
  45. package/srpc/errors.go +26 -1
  46. package/srpc/handler.ts +1 -2
  47. package/srpc/index.ts +0 -4
  48. package/srpc/invoker-prefix.go +1 -1
  49. package/srpc/invoker.go +2 -2
  50. package/srpc/invoker.ts +5 -9
  51. package/srpc/message.go +1 -1
  52. package/srpc/msg-stream.go +1 -9
  53. package/srpc/mux-verbose.go +1 -1
  54. package/srpc/mux.go +1 -1
  55. package/srpc/muxed-conn.go +1 -1
  56. package/srpc/muxed-yamux.go +1 -1
  57. package/srpc/rpcproto.pb.go +102 -323
  58. package/srpc/server-rpc.go +1 -1
  59. package/srpc/server-rpc.ts +1 -6
  60. package/srpc/server.test.ts +49 -1
  61. package/srpc/stream-pipe.go +1 -1
  62. package/srpc/stream-rwc.go +1 -1
  63. package/srpc/stream-yamux.go +1 -1
  64. package/srpc/stream.go +0 -20
  65. package/srpc/websocket.go +1 -1
  66. package/dist/srpc/call-receipt.d.ts +0 -17
  67. package/dist/srpc/call-receipt.js +0 -105
  68. package/dist/srpc/call-receipt.test.d.ts +0 -1
  69. package/dist/srpc/call-receipt.test.js +0 -374
  70. package/dist/srpc/server-invocation.d.ts +0 -17
  71. package/dist/srpc/server-invocation.js +0 -37
  72. package/srpc/call-receipt-e2e_test.go +0 -111
  73. package/srpc/call-receipt.go +0 -112
  74. package/srpc/call-receipt.test.ts +0 -438
  75. package/srpc/call-receipt.ts +0 -130
  76. package/srpc/call-receipt_test.go +0 -536
  77. package/srpc/server-invocation.go +0 -58
  78. package/srpc/server-invocation.ts +0 -82
package/echo/echo.pb.go CHANGED
@@ -1,5 +1,5 @@
1
1
  // Code generated by protoc-gen-go-lite. DO NOT EDIT.
2
- // protoc-gen-go-lite version: v0.13.0
2
+ // protoc-gen-go-lite version: v0.16.0
3
3
  // source: github.com/aperturerobotics/starpc/echo/echo.proto
4
4
 
5
5
  package echo
@@ -8,8 +8,6 @@ import (
8
8
  fmt "fmt"
9
9
  io "io"
10
10
  slices "slices"
11
- strconv "strconv"
12
- strings "strings"
13
11
 
14
12
  protobuf_go_lite "github.com/aperturerobotics/protobuf-go-lite"
15
13
  json "github.com/aperturerobotics/protobuf-go-lite/json"
@@ -141,13 +139,10 @@ func (m *EchoMsg) MarshalToSizedBufferVT(dAtA []byte) (int, error) {
141
139
  var l int
142
140
  _ = l
143
141
  if m.unknownFields != nil {
144
- i -= len(m.unknownFields)
145
- copy(dAtA[i:], m.unknownFields)
142
+ i = protobuf_go_lite.EncodeRawBytes(dAtA, i, m.unknownFields)
146
143
  }
147
144
  if len(m.Body) > 0 {
148
- i -= len(m.Body)
149
- copy(dAtA[i:], m.Body)
150
- i = protobuf_go_lite.EncodeVarint(dAtA, i, uint64(len(m.Body)))
145
+ i = protobuf_go_lite.EncodeString(dAtA, i, m.Body)
151
146
  i--
152
147
  dAtA[i] = 0xa
153
148
  }
@@ -160,26 +155,19 @@ func (m *EchoMsg) SizeVT() (n int) {
160
155
  }
161
156
  var l int
162
157
  _ = l
163
- l = len(m.Body)
164
- if l > 0 {
165
- n += 1 + l + protobuf_go_lite.SizeOfVarint(uint64(l))
166
- }
158
+ n += protobuf_go_lite.SizeStringNonEmpty(1, m.Body)
167
159
  n += len(m.unknownFields)
168
160
  return n
169
161
  }
170
162
 
171
163
  func (x *EchoMsg) MarshalProtoText() string {
172
- var sb strings.Builder
173
- sb.WriteString("EchoMsg {")
164
+ var sb protobuf_go_lite.TextBuilder
165
+ initialLen := protobuf_go_lite.TextStartMessage(&sb, "EchoMsg")
174
166
  if x.Body != "" {
175
- if sb.Len() > 9 {
176
- sb.WriteString(" ")
177
- }
178
- sb.WriteString("body: ")
179
- sb.WriteString(strconv.Quote(x.Body))
167
+ protobuf_go_lite.TextWriteFieldPrefix(&sb, initialLen, "body")
168
+ protobuf_go_lite.TextWriteString(&sb, x.Body)
180
169
  }
181
- sb.WriteString("}")
182
- return sb.String()
170
+ return protobuf_go_lite.TextFinishMessage(&sb)
183
171
  }
184
172
 
185
173
  func (x *EchoMsg) String() string {
@@ -210,24 +198,12 @@ func (m *EchoMsg) UnmarshalVT(dAtA []byte) error {
210
198
  if wireType != 2 {
211
199
  return fmt.Errorf("proto: wrong wireType = %d for field Body", wireType)
212
200
  }
213
- var stringLen uint64
214
- stringLen, iNdEx, err = protobuf_go_lite.DecodeVarint(dAtA, iNdEx)
201
+ var v string
202
+ v, iNdEx, err = protobuf_go_lite.DecodeString(dAtA, iNdEx)
215
203
  if err != nil {
216
204
  return err
217
205
  }
218
- intStringLen := int(stringLen)
219
- if intStringLen < 0 {
220
- return protobuf_go_lite.ErrInvalidLength
221
- }
222
- postIndex := iNdEx + intStringLen
223
- if postIndex < 0 {
224
- return protobuf_go_lite.ErrInvalidLength
225
- }
226
- if postIndex > l {
227
- return io.ErrUnexpectedEOF
228
- }
229
- m.Body = string(dAtA[iNdEx:postIndex])
230
- iNdEx = postIndex
206
+ m.Body = v
231
207
  default:
232
208
  iNdEx = preIndex
233
209
  skippy, err := protobuf_go_lite.Skip(dAtA[iNdEx:])
@@ -1,7 +1,7 @@
1
1
  //go:build deps_only
2
2
 
3
3
  // Code generated by protoc-gen-starpc-cpp. DO NOT EDIT.
4
- // protoc-gen-starpc-cpp version: v0.49.7
4
+ // protoc-gen-starpc-cpp version: v0.49.21
5
5
  // source: github.com/aperturerobotics/starpc/echo/echo.proto
6
6
 
7
7
  #include "echo_srpc.pb.hpp"
@@ -1,5 +1,5 @@
1
1
  // Code generated by protoc-gen-srpc. DO NOT EDIT.
2
- // protoc-gen-srpc version: v0.49.7
2
+ // protoc-gen-srpc version: v0.49.21
3
3
  // source: github.com/aperturerobotics/starpc/echo/echo.proto
4
4
 
5
5
  package echo
@@ -1,7 +1,7 @@
1
1
  //go:build deps_only && cgo
2
2
 
3
3
  // Code generated by protoc-gen-starpc-cpp. DO NOT EDIT.
4
- // protoc-gen-starpc-cpp version: v0.49.7
4
+ // protoc-gen-starpc-cpp version: v0.49.21
5
5
  // source: github.com/aperturerobotics/starpc/echo/echo.proto
6
6
 
7
7
  #pragma once
@@ -1,5 +1,5 @@
1
1
  // Code generated by protoc-gen-starpc-rust. DO NOT EDIT.
2
- // protoc-gen-starpc-rust version: v0.49.7
2
+ // protoc-gen-starpc-rust version: v0.49.21
3
3
  // source: github.com/aperturerobotics/starpc/echo/echo.proto
4
4
 
5
5
  #[allow(unused_imports)]
package/echo/server.go CHANGED
@@ -94,4 +94,4 @@ func (s *EchoServer) DoNothing(ctx context.Context, empty *emptypb.Empty) (*empt
94
94
  }
95
95
 
96
96
  // _ is a type assertion
97
- var _ SRPCEchoerServer = ((*EchoServer)(nil))
97
+ var _ SRPCEchoerServer = (*EchoServer)(nil)
package/go.mod CHANGED
@@ -3,31 +3,32 @@ module github.com/aperturerobotics/starpc
3
3
  go 1.25.0
4
4
 
5
5
  require (
6
- github.com/aperturerobotics/common v0.33.1-0.20260516193515-675cfc5a0c12 // latest
7
- github.com/aperturerobotics/protobuf-go-lite v0.13.0 // latest
8
- github.com/aperturerobotics/util v1.34.5 // latest
6
+ github.com/aperturerobotics/common v0.35.0 // latest
7
+ github.com/aperturerobotics/protobuf-go-lite v0.16.0 // latest
8
+ github.com/aperturerobotics/util v1.34.9 // latest
9
9
  )
10
10
 
11
11
  require (
12
12
  github.com/aperturerobotics/abseil-cpp v0.0.0-20260131110040-4bb56e2f9017 // aperture-2
13
13
  github.com/aperturerobotics/cli v1.1.0 // indirect
14
- github.com/aperturerobotics/go-protoc-gen-prost v0.0.0-20260329113538-218ccd8f20e0 // indirect
15
- github.com/aperturerobotics/go-protoc-wasi v0.0.0-20260329113540-600516012db3 // indirect
16
- github.com/aperturerobotics/go-websocket v1.8.15-0.20260329113544-74dbfb8f11c6 // master
17
- github.com/aperturerobotics/json-iterator-lite v1.0.1-0.20251104042408-0c9eb8a3f726 // indirect
14
+ github.com/aperturerobotics/go-protoc-gen-prost v0.0.0-20260705010911-9f53feac967b // indirect
15
+ github.com/aperturerobotics/go-protoc-wasi v0.0.0-20260712054757-d8078c296c17 // indirect
16
+ github.com/aperturerobotics/go-websocket v1.8.15-0.20260619192713-a096778f08c1 // master
17
+ github.com/aperturerobotics/json-iterator-lite v1.1.0 // indirect
18
18
  github.com/aperturerobotics/protobuf v0.0.0-20260203024654-8201686529c4 // wasi
19
19
  )
20
20
 
21
21
  require (
22
- github.com/libp2p/go-yamux/v4 v4.0.2 // latest
23
22
  github.com/pkg/errors v0.9.1 // latest
24
- github.com/sirupsen/logrus v1.9.5-0.20260508084601-d4a50659cfd6 // latest
23
+ github.com/sirupsen/logrus v1.9.5-0.20260629095817-a23d315dfebb // latest
25
24
  )
26
25
 
26
+ require github.com/libp2p/go-yamux/v5 v5.1.0
27
+
27
28
  require (
28
29
  github.com/libp2p/go-buffer-pool v0.1.0 // indirect
29
- github.com/tetratelabs/wazero v1.11.0 // indirect
30
+ github.com/tetratelabs/wazero v1.12.0 // indirect
30
31
  github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342 // indirect
31
- golang.org/x/mod v0.35.0 // indirect
32
- golang.org/x/sys v0.44.0 // indirect
32
+ golang.org/x/mod v0.38.0 // indirect
33
+ golang.org/x/sys v0.47.0 // indirect
33
34
  )
package/go.sum CHANGED
@@ -2,46 +2,48 @@ 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.33.1-0.20260516193515-675cfc5a0c12 h1:KQiFEDyu5//G8JZ3yTN92kF2P3F+LHjSKsQikgROncU=
6
- github.com/aperturerobotics/common v0.33.1-0.20260516193515-675cfc5a0c12/go.mod h1:pW7BhBpKzVrTxN8XIz6jb3MJERZ15GDxaGQ7jcIl0Xg=
7
- github.com/aperturerobotics/go-protoc-gen-prost v0.0.0-20260329113538-218ccd8f20e0 h1:6/3RSSlPEQ6LeidslB1ZCJkxW+MnfYDkvdWMDklDXw4=
8
- github.com/aperturerobotics/go-protoc-gen-prost v0.0.0-20260329113538-218ccd8f20e0/go.mod h1:OBb/beWmr/pDIZAUfi86j/4tBh2v5ctTxKMqSnh9c/4=
9
- github.com/aperturerobotics/go-protoc-wasi v0.0.0-20260329113540-600516012db3 h1:lp+V8RYcBwTX1p81swkpZn5fhw1wn2xLorzETIxRyZQ=
10
- github.com/aperturerobotics/go-protoc-wasi v0.0.0-20260329113540-600516012db3/go.mod h1:vEq8i7EKb32+KXGtIEZjjhNns+BdsL2dUMw4uhy3578=
11
- github.com/aperturerobotics/go-websocket v1.8.15-0.20260329113544-74dbfb8f11c6 h1:Utc1F7jdCc6/HrwwIikJFXt/hXxkWIWETLp/CsG6Gl0=
12
- github.com/aperturerobotics/go-websocket v1.8.15-0.20260329113544-74dbfb8f11c6/go.mod h1:9KnSGuqxSXbdB/Oi0I6vvfPLkclfJwMGAQaDDGVgGow=
13
- github.com/aperturerobotics/json-iterator-lite v1.0.1-0.20251104042408-0c9eb8a3f726 h1:4B1F0DzuqPzb6WqgCjWaqDD7JU9RDsevQG5OP0DFBgs=
14
- github.com/aperturerobotics/json-iterator-lite v1.0.1-0.20251104042408-0c9eb8a3f726/go.mod h1:SvGGBv3OVxUyqO0ZxA/nvs6z3cg7NIbZ64TnbV2OISo=
5
+ github.com/aperturerobotics/common v0.34.4 h1:RQTOm6LxEnucXkED/kruhKKAOL6tbaPzMgfHPKaES4k=
6
+ github.com/aperturerobotics/common v0.34.4/go.mod h1:xnb1VBRs3x2o1PaKg0OlP7SqDaC9Hmrmt9xH85rOS+A=
7
+ github.com/aperturerobotics/common v0.35.0 h1:VU4OPMXJyqT37lTOtNEMa3QLW5tR8YIBAKbjgxSzuZs=
8
+ github.com/aperturerobotics/common v0.35.0/go.mod h1:xnb1VBRs3x2o1PaKg0OlP7SqDaC9Hmrmt9xH85rOS+A=
9
+ github.com/aperturerobotics/go-protoc-gen-prost v0.0.0-20260705010911-9f53feac967b h1:MMk+AbWPCMfqc2Lm2bJl8lCCsuvlM2+C0CP10fpE3bc=
10
+ github.com/aperturerobotics/go-protoc-gen-prost v0.0.0-20260705010911-9f53feac967b/go.mod h1:OBb/beWmr/pDIZAUfi86j/4tBh2v5ctTxKMqSnh9c/4=
11
+ github.com/aperturerobotics/go-protoc-wasi v0.0.0-20260712054757-d8078c296c17 h1:WT1YmZjJf8fUF1zKbeNNKXFA+t8Wtbr8AVMAmdKcrUU=
12
+ github.com/aperturerobotics/go-protoc-wasi v0.0.0-20260712054757-d8078c296c17/go.mod h1:vEq8i7EKb32+KXGtIEZjjhNns+BdsL2dUMw4uhy3578=
13
+ github.com/aperturerobotics/go-websocket v1.8.15-0.20260619192713-a096778f08c1 h1:q2qkdNOrnhAFf6B7TBeUoAYstYWxPvozN+3vJi2jgp0=
14
+ github.com/aperturerobotics/go-websocket v1.8.15-0.20260619192713-a096778f08c1/go.mod h1:9KnSGuqxSXbdB/Oi0I6vvfPLkclfJwMGAQaDDGVgGow=
15
+ github.com/aperturerobotics/json-iterator-lite v1.1.0 h1:ZLLqHhHTKYlmCAP873ras2e/yVU/THtwC+ji3tXLMMg=
16
+ github.com/aperturerobotics/json-iterator-lite v1.1.0/go.mod h1:SvGGBv3OVxUyqO0ZxA/nvs6z3cg7NIbZ64TnbV2OISo=
15
17
  github.com/aperturerobotics/protobuf v0.0.0-20260203024654-8201686529c4 h1:4Dy3BAHh2kgVdHAqtlwcFsgY0kAwUe2m3rfFcaGwGQg=
16
18
  github.com/aperturerobotics/protobuf v0.0.0-20260203024654-8201686529c4/go.mod h1:tMgO7y6SJo/d9ZcvrpNqIQtdYT9de+QmYaHOZ4KnhOg=
17
- github.com/aperturerobotics/protobuf-go-lite v0.13.0 h1:jEvCJhHaJEikDY/va2AUnS0DOb/0n82aISLAqxSh4Sk=
18
- github.com/aperturerobotics/protobuf-go-lite v0.13.0/go.mod h1:lGH3s5ArCTXKI4wJdlNpaybUtwSjfAG0vdWjxOfMcF8=
19
- github.com/aperturerobotics/util v1.34.5 h1:007MaOJrrsiGm5o1c8Tt7p8nVwUAxkM6pmGflrBww/U=
20
- github.com/aperturerobotics/util v1.34.5/go.mod h1:mDe7WnncVuV7yjeeVSsagyfrw4xfncu7d+f0+d70niY=
19
+ github.com/aperturerobotics/protobuf-go-lite v0.16.0 h1:McGR0jrc15ZkH8HUpAARDOtazjwqr+uYXVHrrR59K28=
20
+ github.com/aperturerobotics/protobuf-go-lite v0.16.0/go.mod h1:3Ay/E7iaw2KWLirK3+dDdNJZHK0hu8Y1/kKeYeUa+8s=
21
+ github.com/aperturerobotics/util v1.34.9 h1:Eyhu1Citt+od7jKIb+Q92h/CEujWCFsvdvJavQeoRjM=
22
+ github.com/aperturerobotics/util v1.34.9/go.mod h1:GxjGkYQNEj8xvLFz+T8ifqANtK5cMesOlCxh50htvBI=
21
23
  github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
22
24
  github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
23
25
  github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
24
26
  github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
25
27
  github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8=
26
28
  github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg=
27
- github.com/libp2p/go-yamux/v4 v4.0.2 h1:nrLh89LN/LEiqcFiqdKDRHjGstN300C1269K/EX0CPU=
28
- github.com/libp2p/go-yamux/v4 v4.0.2/go.mod h1:C808cCRgOs1iBwY4S71T5oxgMxgLmqUw56qh4AeBW2o=
29
+ github.com/libp2p/go-yamux/v5 v5.1.0 h1:8Qlxj4E9JGJAQVW6+uj2o7mqkqsIVlSUGmTWhlXzoHE=
30
+ github.com/libp2p/go-yamux/v5 v5.1.0/go.mod h1:tgIQ07ObtRR/I0IWsFOyQIL9/dR5UXgc2s8xKmNZv1o=
29
31
  github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
30
32
  github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
31
33
  github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
32
34
  github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
33
- github.com/sirupsen/logrus v1.9.5-0.20260508084601-d4a50659cfd6 h1:D6qewLO/pJ+JvUwuri1dmCbc32d/eO+xyqg+p3N+9kA=
34
- github.com/sirupsen/logrus v1.9.5-0.20260508084601-d4a50659cfd6/go.mod h1:FXZFonkDAnFozmO+5hGAFvB0Yg9/j2SIhA/QuIkP180=
35
+ github.com/sirupsen/logrus v1.9.5-0.20260629095817-a23d315dfebb h1:+C8W2sTMIRbihe5hQH6JuT2mi3m/QgdGf0YdFyx2azA=
36
+ github.com/sirupsen/logrus v1.9.5-0.20260629095817-a23d315dfebb/go.mod h1:FXZFonkDAnFozmO+5hGAFvB0Yg9/j2SIhA/QuIkP180=
35
37
  github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
36
38
  github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
37
- github.com/tetratelabs/wazero v1.11.0 h1:+gKemEuKCTevU4d7ZTzlsvgd1uaToIDtlQlmNbwqYhA=
38
- github.com/tetratelabs/wazero v1.11.0/go.mod h1:eV28rsN8Q+xwjogd7f4/Pp4xFxO7uOGbLcD/LzB1wiU=
39
+ github.com/tetratelabs/wazero v1.12.0 h1:DuWcpNu/FzgEXgGBDp8J1Spc+CWOvvtvVyjKlaZopYU=
40
+ github.com/tetratelabs/wazero v1.12.0/go.mod h1:LvKtzl2RqO4gyF27BiXU+nKAjcV8f38U+kP/q2vgxh0=
39
41
  github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342 h1:FnBeRrxr7OU4VvAzt5X7s6266i6cSVkkFPS0TuXWbIg=
40
42
  github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM=
41
- golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM=
42
- golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU=
43
- golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ=
44
- golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
43
+ golang.org/x/mod v0.38.0 h1:MECBjubtXD7yj4HrhIUcywNaGeNVUdfVnxmPajOk4yk=
44
+ golang.org/x/mod v0.38.0/go.mod h1:V6Xz0pq8TQ3dGqVQ1FVHuelZpAL0uNhSkk9ogYP3c40=
45
+ golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs=
46
+ golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
45
47
  google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
46
48
  google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
47
49
  gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
@@ -2,7 +2,6 @@ package main
2
2
 
3
3
  import (
4
4
  "context"
5
- "errors"
6
5
  "fmt"
7
6
  "io"
8
7
  "net"
@@ -15,32 +14,13 @@ import (
15
14
  const bodyTxt = "hello world via starpc cross-language e2e test"
16
15
 
17
16
  func main() {
18
- receiptMode := len(os.Args) > 1 && os.Args[1] == "receipt"
19
- receiptCase := ""
20
- addrIndex := 1
21
- if receiptMode {
22
- if len(os.Args) < 3 {
23
- fmt.Fprintf(os.Stderr, "usage: go-client receipt <case> <addr>\n")
24
- os.Exit(1)
25
- }
26
- receiptCase = os.Args[2]
27
- addrIndex = 3
28
- switch receiptCase {
29
- case "commit", "abort", "loss", "bare-close":
30
- default:
31
- fmt.Fprintf(os.Stderr, "unknown receipt case: %s\n", receiptCase)
32
- os.Exit(1)
33
- }
34
- }
35
- if len(os.Args) <= addrIndex {
36
- fmt.Fprintf(os.Stderr, "usage: go-client [receipt <case>] <addr>\n")
17
+ if len(os.Args) <= 1 {
18
+ fmt.Fprintf(os.Stderr, "usage: go-client <addr>\n")
37
19
  os.Exit(1)
38
20
  }
39
- addr := os.Args[addrIndex]
40
- var conn net.Conn
21
+ addr := os.Args[1]
41
22
  openStream := func(ctx context.Context, msgHandler srpc.PacketDataHandler, closeHandler srpc.CloseHandler) (srpc.PacketWriter, error) {
42
- var err error
43
- conn, err = net.Dial("tcp", addr) //nolint:gosec
23
+ conn, err := net.Dial("tcp", addr) //nolint:gosec
44
24
  if err != nil {
45
25
  return nil, err
46
26
  }
@@ -52,35 +32,22 @@ func main() {
52
32
  client := srpc.NewClient(openStream)
53
33
  echoClient := echo.NewSRPCEchoerClient(client)
54
34
  ctx := context.Background()
55
- if receiptMode {
56
- if err := testReceipt(ctx, client, &conn, receiptCase); err != nil {
57
- fmt.Fprintf(os.Stderr, "receipt test failed: %v\n", err)
58
- os.Exit(1)
59
- }
60
- fmt.Println("All tests passed.")
61
- return
62
- }
63
-
64
35
  if err := testUnary(ctx, echoClient); err != nil {
65
36
  fmt.Fprintf(os.Stderr, "unary test failed: %v\n", err)
66
37
  os.Exit(1)
67
38
  }
68
-
69
39
  if err := testServerStream(ctx, echoClient); err != nil {
70
40
  fmt.Fprintf(os.Stderr, "server stream test failed: %v\n", err)
71
41
  os.Exit(1)
72
42
  }
73
-
74
43
  if err := testClientStream(ctx, echoClient); err != nil {
75
44
  fmt.Fprintf(os.Stderr, "client stream test failed: %v\n", err)
76
45
  os.Exit(1)
77
46
  }
78
-
79
47
  if err := testBidiStream(ctx, echoClient); err != nil {
80
48
  fmt.Fprintf(os.Stderr, "bidi stream test failed: %v\n", err)
81
49
  os.Exit(1)
82
50
  }
83
-
84
51
  fmt.Println("All tests passed.")
85
52
  }
86
53
 
@@ -97,79 +64,6 @@ func testUnary(ctx context.Context, client echo.SRPCEchoerClient) error {
97
64
  return nil
98
65
  }
99
66
 
100
- func testReceipt(
101
- ctx context.Context,
102
- client srpc.Client,
103
- conn *net.Conn,
104
- receiptCase string,
105
- ) error {
106
- fmt.Printf("Testing held unary receipt (%s)...\n", receiptCase)
107
- out := new(echo.EchoMsg)
108
- receipt, err := srpc.ExecCallReceipt(
109
- ctx, client, echo.SRPCEchoerServiceID, "Echo",
110
- &echo.EchoMsg{Body: bodyTxt}, out,
111
- )
112
- if err != nil {
113
- return fmt.Errorf("receipt call: %w", err)
114
- }
115
- if out.GetBody() != bodyTxt {
116
- return fmt.Errorf("expected %q got %q", bodyTxt, out.GetBody())
117
- }
118
-
119
- switch receiptCase {
120
- case "commit":
121
- if err := receipt.Commit(); err != nil {
122
- return fmt.Errorf("receipt commit: %w", err)
123
- }
124
- case "abort":
125
- if err := receipt.Abort(); err != nil {
126
- return fmt.Errorf("receipt abort: %w", err)
127
- }
128
- case "loss":
129
- if *conn == nil {
130
- return errors.New("receipt connection is nil")
131
- }
132
- tcpConn, ok := (*conn).(*net.TCPConn)
133
- if !ok {
134
- return errors.New("receipt connection is not TCP")
135
- }
136
- if err := tcpConn.SetLinger(0); err != nil {
137
- return fmt.Errorf("set receipt loss linger: %w", err)
138
- }
139
- if err := tcpConn.Close(); err != nil {
140
- return fmt.Errorf("close lost connection: %w", err)
141
- }
142
- if err := receipt.Commit(); err == nil {
143
- return errors.New("loss receipt commit unexpectedly succeeded")
144
- }
145
- case "bare-close":
146
- if *conn == nil {
147
- return errors.New("receipt connection is nil")
148
- }
149
- tcpConn, ok := (*conn).(*net.TCPConn)
150
- if !ok {
151
- return errors.New("receipt connection is not TCP")
152
- }
153
- if err := tcpConn.CloseWrite(); err != nil {
154
- return fmt.Errorf("close receipt write side: %w", err)
155
- }
156
- if err := receipt.Commit(); err == nil {
157
- return errors.New("bare-close receipt commit unexpectedly succeeded")
158
- }
159
- default:
160
- return fmt.Errorf("unknown receipt case: %s", receiptCase)
161
- }
162
-
163
- if err := emitReceiptEvent(
164
- fmt.Sprintf("CLIENT_RECEIPT_RESOLVED %s", receiptTerminalName(receiptCase)),
165
- ); err != nil {
166
- return fmt.Errorf("record receipt resolution: %w", err)
167
- }
168
-
169
- fmt.Println(" PASSED")
170
- return nil
171
- }
172
-
173
67
  func testServerStream(ctx context.Context, client echo.SRPCEchoerClient) error {
174
68
  fmt.Println("Testing ServerStream RPC...")
175
69
  strm, err := client.EchoServerStream(ctx, &echo.EchoMsg{Body: bodyTxt})
@@ -249,35 +143,3 @@ func testBidiStream(ctx context.Context, client echo.SRPCEchoerClient) error {
249
143
  fmt.Println(" PASSED")
250
144
  return nil
251
145
  }
252
-
253
- func receiptTerminalName(receiptCase string) string {
254
- switch receiptCase {
255
- case "commit":
256
- return "committed"
257
- case "abort":
258
- return "canceled"
259
- case "loss":
260
- return "transportLost"
261
- case "bare-close":
262
- return "closed"
263
- default:
264
- return "unknown"
265
- }
266
- }
267
-
268
- func emitReceiptEvent(line string) error {
269
- fmt.Println(line)
270
- fifo := os.Getenv("RECEIPT_EVENT_FIFO")
271
- if fifo == "" {
272
- return nil
273
- }
274
- file, err := os.OpenFile(fifo, os.O_WRONLY, 0) //nolint:gosec // FIFO path is created by the local integration runner.
275
- if err != nil {
276
- return err
277
- }
278
- if _, err := file.WriteString(line + "\n"); err != nil {
279
- _ = file.Close()
280
- return err
281
- }
282
- return file.Close()
283
- }
@@ -6,7 +6,6 @@ import (
6
6
  "net"
7
7
  "os"
8
8
  "os/signal"
9
- "sync"
10
9
 
11
10
  "github.com/aperturerobotics/starpc/echo"
12
11
  "github.com/aperturerobotics/starpc/srpc"
@@ -16,73 +15,13 @@ func main() {
16
15
  ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt)
17
16
  defer cancel()
18
17
 
19
- receiptMode := len(os.Args) > 1 && os.Args[1] == "receipt"
20
- receiptCase := ""
21
- if receiptMode {
22
- if len(os.Args) < 3 {
23
- fmt.Fprintln(os.Stderr, "usage: go-server receipt <case>")
24
- os.Exit(1)
25
- }
26
- receiptCase = os.Args[2]
27
- switch receiptCase {
28
- case "commit", "abort", "loss", "bare-close":
29
- default:
30
- fmt.Fprintf(os.Stderr, "unknown receipt case: %s\n", receiptCase)
31
- os.Exit(1)
32
- }
33
- }
34
18
  mux := srpc.NewMux()
35
19
  echoServer := echo.NewEchoServer(mux)
36
20
  if err := echo.SRPCRegisterEchoer(mux, echoServer); err != nil {
37
21
  fmt.Fprintf(os.Stderr, "register error: %v\n", err)
38
22
  os.Exit(1)
39
23
  }
40
- var receiptDone <-chan struct{}
41
- var finishReceipt func()
42
- if receiptMode {
43
- done := make(chan struct{})
44
- var doneOnce sync.Once
45
- receiptDone = done
46
- finishReceipt = func() {
47
- doneOnce.Do(func() {
48
- close(done)
49
- })
50
- }
51
- }
52
- var invoker srpc.Invoker = mux
53
- if receiptMode {
54
- invoker = srpc.InvokerFunc(func(
55
- serviceID, methodID string,
56
- strm srpc.Stream,
57
- ) (bool, error) {
58
- handled, err := mux.InvokeMethod(serviceID, methodID, strm)
59
- if err != nil || !handled {
60
- return handled, err
61
- }
62
- invocation, ok := srpc.GetServerInvocation(strm.Context())
63
- if !ok {
64
- return true, context.Canceled
65
- }
66
- kind, waitErr := invocation.WaitTerminal(context.Background())
67
- markerErr := emitReceiptEvent(
68
- fmt.Sprintf("SERVER_RECEIPT_TERMINAL %s", terminalName(kind)),
69
- )
70
- if waitErr != nil {
71
- return true, waitErr
72
- }
73
- if markerErr != nil {
74
- return true, markerErr
75
- }
76
- if kind != srpc.TerminalCommitted {
77
- finishReceipt()
78
- }
79
- return true, nil
80
- })
81
- }
82
- var server *srpc.Server
83
- if !receiptMode {
84
- server = srpc.NewServer(invoker)
85
- }
24
+ server := srpc.NewServer(mux)
86
25
  ln, err := net.Listen("tcp", "127.0.0.1:0")
87
26
  if err != nil {
88
27
  fmt.Fprintf(os.Stderr, "listen error: %v\n", err)
@@ -90,101 +29,16 @@ func main() {
90
29
  }
91
30
  defer ln.Close()
92
31
 
93
- if receiptMode {
94
- go func() {
95
- <-receiptDone
96
- _ = ln.Close()
97
- }()
98
- }
99
-
100
32
  fmt.Printf("LISTENING %s\n", ln.Addr().String())
101
-
102
33
  go func() {
103
34
  <-ctx.Done()
104
- ln.Close()
35
+ _ = ln.Close()
105
36
  }()
106
-
107
37
  for {
108
38
  conn, err := ln.Accept()
109
39
  if err != nil {
110
40
  return
111
41
  }
112
- if receiptMode {
113
- go handleReceiptStream(ctx, conn, invoker, finishReceipt)
114
- } else {
115
- go server.HandleStream(ctx, conn)
116
- }
117
- }
118
- }
119
-
120
- func handleReceiptStream(
121
- ctx context.Context,
122
- conn net.Conn,
123
- invoker srpc.Invoker,
124
- finishReceipt func(),
125
- ) {
126
- prw := srpc.NewPacketReadWriter(conn)
127
- writer := &receiptPacketWriter{
128
- inner: prw,
129
- finishReceipt: finishReceipt,
130
- }
131
- rpc := srpc.NewServerRPC(ctx, invoker, writer)
132
- prw.ReadPump(rpc.HandlePacketData, rpc.HandleStreamClose)
133
- }
134
-
135
- type receiptPacketWriter struct {
136
- inner srpc.PacketWriter
137
- finishReceipt func()
138
- }
139
-
140
- func (w *receiptPacketWriter) WritePacket(pkt *srpc.Packet) error {
141
- if err := w.inner.WritePacket(pkt); err != nil {
142
- return err
143
- }
144
- data := pkt.GetCallData()
145
- if data != nil && data.GetComplete() && data.GetError() == "" {
146
- if err := emitReceiptEvent("SERVER_RECEIPT_ACK committed"); err != nil {
147
- return err
148
- }
149
- w.finishReceipt()
150
- }
151
- return nil
152
- }
153
-
154
- func (w *receiptPacketWriter) Close() error {
155
- return w.inner.Close()
156
- }
157
-
158
- func terminalName(kind srpc.TerminalKind) string {
159
- switch kind {
160
- case srpc.TerminalCommitted:
161
- return "committed"
162
- case srpc.TerminalCanceled:
163
- return "canceled"
164
- case srpc.TerminalLost:
165
- return "transportLost"
166
- case srpc.TerminalClosed:
167
- return "closed"
168
- case srpc.TerminalAbandoned:
169
- return "abandoned"
170
- default:
171
- return "unknown"
172
- }
173
- }
174
-
175
- func emitReceiptEvent(line string) error {
176
- fmt.Println(line)
177
- fifo := os.Getenv("RECEIPT_EVENT_FIFO")
178
- if fifo == "" {
179
- return nil
180
- }
181
- file, err := os.OpenFile(fifo, os.O_WRONLY, 0) //nolint:gosec // FIFO path is created by the local integration runner.
182
- if err != nil {
183
- return err
184
- }
185
- if _, err := file.WriteString(line + "\n"); err != nil {
186
- _ = file.Close()
187
- return err
42
+ go server.HandleStream(ctx, conn)
188
43
  }
189
- return file.Close()
190
44
  }