@replit/river 0.9.2 → 0.10.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 +11 -11
- package/dist/__tests__/cleanup.test.d.ts +2 -0
- package/dist/__tests__/cleanup.test.d.ts.map +1 -0
- package/dist/__tests__/{invariants.test.js → cleanup.test.js} +47 -20
- package/dist/__tests__/disconnects.test.d.ts +2 -0
- package/dist/__tests__/disconnects.test.d.ts.map +1 -0
- package/dist/__tests__/disconnects.test.js +163 -0
- package/dist/__tests__/e2e.test.js +33 -32
- package/dist/__tests__/fixtures/cleanup.d.ts +2 -2
- package/dist/__tests__/fixtures/cleanup.d.ts.map +1 -1
- package/dist/__tests__/fixtures/cleanup.js +6 -9
- package/dist/__tests__/fixtures/services.d.ts +36 -36
- package/dist/__tests__/fixtures/services.d.ts.map +1 -1
- package/dist/__tests__/fixtures/services.js +36 -53
- package/dist/__tests__/handler.test.js +6 -7
- package/dist/__tests__/typescript-stress.test.d.ts +149 -149
- package/dist/__tests__/typescript-stress.test.d.ts.map +1 -1
- package/dist/__tests__/typescript-stress.test.js +14 -14
- package/dist/router/builder.d.ts +6 -7
- package/dist/router/builder.d.ts.map +1 -1
- package/dist/router/client.d.ts +7 -3
- package/dist/router/client.d.ts.map +1 -1
- package/dist/router/client.js +204 -106
- package/dist/router/defs.d.ts +16 -0
- package/dist/router/defs.d.ts.map +1 -0
- package/dist/router/defs.js +11 -0
- package/dist/router/index.d.ts +2 -0
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +1 -0
- package/dist/router/result.d.ts +2 -1
- package/dist/router/result.d.ts.map +1 -1
- package/dist/router/result.js +5 -1
- package/dist/router/server.d.ts +5 -5
- package/dist/router/server.d.ts.map +1 -1
- package/dist/router/server.js +125 -82
- package/dist/transport/impls/stdio/stdio.test.js +1 -2
- package/dist/transport/impls/ws/client.d.ts +1 -4
- package/dist/transport/impls/ws/client.d.ts.map +1 -1
- package/dist/transport/impls/ws/client.js +5 -6
- package/dist/transport/impls/ws/server.d.ts +3 -0
- package/dist/transport/impls/ws/server.d.ts.map +1 -1
- package/dist/transport/impls/ws/server.js +28 -23
- package/dist/transport/impls/ws/ws.test.js +84 -16
- package/dist/transport/index.d.ts +0 -9
- package/dist/transport/index.d.ts.map +1 -1
- package/dist/transport/index.js +0 -21
- package/dist/transport/message.d.ts +3 -4
- package/dist/transport/message.d.ts.map +1 -1
- package/dist/util/testHelpers.d.ts +20 -97
- package/dist/util/testHelpers.d.ts.map +1 -1
- package/dist/util/testHelpers.js +94 -249
- package/package.json +14 -13
- package/dist/__tests__/invariants.test.d.ts +0 -2
- package/dist/__tests__/invariants.test.d.ts.map +0 -1
|
@@ -23,11 +23,11 @@ export declare const TestServiceConstructor: () => {
|
|
|
23
23
|
errors: import("@sinclair/typebox").TNever;
|
|
24
24
|
handler: (context: import("../../router").ServiceContextWithState<{
|
|
25
25
|
count: number;
|
|
26
|
-
}>, input:
|
|
26
|
+
}>, input: {
|
|
27
27
|
n: number;
|
|
28
|
-
}
|
|
28
|
+
}) => Promise<import("../../router/result").Result<{
|
|
29
29
|
result: number;
|
|
30
|
-
}, never
|
|
30
|
+
}, never>>;
|
|
31
31
|
type: "rpc";
|
|
32
32
|
};
|
|
33
33
|
} & {
|
|
@@ -43,13 +43,13 @@ export declare const TestServiceConstructor: () => {
|
|
|
43
43
|
errors: import("@sinclair/typebox").TNever;
|
|
44
44
|
handler: (context: import("../../router").ServiceContextWithState<{
|
|
45
45
|
count: number;
|
|
46
|
-
}>, input:
|
|
46
|
+
}>, input: AsyncIterableIterator<{
|
|
47
47
|
end?: boolean | undefined;
|
|
48
48
|
msg: string;
|
|
49
49
|
ignore: boolean;
|
|
50
|
-
}
|
|
50
|
+
}>, output: import("it-pushable").Pushable<import("../../router/result").Result<{
|
|
51
51
|
response: string;
|
|
52
|
-
}, never
|
|
52
|
+
}, never>, void, unknown>) => Promise<void>;
|
|
53
53
|
type: "stream";
|
|
54
54
|
};
|
|
55
55
|
} & {
|
|
@@ -68,15 +68,15 @@ export declare const TestServiceConstructor: () => {
|
|
|
68
68
|
errors: import("@sinclair/typebox").TNever;
|
|
69
69
|
handler: (context: import("../../router").ServiceContextWithState<{
|
|
70
70
|
count: number;
|
|
71
|
-
}>, init:
|
|
71
|
+
}>, init: {
|
|
72
72
|
prefix: string;
|
|
73
|
-
}
|
|
73
|
+
}, input: AsyncIterableIterator<{
|
|
74
74
|
end?: boolean | undefined;
|
|
75
75
|
msg: string;
|
|
76
76
|
ignore: boolean;
|
|
77
|
-
}
|
|
77
|
+
}>, output: import("it-pushable").Pushable<import("../../router/result").Result<{
|
|
78
78
|
response: string;
|
|
79
|
-
}, never
|
|
79
|
+
}, never>, void, unknown>) => Promise<void>;
|
|
80
80
|
type: "stream";
|
|
81
81
|
};
|
|
82
82
|
};
|
|
@@ -97,11 +97,11 @@ export declare const OrderingServiceConstructor: () => {
|
|
|
97
97
|
errors: import("@sinclair/typebox").TNever;
|
|
98
98
|
handler: (context: import("../../router").ServiceContextWithState<{
|
|
99
99
|
msgs: number[];
|
|
100
|
-
}>, input:
|
|
100
|
+
}>, input: {
|
|
101
101
|
n: number;
|
|
102
|
-
}
|
|
102
|
+
}) => Promise<import("../../router/result").Result<{
|
|
103
103
|
n: number;
|
|
104
|
-
}, never
|
|
104
|
+
}, never>>;
|
|
105
105
|
type: "rpc";
|
|
106
106
|
};
|
|
107
107
|
} & {
|
|
@@ -113,9 +113,9 @@ export declare const OrderingServiceConstructor: () => {
|
|
|
113
113
|
errors: import("@sinclair/typebox").TNever;
|
|
114
114
|
handler: (context: import("../../router").ServiceContextWithState<{
|
|
115
115
|
msgs: number[];
|
|
116
|
-
}>, input:
|
|
116
|
+
}>, input: {}) => Promise<import("../../router/result").Result<{
|
|
117
117
|
msgs: number[];
|
|
118
|
-
}, never
|
|
118
|
+
}, never>>;
|
|
119
119
|
type: "rpc";
|
|
120
120
|
};
|
|
121
121
|
};
|
|
@@ -132,11 +132,11 @@ export declare const BinaryFileServiceConstructor: () => {
|
|
|
132
132
|
contents: import("@sinclair/typebox").TUint8Array;
|
|
133
133
|
}>;
|
|
134
134
|
errors: import("@sinclair/typebox").TNever;
|
|
135
|
-
handler: (context: import("../../router").ServiceContextWithState<{}>, input:
|
|
135
|
+
handler: (context: import("../../router").ServiceContextWithState<{}>, input: {
|
|
136
136
|
file: string;
|
|
137
|
-
}
|
|
137
|
+
}) => Promise<import("../../router/result").Result<{
|
|
138
138
|
contents: Uint8Array;
|
|
139
|
-
}, never
|
|
139
|
+
}, never>>;
|
|
140
140
|
type: "rpc";
|
|
141
141
|
};
|
|
142
142
|
};
|
|
@@ -162,10 +162,10 @@ export declare const FallibleServiceConstructor: () => {
|
|
|
162
162
|
test: import("@sinclair/typebox").TString;
|
|
163
163
|
}>;
|
|
164
164
|
}>;
|
|
165
|
-
handler: (context: import("../../router").ServiceContextWithState<{}>, input:
|
|
165
|
+
handler: (context: import("../../router").ServiceContextWithState<{}>, input: {
|
|
166
166
|
a: number;
|
|
167
167
|
b: number;
|
|
168
|
-
}
|
|
168
|
+
}) => Promise<import("../../router/result").Result<{
|
|
169
169
|
result: number;
|
|
170
170
|
}, {
|
|
171
171
|
message: string;
|
|
@@ -173,7 +173,7 @@ export declare const FallibleServiceConstructor: () => {
|
|
|
173
173
|
extras: {
|
|
174
174
|
test: string;
|
|
175
175
|
};
|
|
176
|
-
}
|
|
176
|
+
}>>;
|
|
177
177
|
type: "rpc";
|
|
178
178
|
};
|
|
179
179
|
} & {
|
|
@@ -190,16 +190,16 @@ export declare const FallibleServiceConstructor: () => {
|
|
|
190
190
|
code: import("@sinclair/typebox").TLiteral<"STREAM_ERROR">;
|
|
191
191
|
message: import("@sinclair/typebox").TString;
|
|
192
192
|
}>;
|
|
193
|
-
handler: (context: import("../../router").ServiceContextWithState<{}>, input:
|
|
193
|
+
handler: (context: import("../../router").ServiceContextWithState<{}>, input: AsyncIterableIterator<{
|
|
194
194
|
msg: string;
|
|
195
195
|
throwResult: boolean;
|
|
196
196
|
throwError: boolean;
|
|
197
|
-
}
|
|
197
|
+
}>, output: import("it-pushable").Pushable<import("../../router/result").Result<{
|
|
198
198
|
response: string;
|
|
199
199
|
}, {
|
|
200
200
|
message: string;
|
|
201
201
|
code: "STREAM_ERROR";
|
|
202
|
-
}
|
|
202
|
+
}>, void, unknown>) => Promise<void>;
|
|
203
203
|
type: "stream";
|
|
204
204
|
};
|
|
205
205
|
};
|
|
@@ -220,11 +220,11 @@ export declare const SubscribableServiceConstructor: () => {
|
|
|
220
220
|
errors: import("@sinclair/typebox").TNever;
|
|
221
221
|
handler: (context: import("../../router").ServiceContextWithState<{
|
|
222
222
|
count: Observable<number>;
|
|
223
|
-
}>, input:
|
|
223
|
+
}>, input: {
|
|
224
224
|
n: number;
|
|
225
|
-
}
|
|
225
|
+
}) => Promise<import("../../router/result").Result<{
|
|
226
226
|
result: number;
|
|
227
|
-
}, never
|
|
227
|
+
}, never>>;
|
|
228
228
|
type: "rpc";
|
|
229
229
|
};
|
|
230
230
|
} & {
|
|
@@ -236,9 +236,9 @@ export declare const SubscribableServiceConstructor: () => {
|
|
|
236
236
|
errors: import("@sinclair/typebox").TNever;
|
|
237
237
|
handler: (context: import("../../router").ServiceContextWithState<{
|
|
238
238
|
count: Observable<number>;
|
|
239
|
-
}>, input:
|
|
239
|
+
}>, input: {}, output: import("it-pushable").Pushable<import("../../router/result").Result<{
|
|
240
240
|
result: number;
|
|
241
|
-
}, never
|
|
241
|
+
}, never>, void, unknown>) => Promise<void>;
|
|
242
242
|
type: "subscription";
|
|
243
243
|
};
|
|
244
244
|
};
|
|
@@ -255,11 +255,11 @@ export declare const UploadableServiceConstructor: () => {
|
|
|
255
255
|
result: import("@sinclair/typebox").TNumber;
|
|
256
256
|
}>;
|
|
257
257
|
errors: import("@sinclair/typebox").TNever;
|
|
258
|
-
handler: (context: import("../../router").ServiceContextWithState<{}>, input:
|
|
258
|
+
handler: (context: import("../../router").ServiceContextWithState<{}>, input: AsyncIterableIterator<{
|
|
259
259
|
n: number;
|
|
260
|
-
}
|
|
260
|
+
}>) => Promise<import("../../router/result").Result<{
|
|
261
261
|
result: number;
|
|
262
|
-
}, never
|
|
262
|
+
}, never>>;
|
|
263
263
|
type: "upload";
|
|
264
264
|
};
|
|
265
265
|
} & {
|
|
@@ -274,13 +274,13 @@ export declare const UploadableServiceConstructor: () => {
|
|
|
274
274
|
result: import("@sinclair/typebox").TString;
|
|
275
275
|
}>;
|
|
276
276
|
errors: import("@sinclair/typebox").TNever;
|
|
277
|
-
handler: (context: import("../../router").ServiceContextWithState<{}>, init:
|
|
277
|
+
handler: (context: import("../../router").ServiceContextWithState<{}>, init: {
|
|
278
278
|
prefix: string;
|
|
279
|
-
}
|
|
279
|
+
}, input: AsyncIterableIterator<{
|
|
280
280
|
n: number;
|
|
281
|
-
}
|
|
281
|
+
}>) => Promise<import("../../router/result").Result<{
|
|
282
282
|
result: string;
|
|
283
|
-
}, never
|
|
283
|
+
}, never>>;
|
|
284
284
|
type: "upload";
|
|
285
285
|
};
|
|
286
286
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../../../__tests__/fixtures/services.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../../../__tests__/fixtures/services.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,eAAO,MAAM,WAAW;;;;EAItB,CAAC;AACH,eAAO,MAAM,YAAY;;EAA2C,CAAC;AAErE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8CpB,CAAC;AAEhB,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwBxB,CAAC;AAEhB,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;CAc1B,CAAC;AAEhB,eAAO,MAAM,WAAW,gBAAgB,CAAC;AACzC,eAAO,MAAM,YAAY,iBAAiB,CAAC;AAC3C,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyDxB,CAAC;AAEhB,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0B5B,CAAC;AAEhB,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+B1B,CAAC"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { Type } from '@sinclair/typebox';
|
|
2
2
|
import { ServiceBuilder } from '../../router/builder';
|
|
3
|
-
import { reply } from '../../transport/message';
|
|
4
3
|
import { Err, Ok } from '../../router/result';
|
|
5
4
|
import { Observable } from './observable';
|
|
6
5
|
export const EchoRequest = Type.Object({
|
|
@@ -18,10 +17,9 @@ export const TestServiceConstructor = () => ServiceBuilder.create('test')
|
|
|
18
17
|
input: Type.Object({ n: Type.Number() }),
|
|
19
18
|
output: Type.Object({ result: Type.Number() }),
|
|
20
19
|
errors: Type.Never(),
|
|
21
|
-
async handler(ctx,
|
|
22
|
-
const { n } = msg.payload;
|
|
20
|
+
async handler(ctx, { n }) {
|
|
23
21
|
ctx.state.count += n;
|
|
24
|
-
return
|
|
22
|
+
return Ok({ result: ctx.state.count });
|
|
25
23
|
},
|
|
26
24
|
})
|
|
27
25
|
.defineProcedure('echo', {
|
|
@@ -30,12 +28,11 @@ export const TestServiceConstructor = () => ServiceBuilder.create('test')
|
|
|
30
28
|
output: EchoResponse,
|
|
31
29
|
errors: Type.Never(),
|
|
32
30
|
async handler(_ctx, msgStream, returnStream) {
|
|
33
|
-
for await (const msg of msgStream) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
returnStream.push(reply(msg, Ok({ response: req.msg })));
|
|
31
|
+
for await (const { ignore, msg, end } of msgStream) {
|
|
32
|
+
if (!ignore) {
|
|
33
|
+
returnStream.push(Ok({ response: msg }));
|
|
37
34
|
}
|
|
38
|
-
if (
|
|
35
|
+
if (end) {
|
|
39
36
|
returnStream.end();
|
|
40
37
|
}
|
|
41
38
|
}
|
|
@@ -48,10 +45,9 @@ export const TestServiceConstructor = () => ServiceBuilder.create('test')
|
|
|
48
45
|
output: EchoResponse,
|
|
49
46
|
errors: Type.Never(),
|
|
50
47
|
async handler(_ctx, init, msgStream, returnStream) {
|
|
51
|
-
for await (const msg of msgStream) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
returnStream.push(reply(msg, Ok({ response: `${init.payload.prefix} ${req.msg}` })));
|
|
48
|
+
for await (const { ignore, msg } of msgStream) {
|
|
49
|
+
if (!ignore) {
|
|
50
|
+
returnStream.push(Ok({ response: `${init.prefix} ${msg}` }));
|
|
55
51
|
}
|
|
56
52
|
}
|
|
57
53
|
},
|
|
@@ -66,10 +62,9 @@ export const OrderingServiceConstructor = () => ServiceBuilder.create('test')
|
|
|
66
62
|
input: Type.Object({ n: Type.Number() }),
|
|
67
63
|
output: Type.Object({ n: Type.Number() }),
|
|
68
64
|
errors: Type.Never(),
|
|
69
|
-
async handler(ctx,
|
|
70
|
-
const { n } = msg.payload;
|
|
65
|
+
async handler(ctx, { n }) {
|
|
71
66
|
ctx.state.msgs.push(n);
|
|
72
|
-
return
|
|
67
|
+
return Ok({ n });
|
|
73
68
|
},
|
|
74
69
|
})
|
|
75
70
|
.defineProcedure('getAll', {
|
|
@@ -77,8 +72,8 @@ export const OrderingServiceConstructor = () => ServiceBuilder.create('test')
|
|
|
77
72
|
input: Type.Object({}),
|
|
78
73
|
output: Type.Object({ msgs: Type.Array(Type.Number()) }),
|
|
79
74
|
errors: Type.Never(),
|
|
80
|
-
async handler(ctx,
|
|
81
|
-
return
|
|
75
|
+
async handler(ctx, _msg) {
|
|
76
|
+
return Ok({ msgs: ctx.state.msgs });
|
|
82
77
|
},
|
|
83
78
|
})
|
|
84
79
|
.finalize();
|
|
@@ -88,9 +83,9 @@ export const BinaryFileServiceConstructor = () => ServiceBuilder.create('bin')
|
|
|
88
83
|
input: Type.Object({ file: Type.String() }),
|
|
89
84
|
output: Type.Object({ contents: Type.Uint8Array() }),
|
|
90
85
|
errors: Type.Never(),
|
|
91
|
-
async handler(_ctx,
|
|
92
|
-
const bytes = new TextEncoder().encode(`contents for file ${
|
|
93
|
-
return
|
|
86
|
+
async handler(_ctx, { file }) {
|
|
87
|
+
const bytes = new TextEncoder().encode(`contents for file ${file}`);
|
|
88
|
+
return Ok({ contents: bytes });
|
|
94
89
|
},
|
|
95
90
|
})
|
|
96
91
|
.finalize();
|
|
@@ -109,20 +104,16 @@ export const FallibleServiceConstructor = () => ServiceBuilder.create('fallible'
|
|
|
109
104
|
extras: Type.Object({ test: Type.String() }),
|
|
110
105
|
}),
|
|
111
106
|
]),
|
|
112
|
-
async handler(_ctx,
|
|
113
|
-
const { a, b } = msg.payload;
|
|
107
|
+
async handler(_ctx, { a, b }) {
|
|
114
108
|
if (b === 0) {
|
|
115
|
-
return
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
message: 'Cannot divide by zero',
|
|
120
|
-
extras: { test: 'abc' },
|
|
121
|
-
},
|
|
109
|
+
return Err({
|
|
110
|
+
code: DIV_BY_ZERO,
|
|
111
|
+
message: 'Cannot divide by zero',
|
|
112
|
+
extras: { test: 'abc' },
|
|
122
113
|
});
|
|
123
114
|
}
|
|
124
115
|
else {
|
|
125
|
-
return
|
|
116
|
+
return Ok({ result: a / b });
|
|
126
117
|
}
|
|
127
118
|
},
|
|
128
119
|
})
|
|
@@ -141,19 +132,18 @@ export const FallibleServiceConstructor = () => ServiceBuilder.create('fallible'
|
|
|
141
132
|
}),
|
|
142
133
|
]),
|
|
143
134
|
async handler(_ctx, msgStream, returnStream) {
|
|
144
|
-
for await (const msg of msgStream) {
|
|
145
|
-
|
|
146
|
-
if (req.throwError) {
|
|
135
|
+
for await (const { msg, throwError, throwResult } of msgStream) {
|
|
136
|
+
if (throwError) {
|
|
147
137
|
throw new Error('some message');
|
|
148
138
|
}
|
|
149
|
-
else if (
|
|
150
|
-
returnStream.push(
|
|
139
|
+
else if (throwResult) {
|
|
140
|
+
returnStream.push(Err({
|
|
151
141
|
code: STREAM_ERROR,
|
|
152
142
|
message: 'field throwResult was set to true',
|
|
153
|
-
}))
|
|
143
|
+
}));
|
|
154
144
|
}
|
|
155
145
|
else {
|
|
156
|
-
returnStream.push(
|
|
146
|
+
returnStream.push(Ok({ response: msg }));
|
|
157
147
|
}
|
|
158
148
|
}
|
|
159
149
|
},
|
|
@@ -168,10 +158,9 @@ export const SubscribableServiceConstructor = () => ServiceBuilder.create('subsc
|
|
|
168
158
|
input: Type.Object({ n: Type.Number() }),
|
|
169
159
|
output: Type.Object({ result: Type.Number() }),
|
|
170
160
|
errors: Type.Never(),
|
|
171
|
-
async handler(ctx,
|
|
172
|
-
const { n } = msg.payload;
|
|
161
|
+
async handler(ctx, { n }) {
|
|
173
162
|
ctx.state.count.set((prev) => prev + n);
|
|
174
|
-
return
|
|
163
|
+
return Ok({ result: ctx.state.count.get() });
|
|
175
164
|
},
|
|
176
165
|
})
|
|
177
166
|
.defineProcedure('value', {
|
|
@@ -179,9 +168,9 @@ export const SubscribableServiceConstructor = () => ServiceBuilder.create('subsc
|
|
|
179
168
|
input: Type.Object({}),
|
|
180
169
|
output: Type.Object({ result: Type.Number() }),
|
|
181
170
|
errors: Type.Never(),
|
|
182
|
-
async handler(ctx,
|
|
171
|
+
async handler(ctx, _msg, returnStream) {
|
|
183
172
|
ctx.state.count.observe((count) => {
|
|
184
|
-
returnStream.push(
|
|
173
|
+
returnStream.push(Ok({ result: count }));
|
|
185
174
|
});
|
|
186
175
|
},
|
|
187
176
|
})
|
|
@@ -195,13 +184,10 @@ export const UploadableServiceConstructor = () => ServiceBuilder.create('uploada
|
|
|
195
184
|
errors: Type.Never(),
|
|
196
185
|
async handler(_ctx, msgStream) {
|
|
197
186
|
let result = 0;
|
|
198
|
-
|
|
199
|
-
for await (const msg of msgStream) {
|
|
200
|
-
const { n } = msg.payload;
|
|
187
|
+
for await (const { n } of msgStream) {
|
|
201
188
|
result += n;
|
|
202
|
-
lastMsg = msg;
|
|
203
189
|
}
|
|
204
|
-
return
|
|
190
|
+
return Ok({ result: result });
|
|
205
191
|
},
|
|
206
192
|
})
|
|
207
193
|
.defineProcedure('addMultipleWithPrefix', {
|
|
@@ -212,13 +198,10 @@ export const UploadableServiceConstructor = () => ServiceBuilder.create('uploada
|
|
|
212
198
|
errors: Type.Never(),
|
|
213
199
|
async handler(_ctx, init, msgStream) {
|
|
214
200
|
let result = 0;
|
|
215
|
-
|
|
216
|
-
for await (const msg of msgStream) {
|
|
217
|
-
const { n } = msg.payload;
|
|
201
|
+
for await (const { n } of msgStream) {
|
|
218
202
|
result += n;
|
|
219
|
-
lastMsg = msg;
|
|
220
203
|
}
|
|
221
|
-
return
|
|
204
|
+
return Ok({ result: init.prefix + ' ' + result });
|
|
222
205
|
},
|
|
223
206
|
})
|
|
224
207
|
.finalize();
|
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import { asClientRpc, asClientStream,
|
|
1
|
+
import { asClientRpc, asClientStream, asClientSubscription, asClientUpload, iterNext, } from '../util/testHelpers';
|
|
2
2
|
import { assert, describe, expect, test } from 'vitest';
|
|
3
3
|
import { DIV_BY_ZERO, FallibleServiceConstructor, STREAM_ERROR, SubscribableServiceConstructor, UploadableServiceConstructor, TestServiceConstructor, } from './fixtures/services';
|
|
4
4
|
import { UNCAUGHT_ERROR } from '../router/result';
|
|
5
5
|
import { Observable } from './fixtures/observable';
|
|
6
6
|
describe('server-side test', () => {
|
|
7
7
|
const service = TestServiceConstructor();
|
|
8
|
-
const initialState = { count: 0 };
|
|
9
8
|
test('rpc basic', async () => {
|
|
10
|
-
const add = asClientRpc(
|
|
9
|
+
const add = asClientRpc({ count: 0 }, service.procedures.add);
|
|
11
10
|
const result = await add({ n: 3 });
|
|
12
11
|
assert(result.ok);
|
|
13
12
|
expect(result.payload).toStrictEqual({ result: 3 });
|
|
@@ -35,7 +34,7 @@ describe('server-side test', () => {
|
|
|
35
34
|
});
|
|
36
35
|
});
|
|
37
36
|
test('stream basic', async () => {
|
|
38
|
-
const [input, output] = asClientStream(
|
|
37
|
+
const [input, output] = asClientStream({ count: 0 }, service.procedures.echo);
|
|
39
38
|
input.push({ msg: 'abc', ignore: false });
|
|
40
39
|
input.push({ msg: 'def', ignore: true });
|
|
41
40
|
input.push({ msg: 'ghi', ignore: false });
|
|
@@ -49,7 +48,7 @@ describe('server-side test', () => {
|
|
|
49
48
|
expect(output.readableLength).toBe(0);
|
|
50
49
|
});
|
|
51
50
|
test('stream with initialization', async () => {
|
|
52
|
-
const [input, output] =
|
|
51
|
+
const [input, output] = asClientStream({ count: 0 }, service.procedures.echoWithPrefix, { prefix: 'test' });
|
|
53
52
|
input.push({ msg: 'abc', ignore: false });
|
|
54
53
|
input.push({ msg: 'def', ignore: true });
|
|
55
54
|
input.push({ msg: 'ghi', ignore: false });
|
|
@@ -101,7 +100,7 @@ describe('server-side test', () => {
|
|
|
101
100
|
});
|
|
102
101
|
test('uploads', async () => {
|
|
103
102
|
const service = UploadableServiceConstructor();
|
|
104
|
-
const [input, result] = asClientUpload({}, service.procedures.addMultiple);
|
|
103
|
+
const [input, result] = await asClientUpload({}, service.procedures.addMultiple);
|
|
105
104
|
input.push({ n: 1 });
|
|
106
105
|
input.push({ n: 2 });
|
|
107
106
|
input.end();
|
|
@@ -109,7 +108,7 @@ describe('server-side test', () => {
|
|
|
109
108
|
});
|
|
110
109
|
test('uploads with initialization', async () => {
|
|
111
110
|
const service = UploadableServiceConstructor();
|
|
112
|
-
const [input, result] =
|
|
111
|
+
const [input, result] = await asClientUpload({}, service.procedures.addMultipleWithPrefix, { prefix: 'test' });
|
|
113
112
|
input.push({ n: 1 });
|
|
114
113
|
input.push({ n: 2 });
|
|
115
114
|
input.end();
|