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.
- package/dist/integration/cross-language/ts-client.js +5 -79
- package/dist/integration/cross-language/ts-server.js +4 -84
- package/dist/mock/index.d.ts +2 -2
- package/dist/mock/index.js +2 -2
- package/dist/srpc/client.d.ts +1 -3
- package/dist/srpc/client.js +2 -22
- package/dist/srpc/common-rpc.d.ts +1 -11
- package/dist/srpc/common-rpc.js +5 -66
- package/dist/srpc/handler.d.ts +1 -2
- package/dist/srpc/index.d.ts +0 -4
- package/dist/srpc/index.js +0 -2
- package/dist/srpc/invoker.d.ts +1 -2
- package/dist/srpc/server-rpc.js +1 -3
- package/dist/srpc/server.test.js +35 -1
- package/echo/echo.go +8 -8
- package/echo/echo.pb.go +12 -36
- package/echo/echo_srpc.pb.cpp +1 -1
- package/echo/echo_srpc.pb.go +1 -1
- package/echo/echo_srpc.pb.hpp +1 -1
- package/echo/echo_srpc.pb.rs +1 -1
- package/echo/server.go +1 -1
- package/go.mod +13 -12
- package/go.sum +26 -24
- package/integration/cross-language/go-client/main.go +4 -142
- package/integration/cross-language/go-server/main.go +3 -149
- package/integration/cross-language/run.bash +5 -105
- package/integration/cross-language/ts-client.ts +5 -90
- package/integration/cross-language/ts-server.ts +6 -94
- package/mock/index.ts +2 -2
- package/mock/mock.go +1 -1
- package/mock/mock.pb.go +12 -36
- package/mock/mock_srpc.pb.cpp +1 -1
- package/mock/mock_srpc.pb.go +1 -1
- package/mock/mock_srpc.pb.hpp +1 -1
- package/mock/mock_srpc.pb.rs +1 -1
- package/package.json +19 -26
- package/srpc/accept.go +1 -1
- package/srpc/client-prefix.go +1 -1
- package/srpc/client-set.go +1 -1
- package/srpc/client.go +1 -1
- package/srpc/client.ts +4 -31
- package/srpc/common-rpc.go +15 -69
- package/srpc/common-rpc.ts +6 -78
- package/srpc/common-rpc_test.go +81 -0
- package/srpc/errors.go +26 -1
- package/srpc/handler.ts +1 -2
- package/srpc/index.ts +0 -4
- package/srpc/invoker-prefix.go +1 -1
- package/srpc/invoker.go +2 -2
- package/srpc/invoker.ts +5 -9
- package/srpc/message.go +1 -1
- package/srpc/msg-stream.go +1 -9
- package/srpc/mux-verbose.go +1 -1
- package/srpc/mux.go +1 -1
- package/srpc/muxed-conn.go +1 -1
- package/srpc/muxed-yamux.go +1 -1
- package/srpc/rpcproto.pb.go +102 -323
- package/srpc/server-rpc.go +1 -1
- package/srpc/server-rpc.ts +1 -6
- package/srpc/server.test.ts +49 -1
- package/srpc/stream-pipe.go +1 -1
- package/srpc/stream-rwc.go +1 -1
- package/srpc/stream-yamux.go +1 -1
- package/srpc/stream.go +0 -20
- package/srpc/websocket.go +1 -1
- package/dist/srpc/call-receipt.d.ts +0 -17
- package/dist/srpc/call-receipt.js +0 -105
- package/dist/srpc/call-receipt.test.d.ts +0 -1
- package/dist/srpc/call-receipt.test.js +0 -374
- package/dist/srpc/server-invocation.d.ts +0 -17
- package/dist/srpc/server-invocation.js +0 -37
- package/srpc/call-receipt-e2e_test.go +0 -111
- package/srpc/call-receipt.go +0 -112
- package/srpc/call-receipt.test.ts +0 -438
- package/srpc/call-receipt.ts +0 -130
- package/srpc/call-receipt_test.go +0 -536
- package/srpc/server-invocation.go +0 -58
- 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
|
|
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
|
-
|
|
245
|
-
|
|
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"
|
|
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 {
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
135
|
-
|
|
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
|
|
2
|
-
export * from
|
|
1
|
+
export * from './mock.pb.js'
|
|
2
|
+
export * from './mock_srpc.pb.js'
|
package/mock/mock.go
CHANGED
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.
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
171
|
-
|
|
162
|
+
var sb protobuf_go_lite.TextBuilder
|
|
163
|
+
initialLen := protobuf_go_lite.TextStartMessage(&sb, "MockMsg")
|
|
172
164
|
if x.Body != "" {
|
|
173
|
-
|
|
174
|
-
|
|
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
|
-
|
|
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
|
|
212
|
-
|
|
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
|
-
|
|
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:])
|
package/mock/mock_srpc.pb.cpp
CHANGED
|
@@ -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.
|
|
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"
|
package/mock/mock_srpc.pb.go
CHANGED
package/mock/mock_srpc.pb.hpp
CHANGED
package/mock/mock_srpc.pb.rs
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "starpc",
|
|
3
|
-
"version": "0.
|
|
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:
|
|
72
|
-
"format:config": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
98
|
-
"release:minor": "
|
|
99
|
-
"release:version": "
|
|
100
|
-
"release:version:minor": "
|
|
101
|
-
"release:
|
|
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
|
-
"
|
|
108
|
-
"./{srpc,echo,e2e,integration,rpcstream,cmd}
|
|
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
|
-
"@
|
|
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
|
-
"
|
|
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.
|
|
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.
|
|
137
|
+
"@aptre/protobuf-es-lite": "1.1.1"
|
|
145
138
|
},
|
|
146
139
|
"overrides": {
|
|
147
|
-
"@aptre/protobuf-es-lite": "1.1.
|
|
140
|
+
"@aptre/protobuf-es-lite": "1.1.1"
|
|
148
141
|
}
|
|
149
142
|
}
|