@replit/river 0.23.12 → 0.23.14
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/{chunk-3AW3IXVD.js → chunk-4PVU7J25.js} +1 -21
- package/dist/chunk-4PVU7J25.js.map +1 -0
- package/dist/{chunk-HDBVL7EF.js → chunk-BEALFLCB.js} +2 -2
- package/dist/chunk-D2DHRRBN.js +476 -0
- package/dist/chunk-D2DHRRBN.js.map +1 -0
- package/dist/{chunk-7RUKEUKE.js → chunk-GCCRVSMR.js} +33 -4
- package/dist/chunk-GCCRVSMR.js.map +1 -0
- package/dist/{chunk-XZ6IOBM5.js → chunk-GN4YEXT7.js} +2 -2
- package/dist/chunk-GN4YEXT7.js.map +1 -0
- package/dist/chunk-O2AVDJCQ.js +335 -0
- package/dist/chunk-O2AVDJCQ.js.map +1 -0
- package/dist/chunk-OTVTKAN6.js +451 -0
- package/dist/chunk-OTVTKAN6.js.map +1 -0
- package/dist/chunk-WUL63FR6.js +335 -0
- package/dist/chunk-WUL63FR6.js.map +1 -0
- package/dist/{chunk-H6KTH6W6.js → chunk-YCLZWES2.js} +2 -2
- package/dist/client-e13979ac.d.ts +52 -0
- package/dist/codec/index.js +20 -2
- package/dist/codec/index.js.map +1 -1
- package/dist/{connection-8debd45f.d.ts → connection-5d0978ce.d.ts} +1 -1
- package/dist/{connection-581558f8.d.ts → connection-e57e98ea.d.ts} +1 -1
- package/dist/{transport-47af1c81.d.ts → handshake-5665ffd3.d.ts} +101 -153
- package/dist/{index-60f03cb7.d.ts → index-ea74cdbb.d.ts} +1 -1
- package/dist/logging/index.d.cts +1 -1
- package/dist/logging/index.d.ts +1 -1
- package/dist/router/index.cjs +16 -1
- package/dist/router/index.cjs.map +1 -1
- package/dist/router/index.d.cts +8 -6
- package/dist/router/index.d.ts +8 -6
- package/dist/router/index.js +2 -2
- package/dist/server-1cfc88d1.d.ts +24 -0
- package/dist/{services-ca72c9f8.d.ts → services-86c4d10d.d.ts} +3 -2
- package/dist/transport/impls/uds/client.cjs +303 -180
- package/dist/transport/impls/uds/client.cjs.map +1 -1
- package/dist/transport/impls/uds/client.d.cts +6 -5
- package/dist/transport/impls/uds/client.d.ts +6 -5
- package/dist/transport/impls/uds/client.js +6 -4
- package/dist/transport/impls/uds/client.js.map +1 -1
- package/dist/transport/impls/uds/server.cjs +396 -234
- package/dist/transport/impls/uds/server.cjs.map +1 -1
- package/dist/transport/impls/uds/server.d.cts +6 -5
- package/dist/transport/impls/uds/server.d.ts +6 -5
- package/dist/transport/impls/uds/server.js +8 -6
- package/dist/transport/impls/uds/server.js.map +1 -1
- package/dist/transport/impls/ws/client.cjs +305 -182
- package/dist/transport/impls/ws/client.cjs.map +1 -1
- package/dist/transport/impls/ws/client.d.cts +6 -5
- package/dist/transport/impls/ws/client.d.ts +6 -5
- package/dist/transport/impls/ws/client.js +6 -4
- package/dist/transport/impls/ws/client.js.map +1 -1
- package/dist/transport/impls/ws/server.cjs +350 -188
- package/dist/transport/impls/ws/server.cjs.map +1 -1
- package/dist/transport/impls/ws/server.d.cts +4 -3
- package/dist/transport/impls/ws/server.d.ts +4 -3
- package/dist/transport/impls/ws/server.js +8 -6
- package/dist/transport/impls/ws/server.js.map +1 -1
- package/dist/transport/index.cjs +338 -142
- package/dist/transport/index.cjs.map +1 -1
- package/dist/transport/index.d.cts +4 -2
- package/dist/transport/index.d.ts +4 -2
- package/dist/transport/index.js +14 -8
- package/dist/util/testHelpers.cjs +10 -6
- package/dist/util/testHelpers.cjs.map +1 -1
- package/dist/util/testHelpers.d.cts +5 -4
- package/dist/util/testHelpers.d.ts +5 -4
- package/dist/util/testHelpers.js +4 -5
- package/dist/util/testHelpers.js.map +1 -1
- package/package.json +13 -14
- package/dist/chunk-3AW3IXVD.js.map +0 -1
- package/dist/chunk-7RUKEUKE.js.map +0 -1
- package/dist/chunk-VRU4IKRT.js +0 -1392
- package/dist/chunk-VRU4IKRT.js.map +0 -1
- package/dist/chunk-XZ6IOBM5.js.map +0 -1
- /package/dist/{chunk-HDBVL7EF.js.map → chunk-BEALFLCB.js.map} +0 -0
- /package/dist/{chunk-H6KTH6W6.js.map → chunk-YCLZWES2.js.map} +0 -0
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ProtocolError,
|
|
3
|
+
Transport
|
|
4
|
+
} from "./chunk-OTVTKAN6.js";
|
|
5
|
+
import {
|
|
6
|
+
defaultServerTransportOptions
|
|
7
|
+
} from "./chunk-O2AVDJCQ.js";
|
|
8
|
+
import {
|
|
9
|
+
ControlMessageHandshakeRequestSchema,
|
|
10
|
+
PROTOCOL_VERSION,
|
|
11
|
+
SESSION_STATE_MISMATCH,
|
|
12
|
+
coerceErrorString,
|
|
13
|
+
handshakeResponseMessage
|
|
14
|
+
} from "./chunk-GCCRVSMR.js";
|
|
15
|
+
|
|
16
|
+
// transport/server.ts
|
|
17
|
+
import { SpanStatusCode } from "@opentelemetry/api";
|
|
18
|
+
import { Value } from "@sinclair/typebox/value";
|
|
19
|
+
var ServerTransport = class extends Transport {
|
|
20
|
+
/**
|
|
21
|
+
* The options for this transport.
|
|
22
|
+
*/
|
|
23
|
+
options;
|
|
24
|
+
/**
|
|
25
|
+
* Optional handshake options for the server.
|
|
26
|
+
*/
|
|
27
|
+
handshakeExtensions;
|
|
28
|
+
/**
|
|
29
|
+
* A map of session handshake data for each session.
|
|
30
|
+
*/
|
|
31
|
+
sessionHandshakeMetadata;
|
|
32
|
+
constructor(clientId, providedOptions) {
|
|
33
|
+
super(clientId, providedOptions);
|
|
34
|
+
this.options = {
|
|
35
|
+
...defaultServerTransportOptions,
|
|
36
|
+
...providedOptions
|
|
37
|
+
};
|
|
38
|
+
this.sessionHandshakeMetadata = /* @__PURE__ */ new WeakMap();
|
|
39
|
+
this.log?.info(`initiated server transport`, {
|
|
40
|
+
clientId: this.clientId,
|
|
41
|
+
protocolVersion: PROTOCOL_VERSION
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
extendHandshake(options) {
|
|
45
|
+
this.handshakeExtensions = options;
|
|
46
|
+
}
|
|
47
|
+
handleConnection(conn) {
|
|
48
|
+
if (this.getStatus() !== "open")
|
|
49
|
+
return;
|
|
50
|
+
this.log?.info(`new incoming connection`, {
|
|
51
|
+
...conn.loggingMetadata,
|
|
52
|
+
clientId: this.clientId
|
|
53
|
+
});
|
|
54
|
+
let session = void 0;
|
|
55
|
+
const client = () => session?.to ?? "unknown";
|
|
56
|
+
const handshakeTimeout = setTimeout(() => {
|
|
57
|
+
if (!session) {
|
|
58
|
+
this.log?.warn(
|
|
59
|
+
`connection to ${client()} timed out waiting for handshake, closing`,
|
|
60
|
+
{
|
|
61
|
+
...conn.loggingMetadata,
|
|
62
|
+
clientId: this.clientId,
|
|
63
|
+
connectedTo: client()
|
|
64
|
+
}
|
|
65
|
+
);
|
|
66
|
+
conn.telemetry?.span.setStatus({
|
|
67
|
+
code: SpanStatusCode.ERROR,
|
|
68
|
+
message: "handshake timeout"
|
|
69
|
+
});
|
|
70
|
+
conn.close();
|
|
71
|
+
}
|
|
72
|
+
}, this.options.sessionDisconnectGraceMs);
|
|
73
|
+
const buffer = [];
|
|
74
|
+
let receivedHandshakeMessage = false;
|
|
75
|
+
const handshakeHandler = (data) => {
|
|
76
|
+
if (receivedHandshakeMessage) {
|
|
77
|
+
buffer.push(data);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
receivedHandshakeMessage = true;
|
|
81
|
+
clearTimeout(handshakeTimeout);
|
|
82
|
+
void this.receiveHandshakeRequestMessage(data, conn).then(
|
|
83
|
+
(maybeSession) => {
|
|
84
|
+
if (!maybeSession) {
|
|
85
|
+
conn.close();
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
session = maybeSession;
|
|
89
|
+
const dataHandler = (data2) => {
|
|
90
|
+
const parsed = this.parseMsg(data2, conn);
|
|
91
|
+
if (!parsed) {
|
|
92
|
+
conn.close();
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
this.handleMsg(parsed, conn);
|
|
96
|
+
};
|
|
97
|
+
for (const data2 of buffer) {
|
|
98
|
+
dataHandler(data2);
|
|
99
|
+
}
|
|
100
|
+
conn.removeDataListener(handshakeHandler);
|
|
101
|
+
conn.addDataListener(dataHandler);
|
|
102
|
+
buffer.length = 0;
|
|
103
|
+
}
|
|
104
|
+
);
|
|
105
|
+
};
|
|
106
|
+
conn.addDataListener(handshakeHandler);
|
|
107
|
+
conn.addCloseListener(() => {
|
|
108
|
+
if (!session)
|
|
109
|
+
return;
|
|
110
|
+
this.log?.info(`connection to ${client()} disconnected`, {
|
|
111
|
+
...conn.loggingMetadata,
|
|
112
|
+
clientId: this.clientId
|
|
113
|
+
});
|
|
114
|
+
this.onDisconnect(conn, session);
|
|
115
|
+
});
|
|
116
|
+
conn.addErrorListener((err) => {
|
|
117
|
+
conn.telemetry?.span.setStatus({
|
|
118
|
+
code: SpanStatusCode.ERROR,
|
|
119
|
+
message: "connection error"
|
|
120
|
+
});
|
|
121
|
+
if (!session)
|
|
122
|
+
return;
|
|
123
|
+
this.log?.warn(
|
|
124
|
+
`connection to ${client()} got an error: ${coerceErrorString(err)}`,
|
|
125
|
+
{ ...conn.loggingMetadata, clientId: this.clientId }
|
|
126
|
+
);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
async validateHandshakeMetadata(conn, session, rawMetadata, from) {
|
|
130
|
+
let parsedMetadata = {};
|
|
131
|
+
if (this.handshakeExtensions) {
|
|
132
|
+
if (!Value.Check(this.handshakeExtensions.schema, rawMetadata)) {
|
|
133
|
+
conn.telemetry?.span.setStatus({
|
|
134
|
+
code: SpanStatusCode.ERROR,
|
|
135
|
+
message: "malformed handshake meta"
|
|
136
|
+
});
|
|
137
|
+
const reason = "received malformed handshake metadata";
|
|
138
|
+
const responseMsg = handshakeResponseMessage({
|
|
139
|
+
from: this.clientId,
|
|
140
|
+
to: from,
|
|
141
|
+
status: {
|
|
142
|
+
ok: false,
|
|
143
|
+
reason
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
conn.send(this.codec.toBuffer(responseMsg));
|
|
147
|
+
this.log?.warn(`received malformed handshake metadata from ${from}`, {
|
|
148
|
+
...conn.loggingMetadata,
|
|
149
|
+
clientId: this.clientId,
|
|
150
|
+
validationErrors: [
|
|
151
|
+
...Value.Errors(this.handshakeExtensions.schema, rawMetadata)
|
|
152
|
+
]
|
|
153
|
+
});
|
|
154
|
+
this.protocolError(ProtocolError.HandshakeFailed, reason);
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
const previousParsedMetadata = session ? this.sessionHandshakeMetadata.get(session) : void 0;
|
|
158
|
+
parsedMetadata = await this.handshakeExtensions.validate(
|
|
159
|
+
rawMetadata,
|
|
160
|
+
previousParsedMetadata
|
|
161
|
+
);
|
|
162
|
+
if (parsedMetadata === false) {
|
|
163
|
+
const reason = "rejected by handshake handler";
|
|
164
|
+
conn.telemetry?.span.setStatus({
|
|
165
|
+
code: SpanStatusCode.ERROR,
|
|
166
|
+
message: reason
|
|
167
|
+
});
|
|
168
|
+
const responseMsg = handshakeResponseMessage({
|
|
169
|
+
from: this.clientId,
|
|
170
|
+
to: from,
|
|
171
|
+
status: {
|
|
172
|
+
ok: false,
|
|
173
|
+
reason
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
conn.send(this.codec.toBuffer(responseMsg));
|
|
177
|
+
this.log?.warn(`rejected handshake from ${from}`, {
|
|
178
|
+
...conn.loggingMetadata,
|
|
179
|
+
clientId: this.clientId
|
|
180
|
+
});
|
|
181
|
+
this.protocolError(ProtocolError.HandshakeFailed, reason);
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return parsedMetadata;
|
|
186
|
+
}
|
|
187
|
+
async receiveHandshakeRequestMessage(data, conn) {
|
|
188
|
+
const parsed = this.parseMsg(data, conn);
|
|
189
|
+
if (!parsed) {
|
|
190
|
+
conn.telemetry?.span.setStatus({
|
|
191
|
+
code: SpanStatusCode.ERROR,
|
|
192
|
+
message: "non-transport message"
|
|
193
|
+
});
|
|
194
|
+
this.protocolError(
|
|
195
|
+
ProtocolError.HandshakeFailed,
|
|
196
|
+
"received non-transport message"
|
|
197
|
+
);
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
if (!Value.Check(ControlMessageHandshakeRequestSchema, parsed.payload)) {
|
|
201
|
+
conn.telemetry?.span.setStatus({
|
|
202
|
+
code: SpanStatusCode.ERROR,
|
|
203
|
+
message: "invalid handshake request"
|
|
204
|
+
});
|
|
205
|
+
const reason = "received invalid handshake msg";
|
|
206
|
+
const responseMsg2 = handshakeResponseMessage({
|
|
207
|
+
from: this.clientId,
|
|
208
|
+
to: parsed.from,
|
|
209
|
+
status: {
|
|
210
|
+
ok: false,
|
|
211
|
+
reason
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
conn.send(this.codec.toBuffer(responseMsg2));
|
|
215
|
+
this.log?.warn(reason, {
|
|
216
|
+
...conn.loggingMetadata,
|
|
217
|
+
clientId: this.clientId,
|
|
218
|
+
// safe to this.log metadata here as we remove the payload
|
|
219
|
+
// before passing it to user-land
|
|
220
|
+
transportMessage: parsed,
|
|
221
|
+
validationErrors: [
|
|
222
|
+
...Value.Errors(ControlMessageHandshakeRequestSchema, parsed.payload)
|
|
223
|
+
]
|
|
224
|
+
});
|
|
225
|
+
this.protocolError(
|
|
226
|
+
ProtocolError.HandshakeFailed,
|
|
227
|
+
"invalid handshake request"
|
|
228
|
+
);
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
const gotVersion = parsed.payload.protocolVersion;
|
|
232
|
+
if (gotVersion !== PROTOCOL_VERSION) {
|
|
233
|
+
conn.telemetry?.span.setStatus({
|
|
234
|
+
code: SpanStatusCode.ERROR,
|
|
235
|
+
message: "incorrect protocol version"
|
|
236
|
+
});
|
|
237
|
+
const reason = `incorrect version (got: ${gotVersion} wanted ${PROTOCOL_VERSION})`;
|
|
238
|
+
const responseMsg2 = handshakeResponseMessage({
|
|
239
|
+
from: this.clientId,
|
|
240
|
+
to: parsed.from,
|
|
241
|
+
status: {
|
|
242
|
+
ok: false,
|
|
243
|
+
reason
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
conn.send(this.codec.toBuffer(responseMsg2));
|
|
247
|
+
this.log?.warn(
|
|
248
|
+
`received handshake msg with incompatible protocol version (got: ${gotVersion}, expected: ${PROTOCOL_VERSION})`,
|
|
249
|
+
{ ...conn.loggingMetadata, clientId: this.clientId }
|
|
250
|
+
);
|
|
251
|
+
this.protocolError(ProtocolError.HandshakeFailed, reason);
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
const oldSession = this.sessions.get(parsed.from);
|
|
255
|
+
const parsedMetadata = await this.validateHandshakeMetadata(
|
|
256
|
+
conn,
|
|
257
|
+
oldSession,
|
|
258
|
+
parsed.payload.metadata,
|
|
259
|
+
parsed.from
|
|
260
|
+
);
|
|
261
|
+
if (parsedMetadata === false) {
|
|
262
|
+
return false;
|
|
263
|
+
}
|
|
264
|
+
let session;
|
|
265
|
+
let isTransparentReconnect;
|
|
266
|
+
if (!parsed.payload.expectedSessionState) {
|
|
267
|
+
({ session, isTransparentReconnect } = this.getOrCreateSession({
|
|
268
|
+
to: parsed.from,
|
|
269
|
+
conn,
|
|
270
|
+
sessionId: parsed.payload.sessionId,
|
|
271
|
+
propagationCtx: parsed.tracing
|
|
272
|
+
}));
|
|
273
|
+
} else if (parsed.payload.expectedSessionState.reconnect) {
|
|
274
|
+
const existingSession = this.getExistingSession({
|
|
275
|
+
to: parsed.from,
|
|
276
|
+
sessionId: parsed.payload.sessionId,
|
|
277
|
+
nextExpectedSeq: parsed.payload.expectedSessionState.nextExpectedSeq
|
|
278
|
+
});
|
|
279
|
+
if (existingSession === false) {
|
|
280
|
+
conn.telemetry?.span.setStatus({
|
|
281
|
+
code: SpanStatusCode.ERROR,
|
|
282
|
+
message: SESSION_STATE_MISMATCH
|
|
283
|
+
});
|
|
284
|
+
const reason = SESSION_STATE_MISMATCH;
|
|
285
|
+
const responseMsg2 = handshakeResponseMessage({
|
|
286
|
+
from: this.clientId,
|
|
287
|
+
to: parsed.from,
|
|
288
|
+
status: {
|
|
289
|
+
ok: false,
|
|
290
|
+
reason
|
|
291
|
+
}
|
|
292
|
+
});
|
|
293
|
+
conn.send(this.codec.toBuffer(responseMsg2));
|
|
294
|
+
this.log?.warn(
|
|
295
|
+
`'received handshake msg with incompatible existing session state: ${parsed.payload.sessionId}`,
|
|
296
|
+
{ ...conn.loggingMetadata, clientId: this.clientId }
|
|
297
|
+
);
|
|
298
|
+
this.protocolError(ProtocolError.HandshakeFailed, reason);
|
|
299
|
+
return false;
|
|
300
|
+
}
|
|
301
|
+
session = existingSession;
|
|
302
|
+
isTransparentReconnect = false;
|
|
303
|
+
} else {
|
|
304
|
+
const createdSession = this.createNewSession({
|
|
305
|
+
to: parsed.from,
|
|
306
|
+
conn,
|
|
307
|
+
sessionId: parsed.payload.sessionId,
|
|
308
|
+
propagationCtx: parsed.tracing
|
|
309
|
+
});
|
|
310
|
+
session = createdSession;
|
|
311
|
+
isTransparentReconnect = false;
|
|
312
|
+
}
|
|
313
|
+
this.sessionHandshakeMetadata.set(session, parsedMetadata);
|
|
314
|
+
this.log?.debug(
|
|
315
|
+
`handshake from ${parsed.from} ok, responding with handshake success`,
|
|
316
|
+
conn.loggingMetadata
|
|
317
|
+
);
|
|
318
|
+
const responseMsg = handshakeResponseMessage({
|
|
319
|
+
from: this.clientId,
|
|
320
|
+
to: parsed.from,
|
|
321
|
+
status: {
|
|
322
|
+
ok: true,
|
|
323
|
+
sessionId: session.id
|
|
324
|
+
}
|
|
325
|
+
});
|
|
326
|
+
conn.send(this.codec.toBuffer(responseMsg));
|
|
327
|
+
this.onConnect(conn, session, isTransparentReconnect);
|
|
328
|
+
return session;
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
export {
|
|
333
|
+
ServerTransport
|
|
334
|
+
};
|
|
335
|
+
//# sourceMappingURL=chunk-WUL63FR6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../transport/server.ts"],"sourcesContent":["import { SpanStatusCode } from '@opentelemetry/api';\nimport { ParsedMetadata } from '../router/context';\nimport { ServerHandshakeOptions } from '../router/handshake';\nimport {\n ControlMessageHandshakeRequestSchema,\n PROTOCOL_VERSION,\n SESSION_STATE_MISMATCH,\n TransportClientId,\n handshakeResponseMessage,\n} from './message';\nimport {\n ProvidedServerTransportOptions,\n ServerTransportOptions,\n defaultServerTransportOptions,\n} from './options';\nimport { Connection, Session } from './session';\nimport { Transport } from './transport';\nimport { coerceErrorString } from '../util/stringify';\nimport { Static } from '@sinclair/typebox';\nimport { Value } from '@sinclair/typebox/value';\nimport { ProtocolError } from './events';\n\nexport abstract class ServerTransport<\n ConnType extends Connection,\n> extends Transport<ConnType> {\n /**\n * The options for this transport.\n */\n protected options: ServerTransportOptions;\n\n /**\n * Optional handshake options for the server.\n */\n handshakeExtensions?: ServerHandshakeOptions;\n\n /**\n * A map of session handshake data for each session.\n */\n sessionHandshakeMetadata: WeakMap<Session<ConnType>, ParsedMetadata>;\n\n constructor(\n clientId: TransportClientId,\n providedOptions?: ProvidedServerTransportOptions,\n ) {\n super(clientId, providedOptions);\n this.options = {\n ...defaultServerTransportOptions,\n ...providedOptions,\n };\n this.sessionHandshakeMetadata = new WeakMap();\n this.log?.info(`initiated server transport`, {\n clientId: this.clientId,\n protocolVersion: PROTOCOL_VERSION,\n });\n }\n\n extendHandshake(options: ServerHandshakeOptions) {\n this.handshakeExtensions = options;\n }\n\n protected handleConnection(conn: ConnType) {\n if (this.getStatus() !== 'open') return;\n\n this.log?.info(`new incoming connection`, {\n ...conn.loggingMetadata,\n clientId: this.clientId,\n });\n\n let session: Session<ConnType> | undefined = undefined;\n const client = () => session?.to ?? 'unknown';\n\n // kill the conn after the grace period if we haven't received a handshake\n const handshakeTimeout = setTimeout(() => {\n if (!session) {\n this.log?.warn(\n `connection to ${client()} timed out waiting for handshake, closing`,\n {\n ...conn.loggingMetadata,\n clientId: this.clientId,\n connectedTo: client(),\n },\n );\n conn.telemetry?.span.setStatus({\n code: SpanStatusCode.ERROR,\n message: 'handshake timeout',\n });\n conn.close();\n }\n }, this.options.sessionDisconnectGraceMs);\n\n const buffer: Array<Uint8Array> = [];\n let receivedHandshakeMessage = false;\n\n const handshakeHandler = (data: Uint8Array) => {\n // if we've already received, just buffer the data\n if (receivedHandshakeMessage) {\n buffer.push(data);\n return;\n }\n\n receivedHandshakeMessage = true;\n clearTimeout(handshakeTimeout);\n\n void this.receiveHandshakeRequestMessage(data, conn).then(\n (maybeSession) => {\n if (!maybeSession) {\n conn.close();\n return;\n }\n\n session = maybeSession;\n\n // when we are done handshake sequence,\n // remove handshake listener and use the normal message listener\n const dataHandler = (data: Uint8Array) => {\n const parsed = this.parseMsg(data, conn);\n if (!parsed) {\n conn.close();\n return;\n }\n\n this.handleMsg(parsed, conn);\n };\n\n // process any data we missed\n for (const data of buffer) {\n dataHandler(data);\n }\n\n conn.removeDataListener(handshakeHandler);\n conn.addDataListener(dataHandler);\n buffer.length = 0;\n },\n );\n };\n\n conn.addDataListener(handshakeHandler);\n conn.addCloseListener(() => {\n if (!session) return;\n this.log?.info(`connection to ${client()} disconnected`, {\n ...conn.loggingMetadata,\n clientId: this.clientId,\n });\n this.onDisconnect(conn, session);\n });\n\n conn.addErrorListener((err) => {\n conn.telemetry?.span.setStatus({\n code: SpanStatusCode.ERROR,\n message: 'connection error',\n });\n if (!session) return;\n this.log?.warn(\n `connection to ${client()} got an error: ${coerceErrorString(err)}`,\n { ...conn.loggingMetadata, clientId: this.clientId },\n );\n });\n }\n\n private async validateHandshakeMetadata(\n conn: ConnType,\n session: Session<ConnType> | undefined,\n rawMetadata: Static<\n typeof ControlMessageHandshakeRequestSchema\n >['metadata'],\n from: TransportClientId,\n ): Promise<ParsedMetadata | false> {\n let parsedMetadata: ParsedMetadata = {};\n if (this.handshakeExtensions) {\n // check that the metadata that was sent is the correct shape\n if (!Value.Check(this.handshakeExtensions.schema, rawMetadata)) {\n conn.telemetry?.span.setStatus({\n code: SpanStatusCode.ERROR,\n message: 'malformed handshake meta',\n });\n const reason = 'received malformed handshake metadata';\n const responseMsg = handshakeResponseMessage({\n from: this.clientId,\n to: from,\n status: {\n ok: false,\n reason,\n },\n });\n conn.send(this.codec.toBuffer(responseMsg));\n this.log?.warn(`received malformed handshake metadata from ${from}`, {\n ...conn.loggingMetadata,\n clientId: this.clientId,\n validationErrors: [\n ...Value.Errors(this.handshakeExtensions.schema, rawMetadata),\n ],\n });\n this.protocolError(ProtocolError.HandshakeFailed, reason);\n return false;\n }\n\n const previousParsedMetadata = session\n ? this.sessionHandshakeMetadata.get(session)\n : undefined;\n\n parsedMetadata = await this.handshakeExtensions.validate(\n rawMetadata,\n previousParsedMetadata,\n );\n\n // handler rejected the connection\n if (parsedMetadata === false) {\n const reason = 'rejected by handshake handler';\n conn.telemetry?.span.setStatus({\n code: SpanStatusCode.ERROR,\n message: reason,\n });\n const responseMsg = handshakeResponseMessage({\n from: this.clientId,\n to: from,\n status: {\n ok: false,\n reason,\n },\n });\n conn.send(this.codec.toBuffer(responseMsg));\n this.log?.warn(`rejected handshake from ${from}`, {\n ...conn.loggingMetadata,\n clientId: this.clientId,\n });\n this.protocolError(ProtocolError.HandshakeFailed, reason);\n return false;\n }\n }\n\n return parsedMetadata;\n }\n\n async receiveHandshakeRequestMessage(\n data: Uint8Array,\n conn: ConnType,\n ): Promise<Session<ConnType> | false> {\n const parsed = this.parseMsg(data, conn);\n if (!parsed) {\n conn.telemetry?.span.setStatus({\n code: SpanStatusCode.ERROR,\n message: 'non-transport message',\n });\n this.protocolError(\n ProtocolError.HandshakeFailed,\n 'received non-transport message',\n );\n return false;\n }\n\n if (!Value.Check(ControlMessageHandshakeRequestSchema, parsed.payload)) {\n conn.telemetry?.span.setStatus({\n code: SpanStatusCode.ERROR,\n message: 'invalid handshake request',\n });\n const reason = 'received invalid handshake msg';\n const responseMsg = handshakeResponseMessage({\n from: this.clientId,\n to: parsed.from,\n status: {\n ok: false,\n reason,\n },\n });\n conn.send(this.codec.toBuffer(responseMsg));\n this.log?.warn(reason, {\n ...conn.loggingMetadata,\n clientId: this.clientId,\n // safe to this.log metadata here as we remove the payload\n // before passing it to user-land\n transportMessage: parsed,\n validationErrors: [\n ...Value.Errors(ControlMessageHandshakeRequestSchema, parsed.payload),\n ],\n });\n this.protocolError(\n ProtocolError.HandshakeFailed,\n 'invalid handshake request',\n );\n return false;\n }\n\n // double check protocol version here\n const gotVersion = parsed.payload.protocolVersion;\n if (gotVersion !== PROTOCOL_VERSION) {\n conn.telemetry?.span.setStatus({\n code: SpanStatusCode.ERROR,\n message: 'incorrect protocol version',\n });\n\n const reason = `incorrect version (got: ${gotVersion} wanted ${PROTOCOL_VERSION})`;\n const responseMsg = handshakeResponseMessage({\n from: this.clientId,\n to: parsed.from,\n status: {\n ok: false,\n reason,\n },\n });\n conn.send(this.codec.toBuffer(responseMsg));\n this.log?.warn(\n `received handshake msg with incompatible protocol version (got: ${gotVersion}, expected: ${PROTOCOL_VERSION})`,\n { ...conn.loggingMetadata, clientId: this.clientId },\n );\n this.protocolError(ProtocolError.HandshakeFailed, reason);\n return false;\n }\n\n const oldSession = this.sessions.get(parsed.from);\n const parsedMetadata = await this.validateHandshakeMetadata(\n conn,\n oldSession,\n parsed.payload.metadata,\n parsed.from,\n );\n\n if (parsedMetadata === false) {\n return false;\n }\n\n let session: Session<ConnType>;\n let isTransparentReconnect: boolean;\n if (!parsed.payload.expectedSessionState) {\n // TODO: remove once we have upgraded all clients.\n ({ session, isTransparentReconnect } = this.getOrCreateSession({\n to: parsed.from,\n conn,\n sessionId: parsed.payload.sessionId,\n propagationCtx: parsed.tracing,\n }));\n } else if (parsed.payload.expectedSessionState.reconnect) {\n // this has to be an existing session. if it doesn't match what we expect, reject the\n // handshake\n const existingSession = this.getExistingSession({\n to: parsed.from,\n sessionId: parsed.payload.sessionId,\n nextExpectedSeq: parsed.payload.expectedSessionState.nextExpectedSeq,\n });\n if (existingSession === false) {\n conn.telemetry?.span.setStatus({\n code: SpanStatusCode.ERROR,\n message: SESSION_STATE_MISMATCH,\n });\n\n const reason = SESSION_STATE_MISMATCH;\n const responseMsg = handshakeResponseMessage({\n from: this.clientId,\n to: parsed.from,\n status: {\n ok: false,\n reason,\n },\n });\n conn.send(this.codec.toBuffer(responseMsg));\n this.log?.warn(\n `'received handshake msg with incompatible existing session state: ${parsed.payload.sessionId}`,\n { ...conn.loggingMetadata, clientId: this.clientId },\n );\n this.protocolError(ProtocolError.HandshakeFailed, reason);\n return false;\n }\n session = existingSession;\n isTransparentReconnect = false;\n } else {\n // this has to be a new session. if one already exists, it will be replaced silently\n const createdSession = this.createNewSession({\n to: parsed.from,\n conn,\n sessionId: parsed.payload.sessionId,\n propagationCtx: parsed.tracing,\n });\n session = createdSession;\n isTransparentReconnect = false;\n }\n\n this.sessionHandshakeMetadata.set(session, parsedMetadata);\n\n this.log?.debug(\n `handshake from ${parsed.from} ok, responding with handshake success`,\n conn.loggingMetadata,\n );\n const responseMsg = handshakeResponseMessage({\n from: this.clientId,\n to: parsed.from,\n status: {\n ok: true,\n sessionId: session.id,\n },\n });\n conn.send(this.codec.toBuffer(responseMsg));\n this.onConnect(conn, session, isTransparentReconnect);\n\n return session;\n }\n}\n"],"mappings":"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","names":["data","responseMsg"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Connection
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-O2AVDJCQ.js";
|
|
4
4
|
|
|
5
5
|
// transport/transforms/messageFraming.ts
|
|
6
6
|
import { Transform } from "node:stream";
|
|
@@ -103,4 +103,4 @@ var UdsConnection = class extends Connection {
|
|
|
103
103
|
export {
|
|
104
104
|
UdsConnection
|
|
105
105
|
};
|
|
106
|
-
//# sourceMappingURL=chunk-
|
|
106
|
+
//# sourceMappingURL=chunk-YCLZWES2.js.map
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { C as Connection, T as Transport, j as ClientTransportOptions, L as LeakyBucketRateLimit, k as ClientHandshakeOptions, b as ProvidedClientTransportOptions, S as Session } from './handshake-5665ffd3.js';
|
|
2
|
+
import { c as TransportClientId } from './index-ea74cdbb.js';
|
|
3
|
+
|
|
4
|
+
declare abstract class ClientTransport<ConnType extends Connection> extends Transport<ConnType> {
|
|
5
|
+
/**
|
|
6
|
+
* The options for this transport.
|
|
7
|
+
*/
|
|
8
|
+
protected options: ClientTransportOptions;
|
|
9
|
+
/**
|
|
10
|
+
* The map of reconnect promises for each client ID.
|
|
11
|
+
*/
|
|
12
|
+
inflightConnectionPromises: Map<TransportClientId, Promise<ConnType>>;
|
|
13
|
+
retryBudget: LeakyBucketRateLimit;
|
|
14
|
+
/**
|
|
15
|
+
* A flag indicating whether the transport should automatically reconnect
|
|
16
|
+
* when a connection is dropped.
|
|
17
|
+
* Realistically, this should always be true for clients unless you are writing
|
|
18
|
+
* tests or a special case where you don't want to reconnect.
|
|
19
|
+
*/
|
|
20
|
+
reconnectOnConnectionDrop: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Optional handshake options for this client.
|
|
23
|
+
*/
|
|
24
|
+
handshakeExtensions?: ClientHandshakeOptions;
|
|
25
|
+
constructor(clientId: TransportClientId, providedOptions?: ProvidedClientTransportOptions);
|
|
26
|
+
extendHandshake(options: ClientHandshakeOptions): void;
|
|
27
|
+
protected handleConnection(conn: ConnType, to: TransportClientId): void;
|
|
28
|
+
receiveHandshakeResponseMessage(data: Uint8Array, conn: ConnType): Session<ConnType> | false;
|
|
29
|
+
/**
|
|
30
|
+
* Abstract method that creates a new {@link Connection} object.
|
|
31
|
+
* This should call {@link handleConnection} when the connection is created.
|
|
32
|
+
* The downstream client implementation needs to implement this.
|
|
33
|
+
*
|
|
34
|
+
* @param to The client ID of the node to connect to.
|
|
35
|
+
* @returns The new connection object.
|
|
36
|
+
*/
|
|
37
|
+
protected abstract createNewOutgoingConnection(to: TransportClientId): Promise<ConnType>;
|
|
38
|
+
/**
|
|
39
|
+
* Manually attempts to connect to a client.
|
|
40
|
+
* @param to The client ID of the node to connect to.
|
|
41
|
+
*/
|
|
42
|
+
connect(to: TransportClientId): Promise<void>;
|
|
43
|
+
protected deleteSession({ session, closeHandshakingConnection, handshakingConn, }: {
|
|
44
|
+
session: Session<ConnType>;
|
|
45
|
+
closeHandshakingConnection: boolean;
|
|
46
|
+
handshakingConn?: ConnType;
|
|
47
|
+
}): void;
|
|
48
|
+
protected sendHandshake(to: TransportClientId, conn: ConnType): Promise<boolean>;
|
|
49
|
+
close(): void;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export { ClientTransport as C };
|
package/dist/codec/index.js
CHANGED
|
@@ -1,7 +1,25 @@
|
|
|
1
1
|
import {
|
|
2
|
-
BinaryCodec,
|
|
3
2
|
NaiveJsonCodec
|
|
4
|
-
} from "../chunk-
|
|
3
|
+
} from "../chunk-4PVU7J25.js";
|
|
4
|
+
|
|
5
|
+
// codec/binary.ts
|
|
6
|
+
import { decode, encode } from "@msgpack/msgpack";
|
|
7
|
+
var BinaryCodec = {
|
|
8
|
+
toBuffer(obj) {
|
|
9
|
+
return encode(obj, { ignoreUndefined: true });
|
|
10
|
+
},
|
|
11
|
+
fromBuffer: (buff) => {
|
|
12
|
+
try {
|
|
13
|
+
const res = decode(buff);
|
|
14
|
+
if (typeof res !== "object") {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
return res;
|
|
18
|
+
} catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
};
|
|
5
23
|
export {
|
|
6
24
|
BinaryCodec,
|
|
7
25
|
NaiveJsonCodec
|
package/dist/codec/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../codec/binary.ts"],"sourcesContent":["import { decode, encode } from '@msgpack/msgpack';\nimport { Codec } from './types';\n\n/**\n * Binary codec, uses [msgpack](https://www.npmjs.com/package/@msgpack/msgpack) under the hood\n * @type {Codec}\n */\nexport const BinaryCodec: Codec = {\n toBuffer(obj) {\n return encode(obj, { ignoreUndefined: true });\n },\n fromBuffer: (buff: Uint8Array) => {\n try {\n const res = decode(buff);\n if (typeof res !== 'object') {\n return null;\n }\n\n return res;\n } catch {\n return null;\n }\n },\n};\n"],"mappings":";;;;;AAAA,SAAS,QAAQ,cAAc;AAOxB,IAAM,cAAqB;AAAA,EAChC,SAAS,KAAK;AACZ,WAAO,OAAO,KAAK,EAAE,iBAAiB,KAAK,CAAC;AAAA,EAC9C;AAAA,EACA,YAAY,CAAC,SAAqB;AAChC,QAAI;AACF,YAAM,MAAM,OAAO,IAAI;AACvB,UAAI,OAAO,QAAQ,UAAU;AAC3B,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;","names":[]}
|