@replit/river 0.200.0-rc.2 → 0.200.0-rc.20
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 +30 -29
- package/dist/chunk-3HI3IJTL.js +285 -0
- package/dist/chunk-3HI3IJTL.js.map +1 -0
- package/dist/chunk-5L5RNZXH.js +391 -0
- package/dist/chunk-5L5RNZXH.js.map +1 -0
- package/dist/{chunk-QMM35C3H.js → chunk-BAGOAJ3K.js} +1 -1
- package/dist/chunk-BAGOAJ3K.js.map +1 -0
- package/dist/{chunk-S5RL45KH.js → chunk-BYCR4VEM.js} +78 -54
- package/dist/chunk-BYCR4VEM.js.map +1 -0
- package/dist/chunk-DM5QR4HQ.js +60 -0
- package/dist/chunk-DM5QR4HQ.js.map +1 -0
- package/dist/chunk-OLWVR5AB.js +860 -0
- package/dist/chunk-OLWVR5AB.js.map +1 -0
- package/dist/chunk-WKBWCRGN.js +437 -0
- package/dist/chunk-WKBWCRGN.js.map +1 -0
- package/dist/chunk-YBCQVIPR.js +351 -0
- package/dist/chunk-YBCQVIPR.js.map +1 -0
- package/dist/client-75090f07.d.ts +49 -0
- package/dist/connection-c9f96b64.d.ts +32 -0
- package/dist/context-9c907028.d.ts +622 -0
- 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/{index-10ebd26a.d.ts → message-59fe53e1.d.ts} +34 -31
- package/dist/router/index.cjs +771 -1159
- package/dist/router/index.cjs.map +1 -1
- package/dist/router/index.d.cts +14 -48
- package/dist/router/index.d.ts +14 -48
- package/dist/router/index.js +1238 -15
- package/dist/router/index.js.map +1 -1
- package/dist/server-109a29e2.d.ts +69 -0
- package/dist/services-aa49a9fb.d.ts +811 -0
- package/dist/transport/impls/ws/client.cjs +1293 -1034
- package/dist/transport/impls/ws/client.cjs.map +1 -1
- package/dist/transport/impls/ws/client.d.cts +7 -5
- package/dist/transport/impls/ws/client.d.ts +7 -5
- package/dist/transport/impls/ws/client.js +11 -11
- package/dist/transport/impls/ws/client.js.map +1 -1
- package/dist/transport/impls/ws/server.cjs +1437 -1072
- package/dist/transport/impls/ws/server.cjs.map +1 -1
- package/dist/transport/impls/ws/server.d.cts +7 -5
- package/dist/transport/impls/ws/server.d.ts +7 -5
- package/dist/transport/impls/ws/server.js +20 -8
- package/dist/transport/impls/ws/server.js.map +1 -1
- package/dist/transport/index.cjs +1720 -1400
- package/dist/transport/index.cjs.map +1 -1
- package/dist/transport/index.d.cts +5 -26
- package/dist/transport/index.d.ts +5 -26
- package/dist/transport/index.js +11 -11
- package/dist/util/testHelpers.cjs +1164 -591
- package/dist/util/testHelpers.cjs.map +1 -1
- package/dist/util/testHelpers.d.cts +41 -38
- package/dist/util/testHelpers.d.ts +41 -38
- package/dist/util/testHelpers.js +124 -89
- package/dist/util/testHelpers.js.map +1 -1
- package/package.json +3 -3
- package/dist/chunk-47TFNAY2.js +0 -476
- package/dist/chunk-47TFNAY2.js.map +0 -1
- package/dist/chunk-4VNY34QG.js +0 -106
- package/dist/chunk-4VNY34QG.js.map +0 -1
- package/dist/chunk-7CKIN3JT.js +0 -2004
- package/dist/chunk-7CKIN3JT.js.map +0 -1
- package/dist/chunk-CZP4LK3F.js +0 -335
- package/dist/chunk-CZP4LK3F.js.map +0 -1
- package/dist/chunk-DJCW3SKT.js +0 -59
- package/dist/chunk-DJCW3SKT.js.map +0 -1
- package/dist/chunk-NQWDT6GS.js +0 -347
- package/dist/chunk-NQWDT6GS.js.map +0 -1
- package/dist/chunk-ONUXWVRC.js +0 -492
- package/dist/chunk-ONUXWVRC.js.map +0 -1
- package/dist/chunk-QMM35C3H.js.map +0 -1
- package/dist/chunk-S5RL45KH.js.map +0 -1
- package/dist/connection-3f117047.d.ts +0 -17
- package/dist/connection-f900e390.d.ts +0 -35
- package/dist/services-970f97bb.d.ts +0 -1372
- package/dist/transport/impls/uds/client.cjs +0 -1687
- package/dist/transport/impls/uds/client.cjs.map +0 -1
- package/dist/transport/impls/uds/client.d.cts +0 -17
- package/dist/transport/impls/uds/client.d.ts +0 -17
- package/dist/transport/impls/uds/client.js +0 -44
- package/dist/transport/impls/uds/client.js.map +0 -1
- package/dist/transport/impls/uds/server.cjs +0 -1522
- package/dist/transport/impls/uds/server.cjs.map +0 -1
- package/dist/transport/impls/uds/server.d.cts +0 -19
- package/dist/transport/impls/uds/server.d.ts +0 -19
- package/dist/transport/impls/uds/server.js +0 -33
- package/dist/transport/impls/uds/server.js.map +0 -1
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
// transport/message.ts
|
|
2
2
|
import { Type } from "@sinclair/typebox";
|
|
3
|
-
|
|
3
|
+
|
|
4
|
+
// transport/id.ts
|
|
5
|
+
import { customAlphabet } from "nanoid";
|
|
6
|
+
var alphabet = customAlphabet(
|
|
7
|
+
"1234567890abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZ"
|
|
8
|
+
);
|
|
9
|
+
var generateId = () => alphabet(12);
|
|
10
|
+
|
|
11
|
+
// transport/message.ts
|
|
4
12
|
var TransportMessageSchema = (t) => Type.Object({
|
|
5
13
|
id: Type.String(),
|
|
6
14
|
from: Type.String(),
|
|
@@ -25,7 +33,8 @@ var ControlMessageAckSchema = Type.Object({
|
|
|
25
33
|
var ControlMessageCloseSchema = Type.Object({
|
|
26
34
|
type: Type.Literal("CLOSE")
|
|
27
35
|
});
|
|
28
|
-
var
|
|
36
|
+
var currentProtocolVersion = "v2.0";
|
|
37
|
+
var acceptedProtocolVersions = ["v1.1", currentProtocolVersion];
|
|
29
38
|
var ControlMessageHandshakeRequestSchema = Type.Object({
|
|
30
39
|
type: Type.Literal("HANDSHAKE_REQ"),
|
|
31
40
|
protocolVersion: Type.String(),
|
|
@@ -35,18 +44,35 @@ var ControlMessageHandshakeRequestSchema = Type.Object({
|
|
|
35
44
|
* used by the server to know whether this is a new or a reestablished connection, and whether it
|
|
36
45
|
* is compatible with what it already has.
|
|
37
46
|
*/
|
|
38
|
-
expectedSessionState: Type.
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
*/
|
|
44
|
-
reconnect: Type.Boolean(),
|
|
45
|
-
nextExpectedSeq: Type.Integer()
|
|
46
|
-
})
|
|
47
|
-
),
|
|
47
|
+
expectedSessionState: Type.Object({
|
|
48
|
+
// what the client expects the server to send next
|
|
49
|
+
nextExpectedSeq: Type.Integer(),
|
|
50
|
+
nextSentSeq: Type.Integer()
|
|
51
|
+
}),
|
|
48
52
|
metadata: Type.Optional(Type.Unknown())
|
|
49
53
|
});
|
|
54
|
+
var HandshakeErrorRetriableResponseCodes = Type.Union([
|
|
55
|
+
Type.Literal("SESSION_STATE_MISMATCH")
|
|
56
|
+
]);
|
|
57
|
+
var HandshakeErrorCustomHandlerFatalResponseCodes = Type.Union([
|
|
58
|
+
// The custom validation handler rejected the handler because the client is unsupported.
|
|
59
|
+
Type.Literal("REJECTED_UNSUPPORTED_CLIENT"),
|
|
60
|
+
// The custom validation handler rejected the handshake.
|
|
61
|
+
Type.Literal("REJECTED_BY_CUSTOM_HANDLER")
|
|
62
|
+
]);
|
|
63
|
+
var HandshakeErrorFatalResponseCodes = Type.Union([
|
|
64
|
+
HandshakeErrorCustomHandlerFatalResponseCodes,
|
|
65
|
+
// The ciient sent a handshake that doesn't comply with the extended handshake metadata.
|
|
66
|
+
Type.Literal("MALFORMED_HANDSHAKE_META"),
|
|
67
|
+
// The ciient sent a handshake that doesn't comply with ControlMessageHandshakeRequestSchema.
|
|
68
|
+
Type.Literal("MALFORMED_HANDSHAKE"),
|
|
69
|
+
// The client's protocol version does not match the server's.
|
|
70
|
+
Type.Literal("PROTOCOL_VERSION_MISMATCH")
|
|
71
|
+
]);
|
|
72
|
+
var HandshakeErrorResponseCodes = Type.Union([
|
|
73
|
+
HandshakeErrorRetriableResponseCodes,
|
|
74
|
+
HandshakeErrorFatalResponseCodes
|
|
75
|
+
]);
|
|
50
76
|
var ControlMessageHandshakeResponseSchema = Type.Object({
|
|
51
77
|
type: Type.Literal("HANDSHAKE_RESP"),
|
|
52
78
|
status: Type.Union([
|
|
@@ -56,7 +82,8 @@ var ControlMessageHandshakeResponseSchema = Type.Object({
|
|
|
56
82
|
}),
|
|
57
83
|
Type.Object({
|
|
58
84
|
ok: Type.Literal(false),
|
|
59
|
-
reason: Type.String()
|
|
85
|
+
reason: Type.String(),
|
|
86
|
+
code: HandshakeErrorResponseCodes
|
|
60
87
|
})
|
|
61
88
|
])
|
|
62
89
|
});
|
|
@@ -78,36 +105,35 @@ function handshakeRequestMessage({
|
|
|
78
105
|
tracing
|
|
79
106
|
}) {
|
|
80
107
|
return {
|
|
81
|
-
id:
|
|
108
|
+
id: generateId(),
|
|
82
109
|
from,
|
|
83
110
|
to,
|
|
84
111
|
seq: 0,
|
|
85
112
|
ack: 0,
|
|
86
|
-
streamId:
|
|
113
|
+
streamId: generateId(),
|
|
87
114
|
controlFlags: 0,
|
|
88
115
|
tracing,
|
|
89
116
|
payload: {
|
|
90
117
|
type: "HANDSHAKE_REQ",
|
|
91
|
-
protocolVersion:
|
|
118
|
+
protocolVersion: currentProtocolVersion,
|
|
92
119
|
sessionId,
|
|
93
120
|
expectedSessionState,
|
|
94
121
|
metadata
|
|
95
122
|
}
|
|
96
123
|
};
|
|
97
124
|
}
|
|
98
|
-
var SESSION_STATE_MISMATCH = "session state mismatch";
|
|
99
125
|
function handshakeResponseMessage({
|
|
100
126
|
from,
|
|
101
127
|
to,
|
|
102
128
|
status
|
|
103
129
|
}) {
|
|
104
130
|
return {
|
|
105
|
-
id:
|
|
131
|
+
id: generateId(),
|
|
106
132
|
from,
|
|
107
133
|
to,
|
|
108
134
|
seq: 0,
|
|
109
135
|
ack: 0,
|
|
110
|
-
streamId:
|
|
136
|
+
streamId: generateId(),
|
|
111
137
|
controlFlags: 0,
|
|
112
138
|
payload: {
|
|
113
139
|
type: "HANDSHAKE_RESP",
|
|
@@ -115,6 +141,22 @@ function handshakeResponseMessage({
|
|
|
115
141
|
}
|
|
116
142
|
};
|
|
117
143
|
}
|
|
144
|
+
function closeStreamMessage(streamId) {
|
|
145
|
+
return {
|
|
146
|
+
streamId,
|
|
147
|
+
controlFlags: 8 /* StreamClosedBit */,
|
|
148
|
+
payload: {
|
|
149
|
+
type: "CLOSE"
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
function cancelMessage(streamId, payload) {
|
|
154
|
+
return {
|
|
155
|
+
streamId,
|
|
156
|
+
controlFlags: 4 /* StreamCancelBit */,
|
|
157
|
+
payload
|
|
158
|
+
};
|
|
159
|
+
}
|
|
118
160
|
function isAck(controlFlag) {
|
|
119
161
|
return (controlFlag & 1 /* AckBit */) === 1 /* AckBit */;
|
|
120
162
|
}
|
|
@@ -130,21 +172,15 @@ function isStreamClose(controlFlag) {
|
|
|
130
172
|
(controlFlag & 8 /* StreamClosedBit */) === 8 /* StreamClosedBit */
|
|
131
173
|
);
|
|
132
174
|
}
|
|
133
|
-
function
|
|
134
|
-
return (
|
|
135
|
-
/* eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison */
|
|
136
|
-
(controlFlag & 16 /* StreamCloseRequestBit */) === 16 /* StreamCloseRequestBit */
|
|
137
|
-
);
|
|
138
|
-
}
|
|
139
|
-
function isStreamAbort(controlFlag) {
|
|
175
|
+
function isStreamCancel(controlFlag) {
|
|
140
176
|
return (
|
|
141
177
|
/* eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison */
|
|
142
|
-
(controlFlag & 4 /*
|
|
178
|
+
(controlFlag & 4 /* StreamCancelBit */) === 4 /* StreamCancelBit */
|
|
143
179
|
);
|
|
144
180
|
}
|
|
145
181
|
|
|
146
182
|
// package.json
|
|
147
|
-
var version = "0.200.0-rc.
|
|
183
|
+
var version = "0.200.0-rc.20";
|
|
148
184
|
|
|
149
185
|
// util/stringify.ts
|
|
150
186
|
function coerceErrorString(err) {
|
|
@@ -169,16 +205,16 @@ function getPropagationContext(ctx) {
|
|
|
169
205
|
propagation.inject(ctx, tracing);
|
|
170
206
|
return tracing;
|
|
171
207
|
}
|
|
172
|
-
function createSessionTelemetryInfo(
|
|
208
|
+
function createSessionTelemetryInfo(sessionId, to, from, propagationCtx) {
|
|
173
209
|
const parentCtx = propagationCtx ? propagation.extract(context.active(), propagationCtx) : context.active();
|
|
174
210
|
const span = tracer.startSpan(
|
|
175
|
-
`session ${
|
|
211
|
+
`session ${sessionId}`,
|
|
176
212
|
{
|
|
177
213
|
attributes: {
|
|
178
214
|
component: "river",
|
|
179
|
-
"river.session.id":
|
|
180
|
-
"river.session.to":
|
|
181
|
-
"river.session.from":
|
|
215
|
+
"river.session.id": sessionId,
|
|
216
|
+
"river.session.to": to,
|
|
217
|
+
"river.session.from": from
|
|
182
218
|
}
|
|
183
219
|
},
|
|
184
220
|
parentCtx
|
|
@@ -186,21 +222,6 @@ function createSessionTelemetryInfo(session, propagationCtx) {
|
|
|
186
222
|
const ctx = trace.setSpan(parentCtx, span);
|
|
187
223
|
return { span, ctx };
|
|
188
224
|
}
|
|
189
|
-
function createConnectionTelemetryInfo(connection, info) {
|
|
190
|
-
const span = tracer.startSpan(
|
|
191
|
-
`connection ${connection.id}`,
|
|
192
|
-
{
|
|
193
|
-
attributes: {
|
|
194
|
-
component: "river",
|
|
195
|
-
"river.connection.id": connection.id
|
|
196
|
-
},
|
|
197
|
-
links: [{ context: info.span.spanContext() }]
|
|
198
|
-
},
|
|
199
|
-
info.ctx
|
|
200
|
-
);
|
|
201
|
-
const ctx = trace.setSpan(info.ctx, span);
|
|
202
|
-
return { span, ctx };
|
|
203
|
-
}
|
|
204
225
|
function createProcTelemetryInfo(transport, kind, serviceName, procedureName, streamId) {
|
|
205
226
|
const baseCtx = context.active();
|
|
206
227
|
const span = tracer.startSpan(
|
|
@@ -255,28 +276,31 @@ var tracer = trace.getTracer("river", version);
|
|
|
255
276
|
var tracing_default = tracer;
|
|
256
277
|
|
|
257
278
|
export {
|
|
279
|
+
generateId,
|
|
258
280
|
TransportMessageSchema,
|
|
259
281
|
ControlMessageCloseSchema,
|
|
260
|
-
|
|
282
|
+
currentProtocolVersion,
|
|
283
|
+
acceptedProtocolVersions,
|
|
261
284
|
ControlMessageHandshakeRequestSchema,
|
|
285
|
+
HandshakeErrorRetriableResponseCodes,
|
|
286
|
+
HandshakeErrorCustomHandlerFatalResponseCodes,
|
|
262
287
|
ControlMessageHandshakeResponseSchema,
|
|
263
288
|
ControlMessagePayloadSchema,
|
|
264
289
|
OpaqueTransportMessageSchema,
|
|
265
290
|
handshakeRequestMessage,
|
|
266
|
-
SESSION_STATE_MISMATCH,
|
|
267
291
|
handshakeResponseMessage,
|
|
292
|
+
closeStreamMessage,
|
|
293
|
+
cancelMessage,
|
|
268
294
|
isAck,
|
|
269
295
|
isStreamOpen,
|
|
270
296
|
isStreamClose,
|
|
271
|
-
|
|
272
|
-
isStreamAbort,
|
|
297
|
+
isStreamCancel,
|
|
273
298
|
version,
|
|
274
299
|
getPropagationContext,
|
|
275
300
|
createSessionTelemetryInfo,
|
|
276
|
-
createConnectionTelemetryInfo,
|
|
277
301
|
createProcTelemetryInfo,
|
|
278
302
|
createHandlerSpan,
|
|
279
303
|
tracing_default,
|
|
280
304
|
coerceErrorString
|
|
281
305
|
};
|
|
282
|
-
//# sourceMappingURL=chunk-
|
|
306
|
+
//# sourceMappingURL=chunk-BYCR4VEM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../transport/message.ts","../transport/id.ts","../package.json","../util/stringify.ts","../tracing/index.ts"],"sourcesContent":["import { Type, TSchema, Static } from '@sinclair/typebox';\nimport { PropagationContext } from '../tracing';\nimport { generateId } from './id';\nimport { ErrResult, ReaderErrorSchema } from '../router';\n\n/**\n * Control flags for transport messages.\n */\nexport const enum ControlFlags {\n /**\n * Used in heartbeat messages.\n */\n AckBit = 0b00001,\n /**\n * Used in stream open requests.\n */\n StreamOpenBit = 0b00010,\n /**\n * Used when writer closes the stream.\n */\n StreamClosedBit = 0b01000,\n /**\n * Used when a stream is cancelled due errors or to explicit cancellation\n */\n StreamCancelBit = 0b00100,\n}\n\n/**\n * Generic Typebox schema for a transport message.\n * @template T The type of the payload.\n * @param {T} t The payload schema.\n * @returns The transport message schema.\n */\nexport const TransportMessageSchema = <T extends TSchema>(t: T) =>\n Type.Object({\n id: Type.String(),\n from: Type.String(),\n to: Type.String(),\n seq: Type.Integer(),\n ack: Type.Integer(),\n serviceName: Type.Optional(Type.String()),\n procedureName: Type.Optional(Type.String()),\n streamId: Type.String(),\n controlFlags: Type.Integer(),\n tracing: Type.Optional(\n Type.Object({\n traceparent: Type.String(),\n tracestate: Type.String(),\n }),\n ),\n payload: t,\n });\n\n/**\n * Defines the schema for a transport acknowledgement message. This is never constructed manually\n * and is only used internally by the library for tracking inflight messages.\n * @returns The transport message schema.\n */\nexport const ControlMessageAckSchema = Type.Object({\n type: Type.Literal('ACK'),\n});\n\n/**\n * Defines the schema for a transport close message. This is never constructed manually and is only\n * used internally by the library for closing and cleaning up streams.\n */\nexport const ControlMessageCloseSchema = Type.Object({\n type: Type.Literal('CLOSE'),\n});\n\nexport const currentProtocolVersion = 'v2.0';\nexport const acceptedProtocolVersions = ['v1.1', currentProtocolVersion];\n\nexport const ControlMessageHandshakeRequestSchema = Type.Object({\n type: Type.Literal('HANDSHAKE_REQ'),\n protocolVersion: Type.String(),\n sessionId: Type.String(),\n /**\n * Specifies what the server's expected session state (from the pov of the client). This can be\n * used by the server to know whether this is a new or a reestablished connection, and whether it\n * is compatible with what it already has.\n */\n expectedSessionState: Type.Object({\n // what the client expects the server to send next\n nextExpectedSeq: Type.Integer(),\n nextSentSeq: Type.Integer(),\n }),\n\n metadata: Type.Optional(Type.Unknown()),\n});\n\nexport const HandshakeErrorRetriableResponseCodes = Type.Union([\n Type.Literal('SESSION_STATE_MISMATCH'),\n]);\n\nexport const HandshakeErrorCustomHandlerFatalResponseCodes = Type.Union([\n // The custom validation handler rejected the handler because the client is unsupported.\n Type.Literal('REJECTED_UNSUPPORTED_CLIENT'),\n // The custom validation handler rejected the handshake.\n Type.Literal('REJECTED_BY_CUSTOM_HANDLER'),\n]);\n\nexport const HandshakeErrorFatalResponseCodes = Type.Union([\n HandshakeErrorCustomHandlerFatalResponseCodes,\n // The ciient sent a handshake that doesn't comply with the extended handshake metadata.\n Type.Literal('MALFORMED_HANDSHAKE_META'),\n // The ciient sent a handshake that doesn't comply with ControlMessageHandshakeRequestSchema.\n Type.Literal('MALFORMED_HANDSHAKE'),\n // The client's protocol version does not match the server's.\n Type.Literal('PROTOCOL_VERSION_MISMATCH'),\n]);\n\nexport const HandshakeErrorResponseCodes = Type.Union([\n HandshakeErrorRetriableResponseCodes,\n HandshakeErrorFatalResponseCodes,\n]);\n\nexport const ControlMessageHandshakeResponseSchema = Type.Object({\n type: Type.Literal('HANDSHAKE_RESP'),\n status: Type.Union([\n Type.Object({\n ok: Type.Literal(true),\n sessionId: Type.String(),\n }),\n Type.Object({\n ok: Type.Literal(false),\n reason: Type.String(),\n code: HandshakeErrorResponseCodes,\n }),\n ]),\n});\n\nexport const ControlMessagePayloadSchema = Type.Union([\n ControlMessageCloseSchema,\n ControlMessageAckSchema,\n ControlMessageHandshakeRequestSchema,\n ControlMessageHandshakeResponseSchema,\n]);\n\n/**\n * Defines the schema for an opaque transport message that is agnostic to any\n * procedure/service.\n * @returns The transport message schema.\n */\nexport const OpaqueTransportMessageSchema = TransportMessageSchema(\n Type.Unknown(),\n);\n\n/**\n * Represents a transport message. This is the same type as {@link TransportMessageSchema} but\n * we can't statically infer generics from generic Typebox schemas so we have to define it again here.\n *\n * TypeScript can't enforce types when a bitmask is involved, so these are the semantics of\n * `controlFlags`:\n * * If `controlFlags & StreamOpenBit == StreamOpenBit`, `streamId` must be set to a unique value\n * (suggestion: use `nanoid`).\n * * If `controlFlags & StreamOpenBit == StreamOpenBit`, `serviceName` and `procedureName` must be set.\n * * If `controlFlags & StreamClosedBit == StreamClosedBit` and the kind is `stream` or `subscription`,\n * `payload` should be discarded (usually contains a control message).\n * * If `controlFlags & AckBit == AckBit`, the message is an explicit acknowledgement message and doesn't\n * contain any payload that is relevant to the application so should not be delivered.\n * @template Payload The type of the payload.\n */\nexport interface TransportMessage<Payload = unknown> {\n id: string;\n from: TransportClientId;\n to: TransportClientId;\n seq: number;\n ack: number;\n serviceName?: string;\n procedureName?: string;\n streamId: string;\n controlFlags: number;\n tracing?: PropagationContext;\n payload: Payload;\n}\n\nexport type PartialTransportMessage<Payload = unknown> = Omit<\n TransportMessage<Payload>,\n 'id' | 'from' | 'to' | 'seq' | 'ack'\n>;\n\nexport function handshakeRequestMessage({\n from,\n to,\n sessionId,\n expectedSessionState,\n metadata,\n tracing,\n}: {\n from: TransportClientId;\n to: TransportClientId;\n sessionId: string;\n expectedSessionState: Static<\n typeof ControlMessageHandshakeRequestSchema\n >['expectedSessionState'];\n metadata?: unknown;\n tracing?: PropagationContext;\n}): TransportMessage<Static<typeof ControlMessageHandshakeRequestSchema>> {\n return {\n id: generateId(),\n from,\n to,\n seq: 0,\n ack: 0,\n streamId: generateId(),\n controlFlags: 0,\n tracing,\n payload: {\n type: 'HANDSHAKE_REQ',\n protocolVersion: currentProtocolVersion,\n sessionId,\n expectedSessionState,\n metadata,\n } satisfies Static<typeof ControlMessageHandshakeRequestSchema>,\n };\n}\n\n/**\n * This is a reason that can be given during the handshake to indicate that the peer has the wrong\n * session state.\n */\nexport const SESSION_STATE_MISMATCH = 'session state mismatch';\n\nexport function handshakeResponseMessage({\n from,\n to,\n status,\n}: {\n from: TransportClientId;\n to: TransportClientId;\n status: Static<typeof ControlMessageHandshakeResponseSchema>['status'];\n}): TransportMessage<Static<typeof ControlMessageHandshakeResponseSchema>> {\n return {\n id: generateId(),\n from,\n to,\n seq: 0,\n ack: 0,\n streamId: generateId(),\n controlFlags: 0,\n payload: {\n type: 'HANDSHAKE_RESP',\n status,\n } satisfies Static<typeof ControlMessageHandshakeResponseSchema>,\n };\n}\n\nexport function closeStreamMessage(streamId: string): PartialTransportMessage {\n return {\n streamId,\n controlFlags: ControlFlags.StreamClosedBit,\n payload: {\n type: 'CLOSE' as const,\n } satisfies Static<typeof ControlMessagePayloadSchema>,\n };\n}\n\nexport function cancelMessage(\n streamId: string,\n payload: ErrResult<Static<typeof ReaderErrorSchema>>,\n) {\n return {\n streamId,\n controlFlags: ControlFlags.StreamCancelBit,\n payload,\n };\n}\n\n/**\n * A type alias for a transport message with an opaque payload.\n * @template T - The type of the opaque payload.\n */\nexport type OpaqueTransportMessage = TransportMessage;\nexport type TransportClientId = string;\n\n/**\n * Checks if the given control flag (usually found in msg.controlFlag) is an ack message.\n * @param controlFlag - The control flag to check.\n * @returns True if the control flag contains the AckBit, false otherwise.\n */\nexport function isAck(controlFlag: number): boolean {\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison */\n return (controlFlag & ControlFlags.AckBit) === ControlFlags.AckBit;\n}\n\n/**\n * Checks if the given control flag (usually found in msg.controlFlag) is a stream open message.\n * @param controlFlag - The control flag to check.\n * @returns True if the control flag contains the StreamOpenBit, false otherwise.\n */\nexport function isStreamOpen(controlFlag: number): boolean {\n return (\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison */\n (controlFlag & ControlFlags.StreamOpenBit) === ControlFlags.StreamOpenBit\n );\n}\n\n/**\n * Checks if the given control flag (usually found in msg.controlFlag) is a stream close message.\n * @param controlFlag - The control flag to check.\n * @returns True if the control flag contains the StreamCloseBit, false otherwise.\n */\nexport function isStreamClose(controlFlag: number): boolean {\n return (\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison */\n (controlFlag & ControlFlags.StreamClosedBit) ===\n ControlFlags.StreamClosedBit\n );\n}\n\n/**\n * Checks if the given control flag (usually found in msg.controlFlag) is an cancel message.\n * @param controlFlag - The control flag to check.\n * @returns True if the control flag contains the CancelBit, false otherwise\n */\nexport function isStreamCancel(controlFlag: number): boolean {\n return (\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison */\n (controlFlag & ControlFlags.StreamCancelBit) ===\n ControlFlags.StreamCancelBit\n );\n}\n","import { customAlphabet } from 'nanoid';\n\nconst alphabet = customAlphabet(\n '1234567890abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZ',\n);\nexport const generateId = () => alphabet(12);\n","{\n \"name\": \"@replit/river\",\n \"description\": \"It's like tRPC but... with JSON Schema Support, duplex streaming and support for service multiplexing. Transport agnostic!\",\n \"version\": \"0.200.0-rc.20\",\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"import\": \"./dist/router/index.js\",\n \"require\": \"./dist/router/index.cjs\"\n },\n \"./logging\": {\n \"import\": \"./dist/logging/index.js\",\n \"require\": \"./dist/logging/index.cjs\"\n },\n \"./codec\": {\n \"import\": \"./dist/codec/index.js\",\n \"require\": \"./dist/codec/index.cjs\"\n },\n \"./transport\": {\n \"import\": \"./dist/transport/index.js\",\n \"require\": \"./dist/transport/index.cjs\"\n },\n \"./transport/ws/client\": {\n \"import\": \"./dist/transport/impls/ws/client.js\",\n \"require\": \"./dist/transport/impls/ws/client.cjs\"\n },\n \"./transport/ws/server\": {\n \"import\": \"./dist/transport/impls/ws/server.js\",\n \"require\": \"./dist/transport/impls/ws/server.cjs\"\n },\n \"./transport/uds/client\": {\n \"import\": \"./dist/transport/impls/uds/client.js\",\n \"require\": \"./dist/transport/impls/uds/client.cjs\"\n },\n \"./transport/uds/server\": {\n \"import\": \"./dist/transport/impls/uds/server.js\",\n \"require\": \"./dist/transport/impls/uds/server.cjs\"\n },\n \"./test-util\": {\n \"import\": \"./dist/util/testHelpers.js\",\n \"require\": \"./dist/util/testHelpers.cjs\"\n }\n },\n \"sideEffects\": [\n \"./dist/logging/index.js\"\n ],\n \"files\": [\n \"dist\"\n ],\n \"dependencies\": {\n \"@msgpack/msgpack\": \"^3.0.0-beta2\",\n \"nanoid\": \"^4.0.2\",\n \"ws\": \"^8.17.0\"\n },\n \"peerDependencies\": {\n \"@opentelemetry/api\": \"^1.7.0\",\n \"@sinclair/typebox\": \"~0.32.8\"\n },\n \"devDependencies\": {\n \"@opentelemetry/core\": \"^1.7.0\",\n \"@opentelemetry/sdk-trace-base\": \"^1.24.1\",\n \"@opentelemetry/sdk-trace-web\": \"^1.24.1\",\n \"@types/ws\": \"^8.5.5\",\n \"@typescript-eslint/eslint-plugin\": \"^7.8.0\",\n \"@typescript-eslint/parser\": \"^7.8.0\",\n \"@vitest/ui\": \"^2.0.5\",\n \"eslint\": \"^8.57.0\",\n \"eslint-config-prettier\": \"^9.1.0\",\n \"eslint-plugin-prettier\": \"^5.1.3\",\n \"prettier\": \"^3.0.0\",\n \"tsup\": \"^7.2.0\",\n \"typescript\": \"^5.4.5\",\n \"vitest\": \"^2.0.5\"\n },\n \"scripts\": {\n \"check\": \"tsc --noEmit && npm run format && npm run lint\",\n \"format\": \"npx prettier . --check\",\n \"format:fix\": \"npx prettier . --write\",\n \"lint\": \"eslint .\",\n \"lint:fix\": \"eslint . --fix\",\n \"fix\": \"npm run format:fix && npm run lint:fix\",\n \"build\": \"rm -rf dist && tsup && du -sh dist\",\n \"prepack\": \"npm run build\",\n \"release\": \"npm publish --access public\",\n \"test:ui\": \"echo \\\"remember to go to /__vitest__ in the webview\\\" && vitest --ui --api.host 0.0.0.0 --api.port 3000\",\n \"test\": \"vitest\",\n \"test:single\": \"vitest run --reporter=dot\",\n \"test:flake\": \"./flake.sh\",\n \"bench\": \"vitest bench\"\n },\n \"engines\": {\n \"node\": \">=16\"\n },\n \"keywords\": [\n \"rpc\",\n \"websockets\",\n \"jsonschema\"\n ],\n \"author\": \"Jacky Zhao\",\n \"license\": \"MIT\"\n}\n","export function coerceErrorString(err: unknown): string {\n if (err instanceof Error) {\n return err.message || 'unknown reason';\n }\n\n return `[coerced to error] ${String(err)}`;\n}\n","import {\n Context,\n Span,\n SpanKind,\n context,\n propagation,\n trace,\n} from '@opentelemetry/api';\nimport { version as RIVER_VERSION } from '../package.json';\nimport { ValidProcType } from '../router';\nimport { ClientTransport, Connection } from '../transport';\n\nexport interface PropagationContext {\n traceparent: string;\n tracestate: string;\n}\n\nexport interface TelemetryInfo {\n span: Span;\n ctx: Context;\n}\n\nexport function getPropagationContext(\n ctx: Context,\n): PropagationContext | undefined {\n const tracing = {\n traceparent: '',\n tracestate: '',\n };\n propagation.inject(ctx, tracing);\n return tracing;\n}\n\nexport function createSessionTelemetryInfo(\n sessionId: string,\n to: string,\n from: string,\n propagationCtx?: PropagationContext,\n): TelemetryInfo {\n const parentCtx = propagationCtx\n ? propagation.extract(context.active(), propagationCtx)\n : context.active();\n\n const span = tracer.startSpan(\n `session ${sessionId}`,\n {\n attributes: {\n component: 'river',\n 'river.session.id': sessionId,\n 'river.session.to': to,\n 'river.session.from': from,\n },\n },\n parentCtx,\n );\n\n const ctx = trace.setSpan(parentCtx, span);\n\n return { span, ctx };\n}\n\nexport function createConnectionTelemetryInfo(\n connection: Connection,\n info: TelemetryInfo,\n): TelemetryInfo {\n const span = tracer.startSpan(\n `connection ${connection.id}`,\n {\n attributes: {\n component: 'river',\n 'river.connection.id': connection.id,\n },\n links: [{ context: info.span.spanContext() }],\n },\n info.ctx,\n );\n\n const ctx = trace.setSpan(info.ctx, span);\n\n return { span, ctx };\n}\n\nexport function createProcTelemetryInfo(\n transport: ClientTransport<Connection>,\n kind: ValidProcType,\n serviceName: string,\n procedureName: string,\n streamId: string,\n): TelemetryInfo {\n const baseCtx = context.active();\n const span = tracer.startSpan(\n `procedure call ${serviceName}.${procedureName}`,\n {\n attributes: {\n component: 'river',\n 'river.method.kind': kind,\n 'river.method.service': serviceName,\n 'river.method.name': procedureName,\n 'river.streamId': streamId,\n 'span.kind': 'client',\n },\n kind: SpanKind.CLIENT,\n },\n baseCtx,\n );\n\n const ctx = trace.setSpan(baseCtx, span);\n\n transport.log?.info(`invoked ${serviceName}.${procedureName}`, {\n clientId: transport.clientId,\n transportMessage: {\n procedureName,\n serviceName,\n },\n telemetry: {\n traceId: span.spanContext().traceId,\n spanId: span.spanContext().spanId,\n },\n });\n return { span, ctx };\n}\n\nexport function createHandlerSpan<Fn extends (span: Span) => unknown>(\n kind: ValidProcType,\n serviceName: string,\n procedureName: string,\n streamId: string,\n tracing: PropagationContext | undefined,\n fn: Fn,\n): ReturnType<Fn> {\n const ctx = tracing\n ? propagation.extract(context.active(), tracing)\n : context.active();\n\n return tracer.startActiveSpan<Fn>(\n `procedure handler ${serviceName}.${procedureName}`,\n {\n attributes: {\n component: 'river',\n 'river.method.kind': kind,\n 'river.method.service': serviceName,\n 'river.method.name': procedureName,\n 'river.streamId': streamId,\n 'span.kind': 'server',\n },\n kind: SpanKind.SERVER,\n },\n ctx,\n fn,\n );\n}\n\nconst tracer = trace.getTracer('river', RIVER_VERSION);\nexport default tracer;\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Connection
|
|
3
|
+
} from "./chunk-3HI3IJTL.js";
|
|
4
|
+
|
|
5
|
+
// transport/impls/ws/connection.ts
|
|
6
|
+
var WS_HEALTHY_CLOSE_CODE = 1e3;
|
|
7
|
+
var WebSocketConnection = class extends Connection {
|
|
8
|
+
ws;
|
|
9
|
+
extras;
|
|
10
|
+
get loggingMetadata() {
|
|
11
|
+
const metadata = super.loggingMetadata;
|
|
12
|
+
if (this.extras) {
|
|
13
|
+
metadata.extras = this.extras;
|
|
14
|
+
}
|
|
15
|
+
return metadata;
|
|
16
|
+
}
|
|
17
|
+
constructor(ws, extras) {
|
|
18
|
+
super();
|
|
19
|
+
this.ws = ws;
|
|
20
|
+
this.extras = extras;
|
|
21
|
+
this.ws.binaryType = "arraybuffer";
|
|
22
|
+
let didError = false;
|
|
23
|
+
this.ws.onerror = () => {
|
|
24
|
+
didError = true;
|
|
25
|
+
};
|
|
26
|
+
this.ws.onclose = ({ code, reason }) => {
|
|
27
|
+
if (didError) {
|
|
28
|
+
const err = new Error(
|
|
29
|
+
`websocket closed with code and reason: ${code} - ${reason}`
|
|
30
|
+
);
|
|
31
|
+
for (const cb of this.errorListeners) {
|
|
32
|
+
cb(err);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
for (const cb of this.closeListeners) {
|
|
36
|
+
cb();
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
this.ws.onmessage = (msg) => {
|
|
40
|
+
for (const cb of this.dataListeners) {
|
|
41
|
+
cb(msg.data);
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
send(payload) {
|
|
46
|
+
if (this.ws.readyState !== this.ws.OPEN) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
this.ws.send(payload);
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
close() {
|
|
53
|
+
this.ws.close(WS_HEALTHY_CLOSE_CODE);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export {
|
|
58
|
+
WebSocketConnection
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=chunk-DM5QR4HQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../transport/impls/ws/connection.ts"],"sourcesContent":["import { Connection } from '../../connection';\nimport { WsLike } from './wslike';\n\ninterface ConnectionInfoExtras {\n headers: Record<string, string>;\n}\n\nconst WS_HEALTHY_CLOSE_CODE = 1000;\n\nexport class WebSocketConnection extends Connection {\n ws: WsLike;\n extras?: ConnectionInfoExtras;\n\n get loggingMetadata() {\n const metadata = super.loggingMetadata;\n if (this.extras) {\n metadata.extras = this.extras;\n }\n\n return metadata;\n }\n\n constructor(ws: WsLike, extras?: ConnectionInfoExtras) {\n super();\n this.ws = ws;\n this.extras = extras;\n this.ws.binaryType = 'arraybuffer';\n\n // Websockets are kinda shitty, they emit error events with no\n // information other than it errored, so we have to do some extra\n // work to figure out what happened.\n let didError = false;\n this.ws.onerror = () => {\n didError = true;\n };\n\n this.ws.onclose = ({ code, reason }) => {\n if (didError) {\n const err = new Error(\n `websocket closed with code and reason: ${code} - ${reason}`,\n );\n\n for (const cb of this.errorListeners) {\n cb(err);\n }\n }\n\n for (const cb of this.closeListeners) {\n cb();\n }\n };\n\n this.ws.onmessage = (msg) => {\n for (const cb of this.dataListeners) {\n cb(msg.data as Uint8Array);\n }\n };\n }\n\n send(payload: Uint8Array) {\n if (this.ws.readyState !== this.ws.OPEN) {\n return false;\n }\n\n this.ws.send(payload);\n return true;\n }\n\n close() {\n // we close with 1000 normal even if its not really healthy at the river level\n // if we don't specify this, it defaults to 1005 which\n // some proxies/loggers detect as an error\n this.ws.close(WS_HEALTHY_CLOSE_CODE);\n }\n}\n"],"mappings":";;;;;AAOA,IAAM,wBAAwB;AAEvB,IAAM,sBAAN,cAAkC,WAAW;AAAA,EAClD;AAAA,EACA;AAAA,EAEA,IAAI,kBAAkB;AACpB,UAAM,WAAW,MAAM;AACvB,QAAI,KAAK,QAAQ;AACf,eAAS,SAAS,KAAK;AAAA,IACzB;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,IAAY,QAA+B;AACrD,UAAM;AACN,SAAK,KAAK;AACV,SAAK,SAAS;AACd,SAAK,GAAG,aAAa;AAKrB,QAAI,WAAW;AACf,SAAK,GAAG,UAAU,MAAM;AACtB,iBAAW;AAAA,IACb;AAEA,SAAK,GAAG,UAAU,CAAC,EAAE,MAAM,OAAO,MAAM;AACtC,UAAI,UAAU;AACZ,cAAM,MAAM,IAAI;AAAA,UACd,0CAA0C,IAAI,MAAM,MAAM;AAAA,QAC5D;AAEA,mBAAW,MAAM,KAAK,gBAAgB;AACpC,aAAG,GAAG;AAAA,QACR;AAAA,MACF;AAEA,iBAAW,MAAM,KAAK,gBAAgB;AACpC,WAAG;AAAA,MACL;AAAA,IACF;AAEA,SAAK,GAAG,YAAY,CAAC,QAAQ;AAC3B,iBAAW,MAAM,KAAK,eAAe;AACnC,WAAG,IAAI,IAAkB;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,KAAK,SAAqB;AACxB,QAAI,KAAK,GAAG,eAAe,KAAK,GAAG,MAAM;AACvC,aAAO;AAAA,IACT;AAEA,SAAK,GAAG,KAAK,OAAO;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ;AAIN,SAAK,GAAG,MAAM,qBAAqB;AAAA,EACrC;AACF;","names":[]}
|