Extract connection transport runtime

master
dev 5 months ago
parent 01a621545a
commit 521800b42e

@ -22,6 +22,7 @@ Estado al cierre:
- `arts/conn/connection.ts` delega la programacion de reconnect y exhaustion en `connection-reconnect-runtime.ts`.
- `arts/conn/connection.ts` delega decode/routing de frames entrantes en `connection-message-router.ts`.
- `arts/conn/connection.ts` delega el intento open/auth/flush/join en `connection-connect.ts`.
- `arts/conn/connection.ts` delega current transport, attach/detach y close en `connection-transport-runtime.ts`.
- `arts/timr/engine-timers.ts` delega fan-out de listeners y diagnostico de listeners en `timer-events.ts`.
- `arts/timr/engine-timers.ts` delega la construccion de entradas internas en `timer-entry.ts`.
- Integracion total ampliada: `Auth.signOut()` valida anonimizacion, invalidacion de `Permissions` y evento `Cache.invalidate`.

@ -19,7 +19,6 @@ export interface RunConnectionConnectInput {
readonly reconnect: boolean;
readonly timers: ConnectionTimerControls;
resolveTransport(): ConnectionTransport;
setTransport(transport: ConnectionTransport): void;
attachTransport(transport: ConnectionTransport): void;
detachTransport(): void;
markOpen(): void;
@ -36,7 +35,6 @@ export async function runConnectionConnect(
): Promise<ConnectionConnectResult> {
input.timers.cancel(TIMER_KEY_RECONNECT);
const nextTransport = input.resolveTransport();
input.setTransport(nextTransport);
input.attachTransport(nextTransport);
input.state.transition(input.reconnect ? CONNECTION_STATE_RECONNECTING : CONNECTION_STATE_CONNECTING);
try {

@ -0,0 +1,41 @@
import { attachConnectionTransport, type ConnectionTransportHandlers } from './transport-wiring.ts';
import type { ConnectionOptions, ConnectionTransport } from './types.ts';
export interface ConnectionTransportRuntime {
readonly current: ConnectionTransport | null;
resolve(): ConnectionTransport;
attach(transport: ConnectionTransport): void;
detach(): void;
close(reason: string): void;
}
export function createConnectionTransportRuntime(
source: ConnectionOptions['transport'],
handlers: ConnectionTransportHandlers
): ConnectionTransportRuntime {
let current: ConnectionTransport | null = null;
let detachListeners = (): void => {};
function detach(): void {
detachListeners();
detachListeners = (): void => {};
}
return {
get current() {
return current;
},
resolve() {
return typeof source === 'function' ? source() : source;
},
attach(transport) {
detach();
current = transport;
detachListeners = attachConnectionTransport(transport, handlers);
},
detach,
close(reason) {
current?.close(undefined, reason);
}
};
}

@ -38,7 +38,7 @@ import { wireConnectionSession } from './session-wiring.ts';
import { createConnectionSender } from './sender.ts';
import { createFrame } from './serializer.ts';
import { jsonConnectionSerializer } from './serializers/json.ts';
import { attachConnectionTransport } from './transport-wiring.ts';
import { createConnectionTransportRuntime } from './connection-transport-runtime.ts';
import type { Logger } from '$libs/logr';
import type {
Connection,
@ -49,8 +49,7 @@ import type {
ConnectionConnectResult,
ConnectionOptions,
ConnectionSessionSource,
ConnectionState,
ConnectionTransport
ConnectionState
} from './types.ts';
interface ConnectionRuntime {
@ -79,11 +78,17 @@ export function createConnection<TChannels extends ConnectionChannelMap = Connec
emitState: (change) => events.emitState(change)
});
const channelRegistry = createConnectionChannelRegistry<TChannels>(reportChannelListenerError);
const transportRuntime = createConnectionTransportRuntime(options.transport, {
onOpen: handleTransportOpen,
onMessage: handleTransportMessage,
onClose: handleTransportClose,
onError: handleTransportError
});
const sender = createConnectionSender({
serializer,
frameBuffer,
isConnected,
getTransport: () => transport,
getTransport: () => transportRuntime.current,
setError: (err) => {
stateTracker.setError(err);
},
@ -97,31 +102,10 @@ export function createConnection<TChannels extends ConnectionChannelMap = Connec
sender
});
let transport: ConnectionTransport | null = null;
let detachTransportListeners = (): void => {};
let disposed = false;
let intentionalClose = false;
let connectPromise: Promise<ConnectionConnectResult> | null = null;
function resolveTransport(): ConnectionTransport {
return typeof options.transport === 'function' ? options.transport() : options.transport;
}
function detachTransport(): void {
detachTransportListeners();
detachTransportListeners = (): void => {};
}
function attachTransport(next: ConnectionTransport): void {
detachTransport();
detachTransportListeners = attachConnectionTransport(next, {
onOpen: handleTransportOpen,
onMessage: handleTransportMessage,
onClose: handleTransportClose,
onError: handleTransportError
});
}
function markOpen(): void {
if (stateTracker.markOpen()) heartbeat.start();
}
@ -181,7 +165,7 @@ export function createConnection<TChannels extends ConnectionChannelMap = Connec
scheduleTimer: timers.schedule,
cancelTimer: timers.cancel,
closeTransport: (reason) => {
transport?.close(undefined, reason);
transportRuntime.close(reason);
},
diagnostics
});
@ -206,7 +190,7 @@ export function createConnection<TChannels extends ConnectionChannelMap = Connec
function isConnected(): boolean {
return (
stateTracker.state === CONNECTION_STATE_OPEN &&
transport?.state === CONNECTION_TRANSPORT_STATE_OPEN
transportRuntime.current?.state === CONNECTION_TRANSPORT_STATE_OPEN
);
}
@ -233,12 +217,9 @@ export function createConnection<TChannels extends ConnectionChannelMap = Connec
return await runConnectionConnect({
reconnect,
timers,
resolveTransport,
setTransport: (nextTransport) => {
transport = nextTransport;
},
attachTransport,
detachTransport,
resolveTransport: transportRuntime.resolve,
attachTransport: transportRuntime.attach,
detachTransport: transportRuntime.detach,
markOpen,
markClosedFailed: (error) => {
markClosed(CONNECTION_STATE_FAILED, error);
@ -263,7 +244,7 @@ export function createConnection<TChannels extends ConnectionChannelMap = Connec
heartbeat.stop();
acks.resolveAll({ ok: false, reason: CONNECTION_ACK_REASON_CLOSED });
stateTracker.transition(CONNECTION_STATE_CLOSING);
transport?.close(undefined, reason);
transportRuntime.close(reason);
if (stateTracker.state !== CONNECTION_STATE_CLOSED) markClosed(CONNECTION_STATE_CLOSED);
}
@ -372,7 +353,7 @@ export function createConnection<TChannels extends ConnectionChannelMap = Connec
closeTransport(CONNECTION_CLOSE_REASON_DISPOSE);
detachSession();
detachBrowserReconnect();
detachTransport();
transportRuntime.detach();
channelRegistry.dispose();
events.clear();
frameBuffer.clear();

Loading…
Cancel
Save

Powered by TurnKey Linux.