@replit/river 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/bandwidth.bench.js +2 -1
- package/dist/__tests__/integration.test.d.ts +2 -2
- package/dist/__tests__/integration.test.js +1 -2
- package/dist/__tests__/typescript-stress.test.d.ts +49 -49
- package/dist/codec/index.d.ts +2 -0
- package/dist/codec/index.js +1 -0
- package/dist/router/client.js +1 -1
- package/dist/router/index.d.ts +7 -0
- package/dist/router/index.js +3 -0
- package/dist/testUtils.d.ts +14 -0
- package/dist/testUtils.js +73 -0
- package/dist/transport/{stream.d.ts → impls/stdio.d.ts} +3 -3
- package/dist/transport/{stream.js → impls/stdio.js} +3 -3
- package/dist/transport/{stream.test.js → impls/stdio.test.js} +4 -4
- package/dist/transport/{ws.d.ts → impls/ws.d.ts} +2 -2
- package/dist/transport/{ws.js → impls/ws.js} +3 -3
- package/dist/transport/{ws.test.js → impls/ws.test.js} +2 -1
- package/dist/transport/index.d.ts +6 -0
- package/dist/transport/index.js +14 -0
- package/package.json +13 -4
- package/dist/index.d.ts +0 -14
- package/dist/index.js +0 -9
- package/dist/router/server.util.d.ts +0 -6
- package/dist/router/server.util.js +0 -32
- package/dist/transport/stdio.d.ts +0 -7
- package/dist/transport/stdio.js +0 -20
- package/dist/transport/util.d.ts +0 -12
- package/dist/transport/util.js +0 -48
- package/dist/transport/ws.util.d.ts +0 -12
- package/dist/transport/ws.util.js +0 -43
- /package/dist/transport/{stream.test.d.ts → impls/stdio.test.d.ts} +0 -0
- /package/dist/transport/{ws.test.d.ts → impls/ws.test.d.ts} +0 -0
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import http from 'http';
|
|
2
2
|
import { bench, describe } from 'vitest';
|
|
3
|
-
import { createWebSocketServer, createWsTransports, onServerReady,
|
|
3
|
+
import { createWebSocketServer, createWsTransports, onServerReady, } from '../testUtils';
|
|
4
4
|
import largePayload from './largePayload.json';
|
|
5
5
|
import { TestServiceConstructor } from './integration.test';
|
|
6
6
|
import { createServer } from '../router/server';
|
|
7
7
|
import { createClient } from '../router/client';
|
|
8
8
|
import { StupidlyLargeService } from './typescript-stress.test';
|
|
9
|
+
import { waitForMessage } from '../transport';
|
|
9
10
|
let smallId = 0;
|
|
10
11
|
let largeId = 0;
|
|
11
12
|
const dummyPayloadSmall = () => ({
|
|
@@ -18,7 +18,7 @@ export declare const TestServiceConstructor: () => {
|
|
|
18
18
|
output: import("@sinclair/typebox").TObject<{
|
|
19
19
|
result: import("@sinclair/typebox").TNumber;
|
|
20
20
|
}>;
|
|
21
|
-
handler: (context: import("
|
|
21
|
+
handler: (context: import("../router").ServiceContextWithState<{
|
|
22
22
|
count: number;
|
|
23
23
|
}>, input: import("../transport/message").TransportMessage<{
|
|
24
24
|
n: number;
|
|
@@ -36,7 +36,7 @@ export declare const TestServiceConstructor: () => {
|
|
|
36
36
|
output: import("@sinclair/typebox").TObject<{
|
|
37
37
|
response: import("@sinclair/typebox").TString;
|
|
38
38
|
}>;
|
|
39
|
-
handler: (context: import("
|
|
39
|
+
handler: (context: import("../router").ServiceContextWithState<{
|
|
40
40
|
count: number;
|
|
41
41
|
}>, input: AsyncIterable<import("../transport/message").TransportMessage<{
|
|
42
42
|
msg: string;
|
|
@@ -3,10 +3,9 @@ import { Type } from '@sinclair/typebox';
|
|
|
3
3
|
import { ServiceBuilder, serializeService } from '../router/builder';
|
|
4
4
|
import { reply } from '../transport/message';
|
|
5
5
|
import { afterAll, describe, expect, test } from 'vitest';
|
|
6
|
-
import { createWebSocketServer, createWsTransports, onServerReady, } from '../
|
|
6
|
+
import { createWebSocketServer, createWsTransports, onServerReady, asClientRpc, asClientStream, } from '../testUtils';
|
|
7
7
|
import { createServer } from '../router/server';
|
|
8
8
|
import { createClient } from '../router/client';
|
|
9
|
-
import { asClientRpc, asClientStream } from '../router/server.util';
|
|
10
9
|
export const EchoRequest = Type.Object({
|
|
11
10
|
msg: Type.String(),
|
|
12
11
|
ignore: Type.Boolean(),
|
|
@@ -11,7 +11,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
11
11
|
output: import("@sinclair/typebox").TObject<{
|
|
12
12
|
b: import("@sinclair/typebox").TNumber;
|
|
13
13
|
}>;
|
|
14
|
-
handler: (context: import("
|
|
14
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
15
15
|
a: number;
|
|
16
16
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
17
17
|
b: number;
|
|
@@ -26,7 +26,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
26
26
|
output: import("@sinclair/typebox").TObject<{
|
|
27
27
|
b: import("@sinclair/typebox").TNumber;
|
|
28
28
|
}>;
|
|
29
|
-
handler: (context: import("
|
|
29
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
30
30
|
a: number;
|
|
31
31
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
32
32
|
b: number;
|
|
@@ -41,7 +41,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
41
41
|
output: import("@sinclair/typebox").TObject<{
|
|
42
42
|
b: import("@sinclair/typebox").TNumber;
|
|
43
43
|
}>;
|
|
44
|
-
handler: (context: import("
|
|
44
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
45
45
|
a: number;
|
|
46
46
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
47
47
|
b: number;
|
|
@@ -56,7 +56,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
56
56
|
output: import("@sinclair/typebox").TObject<{
|
|
57
57
|
b: import("@sinclair/typebox").TNumber;
|
|
58
58
|
}>;
|
|
59
|
-
handler: (context: import("
|
|
59
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
60
60
|
a: number;
|
|
61
61
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
62
62
|
b: number;
|
|
@@ -71,7 +71,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
71
71
|
output: import("@sinclair/typebox").TObject<{
|
|
72
72
|
b: import("@sinclair/typebox").TNumber;
|
|
73
73
|
}>;
|
|
74
|
-
handler: (context: import("
|
|
74
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
75
75
|
a: number;
|
|
76
76
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
77
77
|
b: number;
|
|
@@ -86,7 +86,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
86
86
|
output: import("@sinclair/typebox").TObject<{
|
|
87
87
|
b: import("@sinclair/typebox").TNumber;
|
|
88
88
|
}>;
|
|
89
|
-
handler: (context: import("
|
|
89
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
90
90
|
a: number;
|
|
91
91
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
92
92
|
b: number;
|
|
@@ -101,7 +101,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
101
101
|
output: import("@sinclair/typebox").TObject<{
|
|
102
102
|
b: import("@sinclair/typebox").TNumber;
|
|
103
103
|
}>;
|
|
104
|
-
handler: (context: import("
|
|
104
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
105
105
|
a: number;
|
|
106
106
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
107
107
|
b: number;
|
|
@@ -116,7 +116,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
116
116
|
output: import("@sinclair/typebox").TObject<{
|
|
117
117
|
b: import("@sinclair/typebox").TNumber;
|
|
118
118
|
}>;
|
|
119
|
-
handler: (context: import("
|
|
119
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
120
120
|
a: number;
|
|
121
121
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
122
122
|
b: number;
|
|
@@ -131,7 +131,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
131
131
|
output: import("@sinclair/typebox").TObject<{
|
|
132
132
|
b: import("@sinclair/typebox").TNumber;
|
|
133
133
|
}>;
|
|
134
|
-
handler: (context: import("
|
|
134
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
135
135
|
a: number;
|
|
136
136
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
137
137
|
b: number;
|
|
@@ -146,7 +146,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
146
146
|
output: import("@sinclair/typebox").TObject<{
|
|
147
147
|
b: import("@sinclair/typebox").TNumber;
|
|
148
148
|
}>;
|
|
149
|
-
handler: (context: import("
|
|
149
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
150
150
|
a: number;
|
|
151
151
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
152
152
|
b: number;
|
|
@@ -161,7 +161,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
161
161
|
output: import("@sinclair/typebox").TObject<{
|
|
162
162
|
b: import("@sinclair/typebox").TNumber;
|
|
163
163
|
}>;
|
|
164
|
-
handler: (context: import("
|
|
164
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
165
165
|
a: number;
|
|
166
166
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
167
167
|
b: number;
|
|
@@ -176,7 +176,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
176
176
|
output: import("@sinclair/typebox").TObject<{
|
|
177
177
|
b: import("@sinclair/typebox").TNumber;
|
|
178
178
|
}>;
|
|
179
|
-
handler: (context: import("
|
|
179
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
180
180
|
a: number;
|
|
181
181
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
182
182
|
b: number;
|
|
@@ -191,7 +191,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
191
191
|
output: import("@sinclair/typebox").TObject<{
|
|
192
192
|
b: import("@sinclair/typebox").TNumber;
|
|
193
193
|
}>;
|
|
194
|
-
handler: (context: import("
|
|
194
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
195
195
|
a: number;
|
|
196
196
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
197
197
|
b: number;
|
|
@@ -206,7 +206,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
206
206
|
output: import("@sinclair/typebox").TObject<{
|
|
207
207
|
b: import("@sinclair/typebox").TNumber;
|
|
208
208
|
}>;
|
|
209
|
-
handler: (context: import("
|
|
209
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
210
210
|
a: number;
|
|
211
211
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
212
212
|
b: number;
|
|
@@ -221,7 +221,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
221
221
|
output: import("@sinclair/typebox").TObject<{
|
|
222
222
|
b: import("@sinclair/typebox").TNumber;
|
|
223
223
|
}>;
|
|
224
|
-
handler: (context: import("
|
|
224
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
225
225
|
a: number;
|
|
226
226
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
227
227
|
b: number;
|
|
@@ -236,7 +236,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
236
236
|
output: import("@sinclair/typebox").TObject<{
|
|
237
237
|
b: import("@sinclair/typebox").TNumber;
|
|
238
238
|
}>;
|
|
239
|
-
handler: (context: import("
|
|
239
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
240
240
|
a: number;
|
|
241
241
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
242
242
|
b: number;
|
|
@@ -251,7 +251,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
251
251
|
output: import("@sinclair/typebox").TObject<{
|
|
252
252
|
b: import("@sinclair/typebox").TNumber;
|
|
253
253
|
}>;
|
|
254
|
-
handler: (context: import("
|
|
254
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
255
255
|
a: number;
|
|
256
256
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
257
257
|
b: number;
|
|
@@ -266,7 +266,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
266
266
|
output: import("@sinclair/typebox").TObject<{
|
|
267
267
|
b: import("@sinclair/typebox").TNumber;
|
|
268
268
|
}>;
|
|
269
|
-
handler: (context: import("
|
|
269
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
270
270
|
a: number;
|
|
271
271
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
272
272
|
b: number;
|
|
@@ -281,7 +281,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
281
281
|
output: import("@sinclair/typebox").TObject<{
|
|
282
282
|
b: import("@sinclair/typebox").TNumber;
|
|
283
283
|
}>;
|
|
284
|
-
handler: (context: import("
|
|
284
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
285
285
|
a: number;
|
|
286
286
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
287
287
|
b: number;
|
|
@@ -296,7 +296,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
296
296
|
output: import("@sinclair/typebox").TObject<{
|
|
297
297
|
b: import("@sinclair/typebox").TNumber;
|
|
298
298
|
}>;
|
|
299
|
-
handler: (context: import("
|
|
299
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
300
300
|
a: number;
|
|
301
301
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
302
302
|
b: number;
|
|
@@ -311,7 +311,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
311
311
|
output: import("@sinclair/typebox").TObject<{
|
|
312
312
|
b: import("@sinclair/typebox").TNumber;
|
|
313
313
|
}>;
|
|
314
|
-
handler: (context: import("
|
|
314
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
315
315
|
a: number;
|
|
316
316
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
317
317
|
b: number;
|
|
@@ -326,7 +326,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
326
326
|
output: import("@sinclair/typebox").TObject<{
|
|
327
327
|
b: import("@sinclair/typebox").TNumber;
|
|
328
328
|
}>;
|
|
329
|
-
handler: (context: import("
|
|
329
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
330
330
|
a: number;
|
|
331
331
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
332
332
|
b: number;
|
|
@@ -341,7 +341,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
341
341
|
output: import("@sinclair/typebox").TObject<{
|
|
342
342
|
b: import("@sinclair/typebox").TNumber;
|
|
343
343
|
}>;
|
|
344
|
-
handler: (context: import("
|
|
344
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
345
345
|
a: number;
|
|
346
346
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
347
347
|
b: number;
|
|
@@ -356,7 +356,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
356
356
|
output: import("@sinclair/typebox").TObject<{
|
|
357
357
|
b: import("@sinclair/typebox").TNumber;
|
|
358
358
|
}>;
|
|
359
|
-
handler: (context: import("
|
|
359
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
360
360
|
a: number;
|
|
361
361
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
362
362
|
b: number;
|
|
@@ -371,7 +371,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
371
371
|
output: import("@sinclair/typebox").TObject<{
|
|
372
372
|
b: import("@sinclair/typebox").TNumber;
|
|
373
373
|
}>;
|
|
374
|
-
handler: (context: import("
|
|
374
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
375
375
|
a: number;
|
|
376
376
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
377
377
|
b: number;
|
|
@@ -386,7 +386,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
386
386
|
output: import("@sinclair/typebox").TObject<{
|
|
387
387
|
b: import("@sinclair/typebox").TNumber;
|
|
388
388
|
}>;
|
|
389
|
-
handler: (context: import("
|
|
389
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
390
390
|
a: number;
|
|
391
391
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
392
392
|
b: number;
|
|
@@ -401,7 +401,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
401
401
|
output: import("@sinclair/typebox").TObject<{
|
|
402
402
|
b: import("@sinclair/typebox").TNumber;
|
|
403
403
|
}>;
|
|
404
|
-
handler: (context: import("
|
|
404
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
405
405
|
a: number;
|
|
406
406
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
407
407
|
b: number;
|
|
@@ -416,7 +416,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
416
416
|
output: import("@sinclair/typebox").TObject<{
|
|
417
417
|
b: import("@sinclair/typebox").TNumber;
|
|
418
418
|
}>;
|
|
419
|
-
handler: (context: import("
|
|
419
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
420
420
|
a: number;
|
|
421
421
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
422
422
|
b: number;
|
|
@@ -431,7 +431,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
431
431
|
output: import("@sinclair/typebox").TObject<{
|
|
432
432
|
b: import("@sinclair/typebox").TNumber;
|
|
433
433
|
}>;
|
|
434
|
-
handler: (context: import("
|
|
434
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
435
435
|
a: number;
|
|
436
436
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
437
437
|
b: number;
|
|
@@ -446,7 +446,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
446
446
|
output: import("@sinclair/typebox").TObject<{
|
|
447
447
|
b: import("@sinclair/typebox").TNumber;
|
|
448
448
|
}>;
|
|
449
|
-
handler: (context: import("
|
|
449
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
450
450
|
a: number;
|
|
451
451
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
452
452
|
b: number;
|
|
@@ -461,7 +461,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
461
461
|
output: import("@sinclair/typebox").TObject<{
|
|
462
462
|
b: import("@sinclair/typebox").TNumber;
|
|
463
463
|
}>;
|
|
464
|
-
handler: (context: import("
|
|
464
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
465
465
|
a: number;
|
|
466
466
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
467
467
|
b: number;
|
|
@@ -476,7 +476,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
476
476
|
output: import("@sinclair/typebox").TObject<{
|
|
477
477
|
b: import("@sinclair/typebox").TNumber;
|
|
478
478
|
}>;
|
|
479
|
-
handler: (context: import("
|
|
479
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
480
480
|
a: number;
|
|
481
481
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
482
482
|
b: number;
|
|
@@ -491,7 +491,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
491
491
|
output: import("@sinclair/typebox").TObject<{
|
|
492
492
|
b: import("@sinclair/typebox").TNumber;
|
|
493
493
|
}>;
|
|
494
|
-
handler: (context: import("
|
|
494
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
495
495
|
a: number;
|
|
496
496
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
497
497
|
b: number;
|
|
@@ -506,7 +506,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
506
506
|
output: import("@sinclair/typebox").TObject<{
|
|
507
507
|
b: import("@sinclair/typebox").TNumber;
|
|
508
508
|
}>;
|
|
509
|
-
handler: (context: import("
|
|
509
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
510
510
|
a: number;
|
|
511
511
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
512
512
|
b: number;
|
|
@@ -521,7 +521,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
521
521
|
output: import("@sinclair/typebox").TObject<{
|
|
522
522
|
b: import("@sinclair/typebox").TNumber;
|
|
523
523
|
}>;
|
|
524
|
-
handler: (context: import("
|
|
524
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
525
525
|
a: number;
|
|
526
526
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
527
527
|
b: number;
|
|
@@ -536,7 +536,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
536
536
|
output: import("@sinclair/typebox").TObject<{
|
|
537
537
|
b: import("@sinclair/typebox").TNumber;
|
|
538
538
|
}>;
|
|
539
|
-
handler: (context: import("
|
|
539
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
540
540
|
a: number;
|
|
541
541
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
542
542
|
b: number;
|
|
@@ -551,7 +551,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
551
551
|
output: import("@sinclair/typebox").TObject<{
|
|
552
552
|
b: import("@sinclair/typebox").TNumber;
|
|
553
553
|
}>;
|
|
554
|
-
handler: (context: import("
|
|
554
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
555
555
|
a: number;
|
|
556
556
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
557
557
|
b: number;
|
|
@@ -566,7 +566,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
566
566
|
output: import("@sinclair/typebox").TObject<{
|
|
567
567
|
b: import("@sinclair/typebox").TNumber;
|
|
568
568
|
}>;
|
|
569
|
-
handler: (context: import("
|
|
569
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
570
570
|
a: number;
|
|
571
571
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
572
572
|
b: number;
|
|
@@ -581,7 +581,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
581
581
|
output: import("@sinclair/typebox").TObject<{
|
|
582
582
|
b: import("@sinclair/typebox").TNumber;
|
|
583
583
|
}>;
|
|
584
|
-
handler: (context: import("
|
|
584
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
585
585
|
a: number;
|
|
586
586
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
587
587
|
b: number;
|
|
@@ -596,7 +596,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
596
596
|
output: import("@sinclair/typebox").TObject<{
|
|
597
597
|
b: import("@sinclair/typebox").TNumber;
|
|
598
598
|
}>;
|
|
599
|
-
handler: (context: import("
|
|
599
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
600
600
|
a: number;
|
|
601
601
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
602
602
|
b: number;
|
|
@@ -611,7 +611,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
611
611
|
output: import("@sinclair/typebox").TObject<{
|
|
612
612
|
b: import("@sinclair/typebox").TNumber;
|
|
613
613
|
}>;
|
|
614
|
-
handler: (context: import("
|
|
614
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
615
615
|
a: number;
|
|
616
616
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
617
617
|
b: number;
|
|
@@ -626,7 +626,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
626
626
|
output: import("@sinclair/typebox").TObject<{
|
|
627
627
|
b: import("@sinclair/typebox").TNumber;
|
|
628
628
|
}>;
|
|
629
|
-
handler: (context: import("
|
|
629
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
630
630
|
a: number;
|
|
631
631
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
632
632
|
b: number;
|
|
@@ -641,7 +641,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
641
641
|
output: import("@sinclair/typebox").TObject<{
|
|
642
642
|
b: import("@sinclair/typebox").TNumber;
|
|
643
643
|
}>;
|
|
644
|
-
handler: (context: import("
|
|
644
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
645
645
|
a: number;
|
|
646
646
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
647
647
|
b: number;
|
|
@@ -656,7 +656,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
656
656
|
output: import("@sinclair/typebox").TObject<{
|
|
657
657
|
b: import("@sinclair/typebox").TNumber;
|
|
658
658
|
}>;
|
|
659
|
-
handler: (context: import("
|
|
659
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
660
660
|
a: number;
|
|
661
661
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
662
662
|
b: number;
|
|
@@ -671,7 +671,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
671
671
|
output: import("@sinclair/typebox").TObject<{
|
|
672
672
|
b: import("@sinclair/typebox").TNumber;
|
|
673
673
|
}>;
|
|
674
|
-
handler: (context: import("
|
|
674
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
675
675
|
a: number;
|
|
676
676
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
677
677
|
b: number;
|
|
@@ -686,7 +686,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
686
686
|
output: import("@sinclair/typebox").TObject<{
|
|
687
687
|
b: import("@sinclair/typebox").TNumber;
|
|
688
688
|
}>;
|
|
689
|
-
handler: (context: import("
|
|
689
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
690
690
|
a: number;
|
|
691
691
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
692
692
|
b: number;
|
|
@@ -701,7 +701,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
701
701
|
output: import("@sinclair/typebox").TObject<{
|
|
702
702
|
b: import("@sinclair/typebox").TNumber;
|
|
703
703
|
}>;
|
|
704
|
-
handler: (context: import("
|
|
704
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
705
705
|
a: number;
|
|
706
706
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
707
707
|
b: number;
|
|
@@ -716,7 +716,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
716
716
|
output: import("@sinclair/typebox").TObject<{
|
|
717
717
|
b: import("@sinclair/typebox").TNumber;
|
|
718
718
|
}>;
|
|
719
|
-
handler: (context: import("
|
|
719
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
720
720
|
a: number;
|
|
721
721
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
722
722
|
b: number;
|
|
@@ -731,7 +731,7 @@ export declare const StupidlyLargeService: () => {
|
|
|
731
731
|
output: import("@sinclair/typebox").TObject<{
|
|
732
732
|
b: import("@sinclair/typebox").TNumber;
|
|
733
733
|
}>;
|
|
734
|
-
handler: (context: import("
|
|
734
|
+
handler: (context: import("../router").ServiceContextWithState<{}>, input: import("../transport/message").TransportMessage<{
|
|
735
735
|
a: number;
|
|
736
736
|
}>) => Promise<import("../transport/message").TransportMessage<{
|
|
737
737
|
b: number;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { NaiveJsonCodec } from './json';
|
package/dist/router/client.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { pushable } from 'it-pushable';
|
|
2
2
|
import { msg } from '../transport/message';
|
|
3
|
-
import { waitForMessage } from '../transport
|
|
3
|
+
import { waitForMessage } from '../transport';
|
|
4
4
|
const noop = () => { };
|
|
5
5
|
function _createRecursiveProxy(callback, path) {
|
|
6
6
|
const proxy = new Proxy(noop, {
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { serializeService, ServiceBuilder } from './builder';
|
|
2
|
+
export type { ValidProcType, ProcListing, Service, ProcHandler, ProcInput, ProcOutput, ProcType, Procedure, } from './builder';
|
|
3
|
+
export { createClient } from './client';
|
|
4
|
+
export type { ServerClient } from './client';
|
|
5
|
+
export { createServer } from './server';
|
|
6
|
+
export type { Server } from './server';
|
|
7
|
+
export type { ServiceContext, ServiceContextWithState } from './context';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import WebSocket from 'isomorphic-ws';
|
|
3
|
+
import { WebSocketServer } from 'ws';
|
|
4
|
+
import http from 'http';
|
|
5
|
+
import { WebSocketTransport } from './transport/impls/ws';
|
|
6
|
+
import { Static, TObject } from '@sinclair/typebox';
|
|
7
|
+
import { Procedure, ServiceContext } from './router';
|
|
8
|
+
import { Pushable } from 'it-pushable';
|
|
9
|
+
export declare function createWebSocketServer(server: http.Server): Promise<WebSocket.Server<typeof WebSocket, typeof http.IncomingMessage>>;
|
|
10
|
+
export declare function onServerReady(server: http.Server): Promise<number>;
|
|
11
|
+
export declare function createLocalWebSocketClient(port: number): Promise<WebSocket>;
|
|
12
|
+
export declare function createWsTransports(port: number, wss: WebSocketServer): [WebSocketTransport, WebSocketTransport];
|
|
13
|
+
export declare function asClientRpc<State extends object | unknown, I extends TObject, O extends TObject>(state: State, proc: Procedure<State, 'rpc', I, O>, extendedContext?: Omit<ServiceContext, 'state'>): (msg: Static<I>) => Promise<Static<O>>;
|
|
14
|
+
export declare function asClientStream<State extends object | unknown, I extends TObject, O extends TObject>(state: State, proc: Procedure<State, 'stream', I, O>, extendedContext?: Omit<ServiceContext, 'state'>): [Pushable<Static<I>>, Pushable<Static<O>>];
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import WebSocket from 'isomorphic-ws';
|
|
2
|
+
import { WebSocketServer } from 'ws';
|
|
3
|
+
import { WebSocketTransport } from './transport/impls/ws';
|
|
4
|
+
import { payloadToTransportMessage } from './transport';
|
|
5
|
+
import { pushable } from 'it-pushable';
|
|
6
|
+
export async function createWebSocketServer(server) {
|
|
7
|
+
return new WebSocketServer({ server });
|
|
8
|
+
}
|
|
9
|
+
export async function onServerReady(server) {
|
|
10
|
+
return new Promise((resolve, reject) => {
|
|
11
|
+
server.listen(() => {
|
|
12
|
+
const addr = server.address();
|
|
13
|
+
if (typeof addr === 'object' && addr) {
|
|
14
|
+
resolve(addr.port);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
reject(new Error("couldn't find a port to allocate"));
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
export async function createLocalWebSocketClient(port) {
|
|
23
|
+
return new WebSocket(`ws://localhost:${port}`);
|
|
24
|
+
}
|
|
25
|
+
export function createWsTransports(port, wss) {
|
|
26
|
+
return [
|
|
27
|
+
new WebSocketTransport(async () => {
|
|
28
|
+
return createLocalWebSocketClient(port);
|
|
29
|
+
}, 'client'),
|
|
30
|
+
new WebSocketTransport(async () => {
|
|
31
|
+
return new Promise((resolve) => {
|
|
32
|
+
wss.on('connection', async function onConnect(serverSock) {
|
|
33
|
+
wss.removeListener('connection', onConnect);
|
|
34
|
+
resolve(serverSock);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
}, 'SERVER'),
|
|
38
|
+
];
|
|
39
|
+
}
|
|
40
|
+
export function asClientRpc(state, proc, extendedContext) {
|
|
41
|
+
return (msg) => proc
|
|
42
|
+
.handler({ ...extendedContext, state }, payloadToTransportMessage(msg))
|
|
43
|
+
.then((res) => res.payload);
|
|
44
|
+
}
|
|
45
|
+
export function asClientStream(state, proc, extendedContext) {
|
|
46
|
+
const rawInput = pushable({ objectMode: true });
|
|
47
|
+
const rawOutput = pushable({ objectMode: true });
|
|
48
|
+
const transportInput = pushable({
|
|
49
|
+
objectMode: true,
|
|
50
|
+
});
|
|
51
|
+
const transportOutput = pushable({
|
|
52
|
+
objectMode: true,
|
|
53
|
+
});
|
|
54
|
+
// wrapping in transport
|
|
55
|
+
(async () => {
|
|
56
|
+
for await (const rawIn of rawInput) {
|
|
57
|
+
transportInput.push(payloadToTransportMessage(rawIn));
|
|
58
|
+
}
|
|
59
|
+
transportInput.end();
|
|
60
|
+
})();
|
|
61
|
+
// unwrap from transport
|
|
62
|
+
(async () => {
|
|
63
|
+
for await (const transportRes of transportOutput) {
|
|
64
|
+
rawOutput.push(transportRes.payload);
|
|
65
|
+
}
|
|
66
|
+
})();
|
|
67
|
+
// handle
|
|
68
|
+
(async () => {
|
|
69
|
+
await proc.handler({ ...extendedContext, state }, transportInput, transportOutput);
|
|
70
|
+
transportOutput.end();
|
|
71
|
+
})();
|
|
72
|
+
return [rawInput, rawOutput];
|
|
73
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import { OpaqueTransportMessage, TransportClientId } from '
|
|
3
|
-
import { Transport } from '
|
|
4
|
-
export declare class
|
|
2
|
+
import { OpaqueTransportMessage, TransportClientId } from '../message';
|
|
3
|
+
import { Transport } from '../types';
|
|
4
|
+
export declare class StdioTransport extends Transport {
|
|
5
5
|
input: NodeJS.ReadableStream;
|
|
6
6
|
output: NodeJS.WritableStream;
|
|
7
7
|
constructor(clientId: TransportClientId, input?: NodeJS.ReadableStream, output?: NodeJS.WritableStream);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { NaiveJsonCodec } from '
|
|
2
|
-
import { Transport } from '
|
|
1
|
+
import { NaiveJsonCodec } from '../../codec/json';
|
|
2
|
+
import { Transport } from '../types';
|
|
3
3
|
import readline from 'readline';
|
|
4
|
-
export class
|
|
4
|
+
export class StdioTransport extends Transport {
|
|
5
5
|
input;
|
|
6
6
|
output;
|
|
7
7
|
constructor(clientId, input = process.stdin, output = process.stdout) {
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { describe, test, expect } from 'vitest';
|
|
2
2
|
import stream from 'node:stream';
|
|
3
|
-
import {
|
|
4
|
-
import { waitForMessage } from '
|
|
3
|
+
import { StdioTransport } from './stdio';
|
|
4
|
+
import { waitForMessage } from '..';
|
|
5
5
|
describe('sending and receiving across node streams works', () => {
|
|
6
6
|
test('basic send/receive', async () => {
|
|
7
7
|
const clientToServer = new stream.PassThrough();
|
|
8
8
|
const serverToClient = new stream.PassThrough();
|
|
9
|
-
const serverTransport = new
|
|
10
|
-
const clientTransport = new
|
|
9
|
+
const serverTransport = new StdioTransport('SERVER', clientToServer, serverToClient);
|
|
10
|
+
const clientTransport = new StdioTransport('client', serverToClient, clientToServer);
|
|
11
11
|
const msg = {
|
|
12
12
|
msg: 'cool',
|
|
13
13
|
test: 123,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/// <reference types="ws" />
|
|
2
2
|
import WebSocket from 'isomorphic-ws';
|
|
3
|
-
import { Transport } from '
|
|
4
|
-
import { MessageId, OpaqueTransportMessage, TransportClientId } from '
|
|
3
|
+
import { Transport } from '../types';
|
|
4
|
+
import { MessageId, OpaqueTransportMessage, TransportClientId } from '../message';
|
|
5
5
|
interface Options {
|
|
6
6
|
retryIntervalMs: number;
|
|
7
7
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Transport } from '
|
|
2
|
-
import { NaiveJsonCodec } from '
|
|
3
|
-
import { log } from '
|
|
1
|
+
import { Transport } from '../types';
|
|
2
|
+
import { NaiveJsonCodec } from '../../codec/json';
|
|
3
|
+
import { log } from '../../logging';
|
|
4
4
|
const defaultOptions = {
|
|
5
5
|
retryIntervalMs: 250,
|
|
6
6
|
};
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import http from 'http';
|
|
2
2
|
import { describe, test, expect, afterAll } from 'vitest';
|
|
3
|
-
import { createWebSocketServer, createWsTransports, onServerReady,
|
|
3
|
+
import { createWebSocketServer, createWsTransports, onServerReady, } from '../../testUtils';
|
|
4
4
|
import { nanoid } from 'nanoid';
|
|
5
|
+
import { waitForMessage } from '..';
|
|
5
6
|
const getMsg = () => ({
|
|
6
7
|
id: nanoid(),
|
|
7
8
|
from: 'client',
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { OpaqueTransportMessage } from './message';
|
|
2
|
+
import { Transport } from './types';
|
|
3
|
+
export { Transport } from './types';
|
|
4
|
+
export { TransportMessageSchema, OpaqueTransportMessageSchema, TransportAckSchema, msg, payloadToTransportMessage, ack, reply, } from './message';
|
|
5
|
+
export type { TransportMessage, MessageId, OpaqueTransportMessage, TransportClientId, TransportMessageAck, } from './message';
|
|
6
|
+
export declare function waitForMessage(t: Transport, filter?: (msg: OpaqueTransportMessage) => boolean): Promise<unknown>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// re-export
|
|
2
|
+
export { Transport } from './types';
|
|
3
|
+
export { TransportMessageSchema, OpaqueTransportMessageSchema, TransportAckSchema, msg, payloadToTransportMessage, ack, reply, } from './message';
|
|
4
|
+
export async function waitForMessage(t, filter) {
|
|
5
|
+
return new Promise((resolve, _reject) => {
|
|
6
|
+
function onMessage(msg) {
|
|
7
|
+
if (!filter || filter?.(msg)) {
|
|
8
|
+
resolve(msg.payload);
|
|
9
|
+
t.removeMessageListener(onMessage);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
t.addMessageListener(onMessage);
|
|
13
|
+
});
|
|
14
|
+
}
|
package/package.json
CHANGED
|
@@ -2,10 +2,19 @@
|
|
|
2
2
|
"name": "@replit/river",
|
|
3
3
|
"sideEffects": false,
|
|
4
4
|
"description": "It's like tRPC but... with JSON Schema Support, duplex streaming and support for service multiplexing. Transport agnostic!",
|
|
5
|
-
"version": "0.
|
|
5
|
+
"version": "0.3.0",
|
|
6
6
|
"type": "module",
|
|
7
|
-
"main": "index.js",
|
|
8
|
-
"
|
|
7
|
+
"main": "dist/index.js",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": "./dist/router/index.js",
|
|
10
|
+
"./logging": "./dist/logging/index.js",
|
|
11
|
+
"./codec": "./dist/codec/index.js",
|
|
12
|
+
"./test-util": "./dist/testUtils.js",
|
|
13
|
+
"./package.json": "./package.json",
|
|
14
|
+
"./transport": "./dist/transport/index.js",
|
|
15
|
+
"./transport/ws": "./dist/transport/impls/ws.js",
|
|
16
|
+
"./transport/stdio": "./dist/transport/impls/stdio.js"
|
|
17
|
+
},
|
|
9
18
|
"files": [
|
|
10
19
|
"dist"
|
|
11
20
|
],
|
|
@@ -21,7 +30,7 @@
|
|
|
21
30
|
"prettier": "^3.0.0",
|
|
22
31
|
"tsup": "^7.2.0",
|
|
23
32
|
"typescript": "^5.2.2",
|
|
24
|
-
"vitest": "^0.34.
|
|
33
|
+
"vitest": "^0.34.6"
|
|
25
34
|
},
|
|
26
35
|
"scripts": {
|
|
27
36
|
"check": "tsc --noEmit && npx prettier . --check",
|
package/dist/index.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export { serializeService, ServiceBuilder } from './router/builder';
|
|
2
|
-
export type { ValidProcType, ProcListing, Service, ProcHandler, ProcInput, ProcOutput, ProcType, Procedure, } from './router/builder';
|
|
3
|
-
export { createClient } from './router/client';
|
|
4
|
-
export type { ServerClient } from './router/client';
|
|
5
|
-
export { createServer } from './router/server';
|
|
6
|
-
export { asClientRpc, asClientStream } from './router/server.util';
|
|
7
|
-
export type { Server } from './router/server';
|
|
8
|
-
export type { ServiceContext, ServiceContextWithState } from './router/context';
|
|
9
|
-
export { Transport } from './transport/types';
|
|
10
|
-
export { TransportMessageSchema, OpaqueTransportMessageSchema, TransportAckSchema, msg, payloadToTransportMessage, ack, reply, } from './transport/message';
|
|
11
|
-
export type { TransportMessage, MessageId, OpaqueTransportMessage, TransportClientId, TransportMessageAck, } from './transport/message';
|
|
12
|
-
export { StreamTransport } from './transport/stream';
|
|
13
|
-
export { WebSocketTransport } from './transport/ws';
|
|
14
|
-
export { createWebSocketServer, onServerReady, createWsTransports, waitForMessage, createLocalWebSocketClient, } from './transport/util';
|
package/dist/index.js
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export { serializeService, ServiceBuilder } from './router/builder';
|
|
2
|
-
export { createClient } from './router/client';
|
|
3
|
-
export { createServer } from './router/server';
|
|
4
|
-
export { asClientRpc, asClientStream } from './router/server.util';
|
|
5
|
-
export { Transport } from './transport/types';
|
|
6
|
-
export { TransportMessageSchema, OpaqueTransportMessageSchema, TransportAckSchema, msg, payloadToTransportMessage, ack, reply, } from './transport/message';
|
|
7
|
-
export { StreamTransport } from './transport/stream';
|
|
8
|
-
export { WebSocketTransport } from './transport/ws';
|
|
9
|
-
export { createWebSocketServer, onServerReady, createWsTransports, waitForMessage, createLocalWebSocketClient, } from './transport/util';
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { Static, TObject } from '@sinclair/typebox';
|
|
2
|
-
import { Procedure } from './builder';
|
|
3
|
-
import type { Pushable } from 'it-pushable';
|
|
4
|
-
import { ServiceContext } from './context';
|
|
5
|
-
export declare function asClientRpc<State extends object | unknown, I extends TObject, O extends TObject>(state: State, proc: Procedure<State, 'rpc', I, O>, extendedContext?: Omit<ServiceContext, 'state'>): (msg: Static<I>) => Promise<Static<O>>;
|
|
6
|
-
export declare function asClientStream<State extends object | unknown, I extends TObject, O extends TObject>(state: State, proc: Procedure<State, 'stream', I, O>, extendedContext?: Omit<ServiceContext, 'state'>): [Pushable<Static<I>>, Pushable<Static<O>>];
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { payloadToTransportMessage, } from '../transport/message';
|
|
2
|
-
import { pushable } from 'it-pushable';
|
|
3
|
-
export function asClientRpc(state, proc, extendedContext) {
|
|
4
|
-
return (msg) => proc
|
|
5
|
-
.handler({ ...extendedContext, state }, payloadToTransportMessage(msg))
|
|
6
|
-
.then((res) => res.payload);
|
|
7
|
-
}
|
|
8
|
-
export function asClientStream(state, proc, extendedContext) {
|
|
9
|
-
const i = pushable({ objectMode: true });
|
|
10
|
-
const o = pushable({ objectMode: true });
|
|
11
|
-
const ri = pushable({ objectMode: true });
|
|
12
|
-
const ro = pushable({ objectMode: true });
|
|
13
|
-
// wrapping in transport
|
|
14
|
-
(async () => {
|
|
15
|
-
for await (const rawIn of i) {
|
|
16
|
-
ri.push(payloadToTransportMessage(rawIn));
|
|
17
|
-
}
|
|
18
|
-
ri.end();
|
|
19
|
-
})();
|
|
20
|
-
// unwrap from transport
|
|
21
|
-
(async () => {
|
|
22
|
-
for await (const transportRes of ro) {
|
|
23
|
-
o.push(transportRes.payload);
|
|
24
|
-
}
|
|
25
|
-
})();
|
|
26
|
-
// handle
|
|
27
|
-
(async () => {
|
|
28
|
-
await proc.handler({ ...extendedContext, state }, ri, ro);
|
|
29
|
-
ro.end();
|
|
30
|
-
})();
|
|
31
|
-
return [i, o];
|
|
32
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { OpaqueTransportMessage, TransportClientId } from './message';
|
|
2
|
-
import { Transport } from './types';
|
|
3
|
-
export declare class StdioTransport extends Transport {
|
|
4
|
-
constructor(clientId: TransportClientId);
|
|
5
|
-
send(msg: OpaqueTransportMessage): string;
|
|
6
|
-
close(): Promise<void>;
|
|
7
|
-
}
|
package/dist/transport/stdio.js
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { NaiveJsonCodec } from '../codec/json';
|
|
2
|
-
import { Transport } from './types';
|
|
3
|
-
import readline from 'readline';
|
|
4
|
-
export class StdioTransport extends Transport {
|
|
5
|
-
constructor(clientId) {
|
|
6
|
-
super(NaiveJsonCodec, clientId);
|
|
7
|
-
const { stdin, stdout } = process;
|
|
8
|
-
const rl = readline.createInterface({
|
|
9
|
-
input: stdin,
|
|
10
|
-
output: stdout,
|
|
11
|
-
});
|
|
12
|
-
rl.on('line', (msg) => this.onMessage(msg));
|
|
13
|
-
}
|
|
14
|
-
send(msg) {
|
|
15
|
-
const id = msg.id;
|
|
16
|
-
process.stdout.write(this.codec.toStringBuf(msg));
|
|
17
|
-
return id;
|
|
18
|
-
}
|
|
19
|
-
async close() { }
|
|
20
|
-
}
|
package/dist/transport/util.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
import http from 'http';
|
|
3
|
-
import WebSocket from 'isomorphic-ws';
|
|
4
|
-
import { WebSocketServer } from 'ws';
|
|
5
|
-
import { Transport } from './types';
|
|
6
|
-
import { WebSocketTransport } from './ws';
|
|
7
|
-
import { OpaqueTransportMessage } from './message';
|
|
8
|
-
export declare function createWebSocketServer(server: http.Server): Promise<WebSocket.Server<typeof WebSocket, typeof http.IncomingMessage>>;
|
|
9
|
-
export declare function onServerReady(server: http.Server): Promise<number>;
|
|
10
|
-
export declare function createLocalWebSocketClient(port: number): Promise<WebSocket>;
|
|
11
|
-
export declare function createWsTransports(port: number, wss: WebSocketServer): [WebSocketTransport, WebSocketTransport];
|
|
12
|
-
export declare function waitForMessage(t: Transport, filter?: (msg: OpaqueTransportMessage) => boolean): Promise<unknown>;
|
package/dist/transport/util.js
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import WebSocket from 'isomorphic-ws';
|
|
2
|
-
import { WebSocketServer } from 'ws';
|
|
3
|
-
import { WebSocketTransport } from './ws';
|
|
4
|
-
export async function createWebSocketServer(server) {
|
|
5
|
-
return new WebSocketServer({ server });
|
|
6
|
-
}
|
|
7
|
-
export async function onServerReady(server) {
|
|
8
|
-
return new Promise((resolve, reject) => {
|
|
9
|
-
server.listen(() => {
|
|
10
|
-
const addr = server.address();
|
|
11
|
-
if (typeof addr === 'object' && addr) {
|
|
12
|
-
resolve(addr.port);
|
|
13
|
-
}
|
|
14
|
-
else {
|
|
15
|
-
reject(new Error("couldn't find a port to allocate"));
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
export async function createLocalWebSocketClient(port) {
|
|
21
|
-
return new WebSocket(`ws://localhost:${port}`);
|
|
22
|
-
}
|
|
23
|
-
export function createWsTransports(port, wss) {
|
|
24
|
-
return [
|
|
25
|
-
new WebSocketTransport(async () => {
|
|
26
|
-
return createLocalWebSocketClient(port);
|
|
27
|
-
}, 'client'),
|
|
28
|
-
new WebSocketTransport(async () => {
|
|
29
|
-
return new Promise((resolve) => {
|
|
30
|
-
wss.on('connection', async function onConnect(serverSock) {
|
|
31
|
-
wss.removeListener('connection', onConnect);
|
|
32
|
-
resolve(serverSock);
|
|
33
|
-
});
|
|
34
|
-
});
|
|
35
|
-
}, 'SERVER'),
|
|
36
|
-
];
|
|
37
|
-
}
|
|
38
|
-
export async function waitForMessage(t, filter) {
|
|
39
|
-
return new Promise((resolve, _reject) => {
|
|
40
|
-
function onMessage(msg) {
|
|
41
|
-
if (!filter || filter?.(msg)) {
|
|
42
|
-
resolve(msg.payload);
|
|
43
|
-
t.removeMessageListener(onMessage);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
t.addMessageListener(onMessage);
|
|
47
|
-
});
|
|
48
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
import http from 'http';
|
|
3
|
-
import WebSocket from 'isomorphic-ws';
|
|
4
|
-
import { WebSocketServer } from 'ws';
|
|
5
|
-
import { Transport } from './types';
|
|
6
|
-
import { OpaqueTransportMessage } from './message';
|
|
7
|
-
export declare function createWebSocketServer(server: http.Server): Promise<WebSocket.Server<typeof WebSocket, typeof http.IncomingMessage>>;
|
|
8
|
-
export declare function onServerReady(server: http.Server, port: number): Promise<void>;
|
|
9
|
-
export declare function createWsTransports(port: number, wss: WebSocketServer): Promise<[Transport, Transport]>;
|
|
10
|
-
export declare function waitForSocketReady(socket: WebSocket): Promise<void>;
|
|
11
|
-
export declare function createWebSocketClient(port: number): Promise<WebSocket>;
|
|
12
|
-
export declare function waitForMessage(t: Transport, filter?: (msg: OpaqueTransportMessage) => boolean): Promise<unknown>;
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import WebSocket from 'isomorphic-ws';
|
|
2
|
-
import { WebSocketServer } from 'ws';
|
|
3
|
-
import { WebSocketTransport } from './ws';
|
|
4
|
-
export async function createWebSocketServer(server) {
|
|
5
|
-
return new WebSocketServer({ server });
|
|
6
|
-
}
|
|
7
|
-
export async function onServerReady(server, port) {
|
|
8
|
-
return new Promise((resolve) => {
|
|
9
|
-
server.listen(port, resolve);
|
|
10
|
-
});
|
|
11
|
-
}
|
|
12
|
-
export async function createWsTransports(port, wss) {
|
|
13
|
-
return new Promise((resolve) => {
|
|
14
|
-
const clientSockPromise = createWebSocketClient(port);
|
|
15
|
-
wss.on('connection', async (serverSock) => {
|
|
16
|
-
resolve([
|
|
17
|
-
new WebSocketTransport(await clientSockPromise, 'client'),
|
|
18
|
-
new WebSocketTransport(serverSock, 'SERVER'),
|
|
19
|
-
]);
|
|
20
|
-
});
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
export async function waitForSocketReady(socket) {
|
|
24
|
-
return new Promise((resolve) => {
|
|
25
|
-
socket.addEventListener('open', () => resolve());
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
export async function createWebSocketClient(port) {
|
|
29
|
-
const client = new WebSocket(`ws://localhost:${port}`);
|
|
30
|
-
await waitForSocketReady(client);
|
|
31
|
-
return client;
|
|
32
|
-
}
|
|
33
|
-
export async function waitForMessage(t, filter) {
|
|
34
|
-
return new Promise((resolve, _reject) => {
|
|
35
|
-
function onMessage(msg) {
|
|
36
|
-
if (!filter || filter?.(msg)) {
|
|
37
|
-
resolve(msg.payload);
|
|
38
|
-
t.removeMessageListener(onMessage);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
t.addMessageListener(onMessage);
|
|
42
|
-
});
|
|
43
|
-
}
|
|
File without changes
|
|
File without changes
|