@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.
- package/README.md +8 -8
- package/dist/{chunk-42Z2FQIU.js → chunk-6BH2CXVE.js} +21 -13
- package/dist/chunk-6BH2CXVE.js.map +1 -0
- package/dist/{chunk-4HT6P2ZG.js → chunk-A4JKES5A.js} +22 -30
- package/dist/chunk-A4JKES5A.js.map +1 -0
- package/dist/{chunk-4PVU7J25.js → chunk-AJGIY2UB.js} +1 -1
- package/dist/chunk-AJGIY2UB.js.map +1 -0
- package/dist/{chunk-EETL2L77.js → chunk-GJUUVID2.js} +14 -32
- package/dist/chunk-GJUUVID2.js.map +1 -0
- package/dist/{chunk-GR3AQKHL.js → chunk-HRKM7BIE.js} +14 -4
- package/dist/chunk-HRKM7BIE.js.map +1 -0
- package/dist/{chunk-ZXZE253M.js → chunk-PJB2Y2AV.js} +24 -37
- package/dist/chunk-PJB2Y2AV.js.map +1 -0
- package/dist/{chunk-I75XYO5W.js → chunk-QIDEN5PP.js} +82 -20
- package/dist/chunk-QIDEN5PP.js.map +1 -0
- package/dist/{chunk-VXYHC666.js → chunk-YTMS7OP6.js} +1 -1
- package/dist/chunk-YTMS7OP6.js.map +1 -0
- package/dist/chunk-Z4PX66JO.js +307 -0
- package/dist/chunk-Z4PX66JO.js.map +1 -0
- package/dist/{client-22a47343.d.ts → client-9292552a.d.ts} +3 -4
- package/dist/codec/index.cjs.map +1 -1
- package/dist/codec/index.js +1 -1
- package/dist/connection-94dea547.d.ts +32 -0
- package/dist/{context-b4aff18f.d.ts → context-69f37ac1.d.ts} +48 -43
- package/dist/logging/index.cjs.map +1 -1
- package/dist/logging/index.d.cts +1 -1
- package/dist/logging/index.d.ts +1 -1
- package/dist/logging/index.js +1 -1
- package/dist/{message-7d135e38.d.ts → message-57bb8187.d.ts} +5 -3
- package/dist/router/index.cjs +649 -709
- package/dist/router/index.cjs.map +1 -1
- package/dist/router/index.d.cts +22 -12
- package/dist/router/index.d.ts +22 -12
- package/dist/router/index.js +502 -404
- package/dist/router/index.js.map +1 -1
- package/dist/{server-dd6a9853.d.ts → server-8fdd7fb2.d.ts} +5 -5
- package/dist/{services-1b5ac5bc.d.ts → services-259f39a3.d.ts} +191 -194
- package/dist/transport/impls/ws/client.cjs +129 -62
- package/dist/transport/impls/ws/client.cjs.map +1 -1
- package/dist/transport/impls/ws/client.d.cts +4 -4
- package/dist/transport/impls/ws/client.d.ts +4 -4
- package/dist/transport/impls/ws/client.js +7 -7
- package/dist/transport/impls/ws/client.js.map +1 -1
- package/dist/transport/impls/ws/server.cjs +146 -70
- package/dist/transport/impls/ws/server.cjs.map +1 -1
- package/dist/transport/impls/ws/server.d.cts +6 -5
- package/dist/transport/impls/ws/server.d.ts +6 -5
- package/dist/transport/impls/ws/server.js +21 -9
- package/dist/transport/impls/ws/server.js.map +1 -1
- package/dist/transport/index.cjs +138 -92
- package/dist/transport/index.cjs.map +1 -1
- package/dist/transport/index.d.cts +4 -4
- package/dist/transport/index.d.ts +4 -4
- package/dist/transport/index.js +7 -7
- package/dist/util/testHelpers.cjs +265 -327
- package/dist/util/testHelpers.cjs.map +1 -1
- package/dist/util/testHelpers.d.cts +36 -31
- package/dist/util/testHelpers.d.ts +36 -31
- package/dist/util/testHelpers.js +82 -52
- package/dist/util/testHelpers.js.map +1 -1
- package/package.json +4 -3
- package/dist/chunk-42Z2FQIU.js.map +0 -1
- package/dist/chunk-4HT6P2ZG.js.map +0 -1
- package/dist/chunk-4PVU7J25.js.map +0 -1
- package/dist/chunk-EETL2L77.js.map +0 -1
- package/dist/chunk-GR3AQKHL.js.map +0 -1
- package/dist/chunk-I75XYO5W.js.map +0 -1
- package/dist/chunk-MQ6ANR3H.js +0 -451
- package/dist/chunk-MQ6ANR3H.js.map +0 -1
- package/dist/chunk-VXYHC666.js.map +0 -1
- package/dist/chunk-ZXZE253M.js.map +0 -1
- 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-
|
|
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
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
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
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
|
70
|
-
declare function
|
|
71
|
-
|
|
72
|
-
|
|
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
|
|
75
|
-
|
|
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,
|
|
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-
|
|
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
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
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
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
|
70
|
-
declare function
|
|
71
|
-
|
|
72
|
-
|
|
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
|
|
75
|
-
|
|
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,
|
|
90
|
+
export { asClientRpc, asClientStream, asClientSubscription, asClientUpload, closeAllConnections, createDummyTransportMessage, createLocalWebSocketClient, createWebSocketServer, dummySession, getClientSendFn, getReadableIterator, getServerSendFn, getTransportConnections, isReadableDone, numberOfConnections, onWsServerReady, payloadToTransportMessage, readNextResult, testingClientSessionOptions, testingSessionOptions, waitForMessage };
|
package/dist/util/testHelpers.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Err,
|
|
3
3
|
Ok,
|
|
4
|
-
|
|
4
|
+
ReadableImpl,
|
|
5
5
|
UNCAUGHT_ERROR_CODE,
|
|
6
|
-
|
|
7
|
-
} from "../chunk-
|
|
6
|
+
WritableImpl
|
|
7
|
+
} from "../chunk-Z4PX66JO.js";
|
|
8
8
|
import {
|
|
9
9
|
SessionStateGraph,
|
|
10
10
|
defaultClientTransportOptions,
|
|
11
11
|
defaultTransportOptions
|
|
12
|
-
} from "../chunk-
|
|
12
|
+
} from "../chunk-6BH2CXVE.js";
|
|
13
13
|
import {
|
|
14
14
|
coerceErrorString,
|
|
15
15
|
currentProtocolVersion
|
|
16
|
-
} from "../chunk-
|
|
17
|
-
import "../chunk-
|
|
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
|
-
|
|
42
|
-
|
|
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
|
|
45
|
-
|
|
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
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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 {
|
|
158
|
+
return { readable, writable };
|
|
132
159
|
}
|
|
133
160
|
function createRequestPipe() {
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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 {
|
|
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
|
-
|
|
156
|
-
|
|
157
|
-
}).catch((err) => responsePipe.
|
|
180
|
+
reqReadable: requestPipe.readable,
|
|
181
|
+
resWritable: responsePipe.writable
|
|
182
|
+
}).catch((err) => responsePipe.writable.write(catchProcError(err)));
|
|
158
183
|
return {
|
|
159
|
-
|
|
160
|
-
|
|
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
|
-
|
|
170
|
-
}).catch(
|
|
171
|
-
|
|
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
|
-
|
|
206
|
+
reqReadable: requestPipe.readable
|
|
180
207
|
}).catch(catchProcError);
|
|
181
|
-
return
|
|
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
|
-
|
|
237
|
+
getClientSendFn,
|
|
238
|
+
getReadableIterator,
|
|
239
|
+
getServerSendFn,
|
|
211
240
|
getTransportConnections,
|
|
212
|
-
|
|
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":"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","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.
|
|
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": "^
|
|
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": "^
|
|
74
|
+
"vitest": "^2.0.5"
|
|
74
75
|
},
|
|
75
76
|
"scripts": {
|
|
76
77
|
"check": "tsc --noEmit && npm run format && npm run lint",
|