@replit/river 0.200.0-rc.9 → 0.200.2

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 (72) hide show
  1. package/README.md +8 -8
  2. package/dist/{chunk-42Z2FQIU.js → chunk-6BH2CXVE.js} +21 -13
  3. package/dist/chunk-6BH2CXVE.js.map +1 -0
  4. package/dist/{chunk-4HT6P2ZG.js → chunk-A4JKES5A.js} +22 -30
  5. package/dist/chunk-A4JKES5A.js.map +1 -0
  6. package/dist/{chunk-4PVU7J25.js → chunk-AJGIY2UB.js} +1 -1
  7. package/dist/chunk-AJGIY2UB.js.map +1 -0
  8. package/dist/{chunk-EETL2L77.js → chunk-GJUUVID2.js} +14 -32
  9. package/dist/chunk-GJUUVID2.js.map +1 -0
  10. package/dist/{chunk-GR3AQKHL.js → chunk-HRKM7BIE.js} +14 -4
  11. package/dist/chunk-HRKM7BIE.js.map +1 -0
  12. package/dist/{chunk-ZXZE253M.js → chunk-PJB2Y2AV.js} +24 -37
  13. package/dist/chunk-PJB2Y2AV.js.map +1 -0
  14. package/dist/{chunk-I75XYO5W.js → chunk-QIDEN5PP.js} +82 -20
  15. package/dist/chunk-QIDEN5PP.js.map +1 -0
  16. package/dist/{chunk-VXYHC666.js → chunk-YTMS7OP6.js} +1 -1
  17. package/dist/chunk-YTMS7OP6.js.map +1 -0
  18. package/dist/chunk-Z4PX66JO.js +307 -0
  19. package/dist/chunk-Z4PX66JO.js.map +1 -0
  20. package/dist/{client-22a47343.d.ts → client-9292552a.d.ts} +3 -4
  21. package/dist/codec/index.cjs.map +1 -1
  22. package/dist/codec/index.js +1 -1
  23. package/dist/connection-94dea547.d.ts +32 -0
  24. package/dist/{context-b4aff18f.d.ts → context-69f37ac1.d.ts} +48 -43
  25. package/dist/logging/index.cjs.map +1 -1
  26. package/dist/logging/index.d.cts +1 -1
  27. package/dist/logging/index.d.ts +1 -1
  28. package/dist/logging/index.js +1 -1
  29. package/dist/{message-7d135e38.d.ts → message-57bb8187.d.ts} +5 -3
  30. package/dist/router/index.cjs +649 -709
  31. package/dist/router/index.cjs.map +1 -1
  32. package/dist/router/index.d.cts +22 -12
  33. package/dist/router/index.d.ts +22 -12
  34. package/dist/router/index.js +502 -404
  35. package/dist/router/index.js.map +1 -1
  36. package/dist/{server-dd6a9853.d.ts → server-8fdd7fb2.d.ts} +5 -5
  37. package/dist/{services-1b5ac5bc.d.ts → services-259f39a3.d.ts} +191 -194
  38. package/dist/transport/impls/ws/client.cjs +129 -62
  39. package/dist/transport/impls/ws/client.cjs.map +1 -1
  40. package/dist/transport/impls/ws/client.d.cts +4 -4
  41. package/dist/transport/impls/ws/client.d.ts +4 -4
  42. package/dist/transport/impls/ws/client.js +7 -7
  43. package/dist/transport/impls/ws/client.js.map +1 -1
  44. package/dist/transport/impls/ws/server.cjs +146 -70
  45. package/dist/transport/impls/ws/server.cjs.map +1 -1
  46. package/dist/transport/impls/ws/server.d.cts +6 -5
  47. package/dist/transport/impls/ws/server.d.ts +6 -5
  48. package/dist/transport/impls/ws/server.js +21 -9
  49. package/dist/transport/impls/ws/server.js.map +1 -1
  50. package/dist/transport/index.cjs +138 -92
  51. package/dist/transport/index.cjs.map +1 -1
  52. package/dist/transport/index.d.cts +4 -4
  53. package/dist/transport/index.d.ts +4 -4
  54. package/dist/transport/index.js +7 -7
  55. package/dist/util/testHelpers.cjs +265 -327
  56. package/dist/util/testHelpers.cjs.map +1 -1
  57. package/dist/util/testHelpers.d.cts +36 -31
  58. package/dist/util/testHelpers.d.ts +36 -31
  59. package/dist/util/testHelpers.js +82 -52
  60. package/dist/util/testHelpers.js.map +1 -1
  61. package/package.json +4 -3
  62. package/dist/chunk-42Z2FQIU.js.map +0 -1
  63. package/dist/chunk-4HT6P2ZG.js.map +0 -1
  64. package/dist/chunk-4PVU7J25.js.map +0 -1
  65. package/dist/chunk-EETL2L77.js.map +0 -1
  66. package/dist/chunk-GR3AQKHL.js.map +0 -1
  67. package/dist/chunk-I75XYO5W.js.map +0 -1
  68. package/dist/chunk-MQ6ANR3H.js +0 -451
  69. package/dist/chunk-MQ6ANR3H.js.map +0 -1
  70. package/dist/chunk-VXYHC666.js.map +0 -1
  71. package/dist/chunk-ZXZE253M.js.map +0 -1
  72. package/dist/connection-260e45a8.d.ts +0 -11
@@ -1,15 +1,16 @@
1
- import { T as Transport, C as Connection, m as SessionOptions, n as ClientTransportOptions, e as SessionNoConnection, o as ServiceContext, S as Session } from '../context-b4aff18f.js';
1
+ import { T as Transport, C as Connection, m as SessionOptions, n as ClientTransportOptions, e as SessionNoConnection, o as SessionBoundSendFn, p as ServiceContext, S as Session } from '../context-69f37ac1.js';
2
+ import { C as ClientTransport } from '../client-9292552a.js';
3
+ import { S as ServerTransport } from '../server-8fdd7fb2.js';
4
+ import { P as PartialTransportMessage, b as OpaqueTransportMessage } from '../message-57bb8187.js';
2
5
  import { Static } from '@sinclair/typebox';
3
- import { P as PartialTransportMessage, b as OpaqueTransportMessage } from '../message-7d135e38.js';
4
- import { B as BaseErrorSchemaType, R as ReadStream, S as SimpleIterator, O as OkResult, E as ErrResult, P as PayloadType, a as ProcedureErrorSchemaType, b as Procedure, c as Result, d as ResponseReaderErrorSchema, W as WriteStream } from '../services-1b5ac5bc.js';
5
6
  import NodeWs from 'ws';
6
7
  import http from 'node:http';
8
+ import { B as BaseErrorSchemaType, R as Readable, a as ReadableIterator, b as ReadableResult, P as PayloadType, c as ProcedureErrorSchemaType, d as Procedure, e as Result, f as ReaderErrorSchema, W as Writable } from '../services-259f39a3.js';
7
9
  import { W as WsLike } from '../wslike-e0b32dd5.js';
8
10
  import '@sinclair/typebox/errors';
9
11
  import '../types-3e5768ec.js';
10
12
  import '@sinclair/typebox/value';
11
13
  import '@opentelemetry/api';
12
- import '../client-22a47343.js';
13
14
 
14
15
  /**
15
16
  * Creates a WebSocket client that connects to a local server at the specified port.
@@ -33,24 +34,26 @@ declare function createWebSocketServer(server: http.Server): NodeWs.Server<typeo
33
34
  * @throws An error if a port cannot be allocated.
34
35
  */
35
36
  declare function onWsServerReady(server: http.Server): Promise<number>;
36
- declare function getIteratorFromStream<T, E extends Static<BaseErrorSchemaType>>(readStream: ReadStream<T, E>): SimpleIterator<OkResult<T> | ErrResult<E | {
37
- readonly code: "STREAM_DRAINED";
38
- readonly message: "Stream was drained";
39
- }>>;
40
37
  /**
41
- * Retrieves the next value from an async iterable iterator.
42
- * @param iter The async iterable iterator.
43
- * @returns A promise that resolves to the next value from the iterator.
38
+ * A safe way to access {@link Readble}'s iterator multiple times in test helpers.
39
+ *
40
+ * If there are other iteration attempts outside of the test helpers
41
+ * (this function, {@link readNextResult}, and {@link isReadableDone})
42
+ * it will throw an error.
44
43
  */
45
- declare function iterNext<T>(iter: {
46
- next(): Promise<{
47
- done: false;
48
- value: T;
49
- } | {
50
- done: true;
51
- value: undefined;
52
- }>;
53
- }): Promise<T>;
44
+ declare function getReadableIterator<T, E extends Static<BaseErrorSchemaType>>(readable: Readable<T, E>): ReadableIterator<T, E>;
45
+ /**
46
+ * Retrieves the next value from {@link Readable}, or throws an error if the Readable is done.
47
+ *
48
+ * Calling semantics are similar to {@link getReadableIterator}
49
+ */
50
+ declare function readNextResult<T, E extends Static<BaseErrorSchemaType>>(readable: Readable<T, E>): Promise<ReadableResult<T, E>>;
51
+ /**
52
+ * Checks if the readable is done iterating, it consumes an iteration in the process.
53
+ *
54
+ * Calling semantics are similar to {@link getReadableIterator}
55
+ */
56
+ declare function isReadableDone<T, E extends Static<BaseErrorSchemaType>>(readable: Readable<T, E>): Promise<boolean>;
54
57
  declare function payloadToTransportMessage<Payload>(payload: Payload): PartialTransportMessage<Payload>;
55
58
  declare function createDummyTransportMessage(): PartialTransportMessage<{
56
59
  msg: string;
@@ -66,20 +69,22 @@ declare function waitForMessage(t: Transport<Connection>, filter?: (msg: OpaqueT
66
69
  declare const testingSessionOptions: SessionOptions;
67
70
  declare const testingClientSessionOptions: ClientTransportOptions;
68
71
  declare function dummySession(): SessionNoConnection;
69
- declare function asClientRpc<State extends object, Init extends PayloadType, Output extends PayloadType, Err extends ProcedureErrorSchemaType>(state: State, proc: Procedure<State, 'rpc', Init, null, Output, Err>, extendedContext?: Omit<ServiceContext, 'state'>, session?: Session<Connection>): (msg: Static<Init>) => Promise<Result<Static<Output>, Static<Err> | Static<typeof ResponseReaderErrorSchema>>>;
70
- declare function asClientStream<State extends object, Init extends PayloadType, Input extends PayloadType, Output extends PayloadType, Err extends ProcedureErrorSchemaType>(state: State, proc: Procedure<State, 'stream', Init, Input, Output, Err>, reqInit?: Static<Init>, extendedContext?: Omit<ServiceContext, 'state'>, session?: Session<Connection>): {
71
- reqWriter: WriteStream<Static<Input>>;
72
- resReader: ReadStream<Static<Output>, Static<Err>>;
72
+ declare function getClientSendFn(clientTransport: ClientTransport<Connection>, serverTransport: ServerTransport<Connection>): SessionBoundSendFn;
73
+ declare function getServerSendFn(serverTransport: ServerTransport<Connection>, clientTransport: ClientTransport<Connection>): SessionBoundSendFn;
74
+ declare function asClientRpc<State extends object, Init extends PayloadType, Res extends PayloadType, Err extends ProcedureErrorSchemaType>(state: State, proc: Procedure<State, 'rpc', Init, null, Res, Err>, extendedContext?: Omit<ServiceContext, 'state'>, session?: Session<Connection>): (msg: Static<Init>) => Promise<Result<Static<Res>, Static<Err> | Static<typeof ReaderErrorSchema>>>;
75
+ declare function asClientStream<State extends object, Init extends PayloadType, Req extends PayloadType, Res extends PayloadType, Err extends ProcedureErrorSchemaType>(state: State, proc: Procedure<State, 'stream', Init, Req, Res, Err>, reqInit?: Static<Init>, extendedContext?: Omit<ServiceContext, 'state'>, session?: Session<Connection>): {
76
+ reqWritable: Writable<Static<Req>>;
77
+ resReadable: Readable<Static<Res>, Static<Err>>;
78
+ };
79
+ declare function asClientSubscription<State extends object, Init extends PayloadType, Res extends PayloadType, Err extends ProcedureErrorSchemaType>(state: State, proc: Procedure<State, 'subscription', Init, null, Res, Err>, extendedContext?: Omit<ServiceContext, 'state'>, session?: Session<Connection>): (msg: Static<Init>) => {
80
+ resReadable: Readable<Static<Res>, Static<Err>>;
73
81
  };
74
- declare function asClientSubscription<State extends object, Init extends PayloadType, Output extends PayloadType, Err extends ProcedureErrorSchemaType>(state: State, proc: Procedure<State, 'subscription', Init, null, Output, Err>, extendedContext?: Omit<ServiceContext, 'state'>, session?: Session<Connection>): (msg: Static<Init>) => {
75
- resReader: ReadStream<Static<Output>, Static<Err>>;
82
+ declare function asClientUpload<State extends object, Init extends PayloadType, Req extends PayloadType, Res extends PayloadType, Err extends ProcedureErrorSchemaType>(state: State, proc: Procedure<State, 'upload', Init, Req, Res, Err>, reqInit?: Static<Init>, extendedContext?: Omit<ServiceContext, 'state'>, session?: Session<Connection>): {
83
+ reqWritable: Writable<Static<Req>>;
84
+ finalize: () => Promise<Result<Static<Res>, Static<Err>>>;
76
85
  };
77
- declare function asClientUpload<State extends object, Init extends PayloadType, Input extends PayloadType, Output extends PayloadType, Err extends ProcedureErrorSchemaType>(state: State, proc: Procedure<State, 'upload', Init, Input, Output, Err>, reqInit?: Static<Init>, extendedContext?: Omit<ServiceContext, 'state'>, session?: Session<Connection>): [
78
- WriteStream<Static<Input>>,
79
- () => Promise<Result<Static<Output>, Static<Err>>>
80
- ];
81
86
  declare function getTransportConnections<ConnType extends Connection>(transport: Transport<ConnType>): Array<ConnType>;
82
87
  declare function numberOfConnections<ConnType extends Connection>(transport: Transport<ConnType>): number;
83
88
  declare function closeAllConnections<ConnType extends Connection>(transport: Transport<ConnType>): void;
84
89
 
85
- export { asClientRpc, asClientStream, asClientSubscription, asClientUpload, closeAllConnections, createDummyTransportMessage, createLocalWebSocketClient, createWebSocketServer, dummySession, getIteratorFromStream, getTransportConnections, iterNext, numberOfConnections, onWsServerReady, payloadToTransportMessage, testingClientSessionOptions, testingSessionOptions, waitForMessage };
90
+ export { asClientRpc, asClientStream, asClientSubscription, asClientUpload, closeAllConnections, createDummyTransportMessage, createLocalWebSocketClient, createWebSocketServer, dummySession, getClientSendFn, getReadableIterator, getServerSendFn, getTransportConnections, isReadableDone, numberOfConnections, onWsServerReady, payloadToTransportMessage, readNextResult, testingClientSessionOptions, testingSessionOptions, waitForMessage };
@@ -1,15 +1,16 @@
1
- import { T as Transport, C as Connection, m as SessionOptions, n as ClientTransportOptions, e as SessionNoConnection, o as ServiceContext, S as Session } from '../context-b4aff18f.js';
1
+ import { T as Transport, C as Connection, m as SessionOptions, n as ClientTransportOptions, e as SessionNoConnection, o as SessionBoundSendFn, p as ServiceContext, S as Session } from '../context-69f37ac1.js';
2
+ import { C as ClientTransport } from '../client-9292552a.js';
3
+ import { S as ServerTransport } from '../server-8fdd7fb2.js';
4
+ import { P as PartialTransportMessage, b as OpaqueTransportMessage } from '../message-57bb8187.js';
2
5
  import { Static } from '@sinclair/typebox';
3
- import { P as PartialTransportMessage, b as OpaqueTransportMessage } from '../message-7d135e38.js';
4
- import { B as BaseErrorSchemaType, R as ReadStream, S as SimpleIterator, O as OkResult, E as ErrResult, P as PayloadType, a as ProcedureErrorSchemaType, b as Procedure, c as Result, d as ResponseReaderErrorSchema, W as WriteStream } from '../services-1b5ac5bc.js';
5
6
  import NodeWs from 'ws';
6
7
  import http from 'node:http';
8
+ import { B as BaseErrorSchemaType, R as Readable, a as ReadableIterator, b as ReadableResult, P as PayloadType, c as ProcedureErrorSchemaType, d as Procedure, e as Result, f as ReaderErrorSchema, W as Writable } from '../services-259f39a3.js';
7
9
  import { W as WsLike } from '../wslike-e0b32dd5.js';
8
10
  import '@sinclair/typebox/errors';
9
11
  import '../types-3e5768ec.js';
10
12
  import '@sinclair/typebox/value';
11
13
  import '@opentelemetry/api';
12
- import '../client-22a47343.js';
13
14
 
14
15
  /**
15
16
  * Creates a WebSocket client that connects to a local server at the specified port.
@@ -33,24 +34,26 @@ declare function createWebSocketServer(server: http.Server): NodeWs.Server<typeo
33
34
  * @throws An error if a port cannot be allocated.
34
35
  */
35
36
  declare function onWsServerReady(server: http.Server): Promise<number>;
36
- declare function getIteratorFromStream<T, E extends Static<BaseErrorSchemaType>>(readStream: ReadStream<T, E>): SimpleIterator<OkResult<T> | ErrResult<E | {
37
- readonly code: "STREAM_DRAINED";
38
- readonly message: "Stream was drained";
39
- }>>;
40
37
  /**
41
- * Retrieves the next value from an async iterable iterator.
42
- * @param iter The async iterable iterator.
43
- * @returns A promise that resolves to the next value from the iterator.
38
+ * A safe way to access {@link Readble}'s iterator multiple times in test helpers.
39
+ *
40
+ * If there are other iteration attempts outside of the test helpers
41
+ * (this function, {@link readNextResult}, and {@link isReadableDone})
42
+ * it will throw an error.
44
43
  */
45
- declare function iterNext<T>(iter: {
46
- next(): Promise<{
47
- done: false;
48
- value: T;
49
- } | {
50
- done: true;
51
- value: undefined;
52
- }>;
53
- }): Promise<T>;
44
+ declare function getReadableIterator<T, E extends Static<BaseErrorSchemaType>>(readable: Readable<T, E>): ReadableIterator<T, E>;
45
+ /**
46
+ * Retrieves the next value from {@link Readable}, or throws an error if the Readable is done.
47
+ *
48
+ * Calling semantics are similar to {@link getReadableIterator}
49
+ */
50
+ declare function readNextResult<T, E extends Static<BaseErrorSchemaType>>(readable: Readable<T, E>): Promise<ReadableResult<T, E>>;
51
+ /**
52
+ * Checks if the readable is done iterating, it consumes an iteration in the process.
53
+ *
54
+ * Calling semantics are similar to {@link getReadableIterator}
55
+ */
56
+ declare function isReadableDone<T, E extends Static<BaseErrorSchemaType>>(readable: Readable<T, E>): Promise<boolean>;
54
57
  declare function payloadToTransportMessage<Payload>(payload: Payload): PartialTransportMessage<Payload>;
55
58
  declare function createDummyTransportMessage(): PartialTransportMessage<{
56
59
  msg: string;
@@ -66,20 +69,22 @@ declare function waitForMessage(t: Transport<Connection>, filter?: (msg: OpaqueT
66
69
  declare const testingSessionOptions: SessionOptions;
67
70
  declare const testingClientSessionOptions: ClientTransportOptions;
68
71
  declare function dummySession(): SessionNoConnection;
69
- declare function asClientRpc<State extends object, Init extends PayloadType, Output extends PayloadType, Err extends ProcedureErrorSchemaType>(state: State, proc: Procedure<State, 'rpc', Init, null, Output, Err>, extendedContext?: Omit<ServiceContext, 'state'>, session?: Session<Connection>): (msg: Static<Init>) => Promise<Result<Static<Output>, Static<Err> | Static<typeof ResponseReaderErrorSchema>>>;
70
- declare function asClientStream<State extends object, Init extends PayloadType, Input extends PayloadType, Output extends PayloadType, Err extends ProcedureErrorSchemaType>(state: State, proc: Procedure<State, 'stream', Init, Input, Output, Err>, reqInit?: Static<Init>, extendedContext?: Omit<ServiceContext, 'state'>, session?: Session<Connection>): {
71
- reqWriter: WriteStream<Static<Input>>;
72
- resReader: ReadStream<Static<Output>, Static<Err>>;
72
+ declare function getClientSendFn(clientTransport: ClientTransport<Connection>, serverTransport: ServerTransport<Connection>): SessionBoundSendFn;
73
+ declare function getServerSendFn(serverTransport: ServerTransport<Connection>, clientTransport: ClientTransport<Connection>): SessionBoundSendFn;
74
+ declare function asClientRpc<State extends object, Init extends PayloadType, Res extends PayloadType, Err extends ProcedureErrorSchemaType>(state: State, proc: Procedure<State, 'rpc', Init, null, Res, Err>, extendedContext?: Omit<ServiceContext, 'state'>, session?: Session<Connection>): (msg: Static<Init>) => Promise<Result<Static<Res>, Static<Err> | Static<typeof ReaderErrorSchema>>>;
75
+ declare function asClientStream<State extends object, Init extends PayloadType, Req extends PayloadType, Res extends PayloadType, Err extends ProcedureErrorSchemaType>(state: State, proc: Procedure<State, 'stream', Init, Req, Res, Err>, reqInit?: Static<Init>, extendedContext?: Omit<ServiceContext, 'state'>, session?: Session<Connection>): {
76
+ reqWritable: Writable<Static<Req>>;
77
+ resReadable: Readable<Static<Res>, Static<Err>>;
78
+ };
79
+ declare function asClientSubscription<State extends object, Init extends PayloadType, Res extends PayloadType, Err extends ProcedureErrorSchemaType>(state: State, proc: Procedure<State, 'subscription', Init, null, Res, Err>, extendedContext?: Omit<ServiceContext, 'state'>, session?: Session<Connection>): (msg: Static<Init>) => {
80
+ resReadable: Readable<Static<Res>, Static<Err>>;
73
81
  };
74
- declare function asClientSubscription<State extends object, Init extends PayloadType, Output extends PayloadType, Err extends ProcedureErrorSchemaType>(state: State, proc: Procedure<State, 'subscription', Init, null, Output, Err>, extendedContext?: Omit<ServiceContext, 'state'>, session?: Session<Connection>): (msg: Static<Init>) => {
75
- resReader: ReadStream<Static<Output>, Static<Err>>;
82
+ declare function asClientUpload<State extends object, Init extends PayloadType, Req extends PayloadType, Res extends PayloadType, Err extends ProcedureErrorSchemaType>(state: State, proc: Procedure<State, 'upload', Init, Req, Res, Err>, reqInit?: Static<Init>, extendedContext?: Omit<ServiceContext, 'state'>, session?: Session<Connection>): {
83
+ reqWritable: Writable<Static<Req>>;
84
+ finalize: () => Promise<Result<Static<Res>, Static<Err>>>;
76
85
  };
77
- declare function asClientUpload<State extends object, Init extends PayloadType, Input extends PayloadType, Output extends PayloadType, Err extends ProcedureErrorSchemaType>(state: State, proc: Procedure<State, 'upload', Init, Input, Output, Err>, reqInit?: Static<Init>, extendedContext?: Omit<ServiceContext, 'state'>, session?: Session<Connection>): [
78
- WriteStream<Static<Input>>,
79
- () => Promise<Result<Static<Output>, Static<Err>>>
80
- ];
81
86
  declare function getTransportConnections<ConnType extends Connection>(transport: Transport<ConnType>): Array<ConnType>;
82
87
  declare function numberOfConnections<ConnType extends Connection>(transport: Transport<ConnType>): number;
83
88
  declare function closeAllConnections<ConnType extends Connection>(transport: Transport<ConnType>): void;
84
89
 
85
- export { asClientRpc, asClientStream, asClientSubscription, asClientUpload, closeAllConnections, createDummyTransportMessage, createLocalWebSocketClient, createWebSocketServer, dummySession, getIteratorFromStream, getTransportConnections, iterNext, numberOfConnections, onWsServerReady, payloadToTransportMessage, testingClientSessionOptions, testingSessionOptions, waitForMessage };
90
+ export { asClientRpc, asClientStream, asClientSubscription, asClientUpload, closeAllConnections, createDummyTransportMessage, createLocalWebSocketClient, createWebSocketServer, dummySession, getClientSendFn, getReadableIterator, getServerSendFn, getTransportConnections, isReadableDone, numberOfConnections, onWsServerReady, payloadToTransportMessage, readNextResult, testingClientSessionOptions, testingSessionOptions, waitForMessage };
@@ -1,20 +1,20 @@
1
1
  import {
2
2
  Err,
3
3
  Ok,
4
- ReadStreamImpl,
4
+ ReadableImpl,
5
5
  UNCAUGHT_ERROR_CODE,
6
- WriteStreamImpl
7
- } from "../chunk-MQ6ANR3H.js";
6
+ WritableImpl
7
+ } from "../chunk-Z4PX66JO.js";
8
8
  import {
9
9
  SessionStateGraph,
10
10
  defaultClientTransportOptions,
11
11
  defaultTransportOptions
12
- } from "../chunk-42Z2FQIU.js";
12
+ } from "../chunk-6BH2CXVE.js";
13
13
  import {
14
14
  coerceErrorString,
15
15
  currentProtocolVersion
16
- } from "../chunk-EETL2L77.js";
17
- import "../chunk-4PVU7J25.js";
16
+ } from "../chunk-GJUUVID2.js";
17
+ import "../chunk-AJGIY2UB.js";
18
18
 
19
19
  // util/testHelpers.ts
20
20
  import NodeWs, { WebSocketServer } from "ws";
@@ -38,11 +38,25 @@ function onWsServerReady(server) {
38
38
  });
39
39
  });
40
40
  }
41
- function getIteratorFromStream(readStream) {
42
- return readStream[Symbol.asyncIterator]();
41
+ var readableIterators = /* @__PURE__ */ new WeakMap();
42
+ function getReadableIterator(readable) {
43
+ let iter = readableIterators.get(readable);
44
+ if (!iter) {
45
+ iter = readable[Symbol.asyncIterator]();
46
+ readableIterators.set(readable, iter);
47
+ }
48
+ return iter;
49
+ }
50
+ async function readNextResult(readable) {
51
+ const res = await getReadableIterator(readable).next();
52
+ if (res.done) {
53
+ throw new Error("readNext from a done Readable");
54
+ }
55
+ return res.value;
43
56
  }
44
- async function iterNext(iter) {
45
- return await iter.next().then((res) => res.value);
57
+ async function isReadableDone(readable) {
58
+ const res = await getReadableIterator(readable).next();
59
+ return res.done;
46
60
  }
47
61
  function payloadToTransportMessage(payload) {
48
62
  return {
@@ -92,6 +106,23 @@ function dummySession() {
92
106
  currentProtocolVersion
93
107
  );
94
108
  }
109
+ function getClientSendFn(clientTransport, serverTransport) {
110
+ const session = clientTransport.sessions.get(serverTransport.clientId) ?? clientTransport.createUnconnectedSession(serverTransport.clientId);
111
+ return clientTransport.getSessionBoundSendFn(
112
+ serverTransport.clientId,
113
+ session.id
114
+ );
115
+ }
116
+ function getServerSendFn(serverTransport, clientTransport) {
117
+ const session = serverTransport.sessions.get(clientTransport.clientId);
118
+ if (!session) {
119
+ throw new Error("session not found");
120
+ }
121
+ return serverTransport.getSessionBoundSendFn(
122
+ clientTransport.clientId,
123
+ session.id
124
+ );
125
+ }
95
126
  function dummyCtx(state, session, extendedContext) {
96
127
  return {
97
128
  ...extendedContext,
@@ -99,9 +130,9 @@ function dummyCtx(state, session, extendedContext) {
99
130
  sessionId: session.id,
100
131
  from: session.from,
101
132
  metadata: {},
102
- abortController: new AbortController(),
103
- clientAbortSignal: new AbortController().signal,
104
- onRequestFinished: () => void 0
133
+ // TODO might wanna hook these up!
134
+ cancel: () => void 0,
135
+ signal: new AbortController().signal
105
136
  };
106
137
  }
107
138
  function asClientRpc(state, proc, extendedContext, session = dummySession()) {
@@ -113,38 +144,32 @@ function asClientRpc(state, proc, extendedContext, session = dummySession()) {
113
144
  };
114
145
  }
115
146
  function createResponsePipe() {
116
- const reader = new ReadStreamImpl(() => {
117
- void Promise.resolve().then(() => {
118
- writer.triggerCloseRequest();
119
- });
120
- });
121
- const writer = new WriteStreamImpl(
122
- (v) => {
123
- reader.pushValue(v);
147
+ const readable = new ReadableImpl();
148
+ const writable = new WritableImpl({
149
+ writeCb: (v) => {
150
+ readable._pushValue(v);
151
+ },
152
+ closeCb: () => {
153
+ void Promise.resolve().then(() => {
154
+ readable._triggerClose();
155
+ });
124
156
  }
125
- );
126
- writer.onClose(() => {
127
- void Promise.resolve().then(() => {
128
- reader.triggerClose();
129
- });
130
157
  });
131
- return { reader, writer };
158
+ return { readable, writable };
132
159
  }
133
160
  function createRequestPipe() {
134
- const reader = new ReadStreamImpl(() => {
135
- void Promise.resolve().then(() => {
136
- writer.triggerCloseRequest();
137
- });
138
- });
139
- const writer = new WriteStreamImpl((v) => {
140
- reader.pushValue(Ok(v));
141
- });
142
- writer.onClose(() => {
143
- void Promise.resolve().then(() => {
144
- reader.triggerClose();
145
- });
161
+ const readable = new ReadableImpl();
162
+ const writable = new WritableImpl({
163
+ writeCb: (v) => {
164
+ readable._pushValue(Ok(v));
165
+ },
166
+ closeCb: () => {
167
+ void Promise.resolve().then(() => {
168
+ readable._triggerClose();
169
+ });
170
+ }
146
171
  });
147
- return { reader, writer };
172
+ return { readable, writable };
148
173
  }
149
174
  function asClientStream(state, proc, reqInit, extendedContext, session = dummySession()) {
150
175
  const requestPipe = createRequestPipe();
@@ -152,12 +177,12 @@ function asClientStream(state, proc, reqInit, extendedContext, session = dummySe
152
177
  void proc.handler({
153
178
  ctx: dummyCtx(state, session, extendedContext),
154
179
  reqInit: reqInit ?? {},
155
- reqReader: requestPipe.reader,
156
- resWriter: responsePipe.writer
157
- }).catch((err) => responsePipe.writer.write(catchProcError(err)));
180
+ reqReadable: requestPipe.readable,
181
+ resWritable: responsePipe.writable
182
+ }).catch((err) => responsePipe.writable.write(catchProcError(err)));
158
183
  return {
159
- reqWriter: requestPipe.writer,
160
- resReader: responsePipe.reader
184
+ reqWritable: requestPipe.writable,
185
+ resReadable: responsePipe.readable
161
186
  };
162
187
  }
163
188
  function asClientSubscription(state, proc, extendedContext, session = dummySession()) {
@@ -166,9 +191,11 @@ function asClientSubscription(state, proc, extendedContext, session = dummySessi
166
191
  void proc.handler({
167
192
  ctx: dummyCtx(state, session, extendedContext),
168
193
  reqInit: msg,
169
- resWriter: responsePipe.writer
170
- }).catch((err) => responsePipe.writer.write(catchProcError(err)));
171
- return { resReader: responsePipe.reader };
194
+ resWritable: responsePipe.writable
195
+ }).catch(
196
+ (err) => responsePipe.writable.write(catchProcError(err))
197
+ );
198
+ return { resReadable: responsePipe.readable };
172
199
  };
173
200
  }
174
201
  function asClientUpload(state, proc, reqInit, extendedContext, session = dummySession()) {
@@ -176,9 +203,9 @@ function asClientUpload(state, proc, reqInit, extendedContext, session = dummySe
176
203
  const result = proc.handler({
177
204
  ctx: dummyCtx(state, session, extendedContext),
178
205
  reqInit: reqInit ?? {},
179
- reqReader: requestPipe.reader
206
+ reqReadable: requestPipe.readable
180
207
  }).catch(catchProcError);
181
- return [requestPipe.writer, () => result];
208
+ return { reqWritable: requestPipe.writable, finalize: () => result };
182
209
  }
183
210
  function getTransportConnections(transport) {
184
211
  const connections = [];
@@ -207,12 +234,15 @@ export {
207
234
  createLocalWebSocketClient,
208
235
  createWebSocketServer,
209
236
  dummySession,
210
- getIteratorFromStream,
237
+ getClientSendFn,
238
+ getReadableIterator,
239
+ getServerSendFn,
211
240
  getTransportConnections,
212
- iterNext,
241
+ isReadableDone,
213
242
  numberOfConnections,
214
243
  onWsServerReady,
215
244
  payloadToTransportMessage,
245
+ readNextResult,
216
246
  testingClientSessionOptions,
217
247
  testingSessionOptions,
218
248
  waitForMessage
@@ -1 +1 @@
1
- {"version":3,"sources":["../../util/testHelpers.ts"],"sourcesContent":["import NodeWs, { WebSocketServer } from 'ws';\nimport http from 'node:http';\nimport { Err, Ok, Result, BaseErrorSchemaType } from '../router/result';\nimport {\n ProcedureErrorSchemaType,\n RequestReaderErrorSchema,\n ResponseReaderErrorSchema,\n UNCAUGHT_ERROR_CODE,\n PayloadType,\n Procedure,\n} from '../router/procedures';\nimport { Static } from '@sinclair/typebox';\nimport {\n OpaqueTransportMessage,\n PartialTransportMessage,\n currentProtocolVersion,\n} from '../transport/message';\nimport { coerceErrorString } from './stringify';\nimport { Transport } from '../transport/transport';\nimport {\n ReadStream,\n WriteStream,\n ReadStreamImpl,\n WriteStreamImpl,\n} from '../router/streams';\nimport { ServiceContext, ProcedureHandlerContext } from '../router/context';\nimport { WsLike } from '../transport/impls/ws/wslike';\nimport {\n defaultClientTransportOptions,\n defaultTransportOptions,\n} from '../transport/options';\nimport { Connection } from '../transport/connection';\nimport { SessionState } from '../transport/sessionStateMachine/common';\nimport {\n Session,\n SessionStateGraph,\n} from '../transport/sessionStateMachine/transitions';\n\n/**\n * Creates a WebSocket client that connects to a local server at the specified port.\n * This should only be used for testing.\n * @param port - The port number to connect to.\n * @returns A Promise that resolves to a WebSocket instance.\n */\nexport function createLocalWebSocketClient(port: number): WsLike {\n const sock = new NodeWs(`ws://localhost:${port}`);\n sock.binaryType = 'arraybuffer';\n\n return sock;\n}\n\n/**\n * Creates a WebSocket server instance using the provided HTTP server.\n * Only used as helper for testing.\n * @param server - The HTTP server instance to use for the WebSocket server.\n * @returns A Promise that resolves to the created WebSocket server instance.\n */\nexport function createWebSocketServer(server: http.Server) {\n return new WebSocketServer({ server });\n}\n\n/**\n * Starts listening on the given server and returns the automatically allocated port number.\n * This should only be used for testing.\n * @param server - The http server to listen on.\n * @returns A promise that resolves with the allocated port number.\n * @throws An error if a port cannot be allocated.\n */\nexport function onWsServerReady(server: http.Server): Promise<number> {\n return new Promise((resolve, reject) => {\n server.listen(() => {\n const addr = server.address();\n if (typeof addr === 'object' && addr) {\n resolve(addr.port);\n } else {\n reject(new Error(\"couldn't find a port to allocate\"));\n }\n });\n });\n}\n\nexport function getIteratorFromStream<T, E extends Static<BaseErrorSchemaType>>(\n readStream: ReadStream<T, E>,\n) {\n return readStream[Symbol.asyncIterator]();\n}\n\n/**\n * Retrieves the next value from an async iterable iterator.\n * @param iter The async iterable iterator.\n * @returns A promise that resolves to the next value from the iterator.\n */\nexport async function iterNext<T>(iter: {\n next(): Promise<\n | {\n done: false;\n value: T;\n }\n | {\n done: true;\n value: undefined;\n }\n >;\n}) {\n return await iter.next().then((res) => res.value as T);\n}\n\nexport function payloadToTransportMessage<Payload>(\n payload: Payload,\n): PartialTransportMessage<Payload> {\n return {\n streamId: 'stream',\n controlFlags: 0,\n payload,\n };\n}\n\nexport function createDummyTransportMessage() {\n return payloadToTransportMessage({\n msg: 'cool',\n test: Math.random(),\n });\n}\n\n/**\n * Waits for a message on the transport.\n * @param {Transport} t - The transport to listen to.\n * @param filter - An optional filter function to apply to the received messages.\n * @returns A promise that resolves with the payload of the first message that passes the filter.\n */\nexport async function waitForMessage(\n t: Transport<Connection>,\n filter?: (msg: OpaqueTransportMessage) => boolean,\n rejectMismatch?: boolean,\n) {\n return new Promise((resolve, reject) => {\n function cleanup() {\n t.removeEventListener('message', onMessage);\n }\n\n function onMessage(msg: OpaqueTransportMessage) {\n if (!filter || filter(msg)) {\n cleanup();\n resolve(msg.payload);\n } else if (rejectMismatch) {\n cleanup();\n reject(new Error('message didnt match the filter'));\n }\n }\n\n t.addEventListener('message', onMessage);\n });\n}\n\nfunction catchProcError(err: unknown) {\n const errorMsg = coerceErrorString(err);\n return Err({ code: UNCAUGHT_ERROR_CODE, message: errorMsg });\n}\n\nexport const testingSessionOptions = defaultTransportOptions;\nexport const testingClientSessionOptions = defaultClientTransportOptions;\n\nexport function dummySession() {\n return SessionStateGraph.entrypoints.NoConnection(\n 'client',\n 'server',\n {\n onSessionGracePeriodElapsed: () => {\n /* noop */\n },\n },\n testingSessionOptions,\n currentProtocolVersion,\n );\n}\n\nfunction dummyCtx<State>(\n state: State,\n session: Session<Connection>,\n extendedContext?: Omit<ServiceContext, 'state'>,\n): ProcedureHandlerContext<State> {\n return {\n ...extendedContext,\n state,\n sessionId: session.id,\n from: session.from,\n metadata: {},\n abortController: new AbortController(),\n clientAbortSignal: new AbortController().signal,\n onRequestFinished: () => undefined,\n };\n}\n\nexport function asClientRpc<\n State extends object,\n Init extends PayloadType,\n Output extends PayloadType,\n Err extends ProcedureErrorSchemaType,\n>(\n state: State,\n proc: Procedure<State, 'rpc', Init, null, Output, Err>,\n extendedContext?: Omit<ServiceContext, 'state'>,\n session: Session<Connection> = dummySession(),\n) {\n return async (\n msg: Static<Init>,\n ): Promise<\n Result<\n Static<Output>,\n Static<Err> | Static<typeof ResponseReaderErrorSchema>\n >\n > => {\n return proc\n .handler({\n ctx: dummyCtx(state, session, extendedContext),\n reqInit: msg,\n })\n .catch(catchProcError);\n };\n}\n\nfunction createResponsePipe<\n Output extends PayloadType,\n Err extends ProcedureErrorSchemaType,\n>(): {\n reader: ReadStream<\n Static<Output>,\n Static<Err> | Static<typeof ResponseReaderErrorSchema>\n >;\n writer: WriteStream<Result<Static<Output>, Static<Err>>>;\n} {\n const reader = new ReadStreamImpl<\n Static<Output>,\n Static<Err> | Static<typeof ResponseReaderErrorSchema>\n >(() => {\n // Make it async to simulate request going over the wire\n // using promises so that we don't get affected by fake timers.\n void Promise.resolve().then(() => {\n writer.triggerCloseRequest();\n });\n });\n const writer = new WriteStreamImpl<Result<Static<Output>, Static<Err>>>(\n (v) => {\n reader.pushValue(v);\n },\n );\n writer.onClose(() => {\n // Make it async to simulate request going over the wire\n // using promises so that we don't get affected by fake timers.\n void Promise.resolve().then(() => {\n reader.triggerClose();\n });\n });\n\n return { reader, writer };\n}\n\nfunction createRequestPipe<Input extends PayloadType>(): {\n reader: ReadStream<Static<Input>, Static<typeof RequestReaderErrorSchema>>;\n writer: WriteStream<Static<Input>>;\n} {\n const reader = new ReadStreamImpl<\n Static<Input>,\n Static<typeof RequestReaderErrorSchema>\n >(() => {\n // Make it async to simulate request going over the wire\n // using promises so that we don't get affected by fake timers.\n void Promise.resolve().then(() => {\n writer.triggerCloseRequest();\n });\n });\n const writer = new WriteStreamImpl<Static<Input>>((v) => {\n reader.pushValue(Ok(v));\n });\n writer.onClose(() => {\n // Make it async to simulate request going over the wire\n // using promises so that we don't get affected by fake timers.\n void Promise.resolve().then(() => {\n reader.triggerClose();\n });\n });\n\n return { reader, writer };\n}\n\nexport function asClientStream<\n State extends object,\n Init extends PayloadType,\n Input extends PayloadType,\n Output extends PayloadType,\n Err extends ProcedureErrorSchemaType,\n>(\n state: State,\n proc: Procedure<State, 'stream', Init, Input, Output, Err>,\n reqInit?: Static<Init>,\n extendedContext?: Omit<ServiceContext, 'state'>,\n session: Session<Connection> = dummySession(),\n): {\n reqWriter: WriteStream<Static<Input>>;\n resReader: ReadStream<Static<Output>, Static<Err>>;\n} {\n const requestPipe = createRequestPipe<Input>();\n const responsePipe = createResponsePipe<Output, Err>();\n\n void proc\n .handler({\n ctx: dummyCtx(state, session, extendedContext),\n reqInit: reqInit ?? {},\n reqReader: requestPipe.reader,\n resWriter: responsePipe.writer,\n })\n .catch((err: unknown) => responsePipe.writer.write(catchProcError(err)));\n\n return {\n reqWriter: requestPipe.writer,\n resReader: responsePipe.reader,\n };\n}\n\nexport function asClientSubscription<\n State extends object,\n Init extends PayloadType,\n Output extends PayloadType,\n Err extends ProcedureErrorSchemaType,\n>(\n state: State,\n proc: Procedure<State, 'subscription', Init, null, Output, Err>,\n extendedContext?: Omit<ServiceContext, 'state'>,\n session: Session<Connection> = dummySession(),\n): (msg: Static<Init>) => {\n resReader: ReadStream<Static<Output>, Static<Err>>;\n} {\n const responsePipe = createResponsePipe<Output, Err>();\n\n return (msg: Static<Init>) => {\n void proc\n .handler({\n ctx: dummyCtx(state, session, extendedContext),\n reqInit: msg,\n resWriter: responsePipe.writer,\n })\n .catch((err: unknown) => responsePipe.writer.write(catchProcError(err)));\n\n return { resReader: responsePipe.reader };\n };\n}\n\nexport function asClientUpload<\n State extends object,\n Init extends PayloadType,\n Input extends PayloadType,\n Output extends PayloadType,\n Err extends ProcedureErrorSchemaType,\n>(\n state: State,\n proc: Procedure<State, 'upload', Init, Input, Output, Err>,\n reqInit?: Static<Init>,\n extendedContext?: Omit<ServiceContext, 'state'>,\n session: Session<Connection> = dummySession(),\n): [\n WriteStream<Static<Input>>,\n () => Promise<Result<Static<Output>, Static<Err>>>,\n] {\n const requestPipe = createRequestPipe<Input>();\n const result = proc\n .handler({\n ctx: dummyCtx(state, session, extendedContext),\n reqInit: reqInit ?? {},\n reqReader: requestPipe.reader,\n })\n .catch(catchProcError);\n\n return [requestPipe.writer, () => result];\n}\n\nexport function getTransportConnections<ConnType extends Connection>(\n transport: Transport<ConnType>,\n): Array<ConnType> {\n const connections = [];\n for (const session of transport.sessions.values()) {\n if (session.state === SessionState.Connected) {\n connections.push(session.conn);\n }\n }\n\n return connections;\n}\n\nexport function numberOfConnections<ConnType extends Connection>(\n transport: Transport<ConnType>,\n): number {\n return getTransportConnections(transport).length;\n}\n\nexport function closeAllConnections<ConnType extends Connection>(\n transport: Transport<ConnType>,\n) {\n for (const conn of getTransportConnections(transport)) {\n conn.close();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,OAAO,UAAU,uBAAuB;AA4CjC,SAAS,2BAA2B,MAAsB;AAC/D,QAAM,OAAO,IAAI,OAAO,kBAAkB,IAAI,EAAE;AAChD,OAAK,aAAa;AAElB,SAAO;AACT;AAQO,SAAS,sBAAsB,QAAqB;AACzD,SAAO,IAAI,gBAAgB,EAAE,OAAO,CAAC;AACvC;AASO,SAAS,gBAAgB,QAAsC;AACpE,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,WAAO,OAAO,MAAM;AAClB,YAAM,OAAO,OAAO,QAAQ;AAC5B,UAAI,OAAO,SAAS,YAAY,MAAM;AACpC,gBAAQ,KAAK,IAAI;AAAA,MACnB,OAAO;AACL,eAAO,IAAI,MAAM,kCAAkC,CAAC;AAAA,MACtD;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,sBACd,YACA;AACA,SAAO,WAAW,OAAO,aAAa,EAAE;AAC1C;AAOA,eAAsB,SAAY,MAW/B;AACD,SAAO,MAAM,KAAK,KAAK,EAAE,KAAK,CAAC,QAAQ,IAAI,KAAU;AACvD;AAEO,SAAS,0BACd,SACkC;AAClC,SAAO;AAAA,IACL,UAAU;AAAA,IACV,cAAc;AAAA,IACd;AAAA,EACF;AACF;AAEO,SAAS,8BAA8B;AAC5C,SAAO,0BAA0B;AAAA,IAC/B,KAAK;AAAA,IACL,MAAM,KAAK,OAAO;AAAA,EACpB,CAAC;AACH;AAQA,eAAsB,eACpB,GACA,QACA,gBACA;AACA,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,aAAS,UAAU;AACjB,QAAE,oBAAoB,WAAW,SAAS;AAAA,IAC5C;AAEA,aAAS,UAAU,KAA6B;AAC9C,UAAI,CAAC,UAAU,OAAO,GAAG,GAAG;AAC1B,gBAAQ;AACR,gBAAQ,IAAI,OAAO;AAAA,MACrB,WAAW,gBAAgB;AACzB,gBAAQ;AACR,eAAO,IAAI,MAAM,gCAAgC,CAAC;AAAA,MACpD;AAAA,IACF;AAEA,MAAE,iBAAiB,WAAW,SAAS;AAAA,EACzC,CAAC;AACH;AAEA,SAAS,eAAe,KAAc;AACpC,QAAM,WAAW,kBAAkB,GAAG;AACtC,SAAO,IAAI,EAAE,MAAM,qBAAqB,SAAS,SAAS,CAAC;AAC7D;AAEO,IAAM,wBAAwB;AAC9B,IAAM,8BAA8B;AAEpC,SAAS,eAAe;AAC7B,SAAO,kBAAkB,YAAY;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,MACE,6BAA6B,MAAM;AAAA,MAEnC;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,SACP,OACA,SACA,iBACgC;AAChC,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA,WAAW,QAAQ;AAAA,IACnB,MAAM,QAAQ;AAAA,IACd,UAAU,CAAC;AAAA,IACX,iBAAiB,IAAI,gBAAgB;AAAA,IACrC,mBAAmB,IAAI,gBAAgB,EAAE;AAAA,IACzC,mBAAmB,MAAM;AAAA,EAC3B;AACF;AAEO,SAAS,YAMd,OACA,MACA,iBACA,UAA+B,aAAa,GAC5C;AACA,SAAO,OACL,QAMG;AACH,WAAO,KACJ,QAAQ;AAAA,MACP,KAAK,SAAS,OAAO,SAAS,eAAe;AAAA,MAC7C,SAAS;AAAA,IACX,CAAC,EACA,MAAM,cAAc;AAAA,EACzB;AACF;AAEA,SAAS,qBASP;AACA,QAAM,SAAS,IAAI,eAGjB,MAAM;AAGN,SAAK,QAAQ,QAAQ,EAAE,KAAK,MAAM;AAChC,aAAO,oBAAoB;AAAA,IAC7B,CAAC;AAAA,EACH,CAAC;AACD,QAAM,SAAS,IAAI;AAAA,IACjB,CAAC,MAAM;AACL,aAAO,UAAU,CAAC;AAAA,IACpB;AAAA,EACF;AACA,SAAO,QAAQ,MAAM;AAGnB,SAAK,QAAQ,QAAQ,EAAE,KAAK,MAAM;AAChC,aAAO,aAAa;AAAA,IACtB,CAAC;AAAA,EACH,CAAC;AAED,SAAO,EAAE,QAAQ,OAAO;AAC1B;AAEA,SAAS,oBAGP;AACA,QAAM,SAAS,IAAI,eAGjB,MAAM;AAGN,SAAK,QAAQ,QAAQ,EAAE,KAAK,MAAM;AAChC,aAAO,oBAAoB;AAAA,IAC7B,CAAC;AAAA,EACH,CAAC;AACD,QAAM,SAAS,IAAI,gBAA+B,CAAC,MAAM;AACvD,WAAO,UAAU,GAAG,CAAC,CAAC;AAAA,EACxB,CAAC;AACD,SAAO,QAAQ,MAAM;AAGnB,SAAK,QAAQ,QAAQ,EAAE,KAAK,MAAM;AAChC,aAAO,aAAa;AAAA,IACtB,CAAC;AAAA,EACH,CAAC;AAED,SAAO,EAAE,QAAQ,OAAO;AAC1B;AAEO,SAAS,eAOd,OACA,MACA,SACA,iBACA,UAA+B,aAAa,GAI5C;AACA,QAAM,cAAc,kBAAyB;AAC7C,QAAM,eAAe,mBAAgC;AAErD,OAAK,KACF,QAAQ;AAAA,IACP,KAAK,SAAS,OAAO,SAAS,eAAe;AAAA,IAC7C,SAAS,WAAW,CAAC;AAAA,IACrB,WAAW,YAAY;AAAA,IACvB,WAAW,aAAa;AAAA,EAC1B,CAAC,EACA,MAAM,CAAC,QAAiB,aAAa,OAAO,MAAM,eAAe,GAAG,CAAC,CAAC;AAEzE,SAAO;AAAA,IACL,WAAW,YAAY;AAAA,IACvB,WAAW,aAAa;AAAA,EAC1B;AACF;AAEO,SAAS,qBAMd,OACA,MACA,iBACA,UAA+B,aAAa,GAG5C;AACA,QAAM,eAAe,mBAAgC;AAErD,SAAO,CAAC,QAAsB;AAC5B,SAAK,KACF,QAAQ;AAAA,MACP,KAAK,SAAS,OAAO,SAAS,eAAe;AAAA,MAC7C,SAAS;AAAA,MACT,WAAW,aAAa;AAAA,IAC1B,CAAC,EACA,MAAM,CAAC,QAAiB,aAAa,OAAO,MAAM,eAAe,GAAG,CAAC,CAAC;AAEzE,WAAO,EAAE,WAAW,aAAa,OAAO;AAAA,EAC1C;AACF;AAEO,SAAS,eAOd,OACA,MACA,SACA,iBACA,UAA+B,aAAa,GAI5C;AACA,QAAM,cAAc,kBAAyB;AAC7C,QAAM,SAAS,KACZ,QAAQ;AAAA,IACP,KAAK,SAAS,OAAO,SAAS,eAAe;AAAA,IAC7C,SAAS,WAAW,CAAC;AAAA,IACrB,WAAW,YAAY;AAAA,EACzB,CAAC,EACA,MAAM,cAAc;AAEvB,SAAO,CAAC,YAAY,QAAQ,MAAM,MAAM;AAC1C;AAEO,SAAS,wBACd,WACiB;AACjB,QAAM,cAAc,CAAC;AACrB,aAAW,WAAW,UAAU,SAAS,OAAO,GAAG;AACjD,QAAI,QAAQ,uCAAkC;AAC5C,kBAAY,KAAK,QAAQ,IAAI;AAAA,IAC/B;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,oBACd,WACQ;AACR,SAAO,wBAAwB,SAAS,EAAE;AAC5C;AAEO,SAAS,oBACd,WACA;AACA,aAAW,QAAQ,wBAAwB,SAAS,GAAG;AACrD,SAAK,MAAM;AAAA,EACb;AACF;","names":[]}
1
+ {"version":3,"sources":["../../util/testHelpers.ts"],"sourcesContent":["import NodeWs, { WebSocketServer } from 'ws';\nimport http from 'node:http';\nimport { Err, Ok, Result } from '../router/result';\nimport { PayloadType, Procedure } from '../router/procedures';\nimport { Static } from '@sinclair/typebox';\nimport {\n OpaqueTransportMessage,\n PartialTransportMessage,\n currentProtocolVersion,\n} from '../transport/message';\nimport { coerceErrorString } from './stringify';\nimport { Transport } from '../transport/transport';\nimport {\n Readable,\n ReadableImpl,\n ReadableResult,\n ReadableIterator,\n Writable,\n WritableImpl,\n} from '../router/streams';\nimport { ServiceContext, ProcedureHandlerContext } from '../router/context';\nimport { WsLike } from '../transport/impls/ws/wslike';\nimport {\n defaultClientTransportOptions,\n defaultTransportOptions,\n} from '../transport/options';\nimport { Connection } from '../transport/connection';\nimport { SessionState } from '../transport/sessionStateMachine/common';\nimport {\n Session,\n SessionStateGraph,\n} from '../transport/sessionStateMachine/transitions';\nimport {\n BaseErrorSchemaType,\n ProcedureErrorSchemaType,\n ReaderErrorSchema,\n UNCAUGHT_ERROR_CODE,\n} from '../router/errors';\nimport { ClientTransport } from '../transport/client';\nimport { ServerTransport } from '../transport/server';\n\n/**\n * Creates a WebSocket client that connects to a local server at the specified port.\n * This should only be used for testing.\n * @param port - The port number to connect to.\n * @returns A Promise that resolves to a WebSocket instance.\n */\nexport function createLocalWebSocketClient(port: number): WsLike {\n const sock = new NodeWs(`ws://localhost:${port}`);\n sock.binaryType = 'arraybuffer';\n\n return sock;\n}\n\n/**\n * Creates a WebSocket server instance using the provided HTTP server.\n * Only used as helper for testing.\n * @param server - The HTTP server instance to use for the WebSocket server.\n * @returns A Promise that resolves to the created WebSocket server instance.\n */\nexport function createWebSocketServer(server: http.Server) {\n return new WebSocketServer({ server });\n}\n\n/**\n * Starts listening on the given server and returns the automatically allocated port number.\n * This should only be used for testing.\n * @param server - The http server to listen on.\n * @returns A promise that resolves with the allocated port number.\n * @throws An error if a port cannot be allocated.\n */\nexport function onWsServerReady(server: http.Server): Promise<number> {\n return new Promise((resolve, reject) => {\n server.listen(() => {\n const addr = server.address();\n if (typeof addr === 'object' && addr) {\n resolve(addr.port);\n } else {\n reject(new Error(\"couldn't find a port to allocate\"));\n }\n });\n });\n}\n\nconst readableIterators = new WeakMap<\n Readable<unknown, Static<BaseErrorSchemaType>>,\n ReadableIterator<unknown, Static<BaseErrorSchemaType>>\n>();\n\n/**\n * A safe way to access {@link Readble}'s iterator multiple times in test helpers.\n *\n * If there are other iteration attempts outside of the test helpers\n * (this function, {@link readNextResult}, and {@link isReadableDone})\n * it will throw an error.\n */\nexport function getReadableIterator<T, E extends Static<BaseErrorSchemaType>>(\n readable: Readable<T, E>,\n): ReadableIterator<T, E> {\n let iter = readableIterators.get(readable) as\n | ReadableIterator<T, E>\n | undefined;\n\n if (!iter) {\n iter = readable[Symbol.asyncIterator]();\n readableIterators.set(readable, iter);\n }\n\n return iter;\n}\n\n/**\n * Retrieves the next value from {@link Readable}, or throws an error if the Readable is done.\n *\n * Calling semantics are similar to {@link getReadableIterator}\n */\nexport async function readNextResult<T, E extends Static<BaseErrorSchemaType>>(\n readable: Readable<T, E>,\n): Promise<ReadableResult<T, E>> {\n const res = await getReadableIterator(readable).next();\n\n if (res.done) {\n throw new Error('readNext from a done Readable');\n }\n\n return res.value;\n}\n\n/**\n * Checks if the readable is done iterating, it consumes an iteration in the process.\n *\n * Calling semantics are similar to {@link getReadableIterator}\n */\nexport async function isReadableDone<T, E extends Static<BaseErrorSchemaType>>(\n readable: Readable<T, E>,\n) {\n const res = await getReadableIterator(readable).next();\n\n return res.done;\n}\n\nexport function payloadToTransportMessage<Payload>(\n payload: Payload,\n): PartialTransportMessage<Payload> {\n return {\n streamId: 'stream',\n controlFlags: 0,\n payload,\n };\n}\n\nexport function createDummyTransportMessage() {\n return payloadToTransportMessage({\n msg: 'cool',\n test: Math.random(),\n });\n}\n\n/**\n * Waits for a message on the transport.\n * @param {Transport} t - The transport to listen to.\n * @param filter - An optional filter function to apply to the received messages.\n * @returns A promise that resolves with the payload of the first message that passes the filter.\n */\nexport async function waitForMessage(\n t: Transport<Connection>,\n filter?: (msg: OpaqueTransportMessage) => boolean,\n rejectMismatch?: boolean,\n) {\n return new Promise((resolve, reject) => {\n function cleanup() {\n t.removeEventListener('message', onMessage);\n }\n\n function onMessage(msg: OpaqueTransportMessage) {\n if (!filter || filter(msg)) {\n cleanup();\n resolve(msg.payload);\n } else if (rejectMismatch) {\n cleanup();\n reject(new Error('message didnt match the filter'));\n }\n }\n\n t.addEventListener('message', onMessage);\n });\n}\n\nfunction catchProcError(err: unknown) {\n const errorMsg = coerceErrorString(err);\n\n return Err({ code: UNCAUGHT_ERROR_CODE, message: errorMsg });\n}\n\nexport const testingSessionOptions = defaultTransportOptions;\nexport const testingClientSessionOptions = defaultClientTransportOptions;\n\nexport function dummySession() {\n return SessionStateGraph.entrypoints.NoConnection(\n 'client',\n 'server',\n {\n onSessionGracePeriodElapsed: () => {\n /* noop */\n },\n },\n testingSessionOptions,\n currentProtocolVersion,\n );\n}\n\nexport function getClientSendFn(\n clientTransport: ClientTransport<Connection>,\n serverTransport: ServerTransport<Connection>,\n) {\n const session =\n clientTransport.sessions.get(serverTransport.clientId) ??\n clientTransport.createUnconnectedSession(serverTransport.clientId);\n\n return clientTransport.getSessionBoundSendFn(\n serverTransport.clientId,\n session.id,\n );\n}\n\nexport function getServerSendFn(\n serverTransport: ServerTransport<Connection>,\n clientTransport: ClientTransport<Connection>,\n) {\n const session = serverTransport.sessions.get(clientTransport.clientId);\n if (!session) {\n throw new Error('session not found');\n }\n\n return serverTransport.getSessionBoundSendFn(\n clientTransport.clientId,\n session.id,\n );\n}\n\nfunction dummyCtx<State>(\n state: State,\n session: Session<Connection>,\n extendedContext?: Omit<ServiceContext, 'state'>,\n): ProcedureHandlerContext<State> {\n return {\n ...extendedContext,\n state,\n sessionId: session.id,\n from: session.from,\n metadata: {},\n // TODO might wanna hook these up!\n cancel: () => undefined,\n signal: new AbortController().signal,\n };\n}\n\nexport function asClientRpc<\n State extends object,\n Init extends PayloadType,\n Res extends PayloadType,\n Err extends ProcedureErrorSchemaType,\n>(\n state: State,\n proc: Procedure<State, 'rpc', Init, null, Res, Err>,\n extendedContext?: Omit<ServiceContext, 'state'>,\n session: Session<Connection> = dummySession(),\n) {\n return async (\n msg: Static<Init>,\n ): Promise<\n Result<Static<Res>, Static<Err> | Static<typeof ReaderErrorSchema>>\n > => {\n return proc\n .handler({\n ctx: dummyCtx(state, session, extendedContext),\n reqInit: msg,\n })\n .catch(catchProcError);\n };\n}\n\nfunction createResponsePipe<\n Res extends PayloadType,\n Err extends ProcedureErrorSchemaType,\n>(): {\n readable: Readable<\n Static<Res>,\n Static<Err> | Static<typeof ReaderErrorSchema>\n >;\n writable: Writable<Result<Static<Res>, Static<Err>>>;\n} {\n const readable = new ReadableImpl<\n Static<Res>,\n Static<Err> | Static<typeof ReaderErrorSchema>\n >();\n const writable = new WritableImpl<Result<Static<Res>, Static<Err>>>({\n writeCb: (v) => {\n readable._pushValue(v);\n },\n closeCb: () => {\n // Make it async to simulate request going over the wire\n // using promises so that we don't get affected by fake timers.\n void Promise.resolve().then(() => {\n readable._triggerClose();\n });\n },\n });\n\n return { readable, writable };\n}\n\nfunction createRequestPipe<Req extends PayloadType>(): {\n readable: Readable<Static<Req>, Static<typeof ReaderErrorSchema>>;\n writable: Writable<Static<Req>>;\n} {\n const readable = new ReadableImpl<\n Static<Req>,\n Static<typeof ReaderErrorSchema>\n >();\n const writable = new WritableImpl<Static<Req>>({\n writeCb: (v) => {\n readable._pushValue(Ok(v));\n },\n closeCb: () => {\n // Make it async to simulate request going over the wire\n // using promises so that we don't get affected by fake timers.\n void Promise.resolve().then(() => {\n readable._triggerClose();\n });\n },\n });\n\n return { readable, writable };\n}\n\nexport function asClientStream<\n State extends object,\n Init extends PayloadType,\n Req extends PayloadType,\n Res extends PayloadType,\n Err extends ProcedureErrorSchemaType,\n>(\n state: State,\n proc: Procedure<State, 'stream', Init, Req, Res, Err>,\n reqInit?: Static<Init>,\n extendedContext?: Omit<ServiceContext, 'state'>,\n session: Session<Connection> = dummySession(),\n): {\n reqWritable: Writable<Static<Req>>;\n resReadable: Readable<Static<Res>, Static<Err>>;\n} {\n const requestPipe = createRequestPipe<Req>();\n const responsePipe = createResponsePipe<Res, Err>();\n\n void proc\n .handler({\n ctx: dummyCtx(state, session, extendedContext),\n reqInit: reqInit ?? {},\n reqReadable: requestPipe.readable,\n resWritable: responsePipe.writable,\n })\n .catch((err: unknown) => responsePipe.writable.write(catchProcError(err)));\n\n return {\n reqWritable: requestPipe.writable,\n resReadable: responsePipe.readable,\n };\n}\n\nexport function asClientSubscription<\n State extends object,\n Init extends PayloadType,\n Res extends PayloadType,\n Err extends ProcedureErrorSchemaType,\n>(\n state: State,\n proc: Procedure<State, 'subscription', Init, null, Res, Err>,\n extendedContext?: Omit<ServiceContext, 'state'>,\n session: Session<Connection> = dummySession(),\n): (msg: Static<Init>) => {\n resReadable: Readable<Static<Res>, Static<Err>>;\n} {\n const responsePipe = createResponsePipe<Res, Err>();\n\n return (msg: Static<Init>) => {\n void proc\n .handler({\n ctx: dummyCtx(state, session, extendedContext),\n reqInit: msg,\n resWritable: responsePipe.writable,\n })\n .catch((err: unknown) =>\n responsePipe.writable.write(catchProcError(err)),\n );\n\n return { resReadable: responsePipe.readable };\n };\n}\n\nexport function asClientUpload<\n State extends object,\n Init extends PayloadType,\n Req extends PayloadType,\n Res extends PayloadType,\n Err extends ProcedureErrorSchemaType,\n>(\n state: State,\n proc: Procedure<State, 'upload', Init, Req, Res, Err>,\n reqInit?: Static<Init>,\n extendedContext?: Omit<ServiceContext, 'state'>,\n session: Session<Connection> = dummySession(),\n): {\n reqWritable: Writable<Static<Req>>;\n finalize: () => Promise<Result<Static<Res>, Static<Err>>>;\n} {\n const requestPipe = createRequestPipe<Req>();\n const result = proc\n .handler({\n ctx: dummyCtx(state, session, extendedContext),\n reqInit: reqInit ?? {},\n reqReadable: requestPipe.readable,\n })\n .catch(catchProcError);\n\n return { reqWritable: requestPipe.writable, finalize: () => result };\n}\n\nexport function getTransportConnections<ConnType extends Connection>(\n transport: Transport<ConnType>,\n): Array<ConnType> {\n const connections = [];\n for (const session of transport.sessions.values()) {\n if (session.state === SessionState.Connected) {\n connections.push(session.conn);\n }\n }\n\n return connections;\n}\n\nexport function numberOfConnections<ConnType extends Connection>(\n transport: Transport<ConnType>,\n): number {\n return getTransportConnections(transport).length;\n}\n\nexport function closeAllConnections<ConnType extends Connection>(\n transport: Transport<ConnType>,\n) {\n for (const conn of getTransportConnections(transport)) {\n conn.close();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,OAAO,UAAU,uBAAuB;AA+CjC,SAAS,2BAA2B,MAAsB;AAC/D,QAAM,OAAO,IAAI,OAAO,kBAAkB,IAAI,EAAE;AAChD,OAAK,aAAa;AAElB,SAAO;AACT;AAQO,SAAS,sBAAsB,QAAqB;AACzD,SAAO,IAAI,gBAAgB,EAAE,OAAO,CAAC;AACvC;AASO,SAAS,gBAAgB,QAAsC;AACpE,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,WAAO,OAAO,MAAM;AAClB,YAAM,OAAO,OAAO,QAAQ;AAC5B,UAAI,OAAO,SAAS,YAAY,MAAM;AACpC,gBAAQ,KAAK,IAAI;AAAA,MACnB,OAAO;AACL,eAAO,IAAI,MAAM,kCAAkC,CAAC;AAAA,MACtD;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEA,IAAM,oBAAoB,oBAAI,QAG5B;AASK,SAAS,oBACd,UACwB;AACxB,MAAI,OAAO,kBAAkB,IAAI,QAAQ;AAIzC,MAAI,CAAC,MAAM;AACT,WAAO,SAAS,OAAO,aAAa,EAAE;AACtC,sBAAkB,IAAI,UAAU,IAAI;AAAA,EACtC;AAEA,SAAO;AACT;AAOA,eAAsB,eACpB,UAC+B;AAC/B,QAAM,MAAM,MAAM,oBAAoB,QAAQ,EAAE,KAAK;AAErD,MAAI,IAAI,MAAM;AACZ,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACjD;AAEA,SAAO,IAAI;AACb;AAOA,eAAsB,eACpB,UACA;AACA,QAAM,MAAM,MAAM,oBAAoB,QAAQ,EAAE,KAAK;AAErD,SAAO,IAAI;AACb;AAEO,SAAS,0BACd,SACkC;AAClC,SAAO;AAAA,IACL,UAAU;AAAA,IACV,cAAc;AAAA,IACd;AAAA,EACF;AACF;AAEO,SAAS,8BAA8B;AAC5C,SAAO,0BAA0B;AAAA,IAC/B,KAAK;AAAA,IACL,MAAM,KAAK,OAAO;AAAA,EACpB,CAAC;AACH;AAQA,eAAsB,eACpB,GACA,QACA,gBACA;AACA,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,aAAS,UAAU;AACjB,QAAE,oBAAoB,WAAW,SAAS;AAAA,IAC5C;AAEA,aAAS,UAAU,KAA6B;AAC9C,UAAI,CAAC,UAAU,OAAO,GAAG,GAAG;AAC1B,gBAAQ;AACR,gBAAQ,IAAI,OAAO;AAAA,MACrB,WAAW,gBAAgB;AACzB,gBAAQ;AACR,eAAO,IAAI,MAAM,gCAAgC,CAAC;AAAA,MACpD;AAAA,IACF;AAEA,MAAE,iBAAiB,WAAW,SAAS;AAAA,EACzC,CAAC;AACH;AAEA,SAAS,eAAe,KAAc;AACpC,QAAM,WAAW,kBAAkB,GAAG;AAEtC,SAAO,IAAI,EAAE,MAAM,qBAAqB,SAAS,SAAS,CAAC;AAC7D;AAEO,IAAM,wBAAwB;AAC9B,IAAM,8BAA8B;AAEpC,SAAS,eAAe;AAC7B,SAAO,kBAAkB,YAAY;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,MACE,6BAA6B,MAAM;AAAA,MAEnC;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,gBACd,iBACA,iBACA;AACA,QAAM,UACJ,gBAAgB,SAAS,IAAI,gBAAgB,QAAQ,KACrD,gBAAgB,yBAAyB,gBAAgB,QAAQ;AAEnE,SAAO,gBAAgB;AAAA,IACrB,gBAAgB;AAAA,IAChB,QAAQ;AAAA,EACV;AACF;AAEO,SAAS,gBACd,iBACA,iBACA;AACA,QAAM,UAAU,gBAAgB,SAAS,IAAI,gBAAgB,QAAQ;AACrE,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,mBAAmB;AAAA,EACrC;AAEA,SAAO,gBAAgB;AAAA,IACrB,gBAAgB;AAAA,IAChB,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,SACP,OACA,SACA,iBACgC;AAChC,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA,WAAW,QAAQ;AAAA,IACnB,MAAM,QAAQ;AAAA,IACd,UAAU,CAAC;AAAA;AAAA,IAEX,QAAQ,MAAM;AAAA,IACd,QAAQ,IAAI,gBAAgB,EAAE;AAAA,EAChC;AACF;AAEO,SAAS,YAMd,OACA,MACA,iBACA,UAA+B,aAAa,GAC5C;AACA,SAAO,OACL,QAGG;AACH,WAAO,KACJ,QAAQ;AAAA,MACP,KAAK,SAAS,OAAO,SAAS,eAAe;AAAA,MAC7C,SAAS;AAAA,IACX,CAAC,EACA,MAAM,cAAc;AAAA,EACzB;AACF;AAEA,SAAS,qBASP;AACA,QAAM,WAAW,IAAI,aAGnB;AACF,QAAM,WAAW,IAAI,aAA+C;AAAA,IAClE,SAAS,CAAC,MAAM;AACd,eAAS,WAAW,CAAC;AAAA,IACvB;AAAA,IACA,SAAS,MAAM;AAGb,WAAK,QAAQ,QAAQ,EAAE,KAAK,MAAM;AAChC,iBAAS,cAAc;AAAA,MACzB,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO,EAAE,UAAU,SAAS;AAC9B;AAEA,SAAS,oBAGP;AACA,QAAM,WAAW,IAAI,aAGnB;AACF,QAAM,WAAW,IAAI,aAA0B;AAAA,IAC7C,SAAS,CAAC,MAAM;AACd,eAAS,WAAW,GAAG,CAAC,CAAC;AAAA,IAC3B;AAAA,IACA,SAAS,MAAM;AAGb,WAAK,QAAQ,QAAQ,EAAE,KAAK,MAAM;AAChC,iBAAS,cAAc;AAAA,MACzB,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO,EAAE,UAAU,SAAS;AAC9B;AAEO,SAAS,eAOd,OACA,MACA,SACA,iBACA,UAA+B,aAAa,GAI5C;AACA,QAAM,cAAc,kBAAuB;AAC3C,QAAM,eAAe,mBAA6B;AAElD,OAAK,KACF,QAAQ;AAAA,IACP,KAAK,SAAS,OAAO,SAAS,eAAe;AAAA,IAC7C,SAAS,WAAW,CAAC;AAAA,IACrB,aAAa,YAAY;AAAA,IACzB,aAAa,aAAa;AAAA,EAC5B,CAAC,EACA,MAAM,CAAC,QAAiB,aAAa,SAAS,MAAM,eAAe,GAAG,CAAC,CAAC;AAE3E,SAAO;AAAA,IACL,aAAa,YAAY;AAAA,IACzB,aAAa,aAAa;AAAA,EAC5B;AACF;AAEO,SAAS,qBAMd,OACA,MACA,iBACA,UAA+B,aAAa,GAG5C;AACA,QAAM,eAAe,mBAA6B;AAElD,SAAO,CAAC,QAAsB;AAC5B,SAAK,KACF,QAAQ;AAAA,MACP,KAAK,SAAS,OAAO,SAAS,eAAe;AAAA,MAC7C,SAAS;AAAA,MACT,aAAa,aAAa;AAAA,IAC5B,CAAC,EACA;AAAA,MAAM,CAAC,QACN,aAAa,SAAS,MAAM,eAAe,GAAG,CAAC;AAAA,IACjD;AAEF,WAAO,EAAE,aAAa,aAAa,SAAS;AAAA,EAC9C;AACF;AAEO,SAAS,eAOd,OACA,MACA,SACA,iBACA,UAA+B,aAAa,GAI5C;AACA,QAAM,cAAc,kBAAuB;AAC3C,QAAM,SAAS,KACZ,QAAQ;AAAA,IACP,KAAK,SAAS,OAAO,SAAS,eAAe;AAAA,IAC7C,SAAS,WAAW,CAAC;AAAA,IACrB,aAAa,YAAY;AAAA,EAC3B,CAAC,EACA,MAAM,cAAc;AAEvB,SAAO,EAAE,aAAa,YAAY,UAAU,UAAU,MAAM,OAAO;AACrE;AAEO,SAAS,wBACd,WACiB;AACjB,QAAM,cAAc,CAAC;AACrB,aAAW,WAAW,UAAU,SAAS,OAAO,GAAG;AACjD,QAAI,QAAQ,uCAAkC;AAC5C,kBAAY,KAAK,QAAQ,IAAI;AAAA,IAC/B;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,oBACd,WACQ;AACR,SAAO,wBAAwB,SAAS,EAAE;AAC5C;AAEO,SAAS,oBACd,WACA;AACA,aAAW,QAAQ,wBAAwB,SAAS,GAAG;AACrD,SAAK,MAAM;AAAA,EACb;AACF;","names":[]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@replit/river",
3
3
  "description": "It's like tRPC but... with JSON Schema Support, duplex streaming and support for service multiplexing. Transport agnostic!",
4
- "version": "0.200.0-rc.9",
4
+ "version": "0.200.2",
5
5
  "type": "module",
6
6
  "exports": {
7
7
  ".": {
@@ -60,17 +60,18 @@
60
60
  "@opentelemetry/core": "^1.7.0",
61
61
  "@opentelemetry/sdk-trace-base": "^1.24.1",
62
62
  "@opentelemetry/sdk-trace-web": "^1.24.1",
63
+ "@stylistic/eslint-plugin": "^2.6.4",
63
64
  "@types/ws": "^8.5.5",
64
65
  "@typescript-eslint/eslint-plugin": "^7.8.0",
65
66
  "@typescript-eslint/parser": "^7.8.0",
66
- "@vitest/ui": "^1.3.1",
67
+ "@vitest/ui": "^2.0.5",
67
68
  "eslint": "^8.57.0",
68
69
  "eslint-config-prettier": "^9.1.0",
69
70
  "eslint-plugin-prettier": "^5.1.3",
70
71
  "prettier": "^3.0.0",
71
72
  "tsup": "^7.2.0",
72
73
  "typescript": "^5.4.5",
73
- "vitest": "^1.3.1"
74
+ "vitest": "^2.0.5"
74
75
  },
75
76
  "scripts": {
76
77
  "check": "tsc --noEmit && npm run format && npm run lint",