@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,317 +0,0 @@
|
|
|
1
|
-
import { afterAll, assert, describe, expect, test } from 'vitest';
|
|
2
|
-
import { createLocalWebSocketClient, createWebSocketServer, createWsTransports, iterNext, onServerReady, } from '../util/testHelpers';
|
|
3
|
-
import { createServer } from '../router/server';
|
|
4
|
-
import { createClient } from '../router/client';
|
|
5
|
-
import http from 'http';
|
|
6
|
-
import { BinaryFileServiceConstructor, DIV_BY_ZERO, FallibleServiceConstructor, OrderingServiceConstructor, STREAM_ERROR, SubscribableServiceConstructor, UploadableServiceConstructor, TestServiceConstructor, } from './fixtures/services';
|
|
7
|
-
import { UNCAUGHT_ERROR } from '../router/result';
|
|
8
|
-
import { codecs } from '../codec/codec.test';
|
|
9
|
-
import { WebSocketClientTransport } from '../transport/impls/ws/client';
|
|
10
|
-
import { WebSocketServerTransport } from '../transport/impls/ws/server';
|
|
11
|
-
import { testFinishesCleanly } from './fixtures/cleanup';
|
|
12
|
-
import { buildServiceDefs } from '../router/defs';
|
|
13
|
-
describe.each(codecs)('client <-> server integration test ($name codec)', async ({ codec }) => {
|
|
14
|
-
const httpServer = http.createServer();
|
|
15
|
-
const port = await onServerReady(httpServer);
|
|
16
|
-
const webSocketServer = await createWebSocketServer(httpServer);
|
|
17
|
-
const getTransports = () => createWsTransports(port, webSocketServer, codec);
|
|
18
|
-
afterAll(() => {
|
|
19
|
-
webSocketServer.close();
|
|
20
|
-
httpServer.close();
|
|
21
|
-
});
|
|
22
|
-
test('rpc', async () => {
|
|
23
|
-
const [clientTransport, serverTransport] = getTransports();
|
|
24
|
-
const serviceDefs = buildServiceDefs([TestServiceConstructor()]);
|
|
25
|
-
const server = createServer(serverTransport, serviceDefs);
|
|
26
|
-
const client = createClient(clientTransport);
|
|
27
|
-
const result = await client.test.add.rpc({ n: 3 });
|
|
28
|
-
assert(result.ok);
|
|
29
|
-
expect(result.payload).toStrictEqual({ result: 3 });
|
|
30
|
-
await testFinishesCleanly({
|
|
31
|
-
clientTransports: [clientTransport],
|
|
32
|
-
serverTransport,
|
|
33
|
-
server,
|
|
34
|
-
});
|
|
35
|
-
});
|
|
36
|
-
test('fallible rpc', async () => {
|
|
37
|
-
const [clientTransport, serverTransport] = getTransports();
|
|
38
|
-
const serviceDefs = buildServiceDefs([FallibleServiceConstructor()]);
|
|
39
|
-
const server = createServer(serverTransport, serviceDefs);
|
|
40
|
-
const client = createClient(clientTransport);
|
|
41
|
-
const result = await client.fallible.divide.rpc({ a: 10, b: 2 });
|
|
42
|
-
assert(result.ok);
|
|
43
|
-
expect(result.payload).toStrictEqual({ result: 5 });
|
|
44
|
-
const result2 = await client.fallible.divide.rpc({ a: 10, b: 0 });
|
|
45
|
-
assert(!result2.ok);
|
|
46
|
-
expect(result2.payload).toStrictEqual({
|
|
47
|
-
code: DIV_BY_ZERO,
|
|
48
|
-
message: 'Cannot divide by zero',
|
|
49
|
-
extras: {
|
|
50
|
-
test: 'abc',
|
|
51
|
-
},
|
|
52
|
-
});
|
|
53
|
-
await testFinishesCleanly({
|
|
54
|
-
clientTransports: [clientTransport],
|
|
55
|
-
serverTransport,
|
|
56
|
-
server,
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
test('rpc with binary (uint8array)', async () => {
|
|
60
|
-
const [clientTransport, serverTransport] = getTransports();
|
|
61
|
-
const serviceDefs = buildServiceDefs([BinaryFileServiceConstructor()]);
|
|
62
|
-
const server = createServer(serverTransport, serviceDefs);
|
|
63
|
-
const client = createClient(clientTransport);
|
|
64
|
-
const result = await client.bin.getFile.rpc({ file: 'test.py' });
|
|
65
|
-
assert(result.ok);
|
|
66
|
-
assert(result.payload.contents instanceof Uint8Array);
|
|
67
|
-
expect(new TextDecoder().decode(result.payload.contents)).toStrictEqual('contents for file test.py');
|
|
68
|
-
await testFinishesCleanly({
|
|
69
|
-
clientTransports: [clientTransport],
|
|
70
|
-
serverTransport,
|
|
71
|
-
server,
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
test('stream', async () => {
|
|
75
|
-
const [clientTransport, serverTransport] = getTransports();
|
|
76
|
-
const serviceDefs = buildServiceDefs([TestServiceConstructor()]);
|
|
77
|
-
const server = createServer(serverTransport, serviceDefs);
|
|
78
|
-
const client = createClient(clientTransport);
|
|
79
|
-
const [input, output, close] = await client.test.echo.stream();
|
|
80
|
-
input.push({ msg: 'abc', ignore: false });
|
|
81
|
-
input.push({ msg: 'def', ignore: true });
|
|
82
|
-
input.push({ msg: 'ghi', ignore: false });
|
|
83
|
-
input.push({ msg: 'end', ignore: false, end: true });
|
|
84
|
-
input.end();
|
|
85
|
-
const result1 = await iterNext(output);
|
|
86
|
-
assert(result1.ok);
|
|
87
|
-
expect(result1.payload).toStrictEqual({ response: 'abc' });
|
|
88
|
-
const result2 = await iterNext(output);
|
|
89
|
-
assert(result2.ok);
|
|
90
|
-
expect(result2.payload).toStrictEqual({ response: 'ghi' });
|
|
91
|
-
const result3 = await iterNext(output);
|
|
92
|
-
assert(result3.ok);
|
|
93
|
-
expect(result3.payload).toStrictEqual({ response: 'end' });
|
|
94
|
-
// after the server stream is ended, the client stream should be ended too
|
|
95
|
-
const result4 = await output.next();
|
|
96
|
-
assert(result4.done);
|
|
97
|
-
close();
|
|
98
|
-
await testFinishesCleanly({
|
|
99
|
-
clientTransports: [clientTransport],
|
|
100
|
-
serverTransport,
|
|
101
|
-
server,
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
|
-
test('stream with init message', async () => {
|
|
105
|
-
const [clientTransport, serverTransport] = getTransports();
|
|
106
|
-
const serviceDefs = buildServiceDefs([TestServiceConstructor()]);
|
|
107
|
-
const server = createServer(serverTransport, serviceDefs);
|
|
108
|
-
const client = createClient(clientTransport);
|
|
109
|
-
const [input, output, close] = await client.test.echoWithPrefix.stream({
|
|
110
|
-
prefix: 'test',
|
|
111
|
-
});
|
|
112
|
-
input.push({ msg: 'abc', ignore: false });
|
|
113
|
-
input.push({ msg: 'def', ignore: true });
|
|
114
|
-
input.push({ msg: 'ghi', ignore: false });
|
|
115
|
-
input.end();
|
|
116
|
-
const result1 = await iterNext(output);
|
|
117
|
-
assert(result1.ok);
|
|
118
|
-
expect(result1.payload).toStrictEqual({ response: 'test abc' });
|
|
119
|
-
const result2 = await iterNext(output);
|
|
120
|
-
assert(result2.ok);
|
|
121
|
-
expect(result2.payload).toStrictEqual({ response: 'test ghi' });
|
|
122
|
-
close();
|
|
123
|
-
await testFinishesCleanly({
|
|
124
|
-
clientTransports: [clientTransport],
|
|
125
|
-
serverTransport,
|
|
126
|
-
server,
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
test('fallible stream', async () => {
|
|
130
|
-
const [clientTransport, serverTransport] = getTransports();
|
|
131
|
-
const serviceDefs = buildServiceDefs([FallibleServiceConstructor()]);
|
|
132
|
-
const server = createServer(serverTransport, serviceDefs);
|
|
133
|
-
const client = createClient(clientTransport);
|
|
134
|
-
const [input, output, close] = await client.fallible.echo.stream();
|
|
135
|
-
input.push({ msg: 'abc', throwResult: false, throwError: false });
|
|
136
|
-
const result1 = await iterNext(output);
|
|
137
|
-
assert(result1 && result1.ok);
|
|
138
|
-
expect(result1.payload).toStrictEqual({ response: 'abc' });
|
|
139
|
-
input.push({ msg: 'def', throwResult: true, throwError: false });
|
|
140
|
-
const result2 = await iterNext(output);
|
|
141
|
-
assert(result2 && !result2.ok);
|
|
142
|
-
expect(result2.payload.code).toStrictEqual(STREAM_ERROR);
|
|
143
|
-
input.push({ msg: 'ghi', throwResult: false, throwError: true });
|
|
144
|
-
const result3 = await iterNext(output);
|
|
145
|
-
assert(result3 && !result3.ok);
|
|
146
|
-
expect(result3.payload).toStrictEqual({
|
|
147
|
-
code: UNCAUGHT_ERROR,
|
|
148
|
-
message: 'some message',
|
|
149
|
-
});
|
|
150
|
-
close();
|
|
151
|
-
await testFinishesCleanly({
|
|
152
|
-
clientTransports: [clientTransport],
|
|
153
|
-
serverTransport,
|
|
154
|
-
server,
|
|
155
|
-
});
|
|
156
|
-
});
|
|
157
|
-
test('subscription', async () => {
|
|
158
|
-
const options = { codec };
|
|
159
|
-
const serverTransport = new WebSocketServerTransport(webSocketServer, 'SERVER', options);
|
|
160
|
-
const client1Transport = new WebSocketClientTransport(() => createLocalWebSocketClient(port), 'client1', 'SERVER', options);
|
|
161
|
-
const client2Transport = new WebSocketClientTransport(() => createLocalWebSocketClient(port), 'client2', 'SERVER', options);
|
|
162
|
-
const serviceDefs = buildServiceDefs([SubscribableServiceConstructor()]);
|
|
163
|
-
const server = createServer(serverTransport, serviceDefs);
|
|
164
|
-
const client1 = createClient(client1Transport);
|
|
165
|
-
const client2 = createClient(client2Transport);
|
|
166
|
-
const [subscription1, close1] = await client1.subscribable.value.subscribe({});
|
|
167
|
-
let result = await iterNext(subscription1);
|
|
168
|
-
assert(result.ok);
|
|
169
|
-
expect(result.payload).toStrictEqual({ result: 0 });
|
|
170
|
-
const [subscription2, close2] = await client2.subscribable.value.subscribe({});
|
|
171
|
-
result = await iterNext(subscription2);
|
|
172
|
-
assert(result.ok);
|
|
173
|
-
expect(result.payload).toStrictEqual({ result: 0 });
|
|
174
|
-
const add1 = await client1.subscribable.add.rpc({ n: 1 });
|
|
175
|
-
assert(add1.ok);
|
|
176
|
-
result = await iterNext(subscription1);
|
|
177
|
-
assert(result.ok);
|
|
178
|
-
expect(result.payload).toStrictEqual({ result: 1 });
|
|
179
|
-
result = await iterNext(subscription2);
|
|
180
|
-
assert(result.ok);
|
|
181
|
-
expect(result.payload).toStrictEqual({ result: 1 });
|
|
182
|
-
const add2 = await client2.subscribable.add.rpc({ n: 3 });
|
|
183
|
-
assert(add2.ok);
|
|
184
|
-
result = await iterNext(subscription1);
|
|
185
|
-
assert(result.ok);
|
|
186
|
-
expect(result.payload).toStrictEqual({ result: 4 });
|
|
187
|
-
result = await iterNext(subscription2);
|
|
188
|
-
assert(result.ok);
|
|
189
|
-
expect(result.payload).toStrictEqual({ result: 4 });
|
|
190
|
-
close1();
|
|
191
|
-
close2();
|
|
192
|
-
await testFinishesCleanly({
|
|
193
|
-
clientTransports: [client1Transport, client2Transport],
|
|
194
|
-
serverTransport,
|
|
195
|
-
server,
|
|
196
|
-
});
|
|
197
|
-
});
|
|
198
|
-
test('upload', async () => {
|
|
199
|
-
const [clientTransport, serverTransport] = getTransports();
|
|
200
|
-
const serviceDefs = buildServiceDefs([UploadableServiceConstructor()]);
|
|
201
|
-
const server = createServer(serverTransport, serviceDefs);
|
|
202
|
-
const client = createClient(clientTransport);
|
|
203
|
-
const [addStream, addResult] = await client.uploadable.addMultiple.upload();
|
|
204
|
-
addStream.push({ n: 1 });
|
|
205
|
-
addStream.push({ n: 2 });
|
|
206
|
-
addStream.end();
|
|
207
|
-
const result = await addResult;
|
|
208
|
-
assert(result.ok);
|
|
209
|
-
expect(result.payload).toStrictEqual({ result: 3 });
|
|
210
|
-
await testFinishesCleanly({
|
|
211
|
-
clientTransports: [clientTransport],
|
|
212
|
-
serverTransport,
|
|
213
|
-
server,
|
|
214
|
-
});
|
|
215
|
-
});
|
|
216
|
-
test('upload with init message', async () => {
|
|
217
|
-
const [clientTransport, serverTransport] = getTransports();
|
|
218
|
-
const serviceDefs = buildServiceDefs([UploadableServiceConstructor()]);
|
|
219
|
-
const server = createServer(serverTransport, serviceDefs);
|
|
220
|
-
const client = createClient(clientTransport);
|
|
221
|
-
const [addStream, addResult] = await client.uploadable.addMultipleWithPrefix.upload({
|
|
222
|
-
prefix: 'test',
|
|
223
|
-
});
|
|
224
|
-
addStream.push({ n: 1 });
|
|
225
|
-
addStream.push({ n: 2 });
|
|
226
|
-
addStream.end();
|
|
227
|
-
const result = await addResult;
|
|
228
|
-
assert(result.ok);
|
|
229
|
-
expect(result.payload).toStrictEqual({ result: 'test 3' });
|
|
230
|
-
await testFinishesCleanly({
|
|
231
|
-
clientTransports: [clientTransport],
|
|
232
|
-
serverTransport,
|
|
233
|
-
server,
|
|
234
|
-
});
|
|
235
|
-
});
|
|
236
|
-
test('message order is preserved in the face of disconnects', async () => {
|
|
237
|
-
const [clientTransport, serverTransport] = getTransports();
|
|
238
|
-
const serviceDefs = buildServiceDefs([OrderingServiceConstructor()]);
|
|
239
|
-
const server = createServer(serverTransport, serviceDefs);
|
|
240
|
-
const client = createClient(clientTransport);
|
|
241
|
-
const expected = [];
|
|
242
|
-
for (let i = 0; i < 50; i++) {
|
|
243
|
-
expected.push(i);
|
|
244
|
-
if (i == 10) {
|
|
245
|
-
clientTransport.connections.forEach((conn) => conn.ws.close());
|
|
246
|
-
}
|
|
247
|
-
if (i == 42) {
|
|
248
|
-
clientTransport.connections.forEach((conn) => conn.ws.terminate());
|
|
249
|
-
}
|
|
250
|
-
await client.test.add.rpc({
|
|
251
|
-
n: i,
|
|
252
|
-
});
|
|
253
|
-
}
|
|
254
|
-
const res = await client.test.getAll.rpc({});
|
|
255
|
-
assert(res.ok);
|
|
256
|
-
expect(res.payload.msgs).toStrictEqual(expected);
|
|
257
|
-
await testFinishesCleanly({
|
|
258
|
-
clientTransports: [clientTransport],
|
|
259
|
-
serverTransport,
|
|
260
|
-
server,
|
|
261
|
-
});
|
|
262
|
-
});
|
|
263
|
-
const CONCURRENCY = 10;
|
|
264
|
-
test('concurrent rpcs', async () => {
|
|
265
|
-
const [clientTransport, serverTransport] = getTransports();
|
|
266
|
-
const serviceDefs = buildServiceDefs([OrderingServiceConstructor()]);
|
|
267
|
-
const server = createServer(serverTransport, serviceDefs);
|
|
268
|
-
const client = createClient(clientTransport);
|
|
269
|
-
const promises = [];
|
|
270
|
-
for (let i = 0; i < CONCURRENCY; i++) {
|
|
271
|
-
promises.push(client.test.add.rpc({ n: i }));
|
|
272
|
-
}
|
|
273
|
-
for (let i = 0; i < CONCURRENCY; i++) {
|
|
274
|
-
const result = await promises[i];
|
|
275
|
-
assert(result.ok);
|
|
276
|
-
expect(result.payload).toStrictEqual({ n: i });
|
|
277
|
-
}
|
|
278
|
-
await testFinishesCleanly({
|
|
279
|
-
clientTransports: [clientTransport],
|
|
280
|
-
serverTransport,
|
|
281
|
-
server,
|
|
282
|
-
});
|
|
283
|
-
});
|
|
284
|
-
test('concurrent streams', async () => {
|
|
285
|
-
const [clientTransport, serverTransport] = getTransports();
|
|
286
|
-
const serviceDefs = buildServiceDefs([TestServiceConstructor()]);
|
|
287
|
-
const server = createServer(serverTransport, serviceDefs);
|
|
288
|
-
const client = createClient(clientTransport);
|
|
289
|
-
const openStreams = [];
|
|
290
|
-
for (let i = 0; i < CONCURRENCY; i++) {
|
|
291
|
-
const streamHandle = await client.test.echo.stream();
|
|
292
|
-
const input = streamHandle[0];
|
|
293
|
-
input.push({ msg: `${i}-1`, ignore: false });
|
|
294
|
-
input.push({ msg: `${i}-2`, ignore: false });
|
|
295
|
-
openStreams.push(streamHandle);
|
|
296
|
-
}
|
|
297
|
-
for (let i = 0; i < CONCURRENCY; i++) {
|
|
298
|
-
const output = openStreams[i][1];
|
|
299
|
-
const result1 = await iterNext(output);
|
|
300
|
-
assert(result1.ok);
|
|
301
|
-
expect(result1.payload).toStrictEqual({ response: `${i}-1` });
|
|
302
|
-
const result2 = await iterNext(output);
|
|
303
|
-
assert(result2.ok);
|
|
304
|
-
expect(result2.payload).toStrictEqual({ response: `${i}-2` });
|
|
305
|
-
}
|
|
306
|
-
// cleanup
|
|
307
|
-
for (let i = 0; i < CONCURRENCY; i++) {
|
|
308
|
-
const [_input, _output, close] = openStreams[i];
|
|
309
|
-
close();
|
|
310
|
-
}
|
|
311
|
-
await testFinishesCleanly({
|
|
312
|
-
clientTransports: [clientTransport],
|
|
313
|
-
serverTransport,
|
|
314
|
-
server,
|
|
315
|
-
});
|
|
316
|
-
});
|
|
317
|
-
});
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { Connection, Transport } from '../../transport';
|
|
2
|
-
import { Server } from '../../router';
|
|
3
|
-
export declare function ensureTransportIsClean(t: Transport<Connection>): Promise<void>;
|
|
4
|
-
export declare function waitFor<T>(cb: () => T | Promise<T>): Promise<T>;
|
|
5
|
-
export declare function ensureTransportQueuesAreEventuallyEmpty(t: Transport<Connection>): Promise<void>;
|
|
6
|
-
export declare function ensureServerIsClean(s: Server<unknown>): Promise<void>;
|
|
7
|
-
export declare function testFinishesCleanly({ clientTransports, serverTransport, server, }: Partial<{
|
|
8
|
-
clientTransports: Array<Transport<Connection>>;
|
|
9
|
-
serverTransport: Transport<Connection>;
|
|
10
|
-
server: Server<unknown>;
|
|
11
|
-
}>): Promise<void>;
|
|
12
|
-
//# sourceMappingURL=cleanup.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../../../__tests__/fixtures/cleanup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAOtC,wBAAsB,sBAAsB,CAAC,CAAC,EAAE,SAAS,CAAC,UAAU,CAAC,iBAiBpE;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,cAElD;AAED,wBAAsB,uCAAuC,CAC3D,CAAC,EAAE,SAAS,CAAC,UAAU,CAAC,iBAczB;AAED,wBAAsB,mBAAmB,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,iBAO3D;AAED,wBAAsB,mBAAmB,CAAC,EACxC,gBAAgB,EAChB,eAAe,EACf,MAAM,GACP,EAAE,OAAO,CAAC;IACT,gBAAgB,EAAE,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;IAC/C,eAAe,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;IACvC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;CACzB,CAAC,iBAgBD"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { expect, vi } from 'vitest';
|
|
2
|
-
const waitUntilOptions = {
|
|
3
|
-
timeout: 250,
|
|
4
|
-
interval: 5, // check every 5ms
|
|
5
|
-
};
|
|
6
|
-
export async function ensureTransportIsClean(t) {
|
|
7
|
-
expect(t.state, `transport ${t.clientId} should be closed after the test`).to.not.equal('open');
|
|
8
|
-
expect(t.connections, `transport ${t.clientId} should not have open connections after the test`).toStrictEqual(new Map());
|
|
9
|
-
expect(t.eventDispatcher.numberOfListeners('message'), `transport ${t.clientId} should not have open message handlers after the test`).equal(0);
|
|
10
|
-
expect(t.eventDispatcher.numberOfListeners('connectionStatus'), `transport ${t.clientId} should not have open connection handlers after the test`).equal(0);
|
|
11
|
-
}
|
|
12
|
-
export function waitFor(cb) {
|
|
13
|
-
return vi.waitFor(cb, waitUntilOptions);
|
|
14
|
-
}
|
|
15
|
-
export async function ensureTransportQueuesAreEventuallyEmpty(t) {
|
|
16
|
-
await waitFor(() => expect(t.sendQueue.size, `transport ${t.clientId} should not have any messages waiting to send after the test`).toEqual(0));
|
|
17
|
-
await waitFor(() => expect(t.sendBuffer.size, `transport ${t.clientId} should not have any un-acked messages after the test`).toEqual(0));
|
|
18
|
-
}
|
|
19
|
-
export async function ensureServerIsClean(s) {
|
|
20
|
-
return waitFor(() => expect(s.streams.size, `server should not have any open streams after the test`).toEqual(0));
|
|
21
|
-
}
|
|
22
|
-
export async function testFinishesCleanly({ clientTransports, serverTransport, server, }) {
|
|
23
|
-
if (clientTransports) {
|
|
24
|
-
await Promise.all(clientTransports.map((t) => t.close()));
|
|
25
|
-
await Promise.all(clientTransports.map(ensureTransportIsClean));
|
|
26
|
-
}
|
|
27
|
-
// server sits on top of server transport so we clean it up first
|
|
28
|
-
if (server) {
|
|
29
|
-
await ensureServerIsClean(server);
|
|
30
|
-
await server.close();
|
|
31
|
-
}
|
|
32
|
-
if (serverTransport) {
|
|
33
|
-
await serverTransport.close();
|
|
34
|
-
await ensureTransportIsClean(serverTransport);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"data": [
|
|
3
|
-
{
|
|
4
|
-
"type": "articles",
|
|
5
|
-
"id": "1",
|
|
6
|
-
"attributes": {
|
|
7
|
-
"title": "Example article",
|
|
8
|
-
"body": "The shortest article. Ever.",
|
|
9
|
-
"created": "2015-05-22T14:56:29.000Z",
|
|
10
|
-
"updated": "2015-05-22T14:56:28.000Z"
|
|
11
|
-
},
|
|
12
|
-
"relationships": {
|
|
13
|
-
"author": {
|
|
14
|
-
"data": {
|
|
15
|
-
"id": "42",
|
|
16
|
-
"type": "people"
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
],
|
|
22
|
-
"included": [
|
|
23
|
-
{
|
|
24
|
-
"type": "people",
|
|
25
|
-
"id": "42",
|
|
26
|
-
"attributes": {
|
|
27
|
-
"name": "John",
|
|
28
|
-
"age": 21,
|
|
29
|
-
"gender": "male"
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
]
|
|
33
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Represents an observable value that can be subscribed to for changes.
|
|
3
|
-
* This should only be used in tests
|
|
4
|
-
* @template T - The type of the value being observed.
|
|
5
|
-
*/
|
|
6
|
-
export declare class Observable<T> {
|
|
7
|
-
value: T;
|
|
8
|
-
private listeners;
|
|
9
|
-
constructor(initialValue: T);
|
|
10
|
-
/**
|
|
11
|
-
* Gets the current value of the observable.
|
|
12
|
-
*/
|
|
13
|
-
get(): T;
|
|
14
|
-
/**
|
|
15
|
-
* Sets the current value of the observable. All listeners will get an update with this value.
|
|
16
|
-
* @param newValue - The new value to set.
|
|
17
|
-
*/
|
|
18
|
-
set(tx: (preValue: T) => T): void;
|
|
19
|
-
/**
|
|
20
|
-
* Subscribes to changes in the observable value.
|
|
21
|
-
* @param listener - A callback function that will be called when the value changes.
|
|
22
|
-
* @returns A function that can be called to unsubscribe from further notifications.
|
|
23
|
-
*/
|
|
24
|
-
observe(listener: (val: T) => void): () => boolean;
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=observable.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"observable.d.ts","sourceRoot":"","sources":["../../../__tests__/fixtures/observable.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,UAAU,CAAC,CAAC;IACvB,KAAK,EAAE,CAAC,CAAC;IACT,OAAO,CAAC,SAAS,CAAwB;gBAE7B,YAAY,EAAE,CAAC;IAK3B;;OAEG;IACH,GAAG;IAIH;;;OAGG;IACH,GAAG,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC;IAM1B;;;;OAIG;IACH,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI;CAKnC"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Represents an observable value that can be subscribed to for changes.
|
|
3
|
-
* This should only be used in tests
|
|
4
|
-
* @template T - The type of the value being observed.
|
|
5
|
-
*/
|
|
6
|
-
export class Observable {
|
|
7
|
-
value;
|
|
8
|
-
listeners;
|
|
9
|
-
constructor(initialValue) {
|
|
10
|
-
this.value = initialValue;
|
|
11
|
-
this.listeners = new Set();
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Gets the current value of the observable.
|
|
15
|
-
*/
|
|
16
|
-
get() {
|
|
17
|
-
return this.value;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Sets the current value of the observable. All listeners will get an update with this value.
|
|
21
|
-
* @param newValue - The new value to set.
|
|
22
|
-
*/
|
|
23
|
-
set(tx) {
|
|
24
|
-
const newValue = tx(this.value);
|
|
25
|
-
this.value = newValue;
|
|
26
|
-
this.listeners.forEach((listener) => listener(newValue));
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Subscribes to changes in the observable value.
|
|
30
|
-
* @param listener - A callback function that will be called when the value changes.
|
|
31
|
-
* @returns A function that can be called to unsubscribe from further notifications.
|
|
32
|
-
*/
|
|
33
|
-
observe(listener) {
|
|
34
|
-
this.listeners.add(listener);
|
|
35
|
-
listener(this.get());
|
|
36
|
-
return () => this.listeners.delete(listener);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"observable.test.d.ts","sourceRoot":"","sources":["../../../__tests__/fixtures/observable.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { Observable } from './observable';
|
|
2
|
-
import { describe, expect, test, vitest } from 'vitest';
|
|
3
|
-
describe('Observable', () => {
|
|
4
|
-
test('should set initial value correctly', () => {
|
|
5
|
-
const initialValue = 10;
|
|
6
|
-
const observable = new Observable(initialValue);
|
|
7
|
-
expect(observable.value).toBe(initialValue);
|
|
8
|
-
});
|
|
9
|
-
test('should update value correctly', () => {
|
|
10
|
-
const observable = new Observable(10);
|
|
11
|
-
const newValue = 20;
|
|
12
|
-
observable.set(() => newValue);
|
|
13
|
-
expect(observable.value).toBe(newValue);
|
|
14
|
-
});
|
|
15
|
-
test('should notify listeners when value changes', () => {
|
|
16
|
-
const observable = new Observable(10);
|
|
17
|
-
const listener = vitest.fn();
|
|
18
|
-
observable.observe(listener);
|
|
19
|
-
expect(listener).toHaveBeenCalledTimes(1);
|
|
20
|
-
const newValue = 20;
|
|
21
|
-
observable.set(() => newValue);
|
|
22
|
-
expect(listener).toHaveBeenCalledTimes(2);
|
|
23
|
-
expect(listener).toHaveBeenCalledWith(newValue);
|
|
24
|
-
});
|
|
25
|
-
test('should unsubscribe from notifications', () => {
|
|
26
|
-
const observable = new Observable(10);
|
|
27
|
-
const listener = vitest.fn();
|
|
28
|
-
const unsubscribe = observable.observe(listener);
|
|
29
|
-
expect(listener).toHaveBeenCalledTimes(1);
|
|
30
|
-
const newValue = 20;
|
|
31
|
-
observable.set(() => newValue);
|
|
32
|
-
expect(listener).toHaveBeenCalledTimes(2);
|
|
33
|
-
expect(listener).toHaveBeenCalledWith(newValue);
|
|
34
|
-
unsubscribe();
|
|
35
|
-
const anotherValue = 30;
|
|
36
|
-
observable.set(() => anotherValue);
|
|
37
|
-
expect(listener).toHaveBeenCalledTimes(2); // should not be called again after unsubscribing
|
|
38
|
-
});
|
|
39
|
-
});
|