1 puntos por previewapp 7 시간 전 | Aún no hay comentarios. | Compartir por WhatsApp

Lo hice con la idea de encontrarte con un video que “alguien eligió y compartió directamente”, en lugar de una recomendación del algoritmo. El antiguo concepto del velero.

Cuando un usuario anónimo envía en un “velero” un enlace de YouTube + una carta de una línea, otro usuario anónimo puede hacer clic y se abre una sala de visualización 1:1. Los reproductores de YouTube de ambas personas se sincronizan en la misma escena, y pueden verlo juntos mientras chatean de forma anónima. En el momento en que una de las dos personas se va, la sala y el chat desaparecen por completo.

Al principio, la idea era que cuando terminara el video, después de una cuenta regresiva de 3 minutos la sala explotara, pero al usarlo vi que cuando encuentras a alguien con quien conectas bien, es natural decir “uno más”; así que cambié el diseño para que la sala se mantenga incluso cuando termine el video y el anfitrión pueda cambiar el video para seguir viendo más.

Partes divertidas / donde más batallé al construirlo:

  • Sincronización: el servidor fija la hora de referencia (con corrección de RTT), ignora drift dentro de 0.5 segundos, si está dentro de 2 segundos lo corrige discretamente ajustando la velocidad de reproducción a 0.95~1.05x, y si supera eso lo corrige a la fuerza con seekTo. Durante la reproducción de anuncios, la corrección se detiene.
  • Donde de verdad batallé fue con los live streams. En vivo, seekTo solo funciona dentro de la ventana DVR, pero como la ventana DVR de ambos espectadores era distinta, tuve que traducir la intención de “el anfitrión está en el live edge” según la ventana del otro. Incluso hubo un loop infinito de eco loading→play→loading; viendo el commit log, solo para arreglar la sincronización en vivo hay 7 fixes.
  • Race de matching: evité que varias personas se subieran al mismo velero al mismo tiempo usando un lock atómico con scripts Lua de Redis (en una prueba con 5 personas haciendo join simultáneamente, confirmé que solo 1 ganaba).
  • Videos con bloqueo de embed (error 153): como la IFrame API no dispara onError, la pantalla se queda negra; así que lo detecté con un watchdog de reproducción de 8 segundos para mostrar un aviso de “no se puede reproducir”.
  • Como es anónimo y 1:1, puse muchas medidas de seguridad: sanitize completo del chat en el servidor, enmascarado automático de contactos externos, moderación con IA + bloqueo por acumulación de reportes, y guía a líneas de ayuda cuando se detectan palabras clave de crisis.

Stack: Next.js 15 / Fastify 5 / Socket.io / Redis 7 / Postgres 16; en móvil, Expo(RN)

Se puede probar al instante sin registro. Esta semana la app de iOS también llegó al App Store: https://apps.apple.com/kr/app/float/id6777661839
Agradezco cualquier feedback.

Aún no hay comentarios.

Aún no hay comentarios.