starpc 0.32.13 → 0.32.15

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.
@@ -0,0 +1,42 @@
1
+ import { describe, it, beforeEach } from 'vitest';
2
+ import { pipe } from 'it-pipe';
3
+ import { createHandler, createMux, Server, Client, StreamConn, ChannelStream, combineUint8ArrayListTransform, } from '../srpc/index.js';
4
+ import { EchoerDefinition, EchoerServer, runClientTest } from '../echo/index.js';
5
+ import { runAbortControllerTest, runRpcStreamTest, } from '../echo/client-test.js';
6
+ describe('srpc server', () => {
7
+ let client;
8
+ beforeEach(async () => {
9
+ const mux = createMux();
10
+ const server = new Server(mux.lookupMethodFunc);
11
+ const echoer = new EchoerServer(server);
12
+ mux.register(createHandler(EchoerDefinition, echoer));
13
+ // StreamConn is unnecessary since ChannelStream has packet framing.
14
+ // Use it here to include yamux in this e2e test.
15
+ const clientConn = new StreamConn();
16
+ const serverConn = new StreamConn(server, { direction: 'inbound' });
17
+ // pipe clientConn -> messageStream -> serverConn -> messageStream -> clientConn
18
+ const { port1: clientPort, port2: serverPort } = new MessageChannel();
19
+ const opts = {}; // { idleTimeoutMs: 250, keepAliveMs: 100 }
20
+ const clientChannelStream = new ChannelStream('client', clientPort, opts);
21
+ const serverChannelStream = new ChannelStream('server', serverPort, opts);
22
+ // Pipe the client traffic via the client end of the MessageChannel.
23
+ pipe(clientChannelStream, clientConn, combineUint8ArrayListTransform(), clientChannelStream)
24
+ .catch((err) => clientConn.close(err))
25
+ .then(() => clientConn.close());
26
+ // Pipe the server traffic via the server end of the MessageChannel.
27
+ pipe(serverChannelStream, serverConn, combineUint8ArrayListTransform(), serverChannelStream)
28
+ .catch((err) => serverConn.close(err))
29
+ .then(() => serverConn.close());
30
+ // Build the client
31
+ client = new Client(clientConn.buildOpenStreamFunc());
32
+ });
33
+ it('should pass client tests', async () => {
34
+ await runClientTest(client);
35
+ });
36
+ it('should pass abort controller tests', async () => {
37
+ await runAbortControllerTest(client);
38
+ });
39
+ it('should pass rpc stream tests', async () => {
40
+ await runRpcStreamTest(client);
41
+ });
42
+ });
@@ -1,4 +1,3 @@
1
- /// <reference types="ws" />
2
1
  import { Direction } from '@libp2p/interface';
3
2
  import type WebSocket from '@aptre/it-ws/web-socket';
4
3
  import { StreamConn } from './conn.js';
package/go.mod CHANGED
@@ -13,7 +13,7 @@ replace nhooyr.io/websocket => github.com/paralin/nhooyr-websocket v1.8.12-0.202
13
13
 
14
14
  require (
15
15
  github.com/aperturerobotics/protobuf-go-lite v0.6.5 // latest
16
- github.com/aperturerobotics/util v1.23.5 // latest
16
+ github.com/aperturerobotics/util v1.23.7 // latest
17
17
  )
18
18
 
19
19
  require (
@@ -42,7 +42,7 @@ require (
42
42
  github.com/multiformats/go-varint v0.0.7 // indirect
43
43
  github.com/spaolacci/murmur3 v1.1.0 // indirect
44
44
  golang.org/x/crypto v0.19.0 // indirect
45
- golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect
45
+ golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 // indirect
46
46
  golang.org/x/sys v0.18.0 // indirect
47
47
  lukechampine.com/blake3 v1.2.1 // indirect
48
48
  )
package/go.sum CHANGED
@@ -6,6 +6,8 @@ github.com/aperturerobotics/protobuf-go-lite v0.6.5 h1:AuPPcZ7ZaJe9ZYYC4gF7/5/Xb
6
6
  github.com/aperturerobotics/protobuf-go-lite v0.6.5/go.mod h1:YTbfnUj3feSULhs8VgepAHFnF3wUc0CPj4jd2axy21I=
7
7
  github.com/aperturerobotics/util v1.23.5 h1:OkqrAI3fJGwNyMk7WNpYZD9CvkTemxSZinqb1RzFvHY=
8
8
  github.com/aperturerobotics/util v1.23.5/go.mod h1:SBLeMheuujF7z+CZM58iPV9yvEwDiHrPIWUjdf0vVFY=
9
+ github.com/aperturerobotics/util v1.23.7 h1:DERV75zYLRn4BTS0vMFkitWJhUg7VGG5UyJq2Frf3iI=
10
+ github.com/aperturerobotics/util v1.23.7/go.mod h1:wpjaPlljanWro3pyt7/9Ja0mvFH26XL6MKsJSzF8s2Q=
9
11
  github.com/cloudflare/circl v1.3.8 h1:j+V8jJt09PoeMFIu2uh5JUyEaIHTXVOHslFoLNAKqwI=
10
12
  github.com/cloudflare/circl v1.3.8/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU=
11
13
  github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -59,6 +61,8 @@ golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo=
59
61
  golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
60
62
  golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM=
61
63
  golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc=
64
+ golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 h1:yixxcjnhBmY0nkL253HFVIm0JsFHwrHdT3Yh6szTnfY=
65
+ golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI=
62
66
  golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
63
67
  golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
64
68
  golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "starpc",
3
- "version": "0.32.13",
3
+ "version": "0.32.15",
4
4
  "description": "Streaming protobuf RPC service protocol over any two-way channel.",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -30,7 +30,7 @@
30
30
  "!**/*.tsbuildinfo",
31
31
  "Makefile",
32
32
  "dist",
33
- "e2e",
33
+ "mock",
34
34
  "echo",
35
35
  "go.mod",
36
36
  "go.sum",
@@ -57,7 +57,7 @@
57
57
  "test": "npm run test:js && npm run test:go",
58
58
  "test:go": "make test",
59
59
  "build:e2e": "npm run build && cd e2e && esbuild e2e.ts --sourcemap --outfile=e2e.cjs --bundle --platform=node",
60
- "test:js": "npm run build:e2e && cd e2e && node ./e2e.cjs",
60
+ "test:js": "vitest",
61
61
  "debug:js": "npm run build:e2e && cd e2e && node --inspect --inspect-brk ./e2e.cjs",
62
62
  "test:integration": "make integration",
63
63
  "integration": "npm run test:integration",
@@ -82,22 +82,23 @@
82
82
  "./{srpc,echo,e2e,integration,rpcstream,cmd}/**/(*.ts|*.tsx|*.html|*.css)": "prettier --config .prettierrc.yaml --write"
83
83
  },
84
84
  "devDependencies": {
85
- "@typescript-eslint/eslint-plugin": "^7.9.0",
86
- "@typescript-eslint/parser": "^7.9.0",
85
+ "@typescript-eslint/eslint-plugin": "^7.14.1",
86
+ "@typescript-eslint/parser": "^7.14.1",
87
87
  "depcheck": "^1.4.6",
88
- "esbuild": "^0.21.3",
88
+ "esbuild": "^0.22.0",
89
89
  "eslint": "^9.1.1",
90
90
  "eslint-config-prettier": "^9.1.0",
91
91
  "lint-staged": "^15.2.2",
92
92
  "pre-commit": "^1.2.2",
93
93
  "prettier": "^3.2.4",
94
94
  "rimraf": "^5.0.7",
95
- "tsx": "^4.10.2",
96
- "typescript": "^5.3.2"
95
+ "tsx": "^4.15.7",
96
+ "typescript": "^5.5.2",
97
+ "vitest": "^1.6.0"
97
98
  },
98
99
  "dependencies": {
99
- "@aptre/it-ws": "^1.0.0",
100
- "@aptre/protobuf-es-lite": "^0.4.5",
100
+ "@aptre/it-ws": "^1.0.1",
101
+ "@aptre/protobuf-es-lite": "^0.4.6",
101
102
  "@chainsafe/libp2p-yamux": "^6.0.2",
102
103
  "@libp2p/interface": "^1.3.1",
103
104
  "@libp2p/logger": "^4.0.12",
@@ -111,6 +112,6 @@
111
112
  "ws": "^8.17.0"
112
113
  },
113
114
  "resolutions": {
114
- "@aptre/protobuf-es-lite": "0.4.5"
115
+ "@aptre/protobuf-es-lite": "0.4.6"
115
116
  }
116
117
  }
@@ -0,0 +1,74 @@
1
+ import { describe, it, beforeEach } from 'vitest'
2
+ import { pipe } from 'it-pipe'
3
+ import {
4
+ createHandler,
5
+ createMux,
6
+ Server,
7
+ Client,
8
+ StreamConn,
9
+ ChannelStream,
10
+ combineUint8ArrayListTransform,
11
+ ChannelStreamOpts,
12
+ } from '../srpc/index.js'
13
+ import { EchoerDefinition, EchoerServer, runClientTest } from '../echo/index.js'
14
+ import {
15
+ runAbortControllerTest,
16
+ runRpcStreamTest,
17
+ } from '../echo/client-test.js'
18
+
19
+ describe('srpc server', () => {
20
+ let client: Client
21
+
22
+ beforeEach(async () => {
23
+ const mux = createMux()
24
+ const server = new Server(mux.lookupMethodFunc)
25
+ const echoer = new EchoerServer(server)
26
+ mux.register(createHandler(EchoerDefinition, echoer))
27
+
28
+ // StreamConn is unnecessary since ChannelStream has packet framing.
29
+ // Use it here to include yamux in this e2e test.
30
+ const clientConn = new StreamConn()
31
+ const serverConn = new StreamConn(server, { direction: 'inbound' })
32
+
33
+ // pipe clientConn -> messageStream -> serverConn -> messageStream -> clientConn
34
+ const { port1: clientPort, port2: serverPort } = new MessageChannel()
35
+ const opts: ChannelStreamOpts = {} // { idleTimeoutMs: 250, keepAliveMs: 100 }
36
+ const clientChannelStream = new ChannelStream('client', clientPort, opts)
37
+ const serverChannelStream = new ChannelStream('server', serverPort, opts)
38
+
39
+ // Pipe the client traffic via the client end of the MessageChannel.
40
+ pipe(
41
+ clientChannelStream,
42
+ clientConn,
43
+ combineUint8ArrayListTransform(),
44
+ clientChannelStream,
45
+ )
46
+ .catch((err: Error) => clientConn.close(err))
47
+ .then(() => clientConn.close())
48
+
49
+ // Pipe the server traffic via the server end of the MessageChannel.
50
+ pipe(
51
+ serverChannelStream,
52
+ serverConn,
53
+ combineUint8ArrayListTransform(),
54
+ serverChannelStream,
55
+ )
56
+ .catch((err: Error) => serverConn.close(err))
57
+ .then(() => serverConn.close())
58
+
59
+ // Build the client
60
+ client = new Client(clientConn.buildOpenStreamFunc())
61
+ })
62
+
63
+ it('should pass client tests', async () => {
64
+ await runClientTest(client)
65
+ })
66
+
67
+ it('should pass abort controller tests', async () => {
68
+ await runAbortControllerTest(client)
69
+ })
70
+
71
+ it('should pass rpc stream tests', async () => {
72
+ await runRpcStreamTest(client)
73
+ })
74
+ })
@@ -1,4 +1,4 @@
1
- package e2e
1
+ package srpc_test
2
2
 
3
3
  import (
4
4
  "context"
@@ -7,8 +7,8 @@ import (
7
7
  "testing"
8
8
  "time"
9
9
 
10
- e2e_mock "github.com/aperturerobotics/starpc/e2e/mock"
11
10
  "github.com/aperturerobotics/starpc/echo"
11
+ e2e_mock "github.com/aperturerobotics/starpc/mock"
12
12
  "github.com/aperturerobotics/starpc/rpcstream"
13
13
  "github.com/aperturerobotics/starpc/srpc"
14
14
  "github.com/pkg/errors"
package/dist/e2e/e2e.js DELETED
@@ -1,49 +0,0 @@
1
- import { pipe } from 'it-pipe';
2
- import { createHandler, createMux, Server, Client, StreamConn, ChannelStream, combineUint8ArrayListTransform, } from '../srpc/index.js';
3
- import { EchoerDefinition, EchoerServer, runClientTest } from '../echo/index.js';
4
- import { runAbortControllerTest, runRpcStreamTest, } from '../echo/client-test.js';
5
- async function runRPC() {
6
- const mux = createMux();
7
- const server = new Server(mux.lookupMethodFunc);
8
- const echoer = new EchoerServer(server);
9
- mux.register(createHandler(EchoerDefinition, echoer));
10
- // StreamConn is unnecessary since ChannelStream has packet framing.
11
- // Use it here to include yamux in this e2e test.
12
- const clientConn = new StreamConn();
13
- const serverConn = new StreamConn(server, { direction: 'inbound' });
14
- // pipe clientConn -> messageStream -> serverConn -> messageStream -> clientConn
15
- const { port1: clientPort, port2: serverPort } = new MessageChannel();
16
- const opts = {}; // { idleTimeoutMs: 250, keepAliveMs: 100 }
17
- const clientChannelStream = new ChannelStream('client', clientPort, opts);
18
- const serverChannelStream = new ChannelStream('server', serverPort, opts);
19
- // Pipe the client traffic via the client end of the MessageChannel.
20
- pipe(clientChannelStream, clientConn, combineUint8ArrayListTransform(), clientChannelStream)
21
- .catch((err) => clientConn.close(err))
22
- .then(() => clientConn.close());
23
- // Pipe the server traffic via the server end of the MessageChannel.
24
- pipe(serverChannelStream, serverConn, combineUint8ArrayListTransform(), serverChannelStream)
25
- .catch((err) => serverConn.close(err))
26
- .then(() => serverConn.close());
27
- // Build the client
28
- const client = new Client(clientConn.buildOpenStreamFunc());
29
- // Run the tests
30
- await runClientTest(client);
31
- await runAbortControllerTest(client);
32
- await runRpcStreamTest(client);
33
- // Make sure we have no uncaught promises
34
- await new Promise((resolve) => {
35
- setTimeout(resolve, 500);
36
- });
37
- // Close cleanly
38
- clientConn.close();
39
- serverConn.close();
40
- }
41
- runRPC()
42
- .then(() => {
43
- console.log('finished successfully');
44
- process.exit(0);
45
- })
46
- .catch((err) => {
47
- console.error('e2e tests failed', err);
48
- process.exit(1);
49
- });
package/e2e/README.md DELETED
@@ -1,10 +0,0 @@
1
- # E2E
2
-
3
- E2E contains tests using the client and server written in the same language.
4
-
5
- For example:
6
-
7
- - Go Client calling Go server: "go test" or "yarn test:go"
8
- - TypeScript client calling TypeScript server: "yarn test:js"
9
-
10
- For cross-language tests, i.e. Ts <-> Go, see [integration](../integration).
package/e2e/e2e.go DELETED
@@ -1 +0,0 @@
1
- package e2e
package/e2e/e2e.ts DELETED
@@ -1,81 +0,0 @@
1
- import { pipe } from 'it-pipe'
2
- import {
3
- createHandler,
4
- createMux,
5
- Server,
6
- Client,
7
- StreamConn,
8
- ChannelStream,
9
- combineUint8ArrayListTransform,
10
- ChannelStreamOpts,
11
- } from '../srpc/index.js'
12
- import { EchoerDefinition, EchoerServer, runClientTest } from '../echo/index.js'
13
- import {
14
- runAbortControllerTest,
15
- runRpcStreamTest,
16
- } from '../echo/client-test.js'
17
-
18
- async function runRPC() {
19
- const mux = createMux()
20
- const server = new Server(mux.lookupMethodFunc)
21
- const echoer = new EchoerServer(server)
22
- mux.register(createHandler(EchoerDefinition, echoer))
23
-
24
- // StreamConn is unnecessary since ChannelStream has packet framing.
25
- // Use it here to include yamux in this e2e test.
26
- const clientConn = new StreamConn()
27
- const serverConn = new StreamConn(server, { direction: 'inbound' })
28
-
29
- // pipe clientConn -> messageStream -> serverConn -> messageStream -> clientConn
30
- const { port1: clientPort, port2: serverPort } = new MessageChannel()
31
- const opts: ChannelStreamOpts = {} // { idleTimeoutMs: 250, keepAliveMs: 100 }
32
- const clientChannelStream = new ChannelStream('client', clientPort, opts)
33
- const serverChannelStream = new ChannelStream('server', serverPort, opts)
34
-
35
- // Pipe the client traffic via the client end of the MessageChannel.
36
- pipe(
37
- clientChannelStream,
38
- clientConn,
39
- combineUint8ArrayListTransform(),
40
- clientChannelStream,
41
- )
42
- .catch((err: Error) => clientConn.close(err))
43
- .then(() => clientConn.close())
44
-
45
- // Pipe the server traffic via the server end of the MessageChannel.
46
- pipe(
47
- serverChannelStream,
48
- serverConn,
49
- combineUint8ArrayListTransform(),
50
- serverChannelStream,
51
- )
52
- .catch((err: Error) => serverConn.close(err))
53
- .then(() => serverConn.close())
54
-
55
- // Build the client
56
- const client = new Client(clientConn.buildOpenStreamFunc())
57
-
58
- // Run the tests
59
- await runClientTest(client)
60
- await runAbortControllerTest(client)
61
- await runRpcStreamTest(client)
62
-
63
- // Make sure we have no uncaught promises
64
- await new Promise<void>((resolve) => {
65
- setTimeout(resolve, 500)
66
- })
67
-
68
- // Close cleanly
69
- clientConn.close()
70
- serverConn.close()
71
- }
72
-
73
- runRPC()
74
- .then(() => {
75
- console.log('finished successfully')
76
- process.exit(0)
77
- })
78
- .catch((err) => {
79
- console.error('e2e tests failed', err)
80
- process.exit(1)
81
- })
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes