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
@@ -111,27 +111,6 @@ stop_server() {
111
111
 
112
112
  # run_pair <test_name> <server_args...> -- <client_args...>
113
113
  # The client receives $SERVER_ADDR as its last argument.
114
- # check_receipt_events verifies terminal markers after the receipt server
115
- # naturally completes, so receipt synchronization is event/process-backed.
116
- check_receipt_events() {
117
- local expected="$1"
118
- local event_log="$2"
119
- awk -v expected="$expected" '
120
- $0 == "SERVER_RECEIPT_TERMINAL " expected { terminal = NR; next }
121
- $0 == "SERVER_RECEIPT_ACK " expected { ack = NR; next }
122
- $0 == "CLIENT_RECEIPT_RESOLVED " expected { client = NR; next }
123
- END {
124
- if (!terminal || !client) {
125
- exit 1
126
- }
127
- if (expected == "committed" &&
128
- (!ack || terminal >= ack || ack >= client)) {
129
- exit 1
130
- }
131
- }
132
- ' "$event_log"
133
- }
134
-
135
114
  run_pair() {
136
115
  local test_name="$1"
137
116
  shift
@@ -140,7 +119,6 @@ run_pair() {
140
119
  return
141
120
  fi
142
121
 
143
- # Split args on "--".
144
122
  local srv_args=()
145
123
  local cli_args=()
146
124
  local in_client=false
@@ -156,103 +134,33 @@ run_pair() {
156
134
  fi
157
135
  done
158
136
 
159
- local expected_terminal=""
160
- case "$test_name" in
161
- *"receipt commit") expected_terminal="committed" ;;
162
- *"receipt abort") expected_terminal="canceled" ;;
163
- *"receipt loss") expected_terminal="transportLost" ;;
164
- *"receipt bare-close") expected_terminal="closed" ;;
165
- esac
166
-
167
137
  echo -n " ${test_name}... "
168
-
169
- local event_fifo=""
170
- local event_log=""
171
- local event_reader=""
172
- if [ -n "$expected_terminal" ]; then
173
- event_fifo=$(mktemp)
174
- rm -f "$event_fifo"
175
- mkfifo "$event_fifo"
176
- event_log=$(mktemp)
177
- exec 3<>"$event_fifo"
178
- (
179
- exec 3>&-
180
- cat "$event_fifo" > "$event_log"
181
- ) &
182
- event_reader=$!
183
- export RECEIPT_EVENT_FIFO="$event_fifo"
184
- else
185
- unset RECEIPT_EVENT_FIFO
186
- fi
187
-
188
138
  if ! start_server "${srv_args[@]}"; then
189
139
  echo "FAILED (server start)"
190
140
  FAILED=$((FAILED + 1))
191
141
  ERRORS="${ERRORS}\n ${test_name} (server start failed)"
192
- if [ -n "$event_reader" ]; then
193
- exec 3>&-
194
- kill "$event_reader" 2>/dev/null || true
195
- wait "$event_reader" 2>/dev/null || true
196
- rm -f "$event_fifo" "$event_log"
197
- fi
198
- unset RECEIPT_EVENT_FIFO
199
142
  return
200
143
  fi
201
144
 
202
145
  local client_out
203
146
  client_out=$(mktemp)
204
147
  local client_ok=false
205
- local server_ok=true
206
148
  if "${cli_args[@]}" "$SERVER_ADDR" > "$client_out" 2>&1; then
207
149
  client_ok=true
208
150
  fi
151
+ stop_server
209
152
 
210
- if [ -n "$event_reader" ]; then
211
- if $client_ok; then
212
- if ! wait "$SERVER_PID"; then
213
- server_ok=false
214
- fi
215
- else
216
- stop_server
217
- wait "$SERVER_PID" 2>/dev/null || true
218
- server_ok=false
219
- fi
220
- exec 3>&-
221
- wait "$event_reader" 2>/dev/null || true
222
- else
223
- stop_server
224
- fi
225
- unset RECEIPT_EVENT_FIFO
226
-
227
- local terminal_ok=true
228
- if [ -n "$expected_terminal" ] &&
229
- ! check_receipt_events "$expected_terminal" "$event_log"; then
230
- terminal_ok=false
231
- fi
232
-
233
- if $client_ok && $server_ok && $terminal_ok; then
153
+ if $client_ok; then
234
154
  echo "PASSED"
235
- if [ -n "$expected_terminal" ]; then
236
- echo " receipt events:"
237
- sed 's/^/ /' "$event_log"
238
- fi
239
155
  PASSED=$((PASSED + 1))
240
156
  else
241
157
  echo "FAILED"
242
158
  FAILED=$((FAILED + 1))
243
159
  ERRORS="${ERRORS}\n ${test_name}"
244
- if ! $client_ok; then
245
- echo " client output:"
246
- sed 's/^/ /' "$client_out"
247
- fi
248
- if ! $terminal_ok; then
249
- echo " receipt events:"
250
- sed 's/^/ /' "$event_log"
251
- echo " server output:"
252
- sed 's/^/ /' "$SERVER_LOG"
253
- fi
160
+ echo " client output:"
161
+ sed 's/^/ /' "$client_out"
254
162
  fi
255
- rm -f "$client_out" "$SERVER_LOG" "$event_fifo" "$event_log"
163
+ rm -f "$client_out" "$SERVER_LOG"
256
164
  SERVER_LOG=""
257
165
  }
258
166
 
@@ -264,10 +172,6 @@ echo ""
264
172
  run_pair "go-server + go-client" "$GO_SERVER" -- "$GO_CLIENT"
265
173
  run_pair "go-server + rust-client" "$GO_SERVER" -- "$RUST_CLIENT"
266
174
  run_pair "go-server + ts-client" "$GO_SERVER" -- node "$TS_CLIENT"
267
- run_pair "go-server + ts-client receipt commit" "$GO_SERVER" receipt commit -- node "$TS_CLIENT" receipt commit
268
- run_pair "go-server + ts-client receipt abort" "$GO_SERVER" receipt abort -- node "$TS_CLIENT" receipt abort
269
- run_pair "go-server + ts-client receipt loss" "$GO_SERVER" receipt loss -- node "$TS_CLIENT" receipt loss
270
- run_pair "go-server + ts-client receipt bare-close" "$GO_SERVER" receipt bare-close -- node "$TS_CLIENT" receipt bare-close
271
175
  run_pair "go-server + cpp-client" "$GO_SERVER" -- "$CPP_CLIENT"
272
176
 
273
177
  # Rust server combinations
@@ -278,10 +182,6 @@ run_pair "rust-server + cpp-client" "$RUST_SERVER" -- "$CPP_CLIENT"
278
182
 
279
183
  # TypeScript server combinations
280
184
  run_pair "ts-server + go-client" node "$TS_SERVER" -- "$GO_CLIENT"
281
- run_pair "ts-server + go-client receipt commit" node "$TS_SERVER" receipt commit -- "$GO_CLIENT" receipt commit
282
- run_pair "ts-server + go-client receipt abort" node "$TS_SERVER" receipt abort -- "$GO_CLIENT" receipt abort
283
- run_pair "ts-server + go-client receipt loss" node "$TS_SERVER" receipt loss -- "$GO_CLIENT" receipt loss
284
- run_pair "ts-server + go-client receipt bare-close" node "$TS_SERVER" receipt bare-close -- "$GO_CLIENT" receipt bare-close
285
185
  run_pair "ts-server + rust-client" node "$TS_SERVER" -- "$RUST_CLIENT"
286
186
  run_pair "ts-server + ts-client" node "$TS_SERVER" -- node "$TS_CLIENT"
287
187
  run_pair "ts-server + cpp-client" node "$TS_SERVER" -- "$CPP_CLIENT"
@@ -1,5 +1,4 @@
1
1
  import net from 'net'
2
- import { closeSync, openSync, writeSync } from 'node:fs'
3
2
  import { pipe } from 'it-pipe'
4
3
  import { pushable } from 'it-pushable'
5
4
  import { Client } from '../../srpc/client.js'
@@ -8,22 +7,9 @@ import {
8
7
  prependLengthPrefixTransform,
9
8
  } from '../../srpc/packet.js'
10
9
  import { combineUint8ArrayListTransform } from '../../srpc/array-list.js'
11
- import { EchoMsg, runClientTest } from '../../echo/index.js'
10
+ import { runClientTest } from '../../echo/index.js'
12
11
  import type { OpenStreamFunc, PacketStream } from '../../srpc/stream.js'
13
12
  import type { Source } from 'it-stream-types'
14
- function emitReceiptEvent(line: string): void {
15
- console.log(line)
16
- const fifo = process.env.RECEIPT_EVENT_FIFO
17
- if (!fifo) {
18
- return
19
- }
20
- const fd = openSync(fifo, 'w')
21
- try {
22
- writeSync(fd, `${line}\n`)
23
- } finally {
24
- closeSync(fd)
25
- }
26
- }
27
13
 
28
14
  // tcpSocketToPacketStream wraps a Node.js TCP socket into a PacketStream.
29
15
  function tcpSocketToPacketStream(socket: net.Socket): PacketStream {
@@ -60,28 +46,17 @@ function tcpSocketToPacketStream(socket: net.Socket): PacketStream {
60
46
  }
61
47
 
62
48
  async function main() {
63
- const receiptMode = process.argv[2] === 'receipt'
64
- const receiptCase = receiptMode ? process.argv[3] : undefined
65
- const addr = receiptMode ? process.argv[4] : process.argv[2]
49
+ const addr = process.argv[2]
66
50
  if (!addr) {
67
- console.error('usage: ts-client [receipt <case>] <host:port>')
51
+ console.error('usage: ts-client <host:port>')
68
52
  process.exit(1)
69
53
  }
70
- if (
71
- receiptMode &&
72
- !['commit', 'abort', 'loss', 'bare-close'].includes(receiptCase ?? '')
73
- ) {
74
- throw new Error(`unknown receipt case: ${receiptCase}`)
75
- }
76
54
 
77
55
  const [host, portStr] = addr.split(':')
78
56
  const port = parseInt(portStr, 10)
79
- let activeSocket: net.Socket | undefined
80
-
81
57
  const openStream: OpenStreamFunc = async (): Promise<PacketStream> => {
82
58
  const { promise, resolve, reject } = Promise.withResolvers<PacketStream>()
83
59
  const socket = net.connect(port, host, () => {
84
- activeSocket = socket
85
60
  resolve(tcpSocketToPacketStream(socket))
86
61
  })
87
62
  socket.on('error', reject)
@@ -89,71 +64,11 @@ async function main() {
89
64
  }
90
65
 
91
66
  const client = new Client(openStream)
92
-
93
- if (receiptMode) {
94
- console.log(`Running held receipt test via TCP (${receiptCase})...`)
95
- const request = EchoMsg.create({ body: 'held receipt' })
96
- const held = await client.requestWithReceipt(
97
- 'echo.Echoer',
98
- 'Echo',
99
- EchoMsg.toBinary(request),
100
- )
101
- const result = EchoMsg.fromBinary(held.response)
102
- if (result.body !== request.body) {
103
- throw new Error(`expected ${request.body}, got ${result.body}`)
104
- }
105
- switch (receiptCase) {
106
- case 'commit':
107
- await held.receipt.commit()
108
- break
109
- case 'abort':
110
- await held.receipt.abort()
111
- break
112
- case 'loss':
113
- activeSocket?.resetAndDestroy()
114
- await expectReceiptFailure(held.receipt)
115
- break
116
- case 'bare-close':
117
- activeSocket?.end()
118
- await expectReceiptFailure(held.receipt)
119
- break
120
- }
121
- emitReceiptEvent(
122
- `CLIENT_RECEIPT_RESOLVED ${receiptTerminalName(receiptCase ?? '')}`,
123
- )
124
- } else {
125
- console.log('Running client test via TCP...')
126
- await runClientTest(client)
127
- }
67
+ console.log('Running client test via TCP...')
68
+ await runClientTest(client)
128
69
  console.log('All tests passed.')
129
70
  }
130
71
 
131
- function receiptTerminalName(receiptCase: string): string {
132
- switch (receiptCase) {
133
- case 'commit':
134
- return 'committed'
135
- case 'abort':
136
- return 'canceled'
137
- case 'loss':
138
- return 'transportLost'
139
- case 'bare-close':
140
- return 'closed'
141
- default:
142
- return 'unknown'
143
- }
144
- }
145
-
146
- async function expectReceiptFailure(receipt: {
147
- commit(): Promise<void>
148
- }): Promise<void> {
149
- try {
150
- await receipt.commit()
151
- } catch {
152
- return
153
- }
154
- throw new Error('receipt commit unexpectedly succeeded')
155
- }
156
-
157
72
  process.on('unhandledRejection', (ev) => {
158
73
  console.error('Unhandled rejection', ev)
159
74
  process.exit(1)
@@ -1,31 +1,17 @@
1
1
  import net from 'net'
2
- import { closeSync, openSync, writeSync } from 'node:fs'
3
2
  import { pipe } from 'it-pipe'
4
3
  import { pushable } from 'it-pushable'
4
+ import type { Source } from 'it-stream-types'
5
+
5
6
  import { createMux, createHandler, Server } from '../../srpc/index.js'
6
7
  import {
7
8
  parseLengthPrefixTransform,
8
9
  prependLengthPrefixTransform,
9
10
  } from '../../srpc/packet.js'
10
11
  import { combineUint8ArrayListTransform } from '../../srpc/array-list.js'
11
- import { EchoerServer, EchoMsg } from '../../echo/index.js'
12
+ import { EchoerServer } from '../../echo/index.js'
12
13
  import { EchoerDefinition } from '../../echo/echo_srpc.pb.js'
13
- import { Packet } from '../../srpc/rpcproto.pb.js'
14
14
  import type { PacketStream } from '../../srpc/stream.js'
15
- import type { Source } from 'it-stream-types'
16
- function emitReceiptEvent(line: string): void {
17
- console.log(line)
18
- const fifo = process.env.RECEIPT_EVENT_FIFO
19
- if (!fifo) {
20
- return
21
- }
22
- const fd = openSync(fifo, 'w')
23
- try {
24
- writeSync(fd, `${line}\n`)
25
- } finally {
26
- closeSync(fd)
27
- }
28
- }
29
15
 
30
16
  // tcpSocketToPacketStream wraps a Node.js TCP socket into a PacketStream.
31
17
  // Each Uint8Array in source/sink is one packet (no length prefix).
@@ -51,25 +37,12 @@ function tcpSocketToPacketStream(socket: net.Socket): PacketStream {
51
37
  sink: async (source: Source<Uint8Array>): Promise<void> => {
52
38
  for await (const chunk of pipe(source, prependLengthPrefixTransform())) {
53
39
  const data = chunk instanceof Uint8Array ? chunk : chunk.subarray()
54
- const packet = Packet.fromBinary(data.subarray(4))
55
- const receiptCompletion =
56
- receiptMode &&
57
- packet.body?.case === 'callData' &&
58
- packet.body.value.complete &&
59
- !packet.body.value.error
60
- const writeDone = new Promise<void>((resolve, reject) => {
40
+ await new Promise<void>((resolve, reject) => {
61
41
  socket.write(data, (err) => {
62
42
  if (err) reject(err)
63
43
  else resolve()
64
44
  })
65
45
  })
66
- if (receiptCompletion) {
67
- emitReceiptEvent('SERVER_RECEIPT_ACK committed')
68
- }
69
- await writeDone
70
- if (receiptCompletion) {
71
- finishReceiptServer()
72
- }
73
46
  }
74
47
  socket.end()
75
48
  },
@@ -77,64 +50,9 @@ function tcpSocketToPacketStream(socket: net.Socket): PacketStream {
77
50
  }
78
51
 
79
52
  const mux = createMux()
80
- const receiptMode = process.argv[2] === 'receipt'
81
- const receiptCase = receiptMode ? process.argv[3] : undefined
82
- if (
83
- receiptMode &&
84
- !['commit', 'abort', 'loss', 'bare-close'].includes(receiptCase ?? '')
85
- ) {
86
- console.error(`unknown receipt case: ${receiptCase}`)
87
- process.exit(1)
88
- }
89
-
90
- const receiptServerDone = Promise.withResolvers<void>()
91
- let receiptServerFinished = false
92
- function finishReceiptServer(): void {
93
- if (!receiptServerFinished) {
94
- receiptServerFinished = true
95
- receiptServerDone.resolve()
96
- }
97
- }
98
-
99
- if (receiptMode) {
100
- mux.registerLookupMethod(async (serviceID, methodID) => {
101
- if (serviceID !== 'echo.Echoer' || methodID !== 'Echo') {
102
- return null
103
- }
104
- return async (dataSource, dataSink, invocation) => {
105
- let requestData: Uint8Array | undefined
106
- for await (const data of dataSource) {
107
- requestData = data
108
- break
109
- }
110
- if (!requestData) {
111
- throw new Error('receipt request was empty')
112
- }
113
- const requestMsg = EchoMsg.fromBinary(requestData)
114
- await dataSink(
115
- (async function* () {
116
- yield EchoMsg.toBinary(requestMsg)
117
- if (!invocation) {
118
- throw new Error('receipt invocation was missing')
119
- }
120
- emitReceiptEvent('SERVER_RECEIPT_WAITING')
121
- const terminal = await invocation.waitTerminal(
122
- new AbortController().signal,
123
- )
124
- emitReceiptEvent(`SERVER_RECEIPT_TERMINAL ${terminal}`)
125
- if (terminal !== 'committed') {
126
- finishReceiptServer()
127
- }
128
- })(),
129
- )
130
- }
131
- })
132
- }
133
53
  const server = new Server(mux.lookupMethod)
134
- if (!receiptMode) {
135
- const echoer = new EchoerServer(server)
136
- mux.register(createHandler(EchoerDefinition, echoer))
137
- }
54
+ const echoer = new EchoerServer(server)
55
+ mux.register(createHandler(EchoerDefinition, echoer))
138
56
 
139
57
  const tcpServer = net.createServer((socket) => {
140
58
  const stream = tcpSocketToPacketStream(socket)
@@ -146,12 +64,6 @@ tcpServer.listen(0, '127.0.0.1', () => {
146
64
  console.log(`LISTENING ${addr.address}:${addr.port}`)
147
65
  })
148
66
 
149
- if (receiptMode) {
150
- void receiptServerDone.promise.then(() => {
151
- tcpServer.close()
152
- })
153
- }
154
-
155
67
  process.on('SIGINT', () => {
156
68
  tcpServer.close()
157
69
  process.exit(0)
package/mock/index.ts CHANGED
@@ -1,2 +1,2 @@
1
- export * from "./mock.pb.js"
2
- export * from "./mock_srpc.pb.js"
1
+ export * from './mock.pb.js'
2
+ export * from './mock_srpc.pb.js'
package/mock/mock.go CHANGED
@@ -26,4 +26,4 @@ func (e *MockServer) MockRequest(ctx context.Context, msg *MockMsg) (*MockMsg, e
26
26
  }
27
27
 
28
28
  // _ is a type assertion
29
- var _ SRPCMockServer = ((*MockServer)(nil))
29
+ var _ SRPCMockServer = (*MockServer)(nil)
package/mock/mock.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/mock/mock.proto
4
4
 
5
5
  package e2e_mock
@@ -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"
@@ -139,13 +137,10 @@ func (m *MockMsg) MarshalToSizedBufferVT(dAtA []byte) (int, error) {
139
137
  var l int
140
138
  _ = l
141
139
  if m.unknownFields != nil {
142
- i -= len(m.unknownFields)
143
- copy(dAtA[i:], m.unknownFields)
140
+ i = protobuf_go_lite.EncodeRawBytes(dAtA, i, m.unknownFields)
144
141
  }
145
142
  if len(m.Body) > 0 {
146
- i -= len(m.Body)
147
- copy(dAtA[i:], m.Body)
148
- i = protobuf_go_lite.EncodeVarint(dAtA, i, uint64(len(m.Body)))
143
+ i = protobuf_go_lite.EncodeString(dAtA, i, m.Body)
149
144
  i--
150
145
  dAtA[i] = 0xa
151
146
  }
@@ -158,26 +153,19 @@ func (m *MockMsg) SizeVT() (n int) {
158
153
  }
159
154
  var l int
160
155
  _ = l
161
- l = len(m.Body)
162
- if l > 0 {
163
- n += 1 + l + protobuf_go_lite.SizeOfVarint(uint64(l))
164
- }
156
+ n += protobuf_go_lite.SizeStringNonEmpty(1, m.Body)
165
157
  n += len(m.unknownFields)
166
158
  return n
167
159
  }
168
160
 
169
161
  func (x *MockMsg) MarshalProtoText() string {
170
- var sb strings.Builder
171
- sb.WriteString("MockMsg {")
162
+ var sb protobuf_go_lite.TextBuilder
163
+ initialLen := protobuf_go_lite.TextStartMessage(&sb, "MockMsg")
172
164
  if x.Body != "" {
173
- if sb.Len() > 9 {
174
- sb.WriteString(" ")
175
- }
176
- sb.WriteString("body: ")
177
- sb.WriteString(strconv.Quote(x.Body))
165
+ protobuf_go_lite.TextWriteFieldPrefix(&sb, initialLen, "body")
166
+ protobuf_go_lite.TextWriteString(&sb, x.Body)
178
167
  }
179
- sb.WriteString("}")
180
- return sb.String()
168
+ return protobuf_go_lite.TextFinishMessage(&sb)
181
169
  }
182
170
 
183
171
  func (x *MockMsg) String() string {
@@ -208,24 +196,12 @@ func (m *MockMsg) UnmarshalVT(dAtA []byte) error {
208
196
  if wireType != 2 {
209
197
  return fmt.Errorf("proto: wrong wireType = %d for field Body", wireType)
210
198
  }
211
- var stringLen uint64
212
- stringLen, iNdEx, err = protobuf_go_lite.DecodeVarint(dAtA, iNdEx)
199
+ var v string
200
+ v, iNdEx, err = protobuf_go_lite.DecodeString(dAtA, iNdEx)
213
201
  if err != nil {
214
202
  return err
215
203
  }
216
- intStringLen := int(stringLen)
217
- if intStringLen < 0 {
218
- return protobuf_go_lite.ErrInvalidLength
219
- }
220
- postIndex := iNdEx + intStringLen
221
- if postIndex < 0 {
222
- return protobuf_go_lite.ErrInvalidLength
223
- }
224
- if postIndex > l {
225
- return io.ErrUnexpectedEOF
226
- }
227
- m.Body = string(dAtA[iNdEx:postIndex])
228
- iNdEx = postIndex
204
+ m.Body = v
229
205
  default:
230
206
  iNdEx = preIndex
231
207
  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/mock/mock.proto
6
6
 
7
7
  #include "mock_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/mock/mock.proto
4
4
 
5
5
  package e2e_mock
@@ -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/mock/mock.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/mock/mock.proto
4
4
 
5
5
  #[allow(unused_imports)]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "starpc",
3
- "version": "0.49.20",
3
+ "version": "0.51.0",
4
4
  "description": "Streaming protobuf RPC service protocol over any two-way channel.",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -68,10 +68,10 @@
68
68
  "deps": "depcheck --ignores 'bufferutil,utf-8-validate,rimraf,starpc,@aptre/protobuf-es-lite,tsx'",
69
69
  "codegen": "bun run gen",
70
70
  "ci": "bun run build && bun run lint:js && bun run lint:go",
71
- "format": "bun run format:go && bun run format:js && bun run format:config",
72
- "format:config": "prettier --write tsconfig.json package.json",
71
+ "format": "bun run format:js && bun run format:go && bun run format:config",
72
+ "format:config": "oxfmt '*.json' '.github/**/*.json' '.github/**/*.yml' '.oxfmtrc.json' 'tsconfig.json'",
73
73
  "format:go": "bun run go:aptre -- format",
74
- "format:js": "prettier --write './{srpc,echo,e2e,integration,rpcstream,cmd}/**/(*.ts|*.tsx|*.html|*.css)'",
74
+ "format:js": "oxfmt './{srpc,echo,e2e,integration,rpcstream,cmd,mock,scripts}/**/*.{ts,tsx,js,mjs,html,css,scss}' '*.{ts,tsx,js,mjs}'",
75
75
  "gen": "bun run go:aptre -- generate && bun run format",
76
76
  "gen:force": "bun run go:aptre -- generate --force && bun run format",
77
77
  "test": "bun run test:js && bun run test:go",
@@ -90,46 +90,39 @@
90
90
  "integration:rust:cpp": "bash ./integration/cross-language/run.bash rust:cpp",
91
91
  "lint": "bun run lint:go && bun run lint:js",
92
92
  "lint:go": "bun run go:aptre -- lint",
93
- "lint:js": "eslint ./",
93
+ "lint:js": "oxlint .",
94
+ "lint:js:fix": "bun run lint:js -- --fix",
94
95
  "prepare": "husky && go mod vendor",
95
96
  "go:aptre": "go run -mod=mod github.com/aperturerobotics/common/cmd/aptre",
96
97
  "precommit": "lint-staged",
97
- "release": "npm run release:version && npm run release:commit",
98
- "release:minor": "npm run release:version:minor && npm run release:commit",
99
- "release:version": "npm version patch -m \"release: v%s\" --no-git-tag-version && npm run release:sync-cargo",
100
- "release:version:minor": "npm version minor -m \"release: v%s\" --no-git-tag-version && npm run release:sync-cargo",
101
- "release:sync-cargo": "node -e \"const v=require('./package.json').version,f='Cargo.toml',c=require('fs').readFileSync(f,'utf8');require('fs').writeFileSync(f,c.replace(/^version = \\\".*?\\\"/m,'version = \\\"'+v+'\\\"'))\"",
102
- "release:commit": "git reset && git add package.json Cargo.toml && git commit -s -m \"release: v$(node -p \"require('./package.json').version\")\" && git tag v$(node -p \"require('./package.json').version\")",
98
+ "release": "bun run release:version && bun run release:commit",
99
+ "release:minor": "bun run release:version:minor && bun run release:commit",
100
+ "release:version": "bun scripts/release-version.ts patch",
101
+ "release:version:minor": "bun scripts/release-version.ts minor",
102
+ "release:commit": "version=$(bun -e 'console.log(require(\"./package.json\").version)') && git reset && git add package.json Cargo.toml && git commit -s -m \"release: v$version\" && git tag \"v$version\"",
103
103
  "release:publish": "git push && git push --tags"
104
104
  },
105
105
  "preferUnplugged": true,
106
106
  "lint-staged": {
107
- "package.json": "prettier --config .prettierrc.yaml --write",
108
- "./{srpc,echo,e2e,integration,rpcstream,cmd}/**/(*.ts|*.tsx|*.html|*.css)": "prettier --config .prettierrc.yaml --write"
107
+ "*.{json,ts,tsx,js,mjs}": "oxfmt",
108
+ "./{srpc,echo,e2e,integration,rpcstream,cmd,mock,scripts}/**/*.{ts,tsx,js,mjs,html,css,scss}": "oxfmt"
109
109
  },
110
110
  "devDependencies": {
111
- "@eslint/js": "^10.0.0",
112
- "@typescript-eslint/eslint-plugin": "^8.59.0",
113
- "@typescript-eslint/parser": "^8.59.0",
111
+ "@typescript/native-preview": "^7.0.0-dev.20260422.1",
114
112
  "depcheck": "^1.4.6",
115
113
  "esbuild": "^0.28.0",
116
- "eslint": "^10.2.1",
117
- "eslint-config-prettier": "^10.0.0",
118
- "eslint-plugin-unused-imports": "^4.4.1",
119
- "globals": "^17.5.0",
120
114
  "happy-dom": "^20.9.0",
121
115
  "husky": "^9.1.7",
122
116
  "lint-staged": "^17.0.0",
123
- "prettier": "^3.8.3",
117
+ "oxfmt": "0.61.0",
118
+ "oxlint": "^1.76.0",
124
119
  "rimraf": "^6.1.3",
125
120
  "tsx": "^4.20.4",
126
- "typescript": "^6.0.3",
127
- "@typescript/native-preview": "^7.0.0-dev.20260422.1",
128
121
  "vitest": "^4.1.5"
129
122
  },
130
123
  "dependencies": {
131
124
  "@aptre/it-ws": "^1.1.2",
132
- "@aptre/protobuf-es-lite": "1.1.0",
125
+ "@aptre/protobuf-es-lite": "1.1.1",
133
126
  "@aptre/yamux": "^1.0.3",
134
127
  "event-iterator": "^2.0.0",
135
128
  "isomorphic-ws": "^5.0.0",
@@ -141,9 +134,9 @@
141
134
  "ws": "^8.20.0"
142
135
  },
143
136
  "resolutions": {
144
- "@aptre/protobuf-es-lite": "1.1.0"
137
+ "@aptre/protobuf-es-lite": "1.1.1"
145
138
  },
146
139
  "overrides": {
147
- "@aptre/protobuf-es-lite": "1.1.0"
140
+ "@aptre/protobuf-es-lite": "1.1.1"
148
141
  }
149
142
  }