@replit/river 0.24.3 → 0.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/{chunk-XKHLA5MP.js → chunk-5CNNIOAO.js} +4 -4
  2. package/dist/{chunk-FKBXIWWN.js → chunk-D5O3ERJU.js} +3 -3
  3. package/dist/{chunk-EHXKU4TW.js → chunk-MBMEJIPU.js} +2 -2
  4. package/dist/{chunk-W3CY6PNC.js → chunk-PCBPPTXH.js} +28 -23
  5. package/dist/chunk-PCBPPTXH.js.map +1 -0
  6. package/dist/{chunk-LSHUPI6U.js → chunk-SGSRNAWJ.js} +41 -18
  7. package/dist/{chunk-LSHUPI6U.js.map → chunk-SGSRNAWJ.js.map} +1 -1
  8. package/dist/{chunk-DZNP3EI5.js → chunk-SZ5NBBX7.js} +2 -2
  9. package/dist/{chunk-DZNP3EI5.js.map → chunk-SZ5NBBX7.js.map} +1 -1
  10. package/dist/{chunk-KVLCQ24J.js → chunk-YM5Y4NAT.js} +34 -13
  11. package/dist/chunk-YM5Y4NAT.js.map +1 -0
  12. package/dist/{client-2ba72e89.d.ts → client-1321630c.d.ts} +1 -1
  13. package/dist/{connection-55cba970.d.ts → connection-bd907ca6.d.ts} +1 -1
  14. package/dist/{handshake-0b88e8fc.d.ts → handshake-3772d7ca.d.ts} +4 -2
  15. package/dist/router/index.cjs +40 -17
  16. package/dist/router/index.cjs.map +1 -1
  17. package/dist/router/index.d.cts +7 -7
  18. package/dist/router/index.d.ts +7 -7
  19. package/dist/router/index.js +2 -2
  20. package/dist/{server-732e7014.d.ts → server-f0fd2b98.d.ts} +1 -1
  21. package/dist/{services-adfd0bc3.d.ts → services-8d14ae16.d.ts} +2 -2
  22. package/dist/transport/impls/ws/client.cjs +33 -12
  23. package/dist/transport/impls/ws/client.cjs.map +1 -1
  24. package/dist/transport/impls/ws/client.d.cts +3 -3
  25. package/dist/transport/impls/ws/client.d.ts +3 -3
  26. package/dist/transport/impls/ws/client.js +7 -7
  27. package/dist/transport/impls/ws/server.cjs +57 -31
  28. package/dist/transport/impls/ws/server.cjs.map +1 -1
  29. package/dist/transport/impls/ws/server.d.cts +3 -3
  30. package/dist/transport/impls/ws/server.d.ts +3 -3
  31. package/dist/transport/impls/ws/server.js +5 -5
  32. package/dist/transport/index.cjs +57 -31
  33. package/dist/transport/index.cjs.map +1 -1
  34. package/dist/transport/index.d.cts +3 -3
  35. package/dist/transport/index.d.ts +3 -3
  36. package/dist/transport/index.js +7 -7
  37. package/dist/util/testHelpers.cjs +33 -27
  38. package/dist/util/testHelpers.cjs.map +1 -1
  39. package/dist/util/testHelpers.d.cts +4 -7
  40. package/dist/util/testHelpers.d.ts +4 -7
  41. package/dist/util/testHelpers.js +3 -14
  42. package/dist/util/testHelpers.js.map +1 -1
  43. package/package.json +13 -14
  44. package/dist/chunk-KVLCQ24J.js.map +0 -1
  45. package/dist/chunk-TDFWZIXR.js +0 -106
  46. package/dist/chunk-TDFWZIXR.js.map +0 -1
  47. package/dist/chunk-W3CY6PNC.js.map +0 -1
  48. package/dist/connection-c6db05d9.d.ts +0 -31
  49. package/dist/transport/impls/uds/client.cjs +0 -1684
  50. package/dist/transport/impls/uds/client.cjs.map +0 -1
  51. package/dist/transport/impls/uds/client.d.cts +0 -18
  52. package/dist/transport/impls/uds/client.d.ts +0 -18
  53. package/dist/transport/impls/uds/client.js +0 -38
  54. package/dist/transport/impls/uds/client.js.map +0 -1
  55. package/dist/transport/impls/uds/server.cjs +0 -1650
  56. package/dist/transport/impls/uds/server.cjs.map +0 -1
  57. package/dist/transport/impls/uds/server.d.cts +0 -19
  58. package/dist/transport/impls/uds/server.d.ts +0 -19
  59. package/dist/transport/impls/uds/server.js +0 -33
  60. package/dist/transport/impls/uds/server.js.map +0 -1
  61. /package/dist/{chunk-XKHLA5MP.js.map → chunk-5CNNIOAO.js.map} +0 -0
  62. /package/dist/{chunk-FKBXIWWN.js.map → chunk-D5O3ERJU.js.map} +0 -0
  63. /package/dist/{chunk-EHXKU4TW.js.map → chunk-MBMEJIPU.js.map} +0 -0
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  ProtocolError,
3
3
  Transport
4
- } from "./chunk-FKBXIWWN.js";
4
+ } from "./chunk-D5O3ERJU.js";
5
5
  import {
6
6
  SessionStateGraph,
7
7
  defaultClientTransportOptions
8
- } from "./chunk-KVLCQ24J.js";
8
+ } from "./chunk-YM5Y4NAT.js";
9
9
  import {
10
10
  ControlMessageHandshakeResponseSchema,
11
11
  HandshakeErrorRetriableResponseCodes,
@@ -13,7 +13,7 @@ import {
13
13
  getPropagationContext,
14
14
  handshakeRequestMessage,
15
15
  tracing_default
16
- } from "./chunk-DZNP3EI5.js";
16
+ } from "./chunk-SZ5NBBX7.js";
17
17
 
18
18
  // transport/client.ts
19
19
  import { SpanStatusCode } from "@opentelemetry/api";
@@ -396,4 +396,4 @@ var ClientTransport = class extends Transport {
396
396
  export {
397
397
  ClientTransport
398
398
  };
399
- //# sourceMappingURL=chunk-XKHLA5MP.js.map
399
+ //# sourceMappingURL=chunk-5CNNIOAO.js.map
@@ -5,10 +5,10 @@ import {
5
5
  import {
6
6
  SessionStateGraph,
7
7
  defaultTransportOptions
8
- } from "./chunk-KVLCQ24J.js";
8
+ } from "./chunk-YM5Y4NAT.js";
9
9
  import {
10
10
  generateId
11
- } from "./chunk-DZNP3EI5.js";
11
+ } from "./chunk-SZ5NBBX7.js";
12
12
 
13
13
  // transport/events.ts
14
14
  var ProtocolError = {
@@ -274,4 +274,4 @@ export {
274
274
  Transport,
275
275
  Connection
276
276
  };
277
- //# sourceMappingURL=chunk-FKBXIWWN.js.map
277
+ //# sourceMappingURL=chunk-D5O3ERJU.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Connection
3
- } from "./chunk-FKBXIWWN.js";
3
+ } from "./chunk-D5O3ERJU.js";
4
4
 
5
5
  // transport/impls/ws/connection.ts
6
6
  var WebSocketConnection = class extends Connection {
@@ -47,4 +47,4 @@ var WebSocketConnection = class extends Connection {
47
47
  export {
48
48
  WebSocketConnection
49
49
  };
50
- //# sourceMappingURL=chunk-EHXKU4TW.js.map
50
+ //# sourceMappingURL=chunk-MBMEJIPU.js.map
@@ -1,17 +1,17 @@
1
1
  import {
2
2
  ProtocolError,
3
3
  Transport
4
- } from "./chunk-FKBXIWWN.js";
4
+ } from "./chunk-D5O3ERJU.js";
5
5
  import {
6
6
  SessionStateGraph,
7
7
  defaultServerTransportOptions
8
- } from "./chunk-KVLCQ24J.js";
8
+ } from "./chunk-YM5Y4NAT.js";
9
9
  import {
10
10
  ControlMessageHandshakeRequestSchema,
11
11
  PROTOCOL_VERSION,
12
12
  coerceErrorString,
13
13
  handshakeResponseMessage
14
- } from "./chunk-DZNP3EI5.js";
14
+ } from "./chunk-SZ5NBBX7.js";
15
15
 
16
16
  // transport/server.ts
17
17
  import { SpanStatusCode } from "@opentelemetry/api";
@@ -202,10 +202,10 @@ var ServerTransport = class extends Transport {
202
202
  return;
203
203
  }
204
204
  let connectCase = "new session";
205
+ const clientNextExpectedSeq = msg.payload.expectedSessionState.nextExpectedSeq;
206
+ const clientNextSentSeq = msg.payload.expectedSessionState.nextSentSeq ?? 0;
205
207
  if (oldSession && oldSession.id === msg.payload.sessionId) {
206
208
  connectCase = "transparent reconnection";
207
- const clientNextExpectedSeq = msg.payload.expectedSessionState.nextExpectedSeq;
208
- const clientNextSentSeq = msg.payload.expectedSessionState.nextSentSeq ?? 0;
209
209
  const ourNextSeq = oldSession.nextSeq();
210
210
  const ourAck = oldSession.ack;
211
211
  if (clientNextSentSeq > ourAck) {
@@ -261,26 +261,31 @@ var ServerTransport = class extends Transport {
261
261
  this.updateSession(oldSession);
262
262
  } else if (oldSession) {
263
263
  connectCase = "hard reconnection";
264
+ this.log?.info(
265
+ `client is reconnecting to a new session (${msg.payload.sessionId}) with an old session (${oldSession.id}) already existing, closing old session`,
266
+ {
267
+ ...session.loggingMetadata,
268
+ connectedTo: msg.from,
269
+ sessionId: msg.payload.sessionId
270
+ }
271
+ );
264
272
  this.deleteSession(oldSession);
265
273
  oldSession = void 0;
266
- } else {
274
+ }
275
+ if (!oldSession && (clientNextSentSeq > 0 || clientNextExpectedSeq > 0)) {
267
276
  connectCase = "unknown session";
268
- const clientNextExpectedSeq = msg.payload.expectedSessionState.nextExpectedSeq;
269
- const clientNextSentSeq = msg.payload.expectedSessionState.nextSentSeq ?? 0;
270
- if (clientNextSentSeq > 0 || clientNextExpectedSeq > 0) {
271
- this.rejectHandshakeRequest(
272
- session,
273
- msg.from,
274
- `client is trying to reconnect to a session the server don't know about: ${msg.payload.sessionId}`,
275
- "SESSION_STATE_MISMATCH",
276
- {
277
- ...session.loggingMetadata,
278
- connectedTo: msg.from,
279
- transportMessage: msg
280
- }
281
- );
282
- return;
283
- }
277
+ this.rejectHandshakeRequest(
278
+ session,
279
+ msg.from,
280
+ `client is trying to reconnect to a session the server don't know about: ${msg.payload.sessionId}`,
281
+ "SESSION_STATE_MISMATCH",
282
+ {
283
+ ...session.loggingMetadata,
284
+ connectedTo: msg.from,
285
+ transportMessage: msg
286
+ }
287
+ );
288
+ return;
284
289
  }
285
290
  const sessionId = msg.payload.sessionId;
286
291
  this.log?.info(
@@ -379,4 +384,4 @@ var ServerTransport = class extends Transport {
379
384
  export {
380
385
  ServerTransport
381
386
  };
382
- //# sourceMappingURL=chunk-W3CY6PNC.js.map
387
+ //# sourceMappingURL=chunk-PCBPPTXH.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 HandshakeErrorResponseCodes,\n OpaqueTransportMessage,\n PROTOCOL_VERSION,\n PartialTransportMessage,\n TransportClientId,\n handshakeResponseMessage,\n} from './message';\nimport {\n ProvidedServerTransportOptions,\n ServerTransportOptions,\n defaultServerTransportOptions,\n} from './options';\nimport { Transport } from './transport';\nimport { coerceErrorString } from '../util/stringify';\nimport { Static } from '@sinclair/typebox';\nimport { Value } from '@sinclair/typebox/value';\nimport { ProtocolError } from './events';\nimport { Connection } from './connection';\nimport { MessageMetadata } from '../logging';\nimport { SessionWaitingForHandshake } from './sessionStateMachine/SessionWaitingForHandshake';\nimport { Session, SessionState } from './sessionStateMachine/common';\nimport { SessionStateGraph } from './sessionStateMachine/transitions';\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 = new Map<TransportClientId, ParsedMetadata>();\n pendingSessions = new Set<SessionWaitingForHandshake<ConnType>>();\n\n constructor(\n clientId: TransportClientId,\n providedOptions?: ProvidedServerTransportOptions,\n ) {\n super(clientId, providedOptions);\n this.options = {\n ...defaultServerTransportOptions,\n ...providedOptions,\n };\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 send(to: string, msg: PartialTransportMessage): string {\n if (this.getStatus() === 'closed') {\n const err = 'transport is closed, cant send';\n this.log?.error(err, {\n clientId: this.clientId,\n transportMessage: msg,\n tags: ['invariant-violation'],\n });\n\n throw new Error(err);\n }\n\n const session = this.sessions.get(to);\n if (!session) {\n const err = `session to ${to} does not exist`;\n this.log?.error(err, {\n clientId: this.clientId,\n transportMessage: msg,\n tags: ['invariant-violation'],\n });\n\n throw new Error(err);\n }\n\n return session.send(msg);\n }\n\n protected deletePendingSession(\n pendingSession: SessionWaitingForHandshake<ConnType>,\n ) {\n pendingSession.close();\n // we don't dispatch a session disconnect event\n // for a non-identified session, just delete directly\n\n this.pendingSessions.delete(pendingSession);\n }\n\n protected deleteSession(session: Session<ConnType>): void {\n this.sessionHandshakeMetadata.delete(session.to);\n super.deleteSession(session);\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 receivedHandshake = false;\n const pendingSession = SessionStateGraph.entrypoints.WaitingForHandshake(\n this.clientId,\n conn,\n {\n onConnectionClosed: () => {\n this.log?.warn(\n `connection from unknown closed before handshake finished`,\n pendingSession.loggingMetadata,\n );\n\n this.deletePendingSession(pendingSession);\n },\n onConnectionErrored: (err) => {\n const errorString = coerceErrorString(err);\n this.log?.warn(\n `connection from unknown errored before handshake finished: ${errorString}`,\n pendingSession.loggingMetadata,\n );\n\n this.deletePendingSession(pendingSession);\n },\n onHandshakeTimeout: () => {\n this.log?.warn(\n `connection from unknown timed out before handshake finished`,\n pendingSession.loggingMetadata,\n );\n\n this.deletePendingSession(pendingSession);\n },\n onHandshake: (msg) => {\n if (receivedHandshake) {\n this.log?.error(\n `received multiple handshake messages from pending session`,\n {\n ...pendingSession.loggingMetadata,\n connectedTo: msg.from,\n transportMessage: msg,\n },\n );\n\n this.deletePendingSession(pendingSession);\n return;\n }\n\n // let this resolve async, we just need to make sure its only\n // called once so we don't race while transitioning to connected\n // onHandshakeRequest is async as custom validation may be async\n receivedHandshake = true;\n void this.onHandshakeRequest(pendingSession, msg);\n },\n onInvalidHandshake: (reason) => {\n this.log?.error(\n `invalid handshake: ${reason}`,\n pendingSession.loggingMetadata,\n );\n this.deletePendingSession(pendingSession);\n this.protocolError(ProtocolError.HandshakeFailed, reason);\n },\n },\n this.options,\n this.log,\n );\n\n this.pendingSessions.add(pendingSession);\n }\n\n private rejectHandshakeRequest(\n session: SessionWaitingForHandshake<ConnType>,\n to: TransportClientId,\n reason: string,\n code: Static<typeof HandshakeErrorResponseCodes>,\n metadata: MessageMetadata,\n ) {\n session.conn.telemetry?.span.setStatus({\n code: SpanStatusCode.ERROR,\n message: reason,\n });\n\n this.log?.warn(reason, metadata);\n\n session.sendHandshake(\n handshakeResponseMessage({\n from: this.clientId,\n to,\n status: {\n ok: false,\n code,\n reason,\n },\n }),\n );\n\n this.protocolError(ProtocolError.HandshakeFailed, reason);\n this.deletePendingSession(session);\n }\n\n protected async onHandshakeRequest(\n session: SessionWaitingForHandshake<ConnType>,\n msg: OpaqueTransportMessage,\n ) {\n // invariant: msg is a handshake request\n if (!Value.Check(ControlMessageHandshakeRequestSchema, msg.payload)) {\n this.rejectHandshakeRequest(\n session,\n msg.from,\n 'received invalid handshake request',\n 'MALFORMED_HANDSHAKE',\n {\n ...session.loggingMetadata,\n transportMessage: msg,\n connectedTo: msg.from,\n validationErrors: [\n ...Value.Errors(ControlMessageHandshakeRequestSchema, msg.payload),\n ],\n },\n );\n\n return;\n }\n\n // invariant: handshake request passes all the validation\n const gotVersion = msg.payload.protocolVersion;\n if (gotVersion !== PROTOCOL_VERSION) {\n this.rejectHandshakeRequest(\n session,\n msg.from,\n `expected protocol version ${PROTOCOL_VERSION}, got ${gotVersion}`,\n 'PROTOCOL_VERSION_MISMATCH',\n {\n ...session.loggingMetadata,\n connectedTo: msg.from,\n transportMessage: msg,\n },\n );\n\n return;\n }\n\n let oldSession = this.sessions.get(msg.from);\n\n // invariant: must pass custom validation if defined\n const parsedMetadata = await this.validateHandshakeMetadata(\n session,\n oldSession,\n msg.payload.metadata,\n msg.from,\n );\n\n if (parsedMetadata === false) {\n return;\n }\n\n // 4 connect cases\n // 1. new session\n // we dont have a session and the client is requesting a new one\n // we can create the session as normal\n // 2. client is reconnecting to an existing session but we don't have it\n // reject this handshake, there's nothing we can do to salvage it\n // 3. transparent reconnect (old session exists and is the same as the client wants)\n // assign to old session\n // 4. hard reconnect (oldSession exists but but the client wants a new one)\n // we close the old session and create a new one\n let connectCase:\n | 'new session'\n | 'unknown session'\n | 'transparent reconnection'\n | 'hard reconnection' = 'new session';\n const clientNextExpectedSeq =\n msg.payload.expectedSessionState.nextExpectedSeq;\n const clientNextSentSeq = msg.payload.expectedSessionState.nextSentSeq ?? 0;\n\n if (oldSession && oldSession.id === msg.payload.sessionId) {\n connectCase = 'transparent reconnection';\n\n // invariant: ordering must be correct\n const ourNextSeq = oldSession.nextSeq();\n const ourAck = oldSession.ack;\n\n // two incorrect cases where we cannot permit a reconnect:\n // - if the client is about to send a message in the future w.r.t to the server\n // - client.seq > server.ack => nextSentSeq > oldSession.ack\n if (clientNextSentSeq > ourAck) {\n this.rejectHandshakeRequest(\n session,\n msg.from,\n `client is in the future: server wanted next message to be ${ourAck} but client would have sent ${clientNextSentSeq}`,\n 'SESSION_STATE_MISMATCH',\n {\n ...session.loggingMetadata,\n connectedTo: msg.from,\n transportMessage: msg,\n },\n );\n\n return;\n }\n\n // - if the server is about to send a message in the future w.r.t to the client\n // - server.seq > client.ack => oldSession.nextSeq() > nextExpectedSeq\n if (ourNextSeq > clientNextExpectedSeq) {\n this.rejectHandshakeRequest(\n session,\n msg.from,\n `server is in the future: client wanted next message to be ${clientNextExpectedSeq} but server would have sent ${ourNextSeq}`,\n 'SESSION_STATE_MISMATCH',\n {\n ...session.loggingMetadata,\n connectedTo: msg.from,\n transportMessage: msg,\n },\n );\n\n return;\n }\n\n // transparent reconnect seems ok, proceed by transitioning old session\n // to not connected\n if (oldSession.state === SessionState.Connected) {\n const noConnectionSession =\n SessionStateGraph.transition.ConnectedToNoConnection(oldSession, {\n onSessionGracePeriodElapsed: () => {\n this.onSessionGracePeriodElapsed(noConnectionSession);\n },\n });\n\n oldSession = noConnectionSession;\n } else if (oldSession.state === SessionState.Handshaking) {\n const noConnectionSession =\n SessionStateGraph.transition.HandshakingToNoConnection(oldSession, {\n onSessionGracePeriodElapsed: () => {\n this.onSessionGracePeriodElapsed(noConnectionSession);\n },\n });\n\n oldSession = noConnectionSession;\n } else if (oldSession.state === SessionState.Connecting) {\n const noConnectionSession =\n SessionStateGraph.transition.ConnectingToNoConnection(oldSession, {\n onSessionGracePeriodElapsed: () => {\n this.onSessionGracePeriodElapsed(noConnectionSession);\n },\n });\n\n oldSession = noConnectionSession;\n }\n\n this.updateSession(oldSession);\n } else if (oldSession) {\n connectCase = 'hard reconnection';\n\n // just nuke the old session entirely and proceed as if this was new\n this.log?.info(\n `client is reconnecting to a new session (${msg.payload.sessionId}) with an old session (${oldSession.id}) already existing, closing old session`,\n {\n ...session.loggingMetadata,\n connectedTo: msg.from,\n sessionId: msg.payload.sessionId,\n },\n );\n this.deleteSession(oldSession);\n oldSession = undefined;\n }\n\n if (!oldSession && (clientNextSentSeq > 0 || clientNextExpectedSeq > 0)) {\n // we don't have a session, but the client is trying to reconnect\n // to an old session. we can't do anything about this, so we reject\n connectCase = 'unknown session';\n this.rejectHandshakeRequest(\n session,\n msg.from,\n `client is trying to reconnect to a session the server don't know about: ${msg.payload.sessionId}`,\n 'SESSION_STATE_MISMATCH',\n {\n ...session.loggingMetadata,\n connectedTo: msg.from,\n transportMessage: msg,\n },\n );\n return;\n }\n\n // from this point on, we're committed to connecting\n const sessionId = msg.payload.sessionId;\n this.log?.info(\n `handshake from ${msg.from} ok (${connectCase}), responding with handshake success`,\n {\n ...session.loggingMetadata,\n connectedTo: msg.from,\n },\n );\n const responseMsg = handshakeResponseMessage({\n from: this.clientId,\n to: msg.from,\n status: {\n ok: true,\n sessionId,\n },\n });\n session.sendHandshake(responseMsg);\n\n // transition\n const connectedSession =\n SessionStateGraph.transition.WaitingForHandshakeToConnected(\n session,\n // by this point oldSession is either no connection or we dont have an old session\n oldSession,\n sessionId,\n msg.from,\n msg.tracing,\n {\n onConnectionErrored: (err) => {\n // just log, when we error we also emit close\n const errStr = coerceErrorString(err);\n this.log?.warn(\n `connection to ${connectedSession.to} errored: ${errStr}`,\n connectedSession.loggingMetadata,\n );\n },\n onConnectionClosed: () => {\n this.log?.info(\n `connection to ${connectedSession.to} closed`,\n connectedSession.loggingMetadata,\n );\n this.onConnClosed(connectedSession);\n },\n onMessage: (msg) => this.handleMsg(msg),\n onInvalidMessage: (reason) => {\n this.protocolError(ProtocolError.MessageOrderingViolated, reason);\n this.deleteSession(connectedSession);\n },\n },\n );\n\n this.sessionHandshakeMetadata.set(connectedSession.to, parsedMetadata);\n this.updateSession(connectedSession);\n this.pendingSessions.delete(session);\n connectedSession.startActiveHeartbeat();\n }\n\n private async validateHandshakeMetadata(\n handshakingSession: SessionWaitingForHandshake<ConnType>,\n existingSession: 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 this.rejectHandshakeRequest(\n handshakingSession,\n from,\n 'received malformed handshake metadata',\n 'MALFORMED_HANDSHAKE_META',\n {\n ...handshakingSession.loggingMetadata,\n connectedTo: from,\n validationErrors: [\n ...Value.Errors(this.handshakeExtensions.schema, rawMetadata),\n ],\n },\n );\n\n return false;\n }\n\n const previousParsedMetadata = existingSession\n ? this.sessionHandshakeMetadata.get(existingSession.to)\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 this.rejectHandshakeRequest(\n handshakingSession,\n from,\n 'rejected by handshake handler',\n 'REJECTED_BY_CUSTOM_HANDLER',\n {\n ...handshakingSession.loggingMetadata,\n connectedTo: from,\n clientId: this.clientId,\n },\n );\n\n return false;\n }\n }\n\n return parsedMetadata;\n }\n}\n"],"mappings":"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","names":["msg"]}
@@ -8,7 +8,7 @@ import {
8
8
  getPropagationContext,
9
9
  isStreamClose,
10
10
  isStreamOpen
11
- } from "./chunk-DZNP3EI5.js";
11
+ } from "./chunk-SZ5NBBX7.js";
12
12
 
13
13
  // router/services.ts
14
14
  import { Type } from "@sinclair/typebox";
@@ -692,6 +692,7 @@ function handleRpc(transport, serverId, input, serviceName, procedureName) {
692
692
  tracing: getPropagationContext(ctx),
693
693
  controlFlags: 2 /* StreamOpenBit */ | 4 /* StreamClosedBit */
694
694
  });
695
+ let cleanedUp = false;
695
696
  const responsePromise = new Promise((resolve) => {
696
697
  const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
697
698
  cleanup();
@@ -703,6 +704,9 @@ function handleRpc(transport, serverId, input, serviceName, procedureName) {
703
704
  );
704
705
  });
705
706
  function cleanup() {
707
+ if (cleanedUp)
708
+ return;
709
+ cleanedUp = true;
706
710
  transport.removeEventListener("message", onMessage);
707
711
  transport.removeEventListener("sessionStatus", onSessionStatus);
708
712
  span.end();
@@ -732,7 +736,8 @@ function handleStream(transport, serverId, init, serviceName, procedureName) {
732
736
  const inputStream = pushable({ objectMode: true });
733
737
  const outputStream = pushable({ objectMode: true });
734
738
  let firstMessage = true;
735
- let healthyClose = true;
739
+ let sentClose = false;
740
+ let cleanedUp = false;
736
741
  if (init) {
737
742
  transport.send(serverId, {
738
743
  streamId,
@@ -760,13 +765,14 @@ function handleStream(transport, serverId, init, serviceName, procedureName) {
760
765
  }
761
766
  transport.send(serverId, m2);
762
767
  }
763
- if (!healthyClose)
768
+ if (sentClose)
764
769
  return;
770
+ sentClose = true;
765
771
  const m = closeStreamMessage(streamId);
772
+ m.serviceName = serviceName;
773
+ m.procedureName = procedureName;
774
+ m.tracing = getPropagationContext(ctx);
766
775
  if (firstMessage) {
767
- m.serviceName = serviceName;
768
- m.procedureName = procedureName;
769
- m.tracing = getPropagationContext(ctx);
770
776
  m.controlFlags |= 2 /* StreamOpenBit */;
771
777
  firstMessage = false;
772
778
  }
@@ -785,6 +791,9 @@ function handleStream(transport, serverId, init, serviceName, procedureName) {
785
791
  }
786
792
  }
787
793
  function cleanup() {
794
+ if (cleanedUp)
795
+ return;
796
+ cleanedUp = true;
788
797
  inputStream.end();
789
798
  outputStream.end();
790
799
  transport.removeEventListener("message", onMessage);
@@ -798,7 +807,7 @@ function handleStream(transport, serverId, init, serviceName, procedureName) {
798
807
  message: `${serverId} unexpectedly disconnected`
799
808
  })
800
809
  );
801
- healthyClose = false;
810
+ sentClose = true;
802
811
  cleanup();
803
812
  });
804
813
  transport.addEventListener("message", onMessage);
@@ -822,7 +831,8 @@ function handleSubscribe(transport, serverId, input, serviceName, procedureName)
822
831
  tracing: getPropagationContext(ctx),
823
832
  controlFlags: 2 /* StreamOpenBit */
824
833
  });
825
- let healthyClose = true;
834
+ let sentClose = false;
835
+ let cleanedUp = false;
826
836
  const outputStream = pushable({ objectMode: true });
827
837
  function onMessage(msg) {
828
838
  if (msg.streamId !== streamId)
@@ -836,6 +846,9 @@ function handleSubscribe(transport, serverId, input, serviceName, procedureName)
836
846
  }
837
847
  }
838
848
  function cleanup() {
849
+ if (cleanedUp)
850
+ return;
851
+ cleanedUp = true;
839
852
  outputStream.end();
840
853
  transport.removeEventListener("message", onMessage);
841
854
  transport.removeEventListener("sessionStatus", onSessionStatus);
@@ -843,9 +856,14 @@ function handleSubscribe(transport, serverId, input, serviceName, procedureName)
843
856
  }
844
857
  const closeHandler = () => {
845
858
  cleanup();
846
- if (!healthyClose)
859
+ if (sentClose)
847
860
  return;
848
- transport.send(serverId, closeStreamMessage(streamId));
861
+ sentClose = true;
862
+ const m = closeStreamMessage(streamId);
863
+ m.serviceName = serviceName;
864
+ m.procedureName = procedureName;
865
+ m.tracing = getPropagationContext(ctx);
866
+ transport.send(serverId, m);
849
867
  };
850
868
  const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
851
869
  outputStream.push(
@@ -854,7 +872,7 @@ function handleSubscribe(transport, serverId, input, serviceName, procedureName)
854
872
  message: `${serverId} unexpectedly disconnected`
855
873
  })
856
874
  );
857
- healthyClose = false;
875
+ sentClose = true;
858
876
  cleanup();
859
877
  });
860
878
  transport.addEventListener("message", onMessage);
@@ -872,7 +890,8 @@ function handleUpload(transport, serverId, init, serviceName, procedureName) {
872
890
  );
873
891
  const inputStream = pushable({ objectMode: true });
874
892
  let firstMessage = true;
875
- let healthyClose = true;
893
+ let sentClose = false;
894
+ let cleanedUp = false;
876
895
  if (init) {
877
896
  transport.send(serverId, {
878
897
  streamId,
@@ -900,13 +919,14 @@ function handleUpload(transport, serverId, init, serviceName, procedureName) {
900
919
  }
901
920
  transport.send(serverId, m2);
902
921
  }
903
- if (!healthyClose)
922
+ if (sentClose)
904
923
  return;
924
+ sentClose = true;
905
925
  const m = closeStreamMessage(streamId);
926
+ m.serviceName = serviceName;
927
+ m.procedureName = procedureName;
928
+ m.tracing = getPropagationContext(ctx);
906
929
  if (firstMessage) {
907
- m.serviceName = serviceName;
908
- m.procedureName = procedureName;
909
- m.tracing = getPropagationContext(ctx);
910
930
  m.controlFlags |= 2 /* StreamOpenBit */;
911
931
  firstMessage = false;
912
932
  }
@@ -915,7 +935,7 @@ function handleUpload(transport, serverId, init, serviceName, procedureName) {
915
935
  void pipeInputToTransport();
916
936
  const responsePromise = new Promise((resolve) => {
917
937
  const onSessionStatus = createSessionDisconnectHandler(serverId, () => {
918
- healthyClose = false;
938
+ sentClose = true;
919
939
  cleanup();
920
940
  resolve(
921
941
  Err({
@@ -925,6 +945,9 @@ function handleUpload(transport, serverId, init, serviceName, procedureName) {
925
945
  );
926
946
  });
927
947
  function cleanup() {
948
+ if (cleanedUp)
949
+ return;
950
+ cleanedUp = true;
928
951
  inputStream.end();
929
952
  transport.removeEventListener("message", onMessage);
930
953
  transport.removeEventListener("sessionStatus", onSessionStatus);
@@ -1428,4 +1451,4 @@ export {
1428
1451
  createClientHandshakeOptions,
1429
1452
  createServerHandshakeOptions
1430
1453
  };
1431
- //# sourceMappingURL=chunk-LSHUPI6U.js.map
1454
+ //# sourceMappingURL=chunk-SGSRNAWJ.js.map