@replit/river 0.25.1 → 0.26.0
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-D5O3ERJU.js → chunk-5FDAIAQ5.js} +3 -3
- package/dist/chunk-5FDAIAQ5.js.map +1 -0
- package/dist/{chunk-5CNNIOAO.js → chunk-5S64PXTU.js} +102 -95
- package/dist/chunk-5S64PXTU.js.map +1 -0
- package/dist/{chunk-PCBPPTXH.js → chunk-7ETNUCOL.js} +54 -62
- package/dist/chunk-7ETNUCOL.js.map +1 -0
- package/dist/{chunk-SGSRNAWJ.js → chunk-BNNELZM4.js} +2 -2
- package/dist/{chunk-SGSRNAWJ.js.map → chunk-BNNELZM4.js.map} +1 -1
- package/dist/{chunk-SZ5NBBX7.js → chunk-CCUYKR5C.js} +14 -4
- package/dist/chunk-CCUYKR5C.js.map +1 -0
- package/dist/{chunk-YM5Y4NAT.js → chunk-JSU2KACV.js} +199 -117
- package/dist/chunk-JSU2KACV.js.map +1 -0
- package/dist/{chunk-MBMEJIPU.js → chunk-KP4UB5NW.js} +2 -2
- package/dist/{client-1321630c.d.ts → client-162c509c.d.ts} +4 -2
- package/dist/{connection-bd907ca6.d.ts → connection-6a404bb8.d.ts} +1 -1
- package/dist/{handshake-3772d7ca.d.ts → handshake-3342bb94.d.ts} +132 -84
- package/dist/logging/index.d.cts +1 -1
- package/dist/logging/index.d.ts +1 -1
- package/dist/{message-e6c560fd.d.ts → message-1a434848.d.ts} +2 -1
- package/dist/router/index.cjs +12 -3
- package/dist/router/index.cjs.map +1 -1
- package/dist/router/index.d.cts +8 -8
- package/dist/router/index.d.ts +8 -8
- package/dist/router/index.js +2 -2
- package/dist/{server-f0fd2b98.d.ts → server-1b695374.d.ts} +9 -4
- package/dist/{services-8d14ae16.d.ts → services-c17f7eff.d.ts} +3 -3
- package/dist/transport/impls/ws/client.cjs +302 -207
- package/dist/transport/impls/ws/client.cjs.map +1 -1
- package/dist/transport/impls/ws/client.d.cts +4 -4
- package/dist/transport/impls/ws/client.d.ts +4 -4
- package/dist/transport/impls/ws/client.js +5 -5
- package/dist/transport/impls/ws/server.cjs +253 -174
- package/dist/transport/impls/ws/server.cjs.map +1 -1
- package/dist/transport/impls/ws/server.d.cts +4 -4
- package/dist/transport/impls/ws/server.d.ts +4 -4
- package/dist/transport/impls/ws/server.js +5 -5
- package/dist/transport/index.cjs +351 -264
- package/dist/transport/index.cjs.map +1 -1
- package/dist/transport/index.d.cts +4 -4
- package/dist/transport/index.d.ts +4 -4
- package/dist/transport/index.js +5 -5
- package/dist/util/testHelpers.cjs +208 -117
- package/dist/util/testHelpers.cjs.map +1 -1
- package/dist/util/testHelpers.d.cts +6 -5
- package/dist/util/testHelpers.d.ts +6 -5
- package/dist/util/testHelpers.js +6 -3
- package/dist/util/testHelpers.js.map +1 -1
- package/package.json +14 -13
- package/dist/chunk-5CNNIOAO.js.map +0 -1
- package/dist/chunk-D5O3ERJU.js.map +0 -1
- package/dist/chunk-PCBPPTXH.js.map +0 -1
- package/dist/chunk-SZ5NBBX7.js.map +0 -1
- package/dist/chunk-YM5Y4NAT.js.map +0 -1
- /package/dist/{chunk-MBMEJIPU.js.map → chunk-KP4UB5NW.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../transport/id.ts","../transport/message.ts","../package.json","../util/stringify.ts","../tracing/index.ts"],"sourcesContent":["import { customAlphabet } from 'nanoid';\n\nconst alphabet = customAlphabet(\n '1234567890abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZ',\n);\nexport const generateId = () => alphabet(12);\n","import { Type, TSchema, Static } from '@sinclair/typebox';\nimport { PropagationContext } from '../tracing';\nimport { generateId } from './id';\n\n/**\n * Control flags for transport messages.\n * An RPC message is coded with StreamOpenBit | StreamClosedBit.\n * Streams are expected to start with StreamOpenBit sent and the client SHOULD send an empty\n * message with StreamClosedBit to close the stream handler on the server, indicating that\n * it will not be using the stream anymore.\n */\nexport const enum ControlFlags {\n AckBit = 0b0001,\n StreamOpenBit = 0b0010,\n StreamClosedBit = 0b0100,\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 PROTOCOL_VERSION = 'v1.1';\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 // TODO: remove optional once we know all servers\n // are nextSentSeq here\n // what the server expects the client to send next\n nextSentSeq: Type.Optional(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 // TODO: remove optional once we know all servers\n // are sending code here\n code: Type.Optional(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: string;\n to: string;\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: PROTOCOL_VERSION,\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\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 \"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.26.0\",\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 \"it-pushable\": \"^3.2.3\",\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/sdk-trace-base\": \"^1.24.1\",\n \"@opentelemetry/sdk-trace-web\": \"^1.24.1\",\n \"@opentelemetry/core\": \"^1.7.0\",\n \"@types/ws\": \"^8.5.5\",\n \"@typescript-eslint/eslint-plugin\": \"^7.8.0\",\n \"@typescript-eslint/parser\": \"^7.8.0\",\n \"@vitest/ui\": \"^1.3.1\",\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\": \"^1.3.1\"\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 {\n ClientTransport,\n Connection,\n OpaqueTransportMessage,\n} 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(\n kind: ValidProcType,\n message: OpaqueTransportMessage,\n fn: (span: Span) => Promise<unknown>,\n) {\n const ctx = message.tracing\n ? propagation.extract(context.active(), message.tracing)\n : context.active();\n\n return tracer.startActiveSpan(\n `procedure handler ${message.serviceName}.${message.procedureName}`,\n {\n attributes: {\n component: 'river',\n 'river.method.kind': kind,\n 'river.method.service': message.serviceName,\n 'river.method.name': message.procedureName,\n 'river.streamId': message.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":[]}
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
createSessionTelemetryInfo,
|
|
4
4
|
generateId,
|
|
5
5
|
isAck
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-CCUYKR5C.js";
|
|
7
7
|
import {
|
|
8
8
|
NaiveJsonCodec
|
|
9
9
|
} from "./chunk-4PVU7J25.js";
|
|
@@ -18,7 +18,7 @@ var defaultTransportOptions = {
|
|
|
18
18
|
codec: NaiveJsonCodec
|
|
19
19
|
};
|
|
20
20
|
var defaultConnectionRetryOptions = {
|
|
21
|
-
baseIntervalMs:
|
|
21
|
+
baseIntervalMs: 150,
|
|
22
22
|
maxJitterMs: 200,
|
|
23
23
|
maxBackoffMs: 32e3,
|
|
24
24
|
attemptBudgetCapacity: 5,
|
|
@@ -36,6 +36,7 @@ var defaultServerTransportOptions = {
|
|
|
36
36
|
import { Value } from "@sinclair/typebox/value";
|
|
37
37
|
var SessionState = /* @__PURE__ */ ((SessionState2) => {
|
|
38
38
|
SessionState2["NoConnection"] = "NoConnection";
|
|
39
|
+
SessionState2["BackingOff"] = "BackingOff";
|
|
39
40
|
SessionState2["Connecting"] = "Connecting";
|
|
40
41
|
SessionState2["Handshaking"] = "Handshaking";
|
|
41
42
|
SessionState2["Connected"] = "Connected";
|
|
@@ -93,7 +94,7 @@ var CommonSession = class extends StateMachineState {
|
|
|
93
94
|
from;
|
|
94
95
|
options;
|
|
95
96
|
log;
|
|
96
|
-
constructor(from, options, log) {
|
|
97
|
+
constructor({ from, options, log }) {
|
|
97
98
|
super();
|
|
98
99
|
this.from = from;
|
|
99
100
|
this.options = options;
|
|
@@ -134,8 +135,9 @@ var IdentifiedSession = class extends CommonSession {
|
|
|
134
135
|
*/
|
|
135
136
|
ack;
|
|
136
137
|
sendBuffer;
|
|
137
|
-
constructor(
|
|
138
|
-
|
|
138
|
+
constructor(props) {
|
|
139
|
+
const { id, to, seq, ack, sendBuffer, telemetry, log } = props;
|
|
140
|
+
super(props);
|
|
139
141
|
this.id = id;
|
|
140
142
|
this.to = to;
|
|
141
143
|
this.seq = seq;
|
|
@@ -190,23 +192,23 @@ var SessionConnecting = class extends IdentifiedSession {
|
|
|
190
192
|
connPromise;
|
|
191
193
|
listeners;
|
|
192
194
|
connectionTimeout;
|
|
193
|
-
constructor(
|
|
194
|
-
super(
|
|
195
|
-
this.connPromise = connPromise;
|
|
196
|
-
this.listeners = listeners;
|
|
195
|
+
constructor(props) {
|
|
196
|
+
super(props);
|
|
197
|
+
this.connPromise = props.connPromise;
|
|
198
|
+
this.listeners = props.listeners;
|
|
197
199
|
this.connectionTimeout = setTimeout(() => {
|
|
198
|
-
listeners.onConnectionTimeout();
|
|
200
|
+
this.listeners.onConnectionTimeout();
|
|
199
201
|
}, this.options.connectionTimeoutMs);
|
|
200
|
-
connPromise.then(
|
|
202
|
+
this.connPromise.then(
|
|
201
203
|
(conn) => {
|
|
202
204
|
if (this._isConsumed)
|
|
203
205
|
return;
|
|
204
|
-
listeners.onConnectionEstablished(conn);
|
|
206
|
+
this.listeners.onConnectionEstablished(conn);
|
|
205
207
|
},
|
|
206
208
|
(err) => {
|
|
207
209
|
if (this._isConsumed)
|
|
208
210
|
return;
|
|
209
|
-
listeners.onConnectionFailed(err);
|
|
211
|
+
this.listeners.onConnectionFailed(err);
|
|
210
212
|
}
|
|
211
213
|
);
|
|
212
214
|
}
|
|
@@ -232,9 +234,9 @@ var SessionNoConnection = class extends IdentifiedSession {
|
|
|
232
234
|
state = "NoConnection" /* NoConnection */;
|
|
233
235
|
listeners;
|
|
234
236
|
gracePeriodTimeout;
|
|
235
|
-
constructor(
|
|
236
|
-
super(
|
|
237
|
-
this.listeners = listeners;
|
|
237
|
+
constructor(props) {
|
|
238
|
+
super(props);
|
|
239
|
+
this.listeners = props.listeners;
|
|
238
240
|
this.gracePeriodTimeout = setTimeout(() => {
|
|
239
241
|
this.listeners.onSessionGracePeriodElapsed();
|
|
240
242
|
}, this.options.sessionDisconnectGraceMs);
|
|
@@ -257,16 +259,16 @@ var SessionWaitingForHandshake = class extends CommonSession {
|
|
|
257
259
|
conn;
|
|
258
260
|
listeners;
|
|
259
261
|
handshakeTimeout;
|
|
260
|
-
constructor(
|
|
261
|
-
super(
|
|
262
|
-
this.conn = conn;
|
|
263
|
-
this.listeners = listeners;
|
|
262
|
+
constructor(props) {
|
|
263
|
+
super(props);
|
|
264
|
+
this.conn = props.conn;
|
|
265
|
+
this.listeners = props.listeners;
|
|
264
266
|
this.handshakeTimeout = setTimeout(() => {
|
|
265
|
-
listeners.onHandshakeTimeout();
|
|
267
|
+
this.listeners.onHandshakeTimeout();
|
|
266
268
|
}, this.options.handshakeTimeoutMs);
|
|
267
269
|
this.conn.addDataListener(this.onHandshakeData);
|
|
268
|
-
this.conn.addErrorListener(listeners.onConnectionErrored);
|
|
269
|
-
this.conn.addCloseListener(listeners.onConnectionClosed);
|
|
270
|
+
this.conn.addErrorListener(this.listeners.onConnectionErrored);
|
|
271
|
+
this.conn.addCloseListener(this.listeners.onConnectionClosed);
|
|
270
272
|
}
|
|
271
273
|
onHandshakeData = (msg) => {
|
|
272
274
|
const parsedMsg = this.parseMsg(msg);
|
|
@@ -303,16 +305,16 @@ var SessionHandshaking = class extends IdentifiedSession {
|
|
|
303
305
|
conn;
|
|
304
306
|
listeners;
|
|
305
307
|
handshakeTimeout;
|
|
306
|
-
constructor(
|
|
307
|
-
super(
|
|
308
|
-
this.conn = conn;
|
|
309
|
-
this.listeners = listeners;
|
|
308
|
+
constructor(props) {
|
|
309
|
+
super(props);
|
|
310
|
+
this.conn = props.conn;
|
|
311
|
+
this.listeners = props.listeners;
|
|
310
312
|
this.handshakeTimeout = setTimeout(() => {
|
|
311
|
-
listeners.onHandshakeTimeout();
|
|
313
|
+
this.listeners.onHandshakeTimeout();
|
|
312
314
|
}, this.options.handshakeTimeoutMs);
|
|
313
315
|
this.conn.addDataListener(this.onHandshakeData);
|
|
314
|
-
this.conn.addErrorListener(listeners.onConnectionErrored);
|
|
315
|
-
this.conn.addCloseListener(listeners.onConnectionClosed);
|
|
316
|
+
this.conn.addErrorListener(this.listeners.onConnectionErrored);
|
|
317
|
+
this.conn.addCloseListener(this.listeners.onConnectionClosed);
|
|
316
318
|
}
|
|
317
319
|
onHandshakeData = (msg) => {
|
|
318
320
|
const parsedMsg = this.parseMsg(msg);
|
|
@@ -344,16 +346,13 @@ var SessionConnected = class extends IdentifiedSession {
|
|
|
344
346
|
state = "Connected" /* Connected */;
|
|
345
347
|
conn;
|
|
346
348
|
listeners;
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
get isActivelyHeartbeating() {
|
|
351
|
-
return this.activeHeartbeatHandle !== void 0;
|
|
352
|
-
}
|
|
349
|
+
heartbeatHandle;
|
|
350
|
+
heartbeatMisses = 0;
|
|
351
|
+
isActivelyHeartbeating;
|
|
353
352
|
updateBookkeeping(ack, seq) {
|
|
354
353
|
this.sendBuffer = this.sendBuffer.filter((unacked) => unacked.seq >= ack);
|
|
355
354
|
this.ack = seq + 1;
|
|
356
|
-
this.
|
|
355
|
+
this.heartbeatMisses = 0;
|
|
357
356
|
}
|
|
358
357
|
send(msg) {
|
|
359
358
|
const constructedMsg = this.constructMsg(msg);
|
|
@@ -361,13 +360,13 @@ var SessionConnected = class extends IdentifiedSession {
|
|
|
361
360
|
this.conn.send(this.options.codec.toBuffer(constructedMsg));
|
|
362
361
|
return constructedMsg.id;
|
|
363
362
|
}
|
|
364
|
-
constructor(
|
|
365
|
-
super(
|
|
366
|
-
this.conn = conn;
|
|
367
|
-
this.listeners = listeners;
|
|
363
|
+
constructor(props) {
|
|
364
|
+
super(props);
|
|
365
|
+
this.conn = props.conn;
|
|
366
|
+
this.listeners = props.listeners;
|
|
368
367
|
this.conn.addDataListener(this.onMessageData);
|
|
369
|
-
this.conn.addCloseListener(listeners.onConnectionClosed);
|
|
370
|
-
this.conn.addErrorListener(listeners.onConnectionErrored);
|
|
368
|
+
this.conn.addCloseListener(this.listeners.onConnectionClosed);
|
|
369
|
+
this.conn.addErrorListener(this.listeners.onConnectionErrored);
|
|
371
370
|
if (this.sendBuffer.length > 0) {
|
|
372
371
|
this.log?.debug(
|
|
373
372
|
`sending ${this.sendBuffer.length} buffered messages`,
|
|
@@ -375,12 +374,11 @@ var SessionConnected = class extends IdentifiedSession {
|
|
|
375
374
|
);
|
|
376
375
|
}
|
|
377
376
|
for (const msg of this.sendBuffer) {
|
|
378
|
-
conn.send(this.options.codec.toBuffer(msg));
|
|
377
|
+
this.conn.send(this.options.codec.toBuffer(msg));
|
|
379
378
|
}
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
const misses = this.activeHeartbeatMisses;
|
|
379
|
+
this.isActivelyHeartbeating = false;
|
|
380
|
+
this.heartbeatHandle = setInterval(() => {
|
|
381
|
+
const misses = this.heartbeatMisses;
|
|
384
382
|
const missDuration = misses * this.options.heartbeatIntervalMs;
|
|
385
383
|
if (misses >= this.options.heartbeatsUntilDead) {
|
|
386
384
|
this.log?.info(
|
|
@@ -389,29 +387,18 @@ var SessionConnected = class extends IdentifiedSession {
|
|
|
389
387
|
);
|
|
390
388
|
this.telemetry.span.addEvent("closing connection due to inactivity");
|
|
391
389
|
this.conn.close();
|
|
392
|
-
clearInterval(this.
|
|
393
|
-
this.
|
|
390
|
+
clearInterval(this.heartbeatHandle);
|
|
391
|
+
this.heartbeatHandle = void 0;
|
|
394
392
|
return;
|
|
395
393
|
}
|
|
396
|
-
this.
|
|
397
|
-
|
|
394
|
+
if (this.isActivelyHeartbeating) {
|
|
395
|
+
this.sendHeartbeat();
|
|
396
|
+
}
|
|
397
|
+
this.heartbeatMisses++;
|
|
398
398
|
}, this.options.heartbeatIntervalMs);
|
|
399
399
|
}
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
if (this.passiveHeartbeatHandle) {
|
|
403
|
-
clearTimeout(this.passiveHeartbeatHandle);
|
|
404
|
-
this.passiveHeartbeatHandle = void 0;
|
|
405
|
-
}
|
|
406
|
-
this.passiveHeartbeatHandle = setTimeout(() => {
|
|
407
|
-
this.log?.info(
|
|
408
|
-
`closing connection to ${this.to} due to not receiving a heartbeat in the last ${duration}ms`,
|
|
409
|
-
this.loggingMetadata
|
|
410
|
-
);
|
|
411
|
-
this.telemetry.span.addEvent("closing connection due to inactivity");
|
|
412
|
-
this.conn.close();
|
|
413
|
-
this.passiveHeartbeatHandle = void 0;
|
|
414
|
-
}, duration);
|
|
400
|
+
startActiveHeartbeat() {
|
|
401
|
+
this.isActivelyHeartbeating = true;
|
|
415
402
|
}
|
|
416
403
|
sendHeartbeat() {
|
|
417
404
|
this.log?.debug("sending heartbeat", this.loggingMetadata);
|
|
@@ -466,7 +453,6 @@ var SessionConnected = class extends IdentifiedSession {
|
|
|
466
453
|
});
|
|
467
454
|
if (!this.isActivelyHeartbeating) {
|
|
468
455
|
this.sendHeartbeat();
|
|
469
|
-
this.waitForNextHeartbeat();
|
|
470
456
|
}
|
|
471
457
|
};
|
|
472
458
|
_handleStateExit() {
|
|
@@ -474,10 +460,8 @@ var SessionConnected = class extends IdentifiedSession {
|
|
|
474
460
|
this.conn.removeDataListener(this.onMessageData);
|
|
475
461
|
this.conn.removeCloseListener(this.listeners.onConnectionClosed);
|
|
476
462
|
this.conn.removeErrorListener(this.listeners.onConnectionErrored);
|
|
477
|
-
clearInterval(this.
|
|
478
|
-
|
|
479
|
-
this.activeHeartbeatHandle = void 0;
|
|
480
|
-
this.passiveHeartbeatHandle = void 0;
|
|
463
|
+
clearInterval(this.heartbeatHandle);
|
|
464
|
+
this.heartbeatHandle = void 0;
|
|
481
465
|
}
|
|
482
466
|
_handleClose() {
|
|
483
467
|
super._handleClose();
|
|
@@ -485,52 +469,76 @@ var SessionConnected = class extends IdentifiedSession {
|
|
|
485
469
|
}
|
|
486
470
|
};
|
|
487
471
|
|
|
472
|
+
// transport/sessionStateMachine/SessionBackingOff.ts
|
|
473
|
+
var SessionBackingOff = class extends IdentifiedSession {
|
|
474
|
+
state = "BackingOff" /* BackingOff */;
|
|
475
|
+
listeners;
|
|
476
|
+
backoffTimeout;
|
|
477
|
+
constructor(props) {
|
|
478
|
+
super(props);
|
|
479
|
+
this.listeners = props.listeners;
|
|
480
|
+
this.backoffTimeout = setTimeout(() => {
|
|
481
|
+
this.listeners.onBackoffFinished();
|
|
482
|
+
}, props.backoffMs);
|
|
483
|
+
}
|
|
484
|
+
_handleClose() {
|
|
485
|
+
super._handleClose();
|
|
486
|
+
}
|
|
487
|
+
_handleStateExit() {
|
|
488
|
+
super._handleStateExit();
|
|
489
|
+
if (this.backoffTimeout) {
|
|
490
|
+
clearTimeout(this.backoffTimeout);
|
|
491
|
+
this.backoffTimeout = void 0;
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
};
|
|
495
|
+
|
|
488
496
|
// transport/sessionStateMachine/transitions.ts
|
|
489
497
|
function inheritSharedSession(session) {
|
|
490
|
-
return
|
|
491
|
-
session.id,
|
|
492
|
-
session.from,
|
|
493
|
-
session.to,
|
|
494
|
-
session.seq,
|
|
495
|
-
session.ack,
|
|
496
|
-
session.sendBuffer,
|
|
497
|
-
session.telemetry,
|
|
498
|
-
session.options,
|
|
499
|
-
session.log
|
|
500
|
-
|
|
498
|
+
return {
|
|
499
|
+
id: session.id,
|
|
500
|
+
from: session.from,
|
|
501
|
+
to: session.to,
|
|
502
|
+
seq: session.seq,
|
|
503
|
+
ack: session.ack,
|
|
504
|
+
sendBuffer: session.sendBuffer,
|
|
505
|
+
telemetry: session.telemetry,
|
|
506
|
+
options: session.options,
|
|
507
|
+
log: session.log
|
|
508
|
+
};
|
|
501
509
|
}
|
|
502
510
|
var SessionStateGraph = {
|
|
503
511
|
entrypoints: {
|
|
504
|
-
NoConnection(to, from, listeners, options, log) {
|
|
512
|
+
NoConnection: (to, from, listeners, options, log) => {
|
|
505
513
|
const id = `session-${generateId()}`;
|
|
506
514
|
const telemetry = createSessionTelemetryInfo(id, to, from);
|
|
507
515
|
const sendBuffer = [];
|
|
508
|
-
const session = new SessionNoConnection(
|
|
516
|
+
const session = new SessionNoConnection({
|
|
509
517
|
listeners,
|
|
510
518
|
id,
|
|
511
519
|
from,
|
|
512
520
|
to,
|
|
513
|
-
0,
|
|
514
|
-
0,
|
|
521
|
+
seq: 0,
|
|
522
|
+
ack: 0,
|
|
515
523
|
sendBuffer,
|
|
516
524
|
telemetry,
|
|
517
525
|
options,
|
|
518
526
|
log
|
|
519
|
-
);
|
|
527
|
+
});
|
|
520
528
|
session.log?.info(`session ${session.id} created in NoConnection state`, {
|
|
521
529
|
...session.loggingMetadata,
|
|
522
530
|
tags: ["state-transition"]
|
|
523
531
|
});
|
|
524
532
|
return session;
|
|
525
533
|
},
|
|
526
|
-
WaitingForHandshake(from, conn, listeners, options, log) {
|
|
527
|
-
const session = new SessionWaitingForHandshake(
|
|
534
|
+
WaitingForHandshake: (from, conn, listeners, options, log) => {
|
|
535
|
+
const session = new SessionWaitingForHandshake({
|
|
528
536
|
conn,
|
|
529
537
|
listeners,
|
|
530
538
|
from,
|
|
531
539
|
options,
|
|
532
540
|
log
|
|
533
|
-
);
|
|
541
|
+
});
|
|
534
542
|
session.log?.info(`session created in WaitingForHandshake state`, {
|
|
535
543
|
...session.loggingMetadata,
|
|
536
544
|
tags: ["state-transition"]
|
|
@@ -542,16 +550,33 @@ var SessionStateGraph = {
|
|
|
542
550
|
// After a session is transitioned, any usage of the old session will throw.
|
|
543
551
|
transition: {
|
|
544
552
|
// happy path transitions
|
|
545
|
-
|
|
553
|
+
NoConnectionToBackingOff: (oldSession, backoffMs, listeners) => {
|
|
546
554
|
const carriedState = inheritSharedSession(oldSession);
|
|
547
555
|
oldSession._handleStateExit();
|
|
548
|
-
const session = new
|
|
549
|
-
|
|
556
|
+
const session = new SessionBackingOff({
|
|
557
|
+
backoffMs,
|
|
550
558
|
listeners,
|
|
551
559
|
...carriedState
|
|
560
|
+
});
|
|
561
|
+
session.log?.info(
|
|
562
|
+
`session ${session.id} transition from NoConnection to BackingOff`,
|
|
563
|
+
{
|
|
564
|
+
...session.loggingMetadata,
|
|
565
|
+
tags: ["state-transition"]
|
|
566
|
+
}
|
|
552
567
|
);
|
|
568
|
+
return session;
|
|
569
|
+
},
|
|
570
|
+
BackingOffToConnecting: (oldSession, connPromise, listeners) => {
|
|
571
|
+
const carriedState = inheritSharedSession(oldSession);
|
|
572
|
+
oldSession._handleStateExit();
|
|
573
|
+
const session = new SessionConnecting({
|
|
574
|
+
connPromise,
|
|
575
|
+
listeners,
|
|
576
|
+
...carriedState
|
|
577
|
+
});
|
|
553
578
|
session.log?.info(
|
|
554
|
-
`session ${session.id} transition from
|
|
579
|
+
`session ${session.id} transition from BackingOff to Connecting`,
|
|
555
580
|
{
|
|
556
581
|
...session.loggingMetadata,
|
|
557
582
|
tags: ["state-transition"]
|
|
@@ -559,10 +584,14 @@ var SessionStateGraph = {
|
|
|
559
584
|
);
|
|
560
585
|
return session;
|
|
561
586
|
},
|
|
562
|
-
ConnectingToHandshaking(oldSession, conn, listeners) {
|
|
587
|
+
ConnectingToHandshaking: (oldSession, conn, listeners) => {
|
|
563
588
|
const carriedState = inheritSharedSession(oldSession);
|
|
564
589
|
oldSession._handleStateExit();
|
|
565
|
-
const session = new SessionHandshaking(
|
|
590
|
+
const session = new SessionHandshaking({
|
|
591
|
+
conn,
|
|
592
|
+
listeners,
|
|
593
|
+
...carriedState
|
|
594
|
+
});
|
|
566
595
|
session.log?.info(
|
|
567
596
|
`session ${session.id} transition from Connecting to Handshaking`,
|
|
568
597
|
{
|
|
@@ -572,11 +601,15 @@ var SessionStateGraph = {
|
|
|
572
601
|
);
|
|
573
602
|
return session;
|
|
574
603
|
},
|
|
575
|
-
HandshakingToConnected(oldSession, listeners) {
|
|
604
|
+
HandshakingToConnected: (oldSession, listeners) => {
|
|
576
605
|
const carriedState = inheritSharedSession(oldSession);
|
|
577
606
|
const conn = oldSession.conn;
|
|
578
607
|
oldSession._handleStateExit();
|
|
579
|
-
const session = new SessionConnected(
|
|
608
|
+
const session = new SessionConnected({
|
|
609
|
+
conn,
|
|
610
|
+
listeners,
|
|
611
|
+
...carriedState
|
|
612
|
+
});
|
|
580
613
|
session.log?.info(
|
|
581
614
|
`session ${session.id} transition from Handshaking to Connected`,
|
|
582
615
|
{
|
|
@@ -586,7 +619,7 @@ var SessionStateGraph = {
|
|
|
586
619
|
);
|
|
587
620
|
return session;
|
|
588
621
|
},
|
|
589
|
-
WaitingForHandshakeToConnected(pendingSession, oldSession, sessionId, to, propagationCtx, listeners) {
|
|
622
|
+
WaitingForHandshakeToConnected: (pendingSession, oldSession, sessionId, to, propagationCtx, listeners) => {
|
|
590
623
|
const conn = pendingSession.conn;
|
|
591
624
|
const { from, options } = pendingSession;
|
|
592
625
|
const carriedState = oldSession ? (
|
|
@@ -594,21 +627,30 @@ var SessionStateGraph = {
|
|
|
594
627
|
inheritSharedSession(oldSession)
|
|
595
628
|
) : (
|
|
596
629
|
// old session does not exist, create new state
|
|
597
|
-
|
|
598
|
-
sessionId,
|
|
630
|
+
{
|
|
631
|
+
id: sessionId,
|
|
599
632
|
from,
|
|
600
633
|
to,
|
|
601
|
-
0,
|
|
602
|
-
0,
|
|
603
|
-
[],
|
|
604
|
-
createSessionTelemetryInfo(
|
|
634
|
+
seq: 0,
|
|
635
|
+
ack: 0,
|
|
636
|
+
sendBuffer: [],
|
|
637
|
+
telemetry: createSessionTelemetryInfo(
|
|
638
|
+
sessionId,
|
|
639
|
+
to,
|
|
640
|
+
from,
|
|
641
|
+
propagationCtx
|
|
642
|
+
),
|
|
605
643
|
options,
|
|
606
|
-
pendingSession.log
|
|
607
|
-
|
|
644
|
+
log: pendingSession.log
|
|
645
|
+
}
|
|
608
646
|
);
|
|
609
647
|
pendingSession._handleStateExit();
|
|
610
648
|
oldSession?._handleStateExit();
|
|
611
|
-
const session = new SessionConnected(
|
|
649
|
+
const session = new SessionConnected({
|
|
650
|
+
conn,
|
|
651
|
+
listeners,
|
|
652
|
+
...carriedState
|
|
653
|
+
});
|
|
612
654
|
session.log?.info(
|
|
613
655
|
`session ${session.id} transition from WaitingForHandshake to Connected`,
|
|
614
656
|
{
|
|
@@ -619,11 +661,24 @@ var SessionStateGraph = {
|
|
|
619
661
|
return session;
|
|
620
662
|
},
|
|
621
663
|
// disconnect paths
|
|
622
|
-
|
|
664
|
+
BackingOffToNoConnection: (oldSession, listeners) => {
|
|
665
|
+
const carriedState = inheritSharedSession(oldSession);
|
|
666
|
+
oldSession._handleStateExit();
|
|
667
|
+
const session = new SessionNoConnection({ listeners, ...carriedState });
|
|
668
|
+
session.log?.info(
|
|
669
|
+
`session ${session.id} transition from BackingOff to NoConnection`,
|
|
670
|
+
{
|
|
671
|
+
...session.loggingMetadata,
|
|
672
|
+
tags: ["state-transition"]
|
|
673
|
+
}
|
|
674
|
+
);
|
|
675
|
+
return session;
|
|
676
|
+
},
|
|
677
|
+
ConnectingToNoConnection: (oldSession, listeners) => {
|
|
623
678
|
const carriedState = inheritSharedSession(oldSession);
|
|
624
679
|
oldSession.bestEffortClose();
|
|
625
680
|
oldSession._handleStateExit();
|
|
626
|
-
const session = new SessionNoConnection(listeners, ...carriedState);
|
|
681
|
+
const session = new SessionNoConnection({ listeners, ...carriedState });
|
|
627
682
|
session.log?.info(
|
|
628
683
|
`session ${session.id} transition from Connecting to NoConnection`,
|
|
629
684
|
{
|
|
@@ -633,11 +688,11 @@ var SessionStateGraph = {
|
|
|
633
688
|
);
|
|
634
689
|
return session;
|
|
635
690
|
},
|
|
636
|
-
HandshakingToNoConnection(oldSession, listeners) {
|
|
691
|
+
HandshakingToNoConnection: (oldSession, listeners) => {
|
|
637
692
|
const carriedState = inheritSharedSession(oldSession);
|
|
638
693
|
oldSession.conn.close();
|
|
639
694
|
oldSession._handleStateExit();
|
|
640
|
-
const session = new SessionNoConnection(listeners, ...carriedState);
|
|
695
|
+
const session = new SessionNoConnection({ listeners, ...carriedState });
|
|
641
696
|
session.log?.info(
|
|
642
697
|
`session ${session.id} transition from Handshaking to NoConnection`,
|
|
643
698
|
{
|
|
@@ -647,11 +702,11 @@ var SessionStateGraph = {
|
|
|
647
702
|
);
|
|
648
703
|
return session;
|
|
649
704
|
},
|
|
650
|
-
ConnectedToNoConnection(oldSession, listeners) {
|
|
705
|
+
ConnectedToNoConnection: (oldSession, listeners) => {
|
|
651
706
|
const carriedState = inheritSharedSession(oldSession);
|
|
652
707
|
oldSession.conn.close();
|
|
653
708
|
oldSession._handleStateExit();
|
|
654
|
-
const session = new SessionNoConnection(listeners, ...carriedState);
|
|
709
|
+
const session = new SessionNoConnection({ listeners, ...carriedState });
|
|
655
710
|
session.log?.info(
|
|
656
711
|
`session ${session.id} transition from Connected to NoConnection`,
|
|
657
712
|
{
|
|
@@ -663,12 +718,39 @@ var SessionStateGraph = {
|
|
|
663
718
|
}
|
|
664
719
|
}
|
|
665
720
|
};
|
|
721
|
+
var transitions = SessionStateGraph.transition;
|
|
722
|
+
var ClientSessionStateGraph = {
|
|
723
|
+
entrypoint: SessionStateGraph.entrypoints.NoConnection,
|
|
724
|
+
transition: {
|
|
725
|
+
// happy paths
|
|
726
|
+
NoConnectionToBackingOff: transitions.NoConnectionToBackingOff,
|
|
727
|
+
BackingOffToConnecting: transitions.BackingOffToConnecting,
|
|
728
|
+
ConnectingToHandshaking: transitions.ConnectingToHandshaking,
|
|
729
|
+
HandshakingToConnected: transitions.HandshakingToConnected,
|
|
730
|
+
// disconnect paths
|
|
731
|
+
BackingOffToNoConnection: transitions.BackingOffToNoConnection,
|
|
732
|
+
ConnectingToNoConnection: transitions.ConnectingToNoConnection,
|
|
733
|
+
HandshakingToNoConnection: transitions.HandshakingToNoConnection,
|
|
734
|
+
ConnectedToNoConnection: transitions.ConnectedToNoConnection
|
|
735
|
+
}
|
|
736
|
+
};
|
|
737
|
+
var ServerSessionStateGraph = {
|
|
738
|
+
entrypoint: SessionStateGraph.entrypoints.WaitingForHandshake,
|
|
739
|
+
transition: {
|
|
740
|
+
// happy paths
|
|
741
|
+
WaitingForHandshakeToConnected: transitions.WaitingForHandshakeToConnected,
|
|
742
|
+
// disconnect paths
|
|
743
|
+
ConnectedToNoConnection: transitions.ConnectedToNoConnection
|
|
744
|
+
}
|
|
745
|
+
};
|
|
666
746
|
|
|
667
747
|
export {
|
|
668
748
|
defaultTransportOptions,
|
|
669
749
|
defaultClientTransportOptions,
|
|
670
750
|
defaultServerTransportOptions,
|
|
671
751
|
SessionState,
|
|
672
|
-
SessionStateGraph
|
|
752
|
+
SessionStateGraph,
|
|
753
|
+
ClientSessionStateGraph,
|
|
754
|
+
ServerSessionStateGraph
|
|
673
755
|
};
|
|
674
|
-
//# sourceMappingURL=chunk-
|
|
756
|
+
//# sourceMappingURL=chunk-JSU2KACV.js.map
|