@replit/river 0.9.0 → 0.9.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/dist/__tests__/invariants.test.js +5 -3
- package/dist/router/builder.d.ts.map +1 -1
- package/dist/router/builder.js +6 -1
- package/dist/router/client.d.ts.map +1 -1
- package/dist/router/client.js +26 -15
- package/dist/router/server.d.ts +5 -1
- package/dist/router/server.d.ts.map +1 -1
- package/dist/router/server.js +122 -104
- package/dist/transport/impls/ws/ws.test.js +2 -2
- package/dist/transport/message.d.ts +19 -10
- package/dist/transport/message.d.ts.map +1 -1
- package/dist/transport/message.js +10 -10
- package/dist/transport/message.test.js +6 -6
- package/dist/transport/transport.d.ts.map +1 -1
- package/dist/transport/transport.js +9 -2
- package/dist/util/testHelpers.d.ts.map +1 -1
- package/dist/util/testHelpers.js +4 -1
- package/package.json +1 -1
|
@@ -79,15 +79,17 @@ describe('procedures should leave no trace after finishing', async () => {
|
|
|
79
79
|
const [input, output, close] = await client.test.echo.stream();
|
|
80
80
|
input.push({ msg: '1', ignore: false });
|
|
81
81
|
input.push({ msg: '2', ignore: false, end: true });
|
|
82
|
-
input.end();
|
|
83
82
|
const result1 = await iterNext(output);
|
|
84
83
|
assert(result1.ok);
|
|
85
84
|
expect(result1.payload).toStrictEqual({ response: '1' });
|
|
85
|
+
// ensure we only have one stream despite pushing multiple messages.
|
|
86
|
+
await waitUntil(() => server.streams.size, 1);
|
|
87
|
+
input.end();
|
|
88
|
+
// ensure we no longer have any streams since the input was closed.
|
|
89
|
+
await waitUntil(() => server.streams.size, 0);
|
|
86
90
|
const result2 = await iterNext(output);
|
|
87
91
|
assert(result2.ok);
|
|
88
92
|
expect(result2.payload).toStrictEqual({ response: '2' });
|
|
89
|
-
// ensure we exactly have one stream even after we send multiple messages
|
|
90
|
-
expect(server.streams.size).toEqual(1);
|
|
91
93
|
const result3 = await output.next();
|
|
92
94
|
assert(result3.done);
|
|
93
95
|
close();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../router/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAQ,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEnE;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAErB,KAAK,GAEL,QAAQ,GAER,cAAc,GAEd,QAAQ,CAAC;AAEb;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,WAAW,OAAO,CACtB,IAAI,SAAS,MAAM,EACnB,KAAK,SAAS,MAAM,EAIpB,KAAK,SAAS,WAAW;IAEzB,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,EAAE,KAAK,CAAC;CACnB;AACD,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;AAEtD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../router/builder.ts"],"names":[],"mappings":"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"}
|
package/dist/router/builder.js
CHANGED
|
@@ -13,7 +13,12 @@ export function serializeService(s) {
|
|
|
13
13
|
{
|
|
14
14
|
input: Type.Strict(procDef.input),
|
|
15
15
|
output: Type.Strict(procDef.output),
|
|
16
|
-
errors
|
|
16
|
+
// Only add the `errors` field if it is non-never.
|
|
17
|
+
...('errors' in procDef
|
|
18
|
+
? {
|
|
19
|
+
errors: Type.Strict(procDef.errors),
|
|
20
|
+
}
|
|
21
|
+
: {}),
|
|
17
22
|
type: procDef.type,
|
|
18
23
|
// Only add the `init` field if the type declares it.
|
|
19
24
|
...('init' in procDef
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../router/client.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../router/client.ts"],"names":[],"mappings":"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"}
|
package/dist/router/client.js
CHANGED
|
@@ -42,16 +42,14 @@ export const createClient = (transport, serverId = 'SERVER') => _createRecursive
|
|
|
42
42
|
const [input] = opts.args;
|
|
43
43
|
const streamId = nanoid();
|
|
44
44
|
function belongsToSameStream(msg) {
|
|
45
|
-
return
|
|
46
|
-
msg.procedureName === procName &&
|
|
47
|
-
msg.streamId === streamId);
|
|
45
|
+
return msg.streamId === streamId;
|
|
48
46
|
}
|
|
49
47
|
if (procType === 'stream') {
|
|
50
48
|
const inputStream = pushable({ objectMode: true });
|
|
51
49
|
const outputStream = pushable({ objectMode: true });
|
|
52
50
|
let firstMessage = true;
|
|
53
51
|
if (input) {
|
|
54
|
-
const m = msg(transport.clientId, serverId,
|
|
52
|
+
const m = msg(transport.clientId, serverId, streamId, input, serviceName, procName);
|
|
55
53
|
// first message needs the open bit.
|
|
56
54
|
m.controlFlags = 2 /* ControlFlags.StreamOpenBit */;
|
|
57
55
|
transport.send(m);
|
|
@@ -61,20 +59,27 @@ export const createClient = (transport, serverId = 'SERVER') => _createRecursive
|
|
|
61
59
|
// this gets cleaned up on inputStream.end() which is called by closeHandler
|
|
62
60
|
(async () => {
|
|
63
61
|
for await (const rawIn of inputStream) {
|
|
64
|
-
const m = msg(transport.clientId, serverId,
|
|
62
|
+
const m = msg(transport.clientId, serverId, streamId, rawIn);
|
|
65
63
|
if (firstMessage) {
|
|
64
|
+
m.serviceName = serviceName;
|
|
65
|
+
m.procedureName = procName;
|
|
66
66
|
m.controlFlags |= 2 /* ControlFlags.StreamOpenBit */;
|
|
67
67
|
firstMessage = false;
|
|
68
68
|
}
|
|
69
69
|
transport.send(m);
|
|
70
70
|
}
|
|
71
|
+
transport.send(closeStream(transport.clientId, serverId, streamId));
|
|
71
72
|
})();
|
|
72
73
|
// transport -> output
|
|
73
74
|
const listener = (msg) => {
|
|
75
|
+
if (!belongsToSameStream(msg)) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
74
78
|
if (isStreamClose(msg.controlFlags)) {
|
|
75
79
|
outputStream.end();
|
|
80
|
+
transport.removeEventListener('message', listener);
|
|
76
81
|
}
|
|
77
|
-
else
|
|
82
|
+
else {
|
|
78
83
|
outputStream.push(msg.payload);
|
|
79
84
|
}
|
|
80
85
|
};
|
|
@@ -82,13 +87,13 @@ export const createClient = (transport, serverId = 'SERVER') => _createRecursive
|
|
|
82
87
|
const closeHandler = () => {
|
|
83
88
|
inputStream.end();
|
|
84
89
|
outputStream.end();
|
|
85
|
-
transport.send(closeStream(transport.clientId, serverId,
|
|
90
|
+
transport.send(closeStream(transport.clientId, serverId, streamId));
|
|
86
91
|
transport.removeEventListener('message', listener);
|
|
87
92
|
};
|
|
88
93
|
return [inputStream, outputStream, closeHandler];
|
|
89
94
|
}
|
|
90
95
|
else if (procType === 'rpc') {
|
|
91
|
-
const m = msg(transport.clientId, serverId,
|
|
96
|
+
const m = msg(transport.clientId, serverId, streamId, input, serviceName, procName);
|
|
92
97
|
// rpc is a stream open + close
|
|
93
98
|
m.controlFlags |=
|
|
94
99
|
2 /* ControlFlags.StreamOpenBit */ | 4 /* ControlFlags.StreamClosedBit */;
|
|
@@ -96,23 +101,27 @@ export const createClient = (transport, serverId = 'SERVER') => _createRecursive
|
|
|
96
101
|
return waitForMessage(transport, belongsToSameStream);
|
|
97
102
|
}
|
|
98
103
|
else if (procType === 'subscribe') {
|
|
99
|
-
const m = msg(transport.clientId, serverId,
|
|
104
|
+
const m = msg(transport.clientId, serverId, streamId, input, serviceName, procName);
|
|
100
105
|
m.controlFlags |= 2 /* ControlFlags.StreamOpenBit */;
|
|
101
106
|
transport.send(m);
|
|
102
107
|
// transport -> output
|
|
103
108
|
const outputStream = pushable({ objectMode: true });
|
|
104
109
|
const listener = (msg) => {
|
|
105
|
-
if (belongsToSameStream(msg)) {
|
|
106
|
-
|
|
110
|
+
if (!belongsToSameStream(msg)) {
|
|
111
|
+
return;
|
|
107
112
|
}
|
|
108
113
|
if (isStreamClose(msg.controlFlags)) {
|
|
109
114
|
outputStream.end();
|
|
115
|
+
transport.removeEventListener('message', listener);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
outputStream.push(msg.payload);
|
|
110
119
|
}
|
|
111
120
|
};
|
|
112
121
|
transport.addEventListener('message', listener);
|
|
113
122
|
const closeHandler = () => {
|
|
114
123
|
outputStream.end();
|
|
115
|
-
transport.send(closeStream(transport.clientId, serverId,
|
|
124
|
+
transport.send(closeStream(transport.clientId, serverId, streamId));
|
|
116
125
|
transport.removeEventListener('message', listener);
|
|
117
126
|
};
|
|
118
127
|
return [outputStream, closeHandler];
|
|
@@ -121,7 +130,7 @@ export const createClient = (transport, serverId = 'SERVER') => _createRecursive
|
|
|
121
130
|
const inputStream = pushable({ objectMode: true });
|
|
122
131
|
let firstMessage = true;
|
|
123
132
|
if (input) {
|
|
124
|
-
const m = msg(transport.clientId, serverId,
|
|
133
|
+
const m = msg(transport.clientId, serverId, streamId, input, serviceName, procName);
|
|
125
134
|
// first message needs the open bit.
|
|
126
135
|
m.controlFlags = 2 /* ControlFlags.StreamOpenBit */;
|
|
127
136
|
transport.send(m);
|
|
@@ -131,14 +140,16 @@ export const createClient = (transport, serverId = 'SERVER') => _createRecursive
|
|
|
131
140
|
// this gets cleaned up on inputStream.end(), which the caller should call.
|
|
132
141
|
(async () => {
|
|
133
142
|
for await (const rawIn of inputStream) {
|
|
134
|
-
const m = msg(transport.clientId, serverId,
|
|
143
|
+
const m = msg(transport.clientId, serverId, streamId, rawIn);
|
|
135
144
|
if (firstMessage) {
|
|
136
145
|
m.controlFlags |= 2 /* ControlFlags.StreamOpenBit */;
|
|
146
|
+
m.serviceName = serviceName;
|
|
147
|
+
m.procedureName = procName;
|
|
137
148
|
firstMessage = false;
|
|
138
149
|
}
|
|
139
150
|
transport.send(m);
|
|
140
151
|
}
|
|
141
|
-
transport.send(closeStream(transport.clientId, serverId,
|
|
152
|
+
transport.send(closeStream(transport.clientId, serverId, streamId));
|
|
142
153
|
})();
|
|
143
154
|
return [inputStream, waitForMessage(transport, belongsToSameStream)];
|
|
144
155
|
}
|
package/dist/router/server.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Static } from '@sinclair/typebox';
|
|
2
2
|
import { Connection, Transport } from '../transport/transport';
|
|
3
|
-
import { AnyService, PayloadType } from './builder';
|
|
3
|
+
import { AnyProcedure, AnyService, PayloadType } from './builder';
|
|
4
4
|
import type { Pushable } from 'it-pushable';
|
|
5
5
|
import { TransportMessage } from '../transport/message';
|
|
6
6
|
import { ServiceContext } from './context';
|
|
@@ -15,6 +15,10 @@ export interface Server<Services> {
|
|
|
15
15
|
close(): Promise<void>;
|
|
16
16
|
}
|
|
17
17
|
interface ProcStream {
|
|
18
|
+
id: string;
|
|
19
|
+
serviceName: string;
|
|
20
|
+
procedureName: string;
|
|
21
|
+
procedure: AnyProcedure;
|
|
18
22
|
incoming: Pushable<TransportMessage>;
|
|
19
23
|
outgoing: Pushable<TransportMessage<Result<Static<PayloadType>, Static<RiverError>>>>;
|
|
20
24
|
promises: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../router/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../router/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAElE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAGL,gBAAgB,EAKjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAA2B,MAAM,WAAW,CAAC;AAGpE,OAAO,EAEL,MAAM,EACN,UAAU,EAGX,MAAM,UAAU,CAAC;AAElB;;;GAGG;AACH,MAAM,WAAW,MAAM,CAAC,QAAQ;IAC9B,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACjC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,UAAU,UAAU;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,YAAY,CAAC;IACxB,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IACrC,QAAQ,EAAE,QAAQ,CAChB,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAClE,CAAC;IACF,QAAQ,EAAE;QACR,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,YAAY,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;KAChC,CAAC;CACH;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EAC5E,SAAS,EAAE,SAAS,CAAC,UAAU,CAAC,EAChC,QAAQ,EAAE,QAAQ,EAClB,eAAe,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,GAC9C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAqQ3B"}
|
package/dist/router/server.js
CHANGED
|
@@ -17,13 +17,14 @@ export async function createServer(transport, services, extendedContext) {
|
|
|
17
17
|
const streamMap = new Map();
|
|
18
18
|
async function cleanupStream(id) {
|
|
19
19
|
const stream = streamMap.get(id);
|
|
20
|
-
if (stream) {
|
|
21
|
-
|
|
22
|
-
await stream.promises.inputHandler;
|
|
23
|
-
stream.outgoing.end();
|
|
24
|
-
await stream.promises.outputHandler;
|
|
25
|
-
streamMap.delete(id);
|
|
20
|
+
if (!stream) {
|
|
21
|
+
return;
|
|
26
22
|
}
|
|
23
|
+
stream.incoming.end();
|
|
24
|
+
await stream.promises.inputHandler;
|
|
25
|
+
stream.outgoing.end();
|
|
26
|
+
await stream.promises.outputHandler;
|
|
27
|
+
streamMap.delete(id);
|
|
27
28
|
}
|
|
28
29
|
function getContext(service) {
|
|
29
30
|
const context = contextMap.get(service);
|
|
@@ -43,71 +44,119 @@ export async function createServer(transport, services, extendedContext) {
|
|
|
43
44
|
log?.info(`${transport.clientId} -- got msg with destination that isn't the server, ignoring`);
|
|
44
45
|
return;
|
|
45
46
|
}
|
|
46
|
-
|
|
47
|
+
const streamIdx = message.streamId;
|
|
48
|
+
const procStream = streamMap.get(streamIdx);
|
|
49
|
+
if (procStream) {
|
|
50
|
+
// If the stream is a continuation, we do not admit the init messages.
|
|
51
|
+
if (Value.Check(procStream.procedure.input, message.payload)) {
|
|
52
|
+
procStream.incoming.push(message);
|
|
53
|
+
}
|
|
54
|
+
else if (!Value.Check(ControlMessagePayloadSchema, message.payload)) {
|
|
55
|
+
log?.error(`${transport.clientId} -- procedure ${procStream.serviceName}.${procStream.procedureName} received invalid payload: ${JSON.stringify(message.payload)}`);
|
|
56
|
+
}
|
|
57
|
+
if (isStreamClose(message.controlFlags)) {
|
|
58
|
+
await cleanupStream(streamIdx);
|
|
59
|
+
}
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (!isStreamOpen(message.controlFlags)) {
|
|
63
|
+
log?.warn(`${transport.clientId} -- couldn't find a matching procedure stream for ${message.serviceName}.${message.procedureName}:${message.streamId}`);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (!message.serviceName || !(message.serviceName in services)) {
|
|
47
67
|
log?.warn(`${transport.clientId} -- couldn't find service ${message.serviceName}`);
|
|
48
68
|
return;
|
|
49
69
|
}
|
|
50
70
|
const service = services[message.serviceName];
|
|
51
71
|
const serviceContext = getContext(service);
|
|
52
|
-
if (!
|
|
72
|
+
if (!message.procedureName ||
|
|
73
|
+
!(message.procedureName in service.procedures)) {
|
|
53
74
|
log?.warn(`${transport.clientId} -- couldn't find a matching procedure for ${message.serviceName}.${message.procedureName}`);
|
|
54
75
|
return;
|
|
55
76
|
}
|
|
56
77
|
const procedure = service.procedures[message.procedureName];
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
(
|
|
64
|
-
|
|
65
|
-
|
|
78
|
+
const procHasInitMessage = 'init' in procedure;
|
|
79
|
+
const incoming = pushable({ objectMode: true });
|
|
80
|
+
const outgoing = pushable({ objectMode: true });
|
|
81
|
+
const outputHandler =
|
|
82
|
+
// sending outgoing messages back to client
|
|
83
|
+
(async () => {
|
|
84
|
+
for await (const response of outgoing) {
|
|
85
|
+
transport.send(response);
|
|
86
|
+
}
|
|
87
|
+
// we ended, send a close bit back to the client
|
|
88
|
+
// only subscriptions and streams have streams the
|
|
89
|
+
// handler can close
|
|
90
|
+
if (procedure.type === 'subscription' || procedure.type === 'stream') {
|
|
91
|
+
transport.send(closeStream(transport.clientId, message.from, message.streamId));
|
|
92
|
+
}
|
|
93
|
+
})();
|
|
94
|
+
function errorHandler(err) {
|
|
95
|
+
const errorMsg = err instanceof Error ? err.message : `[coerced to error] ${err}`;
|
|
96
|
+
log?.error(`${transport.clientId} -- procedure ${message.serviceName}.${message.procedureName}:${message.streamId} threw an error: ${errorMsg}`);
|
|
97
|
+
outgoing.push(reply(message, Err({
|
|
98
|
+
code: UNCAUGHT_ERROR,
|
|
99
|
+
message: errorMsg,
|
|
100
|
+
})));
|
|
101
|
+
}
|
|
102
|
+
// pump incoming message stream -> handler -> outgoing message stream
|
|
103
|
+
let inputHandler;
|
|
104
|
+
if (procedure.type === 'stream') {
|
|
105
|
+
if (procHasInitMessage) {
|
|
106
|
+
inputHandler = (async () => {
|
|
107
|
+
const initMessage = await incoming.next();
|
|
108
|
+
if (initMessage.done) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
return procedure
|
|
112
|
+
.handler(serviceContext, initMessage.value, incoming, outgoing)
|
|
113
|
+
.catch(errorHandler);
|
|
114
|
+
})();
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
inputHandler = procedure
|
|
118
|
+
.handler(serviceContext, incoming, outgoing)
|
|
119
|
+
.catch(errorHandler);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
else if (procedure.type === 'rpc') {
|
|
123
|
+
inputHandler = (async () => {
|
|
124
|
+
const inputMessage = await incoming.next();
|
|
125
|
+
if (inputMessage.done) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
try {
|
|
129
|
+
const outputMessage = await procedure.handler(serviceContext, inputMessage.value);
|
|
130
|
+
outgoing.push(outputMessage);
|
|
66
131
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
// handler can close
|
|
70
|
-
if (procedure.type === 'subscription' ||
|
|
71
|
-
procedure.type === 'stream') {
|
|
72
|
-
transport.send(closeStream(transport.clientId, message.from, message.serviceName, message.procedureName, message.streamId));
|
|
132
|
+
catch (err) {
|
|
133
|
+
errorHandler(err);
|
|
73
134
|
}
|
|
74
135
|
})();
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
})));
|
|
82
|
-
}
|
|
83
|
-
// pump incoming message stream -> handler -> outgoing message stream
|
|
84
|
-
let inputHandler;
|
|
85
|
-
if (procedure.type === 'stream') {
|
|
86
|
-
if ('init' in procedure) {
|
|
87
|
-
inputHandler = (async () => {
|
|
88
|
-
const initMessage = await incoming.next();
|
|
89
|
-
if (initMessage.done) {
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
return procedure
|
|
93
|
-
.handler(serviceContext, initMessage.value, incoming, outgoing)
|
|
94
|
-
.catch(errorHandler);
|
|
95
|
-
})();
|
|
136
|
+
}
|
|
137
|
+
else if (procedure.type === 'subscription') {
|
|
138
|
+
inputHandler = (async () => {
|
|
139
|
+
const inputMessage = await incoming.next();
|
|
140
|
+
if (inputMessage.done) {
|
|
141
|
+
return;
|
|
96
142
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
.handler(serviceContext, incoming, outgoing)
|
|
100
|
-
.catch(errorHandler);
|
|
143
|
+
try {
|
|
144
|
+
await procedure.handler(serviceContext, inputMessage.value, outgoing);
|
|
101
145
|
}
|
|
102
|
-
|
|
103
|
-
|
|
146
|
+
catch (err) {
|
|
147
|
+
errorHandler(err);
|
|
148
|
+
}
|
|
149
|
+
})();
|
|
150
|
+
}
|
|
151
|
+
else if (procedure.type === 'upload') {
|
|
152
|
+
if (procHasInitMessage) {
|
|
104
153
|
inputHandler = (async () => {
|
|
105
|
-
const
|
|
106
|
-
if (
|
|
154
|
+
const initMessage = await incoming.next();
|
|
155
|
+
if (initMessage.done) {
|
|
107
156
|
return;
|
|
108
157
|
}
|
|
109
158
|
try {
|
|
110
|
-
const outputMessage = await procedure.handler(serviceContext,
|
|
159
|
+
const outputMessage = await procedure.handler(serviceContext, initMessage.value, incoming);
|
|
111
160
|
outgoing.push(outputMessage);
|
|
112
161
|
}
|
|
113
162
|
catch (err) {
|
|
@@ -115,68 +164,37 @@ export async function createServer(transport, services, extendedContext) {
|
|
|
115
164
|
}
|
|
116
165
|
})();
|
|
117
166
|
}
|
|
118
|
-
else
|
|
167
|
+
else {
|
|
119
168
|
inputHandler = (async () => {
|
|
120
|
-
const inputMessage = await incoming.next();
|
|
121
|
-
if (inputMessage.done) {
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
169
|
try {
|
|
125
|
-
await procedure.handler(serviceContext,
|
|
170
|
+
const outputMessage = await procedure.handler(serviceContext, incoming);
|
|
171
|
+
outgoing.push(outputMessage);
|
|
126
172
|
}
|
|
127
173
|
catch (err) {
|
|
128
174
|
errorHandler(err);
|
|
129
175
|
}
|
|
130
176
|
})();
|
|
131
177
|
}
|
|
132
|
-
else if (procedure.type === 'upload') {
|
|
133
|
-
if ('init' in procedure) {
|
|
134
|
-
inputHandler = (async () => {
|
|
135
|
-
const initMessage = await incoming.next();
|
|
136
|
-
if (initMessage.done) {
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
try {
|
|
140
|
-
const outputMessage = await procedure.handler(serviceContext, initMessage.value, incoming);
|
|
141
|
-
outgoing.push(outputMessage);
|
|
142
|
-
}
|
|
143
|
-
catch (err) {
|
|
144
|
-
errorHandler(err);
|
|
145
|
-
}
|
|
146
|
-
})();
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
149
|
-
inputHandler = (async () => {
|
|
150
|
-
try {
|
|
151
|
-
const outputMessage = await procedure.handler(serviceContext, incoming);
|
|
152
|
-
outgoing.push(outputMessage);
|
|
153
|
-
}
|
|
154
|
-
catch (err) {
|
|
155
|
-
errorHandler(err);
|
|
156
|
-
}
|
|
157
|
-
})();
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
else {
|
|
161
|
-
// procedure is inferred to be never here as this is not a valid procedure type
|
|
162
|
-
// we cast just to log
|
|
163
|
-
log?.warn(`${transport.clientId} -- got request for invalid procedure type ${procedure.type} at ${message.serviceName}.${message.procedureName}`);
|
|
164
|
-
return;
|
|
165
|
-
}
|
|
166
|
-
streamMap.set(streamIdx, {
|
|
167
|
-
incoming,
|
|
168
|
-
outgoing,
|
|
169
|
-
promises: { inputHandler, outputHandler },
|
|
170
|
-
});
|
|
171
178
|
}
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
179
|
+
else {
|
|
180
|
+
// procedure is inferred to be never here as this is not a valid procedure type
|
|
181
|
+
// we cast just to log
|
|
182
|
+
log?.warn(`${transport.clientId} -- got request for invalid procedure type ${procedure.type} at ${message.serviceName}.${message.procedureName}`);
|
|
175
183
|
return;
|
|
176
184
|
}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
185
|
+
streamMap.set(streamIdx, {
|
|
186
|
+
id: message.streamId,
|
|
187
|
+
incoming,
|
|
188
|
+
outgoing,
|
|
189
|
+
serviceName: message.serviceName,
|
|
190
|
+
procedureName: message.procedureName,
|
|
191
|
+
procedure,
|
|
192
|
+
promises: { inputHandler, outputHandler },
|
|
193
|
+
});
|
|
194
|
+
// This is the first message, so we parse is as the initialization message, if supplied.
|
|
195
|
+
if ((!procHasInitMessage && Value.Check(procedure.input, message.payload)) ||
|
|
196
|
+
(procHasInitMessage && Value.Check(procedure.init, message.payload))) {
|
|
197
|
+
incoming.push(message);
|
|
180
198
|
}
|
|
181
199
|
else if (!Value.Check(ControlMessagePayloadSchema, message.payload)) {
|
|
182
200
|
log?.error(`${transport.clientId} -- procedure ${message.serviceName}.${message.procedureName} received invalid payload: ${JSON.stringify(message.payload)}`);
|
|
@@ -25,9 +25,9 @@ describe('sending and receiving across websockets works', async () => {
|
|
|
25
25
|
});
|
|
26
26
|
test('sending respects to/from fields', async () => {
|
|
27
27
|
const makeDummyMessage = (from, to, message) => {
|
|
28
|
-
return msg(from, to, '
|
|
28
|
+
return msg(from, to, 'stream', {
|
|
29
29
|
msg: message,
|
|
30
|
-
});
|
|
30
|
+
}, 'service', 'proc');
|
|
31
31
|
};
|
|
32
32
|
const clientId1 = 'client1';
|
|
33
33
|
const clientId2 = 'client2';
|
|
@@ -21,8 +21,8 @@ export declare const TransportMessageSchema: <T extends TSchema>(t: T) => import
|
|
|
21
21
|
id: import("@sinclair/typebox").TString;
|
|
22
22
|
from: import("@sinclair/typebox").TString;
|
|
23
23
|
to: import("@sinclair/typebox").TString;
|
|
24
|
-
serviceName: import("@sinclair/typebox").TString
|
|
25
|
-
procedureName: import("@sinclair/typebox").TString
|
|
24
|
+
serviceName: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TNull]>>;
|
|
25
|
+
procedureName: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TNull]>>;
|
|
26
26
|
streamId: import("@sinclair/typebox").TString;
|
|
27
27
|
controlFlags: import("@sinclair/typebox").TInteger;
|
|
28
28
|
payload: T;
|
|
@@ -36,8 +36,8 @@ export declare const TransportAckSchema: import("@sinclair/typebox").TObject<{
|
|
|
36
36
|
id: import("@sinclair/typebox").TString;
|
|
37
37
|
from: import("@sinclair/typebox").TString;
|
|
38
38
|
to: import("@sinclair/typebox").TString;
|
|
39
|
-
serviceName: import("@sinclair/typebox").TString
|
|
40
|
-
procedureName: import("@sinclair/typebox").TString
|
|
39
|
+
serviceName: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TNull]>>;
|
|
40
|
+
procedureName: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TNull]>>;
|
|
41
41
|
streamId: import("@sinclair/typebox").TString;
|
|
42
42
|
controlFlags: import("@sinclair/typebox").TInteger;
|
|
43
43
|
payload: import("@sinclair/typebox").TObject<{
|
|
@@ -56,8 +56,8 @@ export declare const OpaqueTransportMessageSchema: import("@sinclair/typebox").T
|
|
|
56
56
|
id: import("@sinclair/typebox").TString;
|
|
57
57
|
from: import("@sinclair/typebox").TString;
|
|
58
58
|
to: import("@sinclair/typebox").TString;
|
|
59
|
-
serviceName: import("@sinclair/typebox").TString
|
|
60
|
-
procedureName: import("@sinclair/typebox").TString
|
|
59
|
+
serviceName: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TNull]>>;
|
|
60
|
+
procedureName: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TNull]>>;
|
|
61
61
|
streamId: import("@sinclair/typebox").TString;
|
|
62
62
|
controlFlags: import("@sinclair/typebox").TInteger;
|
|
63
63
|
payload: import("@sinclair/typebox").TUnknown;
|
|
@@ -65,14 +65,23 @@ export declare const OpaqueTransportMessageSchema: import("@sinclair/typebox").T
|
|
|
65
65
|
/**
|
|
66
66
|
* Represents a transport message. This is the same type as {@link TransportMessageSchema} but
|
|
67
67
|
* we can't statically infer generics from generic Typebox schemas so we have to define it again here.
|
|
68
|
+
*
|
|
69
|
+
* TypeScript can't enforce types when a bitmask is involved, so these are the semantics of
|
|
70
|
+
* `controlFlags`:
|
|
71
|
+
* * If `controlFlags & StreamOpenBit == StreamOpenBit`, `streamId` must be set to a unique value
|
|
72
|
+
* (suggestion: use `nanoid`).
|
|
73
|
+
* * `serviceName` and `procedureName` must be set only when `controlFlags & StreamOpenBit ==
|
|
74
|
+
* StreamOpenBit`.
|
|
75
|
+
* * If `controlFlags & StreamClosedBit` is set and the kind is `stream` or `subscription`,
|
|
76
|
+
* `payload` can be a control message.
|
|
68
77
|
* @template Payload The type of the payload.
|
|
69
78
|
*/
|
|
70
79
|
export type TransportMessage<Payload extends Record<string, unknown> | unknown = Record<string, unknown>> = {
|
|
71
80
|
id: string;
|
|
72
81
|
from: string;
|
|
73
82
|
to: string;
|
|
74
|
-
serviceName
|
|
75
|
-
procedureName
|
|
83
|
+
serviceName?: string;
|
|
84
|
+
procedureName?: string;
|
|
76
85
|
streamId: string;
|
|
77
86
|
controlFlags: number;
|
|
78
87
|
payload: Payload;
|
|
@@ -95,7 +104,7 @@ export type TransportClientId = string;
|
|
|
95
104
|
* @param payload The payload of the message.
|
|
96
105
|
* @returns A TransportMessage object with the given parameters.
|
|
97
106
|
*/
|
|
98
|
-
export declare function msg<Payload extends object>(from: string, to: string,
|
|
107
|
+
export declare function msg<Payload extends object>(from: string, to: string, streamId: string, payload: Payload, serviceName?: string, procedureName?: string): TransportMessage<Payload>;
|
|
99
108
|
/**
|
|
100
109
|
* Creates a new transport message as a response to the given message.
|
|
101
110
|
* @param msg The original message to respond to.
|
|
@@ -110,7 +119,7 @@ export declare function reply<Payload extends object>(msg: OpaqueTransportMessag
|
|
|
110
119
|
* @param respondTo The transport message to respond to.
|
|
111
120
|
* @returns The close message
|
|
112
121
|
*/
|
|
113
|
-
export declare function closeStream(from: TransportClientId, to: TransportClientId,
|
|
122
|
+
export declare function closeStream(from: TransportClientId, to: TransportClientId, stream: string): TransportMessage<{
|
|
114
123
|
type: "CLOSE";
|
|
115
124
|
}>;
|
|
116
125
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../transport/message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,OAAO,EAAU,MAAM,mBAAmB,CAAC;AAG1D;;;;;;GAMG;AACH,0BAAkB,YAAY;IAC5B,MAAM,IAAS;IACf,aAAa,IAAS;IACtB,eAAe,IAAS;CACzB;AAED;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;EAU/B,CAAC;AAEL;;;;GAIG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;EAI9B,CAAC;AAEF,eAAO,MAAM,2BAA2B;;EAEtC,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,4BAA4B;;;;;;;;;EAExC,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../transport/message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,OAAO,EAAU,MAAM,mBAAmB,CAAC;AAG1D;;;;;;GAMG;AACH,0BAAkB,YAAY;IAC5B,MAAM,IAAS;IACf,aAAa,IAAS;IACtB,eAAe,IAAS;CACzB;AAED;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;EAU/B,CAAC;AAEL;;;;GAIG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;EAI9B,CAAC;AAEF,eAAO,MAAM,2BAA2B;;EAEtC,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,4BAA4B;;;;;;;;;EAExC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,gBAAgB,CAC1B,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IACzE;IACF,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAE/B;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;AAC/D,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEvC;;;;;;;;;;GAUG;AACH,wBAAgB,GAAG,CAAC,OAAO,SAAS,MAAM,EACxC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,EAChB,WAAW,CAAC,EAAE,MAAM,EACpB,aAAa,CAAC,EAAE,MAAM,GACrB,gBAAgB,CAAC,OAAO,CAAC,CAW3B;AAED;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,OAAO,SAAS,MAAM,EAC1C,GAAG,EAAE,sBAAsB,EAC3B,QAAQ,EAAE,OAAO,GAChB,gBAAgB,CAAC,OAAO,CAAC,CAS3B;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,iBAAiB,EACvB,EAAE,EAAE,iBAAiB,EACrB,MAAM,EAAE,MAAM;;GAOf;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAIzD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAK1D"}
|
|
@@ -10,8 +10,8 @@ export const TransportMessageSchema = (t) => Type.Object({
|
|
|
10
10
|
id: Type.String(),
|
|
11
11
|
from: Type.String(),
|
|
12
12
|
to: Type.String(),
|
|
13
|
-
serviceName: Type.String(),
|
|
14
|
-
procedureName: Type.String(),
|
|
13
|
+
serviceName: Type.Optional(Type.Union([Type.String(), Type.Null()])),
|
|
14
|
+
procedureName: Type.Optional(Type.Union([Type.String(), Type.Null()])),
|
|
15
15
|
streamId: Type.String(),
|
|
16
16
|
controlFlags: Type.Integer(),
|
|
17
17
|
payload: t,
|
|
@@ -44,14 +44,14 @@ export const OpaqueTransportMessageSchema = TransportMessageSchema(Type.Unknown(
|
|
|
44
44
|
* @param payload The payload of the message.
|
|
45
45
|
* @returns A TransportMessage object with the given parameters.
|
|
46
46
|
*/
|
|
47
|
-
export function msg(from, to,
|
|
47
|
+
export function msg(from, to, streamId, payload, serviceName, procedureName) {
|
|
48
48
|
return {
|
|
49
49
|
id: nanoid(),
|
|
50
50
|
to,
|
|
51
51
|
from,
|
|
52
|
-
serviceName
|
|
53
|
-
procedureName
|
|
54
|
-
streamId
|
|
52
|
+
serviceName,
|
|
53
|
+
procedureName,
|
|
54
|
+
streamId,
|
|
55
55
|
controlFlags: 0,
|
|
56
56
|
payload,
|
|
57
57
|
};
|
|
@@ -64,9 +64,9 @@ export function msg(from, to, service, proc, stream, payload) {
|
|
|
64
64
|
*/
|
|
65
65
|
export function reply(msg, response) {
|
|
66
66
|
return {
|
|
67
|
-
...msg,
|
|
68
|
-
controlFlags: 0,
|
|
69
67
|
id: nanoid(),
|
|
68
|
+
streamId: msg.streamId,
|
|
69
|
+
controlFlags: 0,
|
|
70
70
|
to: msg.from,
|
|
71
71
|
from: msg.to,
|
|
72
72
|
payload: response,
|
|
@@ -79,8 +79,8 @@ export function reply(msg, response) {
|
|
|
79
79
|
* @param respondTo The transport message to respond to.
|
|
80
80
|
* @returns The close message
|
|
81
81
|
*/
|
|
82
|
-
export function closeStream(from, to,
|
|
83
|
-
const closeMessage = msg(from, to,
|
|
82
|
+
export function closeStream(from, to, stream) {
|
|
83
|
+
const closeMessage = msg(from, to, stream, {
|
|
84
84
|
type: 'CLOSE',
|
|
85
85
|
});
|
|
86
86
|
closeMessage.controlFlags |= 4 /* ControlFlags.StreamClosedBit */;
|
|
@@ -2,7 +2,7 @@ import { isAck, isStreamClose, isStreamOpen, msg, reply, } from './message';
|
|
|
2
2
|
import { describe, test, expect } from 'vitest';
|
|
3
3
|
describe('message helpers', () => {
|
|
4
4
|
test('ack', () => {
|
|
5
|
-
const m = msg('a', 'b', '
|
|
5
|
+
const m = msg('a', 'b', 'stream', { test: 1 }, 'svc', 'proc');
|
|
6
6
|
m.controlFlags |= 1 /* ControlFlags.AckBit */;
|
|
7
7
|
expect(m).toHaveProperty('controlFlags');
|
|
8
8
|
expect(isAck(m.controlFlags)).toBe(true);
|
|
@@ -10,7 +10,7 @@ describe('message helpers', () => {
|
|
|
10
10
|
expect(isStreamClose(m.controlFlags)).toBe(false);
|
|
11
11
|
});
|
|
12
12
|
test('streamOpen', () => {
|
|
13
|
-
const m = msg('a', 'b', '
|
|
13
|
+
const m = msg('a', 'b', 'stream', { test: 1 }, 'svc', 'proc');
|
|
14
14
|
m.controlFlags |= 2 /* ControlFlags.StreamOpenBit */;
|
|
15
15
|
expect(m).toHaveProperty('controlFlags');
|
|
16
16
|
expect(isAck(m.controlFlags)).toBe(false);
|
|
@@ -18,7 +18,7 @@ describe('message helpers', () => {
|
|
|
18
18
|
expect(isStreamClose(m.controlFlags)).toBe(false);
|
|
19
19
|
});
|
|
20
20
|
test('streamClose', () => {
|
|
21
|
-
const m = msg('a', 'b', '
|
|
21
|
+
const m = msg('a', 'b', 'stream', { test: 1 }, 'svc', 'proc');
|
|
22
22
|
m.controlFlags |= 4 /* ControlFlags.StreamClosedBit */;
|
|
23
23
|
expect(m).toHaveProperty('controlFlags');
|
|
24
24
|
expect(isAck(m.controlFlags)).toBe(false);
|
|
@@ -26,7 +26,7 @@ describe('message helpers', () => {
|
|
|
26
26
|
expect(isStreamClose(m.controlFlags)).toBe(true);
|
|
27
27
|
});
|
|
28
28
|
test('reply', () => {
|
|
29
|
-
const m = msg('a', 'b', '
|
|
29
|
+
const m = msg('a', 'b', 'stream', { test: 1 }, 'svc', 'proc');
|
|
30
30
|
const payload = { cool: 2 };
|
|
31
31
|
const resp = reply(m, payload);
|
|
32
32
|
expect(resp.id).not.toBe(m.id);
|
|
@@ -35,13 +35,13 @@ describe('message helpers', () => {
|
|
|
35
35
|
expect(resp.to).toBe('a');
|
|
36
36
|
});
|
|
37
37
|
test('default message has no control flags set', () => {
|
|
38
|
-
const m = msg('a', 'b', '
|
|
38
|
+
const m = msg('a', 'b', 'stream', { test: 1 }, 'svc', 'proc');
|
|
39
39
|
expect(isAck(m.controlFlags)).toBe(false);
|
|
40
40
|
expect(isStreamOpen(m.controlFlags)).toBe(false);
|
|
41
41
|
expect(isStreamClose(m.controlFlags)).toBe(false);
|
|
42
42
|
});
|
|
43
43
|
test('combining control flags works', () => {
|
|
44
|
-
const m = msg('a', 'b', '
|
|
44
|
+
const m = msg('a', 'b', 'stream', { test: 1 }, 'svc', 'proc');
|
|
45
45
|
m.controlFlags |= 2 /* ControlFlags.StreamOpenBit */;
|
|
46
46
|
expect(isStreamOpen(m.controlFlags)).toBe(true);
|
|
47
47
|
expect(isStreamClose(m.controlFlags)).toBe(false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../transport/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,OAAO,EAEL,SAAS,EACT,sBAAsB,EAGtB,iBAAiB,EAGlB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAErE;;;;;;;;;;GAUG;AACH,8BAAsB,UAAU;IAC9B,WAAW,EAAE,iBAAiB,CAAC;IAC/B,SAAS,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;gBAG/B,SAAS,EAAE,SAAS,CAAC,UAAU,CAAC,EAChC,WAAW,EAAE,iBAAiB;IAMhC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO;IACvC,QAAQ,CAAC,KAAK,IAAI,IAAI;CACvB;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,8BAAsB,SAAS,CAAC,QAAQ,SAAS,UAAU;IACzD;;;OAGG;IACH,KAAK,EAAE,eAAe,CAAC;IAEvB;;OAEG;IACH,KAAK,EAAE,KAAK,CAAC;IAEb;;OAEG;IACH,QAAQ,EAAE,iBAAiB,CAAC;IAE5B;;;OAGG;IACH,SAAS,EAAE,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IAEpD;;OAEG;IACH,UAAU,EAAE,GAAG,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC;IAEnD;;OAEG;IACH,WAAW,EAAE,GAAG,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;IAE9C;;OAEG;IACH,eAAe,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC;IAE7C;;;;OAIG;gBACS,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,iBAAiB;IAUrD;;;OAGG;IACH,QAAQ,CAAC,8BAA8B,IAAI,IAAI;IAE/C;;;;;OAKG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAElE;;;OAGG;IACH,SAAS,CAAC,IAAI,EAAE,QAAQ;IA8BxB;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,QAAQ;IAU3B;;;OAGG;IACH,SAAS,CAAC,GAAG,EAAE,UAAU;IAIzB;;;;OAIG;IACH,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,GAAG,sBAAsB,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../transport/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,OAAO,EAEL,SAAS,EACT,sBAAsB,EAGtB,iBAAiB,EAGlB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAErE;;;;;;;;;;GAUG;AACH,8BAAsB,UAAU;IAC9B,WAAW,EAAE,iBAAiB,CAAC;IAC/B,SAAS,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;gBAG/B,SAAS,EAAE,SAAS,CAAC,UAAU,CAAC,EAChC,WAAW,EAAE,iBAAiB;IAMhC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO;IACvC,QAAQ,CAAC,KAAK,IAAI,IAAI;CACvB;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,8BAAsB,SAAS,CAAC,QAAQ,SAAS,UAAU;IACzD;;;OAGG;IACH,KAAK,EAAE,eAAe,CAAC;IAEvB;;OAEG;IACH,KAAK,EAAE,KAAK,CAAC;IAEb;;OAEG;IACH,QAAQ,EAAE,iBAAiB,CAAC;IAE5B;;;OAGG;IACH,SAAS,EAAE,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IAEpD;;OAEG;IACH,UAAU,EAAE,GAAG,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC;IAEnD;;OAEG;IACH,WAAW,EAAE,GAAG,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;IAE9C;;OAEG;IACH,eAAe,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC;IAE7C;;;;OAIG;gBACS,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,iBAAiB;IAUrD;;;OAGG;IACH,QAAQ,CAAC,8BAA8B,IAAI,IAAI;IAE/C;;;;;OAKG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAElE;;;OAGG;IACH,SAAS,CAAC,IAAI,EAAE,QAAQ;IA8BxB;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,QAAQ;IAU3B;;;OAGG;IACH,SAAS,CAAC,GAAG,EAAE,UAAU;IAIzB;;;;OAIG;IACH,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,GAAG,sBAAsB,GAAG,IAAI;IA8BlE;;;;OAIG;IACH,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,sBAAsB,GAAG,IAAI;IA8BtD;;;;OAIG;IACH,gBAAgB,CAAC,CAAC,SAAS,UAAU,EAAE,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EAC9D,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,CAAC,GACT,IAAI;IAIP;;;;OAIG;IACH,mBAAmB,CAAC,CAAC,SAAS,UAAU,EAAE,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EACjE,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,CAAC,GACT,IAAI;IAIP;;;;;OAKG;IACH,IAAI,CAAC,GAAG,EAAE,sBAAsB,GAAG,SAAS;IA4C5C;;;;OAIG;IACG,KAAK;IAUX;;;;OAIG;IACG,OAAO;CASd"}
|
|
@@ -155,10 +155,17 @@ export class Transport {
|
|
|
155
155
|
return null;
|
|
156
156
|
}
|
|
157
157
|
if (Value.Check(OpaqueTransportMessageSchema, parsedMsg)) {
|
|
158
|
-
|
|
158
|
+
// JSON can't express the difference between `undefined` and `null`, so we need to patch that.
|
|
159
|
+
return {
|
|
160
|
+
...parsedMsg,
|
|
161
|
+
serviceName: parsedMsg.serviceName === null ? undefined : parsedMsg.serviceName,
|
|
162
|
+
procedureName: parsedMsg.procedureName === null
|
|
163
|
+
? undefined
|
|
164
|
+
: parsedMsg.procedureName,
|
|
165
|
+
};
|
|
159
166
|
}
|
|
160
167
|
else {
|
|
161
|
-
log?.warn(`${this.clientId} -- received invalid msg: ${JSON.stringify(
|
|
168
|
+
log?.warn(`${this.clientId} -- received invalid msg: ${JSON.stringify(parsedMsg)}`);
|
|
162
169
|
return null;
|
|
163
170
|
}
|
|
164
171
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testHelpers.d.ts","sourceRoot":"","sources":["../../util/testHelpers.ts"],"names":[],"mappings":";AAAA,OAAO,SAAS,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AACrC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAGjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,QAAQ,EAAY,MAAM,aAAa,CAAC;AACjD,OAAO,EAEL,MAAM,EACN,UAAU,EACV,mBAAmB,EAEpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,4EAE9D;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAWxE;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,MAAM,sBAI5D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,eAAe,EACpB,KAAK,CAAC,EAAE,KAAK,GACZ,CAAC,wBAAwB,EAAE,wBAAwB,CAAC,CAWtD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CACzB,KAAK,SAAS,MAAM,GAAG,OAAO,EAC9B,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,UAAU,EAEpB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAC5C,eAAe,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,SAGxC,OAAO,CAAC,CAAC,KACb,QACD,OAAO,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO,0BAA0B,CAAC,CAAC,CAClE,CAYF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAC5B,KAAK,SAAS,MAAM,GAAG,OAAO,EAC9B,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,UAAU,EAEpB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAC/C,eAAe,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,GAC9C;IACD,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACnB,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC;CAC5E,
|
|
1
|
+
{"version":3,"file":"testHelpers.d.ts","sourceRoot":"","sources":["../../util/testHelpers.ts"],"names":[],"mappings":"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"}
|
package/dist/util/testHelpers.js
CHANGED
|
@@ -116,6 +116,7 @@ export function asClientStream(state, proc, extendedContext) {
|
|
|
116
116
|
for await (const transportRes of transportOutput) {
|
|
117
117
|
rawOutput.push(transportRes.payload);
|
|
118
118
|
}
|
|
119
|
+
rawOutput.end();
|
|
119
120
|
})();
|
|
120
121
|
// handle
|
|
121
122
|
(async () => {
|
|
@@ -168,6 +169,7 @@ export function asClientStreamWithInitialization(state, proc, init, extendedCont
|
|
|
168
169
|
for await (const transportRes of transportOutput) {
|
|
169
170
|
rawOutput.push(transportRes.payload);
|
|
170
171
|
}
|
|
172
|
+
rawOutput.end();
|
|
171
173
|
})();
|
|
172
174
|
// handle
|
|
173
175
|
(async () => {
|
|
@@ -209,6 +211,7 @@ export function asClientSubscription(state, proc, extendedContext) {
|
|
|
209
211
|
for await (const transportRes of transportOutput) {
|
|
210
212
|
rawOutput.push(transportRes.payload);
|
|
211
213
|
}
|
|
214
|
+
rawOutput.end();
|
|
212
215
|
})();
|
|
213
216
|
return async (msg) => {
|
|
214
217
|
proc
|
|
@@ -309,7 +312,7 @@ export function asClientUploadWithInitialization(state, proc, init, extendedCont
|
|
|
309
312
|
* @returns The transport message.
|
|
310
313
|
*/
|
|
311
314
|
export function payloadToTransportMessage(payload, streamId, from = 'client', to = 'SERVER') {
|
|
312
|
-
return msg(from, to, '
|
|
315
|
+
return msg(from, to, streamId ?? 'stream', payload, 'service', 'procedure');
|
|
313
316
|
}
|
|
314
317
|
/**
|
|
315
318
|
* Creates a dummy opaque transport message for testing purposes.
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@replit/river",
|
|
3
3
|
"sideEffects": false,
|
|
4
4
|
"description": "It's like tRPC but... with JSON Schema Support, duplex streaming and support for service multiplexing. Transport agnostic!",
|
|
5
|
-
"version": "0.9.
|
|
5
|
+
"version": "0.9.2",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"exports": {
|
|
8
8
|
".": "./dist/router/index.js",
|