@replit/river 0.10.0 → 0.10.1
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/{router/builder.d.ts → builder-3c4485f0.d.ts} +76 -21
- package/dist/chunk-7WJ6YLE5.js +683 -0
- package/dist/chunk-AJQU4AZG.js +284 -0
- package/dist/chunk-ORAG7IAU.js +0 -0
- package/dist/chunk-PC65ZFWJ.js +29 -0
- package/dist/chunk-R6H2BIMC.js +49 -0
- package/dist/chunk-RGMHF6PF.js +65 -0
- package/dist/chunk-SLUSVGQH.js +30 -0
- package/dist/chunk-UU2Z7LDR.js +113 -0
- package/dist/chunk-WVT5QXMZ.js +20 -0
- package/dist/chunk-ZE4MX7DF.js +75 -0
- package/dist/codec/index.cjs +94 -0
- package/dist/codec/index.d.cts +15 -0
- package/dist/codec/index.d.ts +15 -4
- package/dist/codec/index.js +10 -2
- package/dist/connection-8e19874c.d.ts +11 -0
- package/dist/connection-f7688cc1.d.ts +11 -0
- package/dist/logging/index.cjs +56 -0
- package/dist/logging/index.d.cts +28 -0
- package/dist/logging/index.d.ts +6 -6
- package/dist/logging/index.js +9 -40
- package/dist/router/index.cjs +770 -0
- package/dist/router/index.d.cts +114 -0
- package/dist/router/index.d.ts +114 -12
- package/dist/router/index.js +24 -5
- package/dist/transport/impls/ws/client.cjs +505 -0
- package/dist/transport/impls/ws/client.d.cts +42 -0
- package/dist/transport/impls/ws/client.d.ts +8 -8
- package/dist/transport/impls/ws/client.js +10 -100
- package/dist/transport/impls/ws/server.cjs +457 -0
- package/dist/transport/impls/ws/server.d.cts +21 -0
- package/dist/transport/impls/ws/server.d.ts +11 -10
- package/dist/transport/impls/ws/server.js +11 -52
- package/dist/transport/index.cjs +362 -0
- package/dist/transport/{transport.d.ts → index.d.cts} +119 -7
- package/dist/transport/index.d.ts +273 -4
- package/dist/transport/index.js +20 -2
- package/dist/{codec/types.d.ts → types-3e5768ec.d.ts} +3 -2
- package/dist/util/testHelpers.cjs +731 -0
- package/dist/util/testHelpers.d.cts +79 -0
- package/dist/util/testHelpers.d.ts +22 -19
- package/dist/util/testHelpers.js +135 -163
- package/package.json +41 -13
- package/dist/__tests__/bandwidth.bench.d.ts +0 -2
- package/dist/__tests__/bandwidth.bench.d.ts.map +0 -1
- package/dist/__tests__/bandwidth.bench.js +0 -90
- package/dist/__tests__/cleanup.test.d.ts +0 -2
- package/dist/__tests__/cleanup.test.d.ts.map +0 -1
- package/dist/__tests__/cleanup.test.js +0 -165
- package/dist/__tests__/disconnects.test.d.ts +0 -2
- package/dist/__tests__/disconnects.test.d.ts.map +0 -1
- package/dist/__tests__/disconnects.test.js +0 -163
- package/dist/__tests__/e2e.test.d.ts +0 -2
- package/dist/__tests__/e2e.test.d.ts.map +0 -1
- package/dist/__tests__/e2e.test.js +0 -317
- package/dist/__tests__/fixtures/cleanup.d.ts +0 -12
- package/dist/__tests__/fixtures/cleanup.d.ts.map +0 -1
- package/dist/__tests__/fixtures/cleanup.js +0 -36
- package/dist/__tests__/fixtures/largePayload.json +0 -33
- package/dist/__tests__/fixtures/observable.d.ts +0 -26
- package/dist/__tests__/fixtures/observable.d.ts.map +0 -1
- package/dist/__tests__/fixtures/observable.js +0 -38
- package/dist/__tests__/fixtures/observable.test.d.ts +0 -2
- package/dist/__tests__/fixtures/observable.test.d.ts.map +0 -1
- package/dist/__tests__/fixtures/observable.test.js +0 -39
- package/dist/__tests__/fixtures/services.d.ts +0 -288
- package/dist/__tests__/fixtures/services.d.ts.map +0 -1
- package/dist/__tests__/fixtures/services.js +0 -207
- package/dist/__tests__/handler.test.d.ts +0 -2
- package/dist/__tests__/handler.test.d.ts.map +0 -1
- package/dist/__tests__/handler.test.js +0 -120
- package/dist/__tests__/serialize.test.d.ts +0 -2
- package/dist/__tests__/serialize.test.d.ts.map +0 -1
- package/dist/__tests__/serialize.test.js +0 -208
- package/dist/__tests__/typescript-stress.test.d.ts +0 -1583
- package/dist/__tests__/typescript-stress.test.d.ts.map +0 -1
- package/dist/__tests__/typescript-stress.test.js +0 -123
- package/dist/codec/binary.d.ts +0 -7
- package/dist/codec/binary.d.ts.map +0 -1
- package/dist/codec/binary.js +0 -20
- package/dist/codec/codec.test.d.ts +0 -5
- package/dist/codec/codec.test.d.ts.map +0 -1
- package/dist/codec/codec.test.js +0 -41
- package/dist/codec/index.d.ts.map +0 -1
- package/dist/codec/json.d.ts +0 -7
- package/dist/codec/json.d.ts.map +0 -1
- package/dist/codec/json.js +0 -51
- package/dist/codec/types.d.ts.map +0 -1
- package/dist/codec/types.js +0 -1
- package/dist/logging/index.d.ts.map +0 -1
- package/dist/router/builder.d.ts.map +0 -1
- package/dist/router/builder.js +0 -91
- package/dist/router/client.d.ts +0 -72
- package/dist/router/client.d.ts.map +0 -1
- package/dist/router/client.js +0 -257
- package/dist/router/context.d.ts +0 -30
- package/dist/router/context.d.ts.map +0 -1
- package/dist/router/context.js +0 -1
- package/dist/router/defs.d.ts +0 -16
- package/dist/router/defs.d.ts.map +0 -1
- package/dist/router/defs.js +0 -11
- package/dist/router/index.d.ts.map +0 -1
- package/dist/router/result.d.ts +0 -26
- package/dist/router/result.d.ts.map +0 -1
- package/dist/router/result.js +0 -22
- package/dist/router/server.d.ts +0 -39
- package/dist/router/server.d.ts.map +0 -1
- package/dist/router/server.js +0 -260
- package/dist/transport/events.d.ts +0 -19
- package/dist/transport/events.d.ts.map +0 -1
- package/dist/transport/events.js +0 -26
- package/dist/transport/impls/stdio/stdio.d.ts +0 -33
- package/dist/transport/impls/stdio/stdio.d.ts.map +0 -1
- package/dist/transport/impls/stdio/stdio.js +0 -75
- package/dist/transport/impls/stdio/stdio.test.d.ts +0 -2
- package/dist/transport/impls/stdio/stdio.test.d.ts.map +0 -1
- package/dist/transport/impls/stdio/stdio.test.js +0 -24
- package/dist/transport/impls/ws/client.d.ts.map +0 -1
- package/dist/transport/impls/ws/connection.d.ts +0 -11
- package/dist/transport/impls/ws/connection.d.ts.map +0 -1
- package/dist/transport/impls/ws/connection.js +0 -23
- package/dist/transport/impls/ws/server.d.ts.map +0 -1
- package/dist/transport/impls/ws/ws.test.d.ts +0 -2
- package/dist/transport/impls/ws/ws.test.d.ts.map +0 -1
- package/dist/transport/impls/ws/ws.test.js +0 -185
- package/dist/transport/index.d.ts.map +0 -1
- package/dist/transport/message.d.ts +0 -142
- package/dist/transport/message.d.ts.map +0 -1
- package/dist/transport/message.js +0 -113
- package/dist/transport/message.test.d.ts +0 -2
- package/dist/transport/message.test.d.ts.map +0 -1
- package/dist/transport/message.test.js +0 -52
- package/dist/transport/transport.d.ts.map +0 -1
- package/dist/transport/transport.js +0 -281
- package/dist/util/testHelpers.d.ts.map +0 -1
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import http from 'http';
|
|
2
|
-
import { assert, bench, describe } from 'vitest';
|
|
3
|
-
import { createWebSocketServer, createWsTransports, onServerReady, waitForMessage, } from '../util/testHelpers';
|
|
4
|
-
import largePayload from './fixtures/largePayload.json';
|
|
5
|
-
import { TestServiceConstructor } from './fixtures/services';
|
|
6
|
-
import { createServer } from '../router/server';
|
|
7
|
-
import { createClient } from '../router/client';
|
|
8
|
-
import { StupidlyLargeService } from './typescript-stress.test';
|
|
9
|
-
import { buildServiceDefs } from '../router/defs';
|
|
10
|
-
let smallId = 0;
|
|
11
|
-
let largeId = 0;
|
|
12
|
-
const dummyPayloadSmall = () => ({
|
|
13
|
-
id: `${smallId++}`,
|
|
14
|
-
from: 'client',
|
|
15
|
-
to: 'SERVER',
|
|
16
|
-
serviceName: 'test',
|
|
17
|
-
procedureName: 'test',
|
|
18
|
-
streamId: 'test',
|
|
19
|
-
controlFlags: 0,
|
|
20
|
-
payload: {
|
|
21
|
-
msg: 'cool',
|
|
22
|
-
},
|
|
23
|
-
});
|
|
24
|
-
const dummyPayloadLarge = () => ({
|
|
25
|
-
id: `${largeId++}`,
|
|
26
|
-
from: 'client',
|
|
27
|
-
to: 'SERVER',
|
|
28
|
-
serviceName: 'test',
|
|
29
|
-
procedureName: 'test',
|
|
30
|
-
streamId: 'test',
|
|
31
|
-
controlFlags: 0,
|
|
32
|
-
payload: largePayload,
|
|
33
|
-
});
|
|
34
|
-
const BENCH_DURATION = 1000;
|
|
35
|
-
describe('transport level bandwidth', async () => {
|
|
36
|
-
const server = http.createServer();
|
|
37
|
-
const port = await onServerReady(server);
|
|
38
|
-
const webSocketServer = await createWebSocketServer(server);
|
|
39
|
-
const [clientTransport, serverTransport] = createWsTransports(port, webSocketServer);
|
|
40
|
-
bench('send and recv (small payload)', async () => {
|
|
41
|
-
const id = clientTransport.send(dummyPayloadSmall());
|
|
42
|
-
await waitForMessage(serverTransport, (msg) => msg.id === id);
|
|
43
|
-
return;
|
|
44
|
-
}, { time: BENCH_DURATION });
|
|
45
|
-
bench('send and recv (large payload)', async () => {
|
|
46
|
-
const id = clientTransport.send(dummyPayloadLarge());
|
|
47
|
-
await waitForMessage(serverTransport, (msg) => msg.id === id);
|
|
48
|
-
return;
|
|
49
|
-
}, { time: BENCH_DURATION });
|
|
50
|
-
});
|
|
51
|
-
describe('simple router level bandwidth', async () => {
|
|
52
|
-
const httpServer = http.createServer();
|
|
53
|
-
const port = await onServerReady(httpServer);
|
|
54
|
-
const webSocketServer = await createWebSocketServer(httpServer);
|
|
55
|
-
const [clientTransport, serverTransport] = createWsTransports(port, webSocketServer);
|
|
56
|
-
const serviceDefs = buildServiceDefs([TestServiceConstructor()]);
|
|
57
|
-
const server = createServer(serverTransport, serviceDefs);
|
|
58
|
-
const client = createClient(clientTransport);
|
|
59
|
-
bench('rpc (wait for response)', async () => {
|
|
60
|
-
const result = await client.test.add.rpc({ n: 1 });
|
|
61
|
-
assert(result.ok);
|
|
62
|
-
}, { time: BENCH_DURATION });
|
|
63
|
-
const [input, output] = await client.test.echo.stream();
|
|
64
|
-
bench('stream (wait for response)', async () => {
|
|
65
|
-
input.push({ msg: 'abc', ignore: false });
|
|
66
|
-
const result = await output.next();
|
|
67
|
-
assert(result.value && result.value.ok);
|
|
68
|
-
}, { time: BENCH_DURATION });
|
|
69
|
-
bench('stream', async () => {
|
|
70
|
-
input.push({ msg: 'abc', ignore: false });
|
|
71
|
-
}, { time: BENCH_DURATION });
|
|
72
|
-
});
|
|
73
|
-
describe('complex (50 procedures) router level bandwidth', async () => {
|
|
74
|
-
const httpServer = http.createServer();
|
|
75
|
-
const port = await onServerReady(httpServer);
|
|
76
|
-
const webSocketServer = await createWebSocketServer(httpServer);
|
|
77
|
-
const [clientTransport, serverTransport] = createWsTransports(port, webSocketServer);
|
|
78
|
-
const serviceDefs = buildServiceDefs([
|
|
79
|
-
StupidlyLargeService('a'),
|
|
80
|
-
StupidlyLargeService('b'),
|
|
81
|
-
StupidlyLargeService('c'),
|
|
82
|
-
StupidlyLargeService('d'),
|
|
83
|
-
]);
|
|
84
|
-
const server = createServer(serverTransport, serviceDefs);
|
|
85
|
-
const client = createClient(clientTransport);
|
|
86
|
-
bench('rpc (wait for response)', async () => {
|
|
87
|
-
const result = await client.b.f35.rpc({ a: 1 });
|
|
88
|
-
assert(result.ok);
|
|
89
|
-
}, { time: BENCH_DURATION });
|
|
90
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cleanup.test.d.ts","sourceRoot":"","sources":["../../__tests__/cleanup.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
import { afterAll, assert, describe, expect, test } from 'vitest';
|
|
2
|
-
import http from 'http';
|
|
3
|
-
import { createWebSocketServer, createWsTransports, iterNext, onServerReady, } from '../util/testHelpers';
|
|
4
|
-
import { SubscribableServiceConstructor, TestServiceConstructor, UploadableServiceConstructor, } from './fixtures/services';
|
|
5
|
-
import { createClient, createServer } from '../router';
|
|
6
|
-
import { ensureServerIsClean, ensureTransportQueuesAreEventuallyEmpty, waitFor, } from './fixtures/cleanup';
|
|
7
|
-
import { buildServiceDefs } from '../router/defs';
|
|
8
|
-
describe('procedures should leave no trace after finishing', async () => {
|
|
9
|
-
const httpServer = http.createServer();
|
|
10
|
-
const port = await onServerReady(httpServer);
|
|
11
|
-
const webSocketServer = await createWebSocketServer(httpServer);
|
|
12
|
-
const getTransports = () => createWsTransports(port, webSocketServer);
|
|
13
|
-
afterAll(() => {
|
|
14
|
-
webSocketServer.close();
|
|
15
|
-
httpServer.close();
|
|
16
|
-
});
|
|
17
|
-
test('closing a transport from the client cleans up connection on the server', async () => {
|
|
18
|
-
const [clientTransport, serverTransport] = getTransports();
|
|
19
|
-
const serviceDefs = buildServiceDefs([TestServiceConstructor()]);
|
|
20
|
-
const server = createServer(serverTransport, serviceDefs);
|
|
21
|
-
const client = createClient(clientTransport);
|
|
22
|
-
expect(clientTransport.connections.size).toEqual(0);
|
|
23
|
-
expect(serverTransport.connections.size).toEqual(0);
|
|
24
|
-
// start procedure
|
|
25
|
-
await client.test.add.rpc({ n: 3 });
|
|
26
|
-
// end procedure
|
|
27
|
-
expect(clientTransport.connections.size).toEqual(1);
|
|
28
|
-
expect(serverTransport.connections.size).toEqual(1);
|
|
29
|
-
// should be back to 0 connections after client closes
|
|
30
|
-
clientTransport.close();
|
|
31
|
-
expect(clientTransport.connections.size).toEqual(0);
|
|
32
|
-
await waitFor(() => expect(serverTransport.connections.size, 'server should cleanup connection after client closes').toEqual(0));
|
|
33
|
-
});
|
|
34
|
-
test('closing a transport from the server cleans up connection on the client', async () => {
|
|
35
|
-
const [clientTransport, serverTransport] = getTransports();
|
|
36
|
-
const serviceDefs = buildServiceDefs([TestServiceConstructor()]);
|
|
37
|
-
const server = createServer(serverTransport, serviceDefs);
|
|
38
|
-
const client = createClient(clientTransport);
|
|
39
|
-
expect(clientTransport.connections.size).toEqual(0);
|
|
40
|
-
expect(serverTransport.connections.size).toEqual(0);
|
|
41
|
-
// start procedure
|
|
42
|
-
await client.test.add.rpc({ n: 3 });
|
|
43
|
-
// end procedure
|
|
44
|
-
expect(clientTransport.connections.size).toEqual(1);
|
|
45
|
-
expect(serverTransport.connections.size).toEqual(1);
|
|
46
|
-
// should be back to 0 connections after client closes
|
|
47
|
-
serverTransport.close();
|
|
48
|
-
expect(serverTransport.connections.size).toEqual(0);
|
|
49
|
-
await waitFor(() => expect(clientTransport.connections.size, 'client should cleanup connection after server closes').toEqual(0));
|
|
50
|
-
});
|
|
51
|
-
test('rpc', async () => {
|
|
52
|
-
const [clientTransport, serverTransport] = getTransports();
|
|
53
|
-
const serviceDefs = buildServiceDefs([TestServiceConstructor()]);
|
|
54
|
-
const server = createServer(serverTransport, serviceDefs);
|
|
55
|
-
const client = createClient(clientTransport);
|
|
56
|
-
let serverListeners = serverTransport.eventDispatcher.numberOfListeners('message');
|
|
57
|
-
let clientListeners = clientTransport.eventDispatcher.numberOfListeners('message');
|
|
58
|
-
// start procedure
|
|
59
|
-
await client.test.add.rpc({ n: 3 });
|
|
60
|
-
// end procedure
|
|
61
|
-
// number of message handlers shouldn't increase after rpc
|
|
62
|
-
expect(serverTransport.eventDispatcher.numberOfListeners('message')).toEqual(serverListeners);
|
|
63
|
-
expect(clientTransport.eventDispatcher.numberOfListeners('message')).toEqual(clientListeners);
|
|
64
|
-
// check number of connections
|
|
65
|
-
expect(serverTransport.connections.size).toEqual(1);
|
|
66
|
-
expect(clientTransport.connections.size).toEqual(1);
|
|
67
|
-
await ensureTransportQueuesAreEventuallyEmpty(clientTransport);
|
|
68
|
-
await ensureTransportQueuesAreEventuallyEmpty(serverTransport);
|
|
69
|
-
// ensure we have no streams left on the server
|
|
70
|
-
await ensureServerIsClean(server);
|
|
71
|
-
});
|
|
72
|
-
test('stream', async () => {
|
|
73
|
-
const [clientTransport, serverTransport] = getTransports();
|
|
74
|
-
const serviceDefs = buildServiceDefs([TestServiceConstructor()]);
|
|
75
|
-
const server = createServer(serverTransport, serviceDefs);
|
|
76
|
-
const client = createClient(clientTransport);
|
|
77
|
-
let serverListeners = serverTransport.eventDispatcher.numberOfListeners('message');
|
|
78
|
-
let clientListeners = clientTransport.eventDispatcher.numberOfListeners('message');
|
|
79
|
-
// start procedure
|
|
80
|
-
const [input, output, close] = await client.test.echo.stream();
|
|
81
|
-
input.push({ msg: '1', ignore: false });
|
|
82
|
-
input.push({ msg: '2', ignore: false, end: true });
|
|
83
|
-
const result1 = await iterNext(output);
|
|
84
|
-
assert(result1.ok);
|
|
85
|
-
expect(result1.payload).toStrictEqual({ response: '1' });
|
|
86
|
-
// ensure we only have one stream despite pushing multiple messages.
|
|
87
|
-
await waitFor(() => expect(server.streams.size).toEqual(1));
|
|
88
|
-
input.end();
|
|
89
|
-
// ensure we no longer have any streams since the input was closed.
|
|
90
|
-
await waitFor(() => expect(server.streams.size).toEqual(0));
|
|
91
|
-
const result2 = await iterNext(output);
|
|
92
|
-
assert(result2.ok);
|
|
93
|
-
expect(result2.payload).toStrictEqual({ response: '2' });
|
|
94
|
-
const result3 = await output.next();
|
|
95
|
-
assert(result3.done);
|
|
96
|
-
close();
|
|
97
|
-
// end procedure
|
|
98
|
-
// number of message handlers shouldn't increase after stream ends
|
|
99
|
-
expect(serverTransport.eventDispatcher.numberOfListeners('message')).toEqual(serverListeners);
|
|
100
|
-
expect(clientTransport.eventDispatcher.numberOfListeners('message')).toEqual(clientListeners);
|
|
101
|
-
// check number of connections
|
|
102
|
-
expect(serverTransport.connections.size).toEqual(1);
|
|
103
|
-
expect(clientTransport.connections.size).toEqual(1);
|
|
104
|
-
await ensureTransportQueuesAreEventuallyEmpty(clientTransport);
|
|
105
|
-
await ensureTransportQueuesAreEventuallyEmpty(serverTransport);
|
|
106
|
-
// ensure we have no streams left on the server
|
|
107
|
-
await ensureServerIsClean(server);
|
|
108
|
-
});
|
|
109
|
-
test('subscription', async () => {
|
|
110
|
-
const [clientTransport, serverTransport] = getTransports();
|
|
111
|
-
const serviceDefs = buildServiceDefs([SubscribableServiceConstructor()]);
|
|
112
|
-
const server = createServer(serverTransport, serviceDefs);
|
|
113
|
-
const client = createClient(clientTransport);
|
|
114
|
-
let serverListeners = serverTransport.eventDispatcher.numberOfListeners('message');
|
|
115
|
-
let clientListeners = clientTransport.eventDispatcher.numberOfListeners('message');
|
|
116
|
-
// start procedure
|
|
117
|
-
const [subscription, close] = await client.subscribable.value.subscribe({});
|
|
118
|
-
let result = await iterNext(subscription);
|
|
119
|
-
assert(result.ok);
|
|
120
|
-
expect(result.payload).toStrictEqual({ result: 0 });
|
|
121
|
-
const add1 = await client.subscribable.add.rpc({ n: 1 });
|
|
122
|
-
assert(add1.ok);
|
|
123
|
-
result = await iterNext(subscription);
|
|
124
|
-
assert(result.ok);
|
|
125
|
-
close();
|
|
126
|
-
// end procedure
|
|
127
|
-
// number of message handlers shouldn't increase after subscription ends
|
|
128
|
-
expect(serverTransport.eventDispatcher.numberOfListeners('message')).toEqual(serverListeners);
|
|
129
|
-
expect(clientTransport.eventDispatcher.numberOfListeners('message')).toEqual(clientListeners);
|
|
130
|
-
// check number of connections
|
|
131
|
-
expect(serverTransport.connections.size).toEqual(1);
|
|
132
|
-
expect(clientTransport.connections.size).toEqual(1);
|
|
133
|
-
await ensureTransportQueuesAreEventuallyEmpty(clientTransport);
|
|
134
|
-
await ensureTransportQueuesAreEventuallyEmpty(serverTransport);
|
|
135
|
-
// ensure we have no streams left on the server
|
|
136
|
-
await ensureServerIsClean(server);
|
|
137
|
-
});
|
|
138
|
-
test('upload', async () => {
|
|
139
|
-
const [clientTransport, serverTransport] = getTransports();
|
|
140
|
-
const serviceDefs = buildServiceDefs([UploadableServiceConstructor()]);
|
|
141
|
-
const server = createServer(serverTransport, serviceDefs);
|
|
142
|
-
const client = createClient(clientTransport);
|
|
143
|
-
let serverListeners = serverTransport.eventDispatcher.numberOfListeners('message');
|
|
144
|
-
let clientListeners = clientTransport.eventDispatcher.numberOfListeners('message');
|
|
145
|
-
// start procedure
|
|
146
|
-
const [addStream, addResult] = await client.uploadable.addMultiple.upload();
|
|
147
|
-
addStream.push({ n: 1 });
|
|
148
|
-
addStream.push({ n: 2 });
|
|
149
|
-
addStream.end();
|
|
150
|
-
const result = await addResult;
|
|
151
|
-
assert(result.ok);
|
|
152
|
-
expect(result.payload).toStrictEqual({ result: 3 });
|
|
153
|
-
// end procedure
|
|
154
|
-
// number of message handlers shouldn't increase after upload ends
|
|
155
|
-
expect(serverTransport.eventDispatcher.numberOfListeners('message')).toEqual(serverListeners);
|
|
156
|
-
expect(clientTransport.eventDispatcher.numberOfListeners('message')).toEqual(clientListeners);
|
|
157
|
-
// check number of connections
|
|
158
|
-
expect(serverTransport.connections.size).toEqual(1);
|
|
159
|
-
expect(clientTransport.connections.size).toEqual(1);
|
|
160
|
-
await ensureTransportQueuesAreEventuallyEmpty(clientTransport);
|
|
161
|
-
await ensureTransportQueuesAreEventuallyEmpty(serverTransport);
|
|
162
|
-
// ensure we have no streams left on the server
|
|
163
|
-
await ensureServerIsClean(server);
|
|
164
|
-
});
|
|
165
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"disconnects.test.d.ts","sourceRoot":"","sources":["../../__tests__/disconnects.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
import { afterAll, afterEach, assert, beforeEach, describe, expect, test, vi, } from 'vitest';
|
|
2
|
-
import http from 'http';
|
|
3
|
-
import { createLocalWebSocketClient, createWebSocketServer, createWsTransports, iterNext, onServerReady, } from '../util/testHelpers';
|
|
4
|
-
import { SubscribableServiceConstructor, TestServiceConstructor, UploadableServiceConstructor, } from './fixtures/services';
|
|
5
|
-
import { createClient, createServer } from '../router';
|
|
6
|
-
import { ensureServerIsClean, waitFor } from './fixtures/cleanup';
|
|
7
|
-
import { CONNECTION_GRACE_PERIOD_MS } from '../router/client';
|
|
8
|
-
import { Err, UNEXPECTED_DISCONNECT } from '../router/result';
|
|
9
|
-
import { WebSocketServerTransport } from '../transport/impls/ws/server';
|
|
10
|
-
import { WebSocketClientTransport } from '../transport/impls/ws/client';
|
|
11
|
-
import { buildServiceDefs } from '../router/defs';
|
|
12
|
-
describe('procedures should handle unexpected disconnects', async () => {
|
|
13
|
-
const httpServer = http.createServer();
|
|
14
|
-
const port = await onServerReady(httpServer);
|
|
15
|
-
const webSocketServer = await createWebSocketServer(httpServer);
|
|
16
|
-
const getTransports = () => createWsTransports(port, webSocketServer);
|
|
17
|
-
afterAll(() => {
|
|
18
|
-
webSocketServer.close();
|
|
19
|
-
httpServer.close();
|
|
20
|
-
});
|
|
21
|
-
beforeEach(() => {
|
|
22
|
-
vi.useFakeTimers();
|
|
23
|
-
});
|
|
24
|
-
afterEach(() => {
|
|
25
|
-
vi.useRealTimers();
|
|
26
|
-
});
|
|
27
|
-
test('rpc', async () => {
|
|
28
|
-
const [clientTransport, serverTransport] = getTransports();
|
|
29
|
-
const serviceDefs = buildServiceDefs([TestServiceConstructor()]);
|
|
30
|
-
const server = createServer(serverTransport, serviceDefs);
|
|
31
|
-
const client = createClient(clientTransport);
|
|
32
|
-
// start procedure
|
|
33
|
-
await client.test.add.rpc({ n: 3 });
|
|
34
|
-
expect(clientTransport.connections.size).toEqual(1);
|
|
35
|
-
expect(serverTransport.connections.size).toEqual(1);
|
|
36
|
-
clientTransport.connections.forEach((conn) => conn.ws.close());
|
|
37
|
-
clientTransport.tryReconnecting = false;
|
|
38
|
-
const procPromise = client.test.add.rpc({ n: 4 });
|
|
39
|
-
// end procedure
|
|
40
|
-
// after we've disconnected, hit end of grace period
|
|
41
|
-
await vi.runOnlyPendingTimersAsync();
|
|
42
|
-
await vi.advanceTimersByTimeAsync(CONNECTION_GRACE_PERIOD_MS);
|
|
43
|
-
// we should get an error + expect the streams to be cleaned up
|
|
44
|
-
await expect(procPromise).resolves.toMatchObject(Err({
|
|
45
|
-
code: UNEXPECTED_DISCONNECT,
|
|
46
|
-
}));
|
|
47
|
-
waitFor(() => expect(clientTransport.connections.size).toEqual(0));
|
|
48
|
-
waitFor(() => expect(serverTransport.connections.size).toEqual(0));
|
|
49
|
-
await ensureServerIsClean(server);
|
|
50
|
-
});
|
|
51
|
-
test('stream', async () => {
|
|
52
|
-
const [clientTransport, serverTransport] = getTransports();
|
|
53
|
-
const serviceDefs = buildServiceDefs([TestServiceConstructor()]);
|
|
54
|
-
const server = createServer(serverTransport, serviceDefs);
|
|
55
|
-
const client = createClient(clientTransport);
|
|
56
|
-
// start procedure
|
|
57
|
-
const [input, output] = await client.test.echo.stream();
|
|
58
|
-
input.push({ msg: 'abc', ignore: false });
|
|
59
|
-
const result = await iterNext(output);
|
|
60
|
-
assert(result.ok);
|
|
61
|
-
expect(clientTransport.connections.size).toEqual(1);
|
|
62
|
-
expect(serverTransport.connections.size).toEqual(1);
|
|
63
|
-
clientTransport.connections.forEach((conn) => conn.ws.close());
|
|
64
|
-
clientTransport.tryReconnecting = false;
|
|
65
|
-
const nextResPromise = iterNext(output);
|
|
66
|
-
// end procedure
|
|
67
|
-
// after we've disconnected, hit end of grace period
|
|
68
|
-
await vi.runOnlyPendingTimersAsync();
|
|
69
|
-
await vi.advanceTimersByTimeAsync(CONNECTION_GRACE_PERIOD_MS);
|
|
70
|
-
// we should get an error + expect the streams to be cleaned up
|
|
71
|
-
await expect(nextResPromise).resolves.toMatchObject(Err({
|
|
72
|
-
code: UNEXPECTED_DISCONNECT,
|
|
73
|
-
}));
|
|
74
|
-
waitFor(() => expect(clientTransport.connections.size).toEqual(0));
|
|
75
|
-
waitFor(() => expect(serverTransport.connections.size).toEqual(0));
|
|
76
|
-
await ensureServerIsClean(server);
|
|
77
|
-
});
|
|
78
|
-
test('subscription', async () => {
|
|
79
|
-
const serverTransport = new WebSocketServerTransport(webSocketServer, 'SERVER');
|
|
80
|
-
const client1Transport = new WebSocketClientTransport(() => createLocalWebSocketClient(port), 'client1', 'SERVER');
|
|
81
|
-
const client2Transport = new WebSocketClientTransport(() => createLocalWebSocketClient(port), 'client2', 'SERVER');
|
|
82
|
-
const serviceDefs = buildServiceDefs([SubscribableServiceConstructor()]);
|
|
83
|
-
const server = createServer(serverTransport, serviceDefs);
|
|
84
|
-
const client1 = createClient(client1Transport);
|
|
85
|
-
const client2 = createClient(client2Transport);
|
|
86
|
-
// start procedure
|
|
87
|
-
// client1 and client2 both subscribe
|
|
88
|
-
const [subscription1, close1] = await client1.subscribable.value.subscribe({});
|
|
89
|
-
let result = await iterNext(subscription1);
|
|
90
|
-
assert(result.ok);
|
|
91
|
-
expect(result.payload).toStrictEqual({ result: 0 });
|
|
92
|
-
const [subscription2, _close2] = await client2.subscribable.value.subscribe({});
|
|
93
|
-
result = await iterNext(subscription2);
|
|
94
|
-
assert(result.ok);
|
|
95
|
-
expect(result.payload).toStrictEqual({ result: 0 });
|
|
96
|
-
// client2 adds a value
|
|
97
|
-
const add1 = await client2.subscribable.add.rpc({ n: 1 });
|
|
98
|
-
assert(add1.ok);
|
|
99
|
-
// both clients should receive the updated value
|
|
100
|
-
result = await iterNext(subscription1);
|
|
101
|
-
assert(result.ok);
|
|
102
|
-
expect(result.payload).toStrictEqual({ result: 1 });
|
|
103
|
-
result = await iterNext(subscription2);
|
|
104
|
-
assert(result.ok);
|
|
105
|
-
expect(result.payload).toStrictEqual({ result: 1 });
|
|
106
|
-
// all clients are connected
|
|
107
|
-
expect(client1Transport.connections.size).toEqual(1);
|
|
108
|
-
expect(client2Transport.connections.size).toEqual(1);
|
|
109
|
-
expect(serverTransport.connections.size).toEqual(2);
|
|
110
|
-
// kill the connection for client2
|
|
111
|
-
client2Transport.connections.forEach((conn) => conn.ws.close());
|
|
112
|
-
client2Transport.tryReconnecting = false;
|
|
113
|
-
// client1 who is still connected can still add values and receive updates
|
|
114
|
-
const add2Promise = client1.subscribable.add.rpc({ n: 2 });
|
|
115
|
-
// after we've disconnected, hit end of grace period
|
|
116
|
-
await vi.runOnlyPendingTimersAsync();
|
|
117
|
-
await vi.advanceTimersByTimeAsync(CONNECTION_GRACE_PERIOD_MS);
|
|
118
|
-
// we should get an error from the subscription on client2
|
|
119
|
-
const nextResPromise = iterNext(subscription2);
|
|
120
|
-
await expect(nextResPromise).resolves.toMatchObject(Err({
|
|
121
|
-
code: UNEXPECTED_DISCONNECT,
|
|
122
|
-
}));
|
|
123
|
-
// client1 who is still connected can still add values and receive updates
|
|
124
|
-
assert((await add2Promise).ok);
|
|
125
|
-
result = await iterNext(subscription1);
|
|
126
|
-
assert(result.ok);
|
|
127
|
-
expect(result.payload).toStrictEqual({ result: 3 });
|
|
128
|
-
// at this point, only client1 is connected
|
|
129
|
-
expect(client1Transport.connections.size).toEqual(1);
|
|
130
|
-
expect(client2Transport.connections.size).toEqual(0);
|
|
131
|
-
expect(serverTransport.connections.size).toEqual(1);
|
|
132
|
-
// cleanup client1 (client2 is already disconnected)
|
|
133
|
-
close1();
|
|
134
|
-
await client1Transport.close();
|
|
135
|
-
await ensureServerIsClean(server);
|
|
136
|
-
});
|
|
137
|
-
test('upload', async () => {
|
|
138
|
-
const [clientTransport, serverTransport] = getTransports();
|
|
139
|
-
const serviceDefs = buildServiceDefs([UploadableServiceConstructor()]);
|
|
140
|
-
const server = createServer(serverTransport, serviceDefs);
|
|
141
|
-
const client = createClient(clientTransport);
|
|
142
|
-
// start procedure
|
|
143
|
-
const [addStream, addResult] = await client.uploadable.addMultiple.upload();
|
|
144
|
-
addStream.push({ n: 1 });
|
|
145
|
-
addStream.push({ n: 2 });
|
|
146
|
-
// end procedure
|
|
147
|
-
// need to wait for connection to be established
|
|
148
|
-
await waitFor(() => expect(clientTransport.connections.size).toEqual(1));
|
|
149
|
-
await waitFor(() => expect(serverTransport.connections.size).toEqual(1));
|
|
150
|
-
clientTransport.connections.forEach((conn) => conn.ws.close());
|
|
151
|
-
clientTransport.tryReconnecting = false;
|
|
152
|
-
// after we've disconnected, hit end of grace period
|
|
153
|
-
await vi.runOnlyPendingTimersAsync();
|
|
154
|
-
await vi.advanceTimersByTimeAsync(CONNECTION_GRACE_PERIOD_MS);
|
|
155
|
-
// we should get an error + expect the streams to be cleaned up
|
|
156
|
-
await expect(addResult).resolves.toMatchObject(Err({
|
|
157
|
-
code: UNEXPECTED_DISCONNECT,
|
|
158
|
-
}));
|
|
159
|
-
waitFor(() => expect(clientTransport.connections.size).toEqual(0));
|
|
160
|
-
waitFor(() => expect(serverTransport.connections.size).toEqual(0));
|
|
161
|
-
await ensureServerIsClean(server);
|
|
162
|
-
});
|
|
163
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"e2e.test.d.ts","sourceRoot":"","sources":["../../__tests__/e2e.test.ts"],"names":[],"mappings":""}
|