@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.
Files changed (135) hide show
  1. package/dist/{router/builder.d.ts → builder-3c4485f0.d.ts} +76 -21
  2. package/dist/chunk-7WJ6YLE5.js +683 -0
  3. package/dist/chunk-AJQU4AZG.js +284 -0
  4. package/dist/chunk-ORAG7IAU.js +0 -0
  5. package/dist/chunk-PC65ZFWJ.js +29 -0
  6. package/dist/chunk-R6H2BIMC.js +49 -0
  7. package/dist/chunk-RGMHF6PF.js +65 -0
  8. package/dist/chunk-SLUSVGQH.js +30 -0
  9. package/dist/chunk-UU2Z7LDR.js +113 -0
  10. package/dist/chunk-WVT5QXMZ.js +20 -0
  11. package/dist/chunk-ZE4MX7DF.js +75 -0
  12. package/dist/codec/index.cjs +94 -0
  13. package/dist/codec/index.d.cts +15 -0
  14. package/dist/codec/index.d.ts +15 -4
  15. package/dist/codec/index.js +10 -2
  16. package/dist/connection-8e19874c.d.ts +11 -0
  17. package/dist/connection-f7688cc1.d.ts +11 -0
  18. package/dist/logging/index.cjs +56 -0
  19. package/dist/logging/index.d.cts +28 -0
  20. package/dist/logging/index.d.ts +6 -6
  21. package/dist/logging/index.js +9 -40
  22. package/dist/router/index.cjs +770 -0
  23. package/dist/router/index.d.cts +114 -0
  24. package/dist/router/index.d.ts +114 -12
  25. package/dist/router/index.js +24 -5
  26. package/dist/transport/impls/ws/client.cjs +505 -0
  27. package/dist/transport/impls/ws/client.d.cts +42 -0
  28. package/dist/transport/impls/ws/client.d.ts +8 -8
  29. package/dist/transport/impls/ws/client.js +10 -100
  30. package/dist/transport/impls/ws/server.cjs +457 -0
  31. package/dist/transport/impls/ws/server.d.cts +21 -0
  32. package/dist/transport/impls/ws/server.d.ts +11 -10
  33. package/dist/transport/impls/ws/server.js +11 -52
  34. package/dist/transport/index.cjs +362 -0
  35. package/dist/transport/{transport.d.ts → index.d.cts} +119 -7
  36. package/dist/transport/index.d.ts +273 -4
  37. package/dist/transport/index.js +20 -2
  38. package/dist/{codec/types.d.ts → types-3e5768ec.d.ts} +3 -2
  39. package/dist/util/testHelpers.cjs +731 -0
  40. package/dist/util/testHelpers.d.cts +79 -0
  41. package/dist/util/testHelpers.d.ts +22 -19
  42. package/dist/util/testHelpers.js +135 -163
  43. package/package.json +41 -13
  44. package/dist/__tests__/bandwidth.bench.d.ts +0 -2
  45. package/dist/__tests__/bandwidth.bench.d.ts.map +0 -1
  46. package/dist/__tests__/bandwidth.bench.js +0 -90
  47. package/dist/__tests__/cleanup.test.d.ts +0 -2
  48. package/dist/__tests__/cleanup.test.d.ts.map +0 -1
  49. package/dist/__tests__/cleanup.test.js +0 -165
  50. package/dist/__tests__/disconnects.test.d.ts +0 -2
  51. package/dist/__tests__/disconnects.test.d.ts.map +0 -1
  52. package/dist/__tests__/disconnects.test.js +0 -163
  53. package/dist/__tests__/e2e.test.d.ts +0 -2
  54. package/dist/__tests__/e2e.test.d.ts.map +0 -1
  55. package/dist/__tests__/e2e.test.js +0 -317
  56. package/dist/__tests__/fixtures/cleanup.d.ts +0 -12
  57. package/dist/__tests__/fixtures/cleanup.d.ts.map +0 -1
  58. package/dist/__tests__/fixtures/cleanup.js +0 -36
  59. package/dist/__tests__/fixtures/largePayload.json +0 -33
  60. package/dist/__tests__/fixtures/observable.d.ts +0 -26
  61. package/dist/__tests__/fixtures/observable.d.ts.map +0 -1
  62. package/dist/__tests__/fixtures/observable.js +0 -38
  63. package/dist/__tests__/fixtures/observable.test.d.ts +0 -2
  64. package/dist/__tests__/fixtures/observable.test.d.ts.map +0 -1
  65. package/dist/__tests__/fixtures/observable.test.js +0 -39
  66. package/dist/__tests__/fixtures/services.d.ts +0 -288
  67. package/dist/__tests__/fixtures/services.d.ts.map +0 -1
  68. package/dist/__tests__/fixtures/services.js +0 -207
  69. package/dist/__tests__/handler.test.d.ts +0 -2
  70. package/dist/__tests__/handler.test.d.ts.map +0 -1
  71. package/dist/__tests__/handler.test.js +0 -120
  72. package/dist/__tests__/serialize.test.d.ts +0 -2
  73. package/dist/__tests__/serialize.test.d.ts.map +0 -1
  74. package/dist/__tests__/serialize.test.js +0 -208
  75. package/dist/__tests__/typescript-stress.test.d.ts +0 -1583
  76. package/dist/__tests__/typescript-stress.test.d.ts.map +0 -1
  77. package/dist/__tests__/typescript-stress.test.js +0 -123
  78. package/dist/codec/binary.d.ts +0 -7
  79. package/dist/codec/binary.d.ts.map +0 -1
  80. package/dist/codec/binary.js +0 -20
  81. package/dist/codec/codec.test.d.ts +0 -5
  82. package/dist/codec/codec.test.d.ts.map +0 -1
  83. package/dist/codec/codec.test.js +0 -41
  84. package/dist/codec/index.d.ts.map +0 -1
  85. package/dist/codec/json.d.ts +0 -7
  86. package/dist/codec/json.d.ts.map +0 -1
  87. package/dist/codec/json.js +0 -51
  88. package/dist/codec/types.d.ts.map +0 -1
  89. package/dist/codec/types.js +0 -1
  90. package/dist/logging/index.d.ts.map +0 -1
  91. package/dist/router/builder.d.ts.map +0 -1
  92. package/dist/router/builder.js +0 -91
  93. package/dist/router/client.d.ts +0 -72
  94. package/dist/router/client.d.ts.map +0 -1
  95. package/dist/router/client.js +0 -257
  96. package/dist/router/context.d.ts +0 -30
  97. package/dist/router/context.d.ts.map +0 -1
  98. package/dist/router/context.js +0 -1
  99. package/dist/router/defs.d.ts +0 -16
  100. package/dist/router/defs.d.ts.map +0 -1
  101. package/dist/router/defs.js +0 -11
  102. package/dist/router/index.d.ts.map +0 -1
  103. package/dist/router/result.d.ts +0 -26
  104. package/dist/router/result.d.ts.map +0 -1
  105. package/dist/router/result.js +0 -22
  106. package/dist/router/server.d.ts +0 -39
  107. package/dist/router/server.d.ts.map +0 -1
  108. package/dist/router/server.js +0 -260
  109. package/dist/transport/events.d.ts +0 -19
  110. package/dist/transport/events.d.ts.map +0 -1
  111. package/dist/transport/events.js +0 -26
  112. package/dist/transport/impls/stdio/stdio.d.ts +0 -33
  113. package/dist/transport/impls/stdio/stdio.d.ts.map +0 -1
  114. package/dist/transport/impls/stdio/stdio.js +0 -75
  115. package/dist/transport/impls/stdio/stdio.test.d.ts +0 -2
  116. package/dist/transport/impls/stdio/stdio.test.d.ts.map +0 -1
  117. package/dist/transport/impls/stdio/stdio.test.js +0 -24
  118. package/dist/transport/impls/ws/client.d.ts.map +0 -1
  119. package/dist/transport/impls/ws/connection.d.ts +0 -11
  120. package/dist/transport/impls/ws/connection.d.ts.map +0 -1
  121. package/dist/transport/impls/ws/connection.js +0 -23
  122. package/dist/transport/impls/ws/server.d.ts.map +0 -1
  123. package/dist/transport/impls/ws/ws.test.d.ts +0 -2
  124. package/dist/transport/impls/ws/ws.test.d.ts.map +0 -1
  125. package/dist/transport/impls/ws/ws.test.js +0 -185
  126. package/dist/transport/index.d.ts.map +0 -1
  127. package/dist/transport/message.d.ts +0 -142
  128. package/dist/transport/message.d.ts.map +0 -1
  129. package/dist/transport/message.js +0 -113
  130. package/dist/transport/message.test.d.ts +0 -2
  131. package/dist/transport/message.test.d.ts.map +0 -1
  132. package/dist/transport/message.test.js +0 -52
  133. package/dist/transport/transport.d.ts.map +0 -1
  134. package/dist/transport/transport.js +0 -281
  135. 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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=cleanup.test.d.ts.map
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=disconnects.test.d.ts.map
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=e2e.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"e2e.test.d.ts","sourceRoot":"","sources":["../../__tests__/e2e.test.ts"],"names":[],"mappings":""}