memory leak on client side with websocket sessions

Abierto
#153 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 5 días

Nadie ha tomado este issue todavía.

  • #154 de @VastBlast — cerrado sin fusionar

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
35/100
Tipo de issue
Error
Claridad
Necesita aclaración
Estado de actividad
Estancado
Stack tecnológico
typescript
Área
networking

Línea de trabajo

Empieza ejecutando la reproducción proporcionada del servidor y cliente TypeScript, y después inspecciona el ciclo de vida de newWebSocketRpcSession y sus promises retenidas con --inspect. Se considera terminado cuando las llamadas websocket repetidas ya no retienen promises no utilizadas y la memoria del cliente se estabiliza sin reiniciar la sesión.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

There seems to be a memory leak on the client side with websocket sessions, unless I am doing something wrong. I understand there are disposal rules to consider, especially with websockets per the docs, but I tried many different things and the only way to clear the memory of unused promises seems to be to restart the session. See the reproduction below.

I also ran it with --inspect and it seems there are forever-growing Promise's kept in the memory.

Server:

import { RpcTarget, newWebSocketRpcSession } from "capnweb";
import { WebSocketServer } from "ws";

class Api extends RpcTarget {
  sendMeText(text: string): string {
    return `got: ${text}`;
  }
}

const server = new WebSocketServer({ port: 8787, perMessageDeflate: false });

server.on("connection", ws => {
  newWebSocketRpcSession(ws as any, new Api());
});

console.log("ws://localhost:8787");

Client:

import { newWebSocketRpcSession } from "capnweb";

type Api = {
  sendMeText(text: string): string;
};

const session = newWebSocketRpcSession<Api>("ws://localhost:8787");
const text = "abc123".repeat(2000);

let calls = 0;

setInterval(() => {
  console.log(
    `calls=${calls} heapUsed=${(process.memoryUsage().heapUsed / 1024 / 1024).toFixed(1)}MB`
  );
}, 1000);


while (true) {
  await session.sendMeText(text);
  ++calls;
  await new Promise(resolve => setTimeout(resolve, 1)); // delay 1ms
}

// this doesn't prevent a memory leak either, same result:
while(true){
  const res = session.sendMeText(text);
  await res;
  res[Symbol.dispose]();
  ++calls;
  await new Promise(resolve => setTimeout(resolve, 1)); // delay 1ms
}
Lenguaje dominante
TypeScript
Estrellas
4k
Forks
150
Merge medio
3 d 12 h
PR fusionados (30 d)
2

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de cloudflare/capnweb

Todos los issues de cloudflare/capnweb

Issues similares

Más issues de TypeScript

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.