Skip to content

Latest commit

 

History

History
82 lines (56 loc) · 3.11 KB

README.es.md

File metadata and controls

82 lines (56 loc) · 3.11 KB

5 - De un log distribuido a una db distribuida

Felicitaciones 🎉🎆!!

Si llegaste hasta aquí significa que ya sos una hypercore padawan. Es tiempo de ampliar tu conocimiento peer-to-peer y convertirte en una gran Jedi.

Vimos que hypercore nos ofrece un log distribuido pero existen situaciones en donde eso no nos alcanza, por suerte, nada nos limita a crear estructuras mucho mas complejas arriba de hypercore. Una de ellas es nuestra ⭐ del workshop: hyperdb

Hyperdb

Hyperdb nos ofrece una base de datos key-value distribuida sobre un conjunto de feeds de hypercore.

Una de la features mas importantes es, que agrega la posibilidad de tener multiple-writters lo cual llevaría a Dat al siguiente nivel, en donde múltiples usuarios previamente autorizados podrían modificar el contenido de un recurso Dat. Ya no existiría un solo owner.

Sobre qué vamos a construir

En este workshop estamos aprendiendo cómo usar Dat para escrbir una aplicación web P2P. Nuestro objetivo será construir juntos un chat P2P. El codename del chat será: Olaf 😺.

Para construir nuestro chat vamos a usar lo que venimos aprendiendo. En este modulo vamos a introducir una parte fundamental que iremos desarrollando. Les presentamos a saga 😻

Saga

saga

Hyperdb es lo que necesitamos para poder avanzar en nuestro chat peer-to-peer.

Vamos a definir una API que permita a múltiples usuarios escribir sobre un hyperdb distribuido.

En este caso enfoquemonos en los requerimientos que tiene un chat para considerarse como tal:

  1. Podemos escribir mensajes en el chat.
  2. Podemos leer los mensajes en real-time.
  3. Podemos conectar y desconectar usuarios al canal (room).

Entonces, comencemos el desarrollo de nuestra API, aka: Saga 😻

Ejercicio

  1. En la clase Saga agregar un constructor que reciba un storage, una key y un username.
  2. Con el storage y la key, crear una instancia de hyperdb con un valueEncoding json.
  3. Una instancia de Saga debe permitirnos acceder a:
  • la instancia de hyperdb, bajo la prop: db
  • el username, bajo la prop: username
  • un Map de usuarios (inicialmente vació): users
  • un Map de mensajes (inicialmente vació): messages
  • un timestamp con la fecha actual de creación: timestamp

Tips

  1. Vas a encontrar que hyperdb posee una API muy similar a hypercore. 😉
  2. Sobre Map, partes importantes:
  • un map puede contener objetos como claves. 🆒
  • constructor: new Map([iterable])
  • métodos:
    • size(), para obtener el tamaño.
    • set(clave, valor), para agregar un clave nueva con valor.
    • has(clave), para saber si nuestro map contiene determinada clave.
    • keys(), para obtener todas las claves del map.
  • Hint: es 🆒 usar for...of para iterar sobre los elementos del map.

Test

$ npm test ./05

test.js

Solución

solution.js