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