@replit/river 0.10.0 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/dist/{router/builder.d.ts → builder-3c4485f0.d.ts} +76 -21
  2. package/dist/chunk-7WJ6YLE5.js +683 -0
  3. package/dist/chunk-AJQU4AZG.js +284 -0
  4. package/dist/chunk-ORAG7IAU.js +0 -0
  5. package/dist/chunk-PC65ZFWJ.js +29 -0
  6. package/dist/chunk-R6H2BIMC.js +49 -0
  7. package/dist/chunk-RGMHF6PF.js +65 -0
  8. package/dist/chunk-SLUSVGQH.js +30 -0
  9. package/dist/chunk-UU2Z7LDR.js +113 -0
  10. package/dist/chunk-WVT5QXMZ.js +20 -0
  11. package/dist/chunk-ZE4MX7DF.js +75 -0
  12. package/dist/codec/index.cjs +94 -0
  13. package/dist/codec/index.d.cts +15 -0
  14. package/dist/codec/index.d.ts +15 -4
  15. package/dist/codec/index.js +10 -2
  16. package/dist/connection-8e19874c.d.ts +11 -0
  17. package/dist/connection-f7688cc1.d.ts +11 -0
  18. package/dist/logging/index.cjs +56 -0
  19. package/dist/logging/index.d.cts +28 -0
  20. package/dist/logging/index.d.ts +6 -6
  21. package/dist/logging/index.js +9 -40
  22. package/dist/router/index.cjs +770 -0
  23. package/dist/router/index.d.cts +114 -0
  24. package/dist/router/index.d.ts +114 -12
  25. package/dist/router/index.js +24 -5
  26. package/dist/transport/impls/ws/client.cjs +505 -0
  27. package/dist/transport/impls/ws/client.d.cts +42 -0
  28. package/dist/transport/impls/ws/client.d.ts +8 -8
  29. package/dist/transport/impls/ws/client.js +10 -100
  30. package/dist/transport/impls/ws/server.cjs +457 -0
  31. package/dist/transport/impls/ws/server.d.cts +21 -0
  32. package/dist/transport/impls/ws/server.d.ts +11 -10
  33. package/dist/transport/impls/ws/server.js +11 -52
  34. package/dist/transport/index.cjs +362 -0
  35. package/dist/transport/{transport.d.ts → index.d.cts} +119 -7
  36. package/dist/transport/index.d.ts +273 -4
  37. package/dist/transport/index.js +20 -2
  38. package/dist/{codec/types.d.ts → types-3e5768ec.d.ts} +3 -2
  39. package/dist/util/testHelpers.cjs +731 -0
  40. package/dist/util/testHelpers.d.cts +79 -0
  41. package/dist/util/testHelpers.d.ts +22 -19
  42. package/dist/util/testHelpers.js +135 -163
  43. package/package.json +41 -13
  44. package/dist/__tests__/bandwidth.bench.d.ts +0 -2
  45. package/dist/__tests__/bandwidth.bench.d.ts.map +0 -1
  46. package/dist/__tests__/bandwidth.bench.js +0 -90
  47. package/dist/__tests__/cleanup.test.d.ts +0 -2
  48. package/dist/__tests__/cleanup.test.d.ts.map +0 -1
  49. package/dist/__tests__/cleanup.test.js +0 -165
  50. package/dist/__tests__/disconnects.test.d.ts +0 -2
  51. package/dist/__tests__/disconnects.test.d.ts.map +0 -1
  52. package/dist/__tests__/disconnects.test.js +0 -163
  53. package/dist/__tests__/e2e.test.d.ts +0 -2
  54. package/dist/__tests__/e2e.test.d.ts.map +0 -1
  55. package/dist/__tests__/e2e.test.js +0 -317
  56. package/dist/__tests__/fixtures/cleanup.d.ts +0 -12
  57. package/dist/__tests__/fixtures/cleanup.d.ts.map +0 -1
  58. package/dist/__tests__/fixtures/cleanup.js +0 -36
  59. package/dist/__tests__/fixtures/largePayload.json +0 -33
  60. package/dist/__tests__/fixtures/observable.d.ts +0 -26
  61. package/dist/__tests__/fixtures/observable.d.ts.map +0 -1
  62. package/dist/__tests__/fixtures/observable.js +0 -38
  63. package/dist/__tests__/fixtures/observable.test.d.ts +0 -2
  64. package/dist/__tests__/fixtures/observable.test.d.ts.map +0 -1
  65. package/dist/__tests__/fixtures/observable.test.js +0 -39
  66. package/dist/__tests__/fixtures/services.d.ts +0 -288
  67. package/dist/__tests__/fixtures/services.d.ts.map +0 -1
  68. package/dist/__tests__/fixtures/services.js +0 -207
  69. package/dist/__tests__/handler.test.d.ts +0 -2
  70. package/dist/__tests__/handler.test.d.ts.map +0 -1
  71. package/dist/__tests__/handler.test.js +0 -120
  72. package/dist/__tests__/serialize.test.d.ts +0 -2
  73. package/dist/__tests__/serialize.test.d.ts.map +0 -1
  74. package/dist/__tests__/serialize.test.js +0 -208
  75. package/dist/__tests__/typescript-stress.test.d.ts +0 -1583
  76. package/dist/__tests__/typescript-stress.test.d.ts.map +0 -1
  77. package/dist/__tests__/typescript-stress.test.js +0 -123
  78. package/dist/codec/binary.d.ts +0 -7
  79. package/dist/codec/binary.d.ts.map +0 -1
  80. package/dist/codec/binary.js +0 -20
  81. package/dist/codec/codec.test.d.ts +0 -5
  82. package/dist/codec/codec.test.d.ts.map +0 -1
  83. package/dist/codec/codec.test.js +0 -41
  84. package/dist/codec/index.d.ts.map +0 -1
  85. package/dist/codec/json.d.ts +0 -7
  86. package/dist/codec/json.d.ts.map +0 -1
  87. package/dist/codec/json.js +0 -51
  88. package/dist/codec/types.d.ts.map +0 -1
  89. package/dist/codec/types.js +0 -1
  90. package/dist/logging/index.d.ts.map +0 -1
  91. package/dist/router/builder.d.ts.map +0 -1
  92. package/dist/router/builder.js +0 -91
  93. package/dist/router/client.d.ts +0 -72
  94. package/dist/router/client.d.ts.map +0 -1
  95. package/dist/router/client.js +0 -257
  96. package/dist/router/context.d.ts +0 -30
  97. package/dist/router/context.d.ts.map +0 -1
  98. package/dist/router/context.js +0 -1
  99. package/dist/router/defs.d.ts +0 -16
  100. package/dist/router/defs.d.ts.map +0 -1
  101. package/dist/router/defs.js +0 -11
  102. package/dist/router/index.d.ts.map +0 -1
  103. package/dist/router/result.d.ts +0 -26
  104. package/dist/router/result.d.ts.map +0 -1
  105. package/dist/router/result.js +0 -22
  106. package/dist/router/server.d.ts +0 -39
  107. package/dist/router/server.d.ts.map +0 -1
  108. package/dist/router/server.js +0 -260
  109. package/dist/transport/events.d.ts +0 -19
  110. package/dist/transport/events.d.ts.map +0 -1
  111. package/dist/transport/events.js +0 -26
  112. package/dist/transport/impls/stdio/stdio.d.ts +0 -33
  113. package/dist/transport/impls/stdio/stdio.d.ts.map +0 -1
  114. package/dist/transport/impls/stdio/stdio.js +0 -75
  115. package/dist/transport/impls/stdio/stdio.test.d.ts +0 -2
  116. package/dist/transport/impls/stdio/stdio.test.d.ts.map +0 -1
  117. package/dist/transport/impls/stdio/stdio.test.js +0 -24
  118. package/dist/transport/impls/ws/client.d.ts.map +0 -1
  119. package/dist/transport/impls/ws/connection.d.ts +0 -11
  120. package/dist/transport/impls/ws/connection.d.ts.map +0 -1
  121. package/dist/transport/impls/ws/connection.js +0 -23
  122. package/dist/transport/impls/ws/server.d.ts.map +0 -1
  123. package/dist/transport/impls/ws/ws.test.d.ts +0 -2
  124. package/dist/transport/impls/ws/ws.test.d.ts.map +0 -1
  125. package/dist/transport/impls/ws/ws.test.js +0 -185
  126. package/dist/transport/index.d.ts.map +0 -1
  127. package/dist/transport/message.d.ts +0 -142
  128. package/dist/transport/message.d.ts.map +0 -1
  129. package/dist/transport/message.js +0 -113
  130. package/dist/transport/message.test.d.ts +0 -2
  131. package/dist/transport/message.test.d.ts.map +0 -1
  132. package/dist/transport/message.test.js +0 -52
  133. package/dist/transport/transport.d.ts.map +0 -1
  134. package/dist/transport/transport.js +0 -281
  135. package/dist/util/testHelpers.d.ts.map +0 -1
@@ -1,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: {
27
- n: number;
28
- }) => Promise<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: AsyncIterableIterator<{
47
- end?: boolean | undefined;
48
- msg: string;
49
- ignore: boolean;
50
- }>, output: import("it-pushable").Pushable<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: {
72
- prefix: string;
73
- }, input: AsyncIterableIterator<{
74
- end?: boolean | undefined;
75
- msg: string;
76
- ignore: boolean;
77
- }>, output: import("it-pushable").Pushable<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: {
101
- n: number;
102
- }) => Promise<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: {}) => Promise<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: {
136
- file: string;
137
- }) => Promise<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: {
166
- a: number;
167
- b: number;
168
- }) => Promise<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: AsyncIterableIterator<{
194
- msg: string;
195
- throwResult: boolean;
196
- throwError: boolean;
197
- }>, output: import("it-pushable").Pushable<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: {
224
- n: number;
225
- }) => Promise<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: {}, output: import("it-pushable").Pushable<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: AsyncIterableIterator<{
259
- n: number;
260
- }>) => Promise<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: {
278
- prefix: string;
279
- }, input: AsyncIterableIterator<{
280
- n: number;
281
- }>) => Promise<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":"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,207 +0,0 @@
1
- import { Type } from '@sinclair/typebox';
2
- import { ServiceBuilder } from '../../router/builder';
3
- import { Err, Ok } from '../../router/result';
4
- import { Observable } from './observable';
5
- export const EchoRequest = Type.Object({
6
- msg: Type.String(),
7
- ignore: Type.Boolean(),
8
- end: Type.Optional(Type.Boolean()),
9
- });
10
- export const EchoResponse = Type.Object({ response: Type.String() });
11
- export const TestServiceConstructor = () => ServiceBuilder.create('test')
12
- .initialState({
13
- count: 0,
14
- })
15
- .defineProcedure('add', {
16
- type: 'rpc',
17
- input: Type.Object({ n: Type.Number() }),
18
- output: Type.Object({ result: Type.Number() }),
19
- errors: Type.Never(),
20
- async handler(ctx, { n }) {
21
- ctx.state.count += n;
22
- return Ok({ result: ctx.state.count });
23
- },
24
- })
25
- .defineProcedure('echo', {
26
- type: 'stream',
27
- input: EchoRequest,
28
- output: EchoResponse,
29
- errors: Type.Never(),
30
- async handler(_ctx, msgStream, returnStream) {
31
- for await (const { ignore, msg, end } of msgStream) {
32
- if (!ignore) {
33
- returnStream.push(Ok({ response: msg }));
34
- }
35
- if (end) {
36
- returnStream.end();
37
- }
38
- }
39
- },
40
- })
41
- .defineProcedure('echoWithPrefix', {
42
- type: 'stream',
43
- init: Type.Object({ prefix: Type.String() }),
44
- input: EchoRequest,
45
- output: EchoResponse,
46
- errors: Type.Never(),
47
- async handler(_ctx, init, msgStream, returnStream) {
48
- for await (const { ignore, msg } of msgStream) {
49
- if (!ignore) {
50
- returnStream.push(Ok({ response: `${init.prefix} ${msg}` }));
51
- }
52
- }
53
- },
54
- })
55
- .finalize();
56
- export const OrderingServiceConstructor = () => ServiceBuilder.create('test')
57
- .initialState({
58
- msgs: [],
59
- })
60
- .defineProcedure('add', {
61
- type: 'rpc',
62
- input: Type.Object({ n: Type.Number() }),
63
- output: Type.Object({ n: Type.Number() }),
64
- errors: Type.Never(),
65
- async handler(ctx, { n }) {
66
- ctx.state.msgs.push(n);
67
- return Ok({ n });
68
- },
69
- })
70
- .defineProcedure('getAll', {
71
- type: 'rpc',
72
- input: Type.Object({}),
73
- output: Type.Object({ msgs: Type.Array(Type.Number()) }),
74
- errors: Type.Never(),
75
- async handler(ctx, _msg) {
76
- return Ok({ msgs: ctx.state.msgs });
77
- },
78
- })
79
- .finalize();
80
- export const BinaryFileServiceConstructor = () => ServiceBuilder.create('bin')
81
- .defineProcedure('getFile', {
82
- type: 'rpc',
83
- input: Type.Object({ file: Type.String() }),
84
- output: Type.Object({ contents: Type.Uint8Array() }),
85
- errors: Type.Never(),
86
- async handler(_ctx, { file }) {
87
- const bytes = new TextEncoder().encode(`contents for file ${file}`);
88
- return Ok({ contents: bytes });
89
- },
90
- })
91
- .finalize();
92
- export const DIV_BY_ZERO = 'DIV_BY_ZERO';
93
- export const STREAM_ERROR = 'STREAM_ERROR';
94
- export const FallibleServiceConstructor = () => ServiceBuilder.create('fallible')
95
- .initialState({})
96
- .defineProcedure('divide', {
97
- type: 'rpc',
98
- input: Type.Object({ a: Type.Number(), b: Type.Number() }),
99
- output: Type.Object({ result: Type.Number() }),
100
- errors: Type.Union([
101
- Type.Object({
102
- code: Type.Literal(DIV_BY_ZERO),
103
- message: Type.String(),
104
- extras: Type.Object({ test: Type.String() }),
105
- }),
106
- ]),
107
- async handler(_ctx, { a, b }) {
108
- if (b === 0) {
109
- return Err({
110
- code: DIV_BY_ZERO,
111
- message: 'Cannot divide by zero',
112
- extras: { test: 'abc' },
113
- });
114
- }
115
- else {
116
- return Ok({ result: a / b });
117
- }
118
- },
119
- })
120
- .defineProcedure('echo', {
121
- type: 'stream',
122
- input: Type.Object({
123
- msg: Type.String(),
124
- throwResult: Type.Boolean(),
125
- throwError: Type.Boolean(),
126
- }),
127
- output: Type.Object({ response: Type.String() }),
128
- errors: Type.Union([
129
- Type.Object({
130
- code: Type.Literal(STREAM_ERROR),
131
- message: Type.String(),
132
- }),
133
- ]),
134
- async handler(_ctx, msgStream, returnStream) {
135
- for await (const { msg, throwError, throwResult } of msgStream) {
136
- if (throwError) {
137
- throw new Error('some message');
138
- }
139
- else if (throwResult) {
140
- returnStream.push(Err({
141
- code: STREAM_ERROR,
142
- message: 'field throwResult was set to true',
143
- }));
144
- }
145
- else {
146
- returnStream.push(Ok({ response: msg }));
147
- }
148
- }
149
- },
150
- })
151
- .finalize();
152
- export const SubscribableServiceConstructor = () => ServiceBuilder.create('subscribable')
153
- .initialState({
154
- count: new Observable(0),
155
- })
156
- .defineProcedure('add', {
157
- type: 'rpc',
158
- input: Type.Object({ n: Type.Number() }),
159
- output: Type.Object({ result: Type.Number() }),
160
- errors: Type.Never(),
161
- async handler(ctx, { n }) {
162
- ctx.state.count.set((prev) => prev + n);
163
- return Ok({ result: ctx.state.count.get() });
164
- },
165
- })
166
- .defineProcedure('value', {
167
- type: 'subscription',
168
- input: Type.Object({}),
169
- output: Type.Object({ result: Type.Number() }),
170
- errors: Type.Never(),
171
- async handler(ctx, _msg, returnStream) {
172
- ctx.state.count.observe((count) => {
173
- returnStream.push(Ok({ result: count }));
174
- });
175
- },
176
- })
177
- .finalize();
178
- export const UploadableServiceConstructor = () => ServiceBuilder.create('uploadable')
179
- .initialState({})
180
- .defineProcedure('addMultiple', {
181
- type: 'upload',
182
- input: Type.Object({ n: Type.Number() }),
183
- output: Type.Object({ result: Type.Number() }),
184
- errors: Type.Never(),
185
- async handler(_ctx, msgStream) {
186
- let result = 0;
187
- for await (const { n } of msgStream) {
188
- result += n;
189
- }
190
- return Ok({ result: result });
191
- },
192
- })
193
- .defineProcedure('addMultipleWithPrefix', {
194
- type: 'upload',
195
- init: Type.Object({ prefix: Type.String() }),
196
- input: Type.Object({ n: Type.Number() }),
197
- output: Type.Object({ result: Type.String() }),
198
- errors: Type.Never(),
199
- async handler(_ctx, init, msgStream) {
200
- let result = 0;
201
- for await (const { n } of msgStream) {
202
- result += n;
203
- }
204
- return Ok({ result: init.prefix + ' ' + result });
205
- },
206
- })
207
- .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,120 +0,0 @@
1
- import { asClientRpc, asClientStream, asClientSubscription, asClientUpload, 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
- test('rpc basic', async () => {
9
- const add = asClientRpc({ count: 0 }, service.procedures.add);
10
- const result = await add({ n: 3 });
11
- assert(result.ok);
12
- expect(result.payload).toStrictEqual({ result: 3 });
13
- });
14
- test('rpc initial state', async () => {
15
- const add = asClientRpc({ count: 5 }, service.procedures.add);
16
- const result = await add({ n: 6 });
17
- assert(result.ok);
18
- expect(result.payload).toStrictEqual({ result: 11 });
19
- });
20
- test('fallible rpc', async () => {
21
- const service = FallibleServiceConstructor();
22
- const divide = asClientRpc({}, service.procedures.divide);
23
- const result = await divide({ a: 10, b: 2 });
24
- assert(result.ok);
25
- expect(result.payload).toStrictEqual({ result: 5 });
26
- const result2 = await divide({ a: 10, b: 0 });
27
- assert(!result2.ok);
28
- expect(result2.payload).toStrictEqual({
29
- code: DIV_BY_ZERO,
30
- message: 'Cannot divide by zero',
31
- extras: {
32
- test: 'abc',
33
- },
34
- });
35
- });
36
- test('stream basic', async () => {
37
- const [input, output] = asClientStream({ count: 0 }, service.procedures.echo);
38
- input.push({ msg: 'abc', ignore: false });
39
- input.push({ msg: 'def', ignore: true });
40
- input.push({ msg: 'ghi', ignore: false });
41
- input.end();
42
- const result1 = await iterNext(output);
43
- assert(result1 && result1.ok);
44
- expect(result1.payload).toStrictEqual({ response: 'abc' });
45
- const result2 = await iterNext(output);
46
- assert(result2 && result2.ok);
47
- expect(result2.payload).toStrictEqual({ response: 'ghi' });
48
- expect(output.readableLength).toBe(0);
49
- });
50
- test('stream with initialization', async () => {
51
- const [input, output] = asClientStream({ count: 0 }, service.procedures.echoWithPrefix, { prefix: 'test' });
52
- input.push({ msg: 'abc', ignore: false });
53
- input.push({ msg: 'def', ignore: true });
54
- input.push({ msg: 'ghi', ignore: false });
55
- input.end();
56
- const result1 = await iterNext(output);
57
- assert(result1 && result1.ok);
58
- expect(result1.payload).toStrictEqual({ response: 'test abc' });
59
- const result2 = await iterNext(output);
60
- assert(result2 && result2.ok);
61
- expect(result2.payload).toStrictEqual({ response: 'test ghi' });
62
- expect(output.readableLength).toBe(0);
63
- });
64
- test('fallible stream', async () => {
65
- const service = FallibleServiceConstructor();
66
- const [input, output] = asClientStream({}, service.procedures.echo);
67
- input.push({ msg: 'abc', throwResult: false, throwError: false });
68
- const result1 = await iterNext(output);
69
- assert(result1 && result1.ok);
70
- expect(result1.payload).toStrictEqual({ response: 'abc' });
71
- input.push({ msg: 'def', throwResult: true, throwError: false });
72
- const result2 = await iterNext(output);
73
- assert(result2 && !result2.ok);
74
- expect(result2.payload.code).toStrictEqual(STREAM_ERROR);
75
- input.push({ msg: 'ghi', throwResult: false, throwError: true });
76
- const result3 = await iterNext(output);
77
- assert(result3 && !result3.ok);
78
- expect(result3.payload).toStrictEqual({
79
- code: UNCAUGHT_ERROR,
80
- message: 'some message',
81
- });
82
- input.end();
83
- expect(output.readableLength).toBe(0);
84
- });
85
- test('subscriptions', async () => {
86
- const service = SubscribableServiceConstructor();
87
- const state = { count: new Observable(0) };
88
- const add = asClientRpc(state, service.procedures.add);
89
- const subscribe = asClientSubscription(state, service.procedures.value);
90
- const stream = await subscribe({});
91
- const streamResult1 = await iterNext(stream);
92
- assert(streamResult1 && streamResult1.ok);
93
- expect(streamResult1.payload).toStrictEqual({ result: 0 });
94
- const result = await add({ n: 3 });
95
- assert(result.ok);
96
- expect(result.payload).toStrictEqual({ result: 3 });
97
- const streamResult2 = await iterNext(stream);
98
- assert(streamResult2 && streamResult1.ok);
99
- expect(streamResult2.payload).toStrictEqual({ result: 3 });
100
- });
101
- test('uploads', async () => {
102
- const service = UploadableServiceConstructor();
103
- const [input, result] = await asClientUpload({}, service.procedures.addMultiple);
104
- input.push({ n: 1 });
105
- input.push({ n: 2 });
106
- input.end();
107
- expect(await result).toStrictEqual({ ok: true, payload: { result: 3 } });
108
- });
109
- test('uploads with initialization', async () => {
110
- const service = UploadableServiceConstructor();
111
- const [input, result] = await asClientUpload({}, service.procedures.addMultipleWithPrefix, { prefix: 'test' });
112
- input.push({ n: 1 });
113
- input.push({ n: 2 });
114
- input.end();
115
- expect(await result).toStrictEqual({
116
- ok: true,
117
- payload: { result: 'test 3' },
118
- });
119
- });
120
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=serialize.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"serialize.test.d.ts","sourceRoot":"","sources":["../../__tests__/serialize.test.ts"],"names":[],"mappings":""}