Reproductor P2P con enlace IPNS

En esta entrada adaptaremos una librería que utiliza el proyecto p2p-media-loader básicamente es un loader que permite reproducir contenido P2P en el navegador y compartir lo que vemos con los demás pares conectados, tenemos la posibilidad de reproducir un vídeo directamente desde la red IPFS, que es una red P2P distribuida por lo que no utilizaremos esta funcionalidad del reproductor

Un enlace IPFS está compuesto de un hash que identifica el recurso que queremos consultar, en este caso usaremos enlaces IPNS que son nombres de dominio y que podemos resolver hacia una dirección IPFS, este enlace IPNS puede ser dinámico por lo que no siempre apunta al mismo recurso IPFS. Para crear un enlace IPNS necesitamos añadir la siguiente entrada al servidor de dominio (DNS) del dominio en cuestión y que resuelve al recurso IPFS

$ dig TXT +short _dnslink.manalejandro.com
"dnslink=/ipfs/QmVAtSU4W5G3GccYC9rYPZtqLVRWq6sVG7QJ5NpFr2TMqs"

Usamos el loader HLS-IPFS del reproductor y lo adaptaremos con el siguiente parche para realizar la consulta del enlace IPNS, una vez aplicado al fichero index.js

--- hlsjs-ipfs-loader.js
+++ hlsjs-ipns-loader.js
@@ -1,10 +1,10 @@
 'use strict'
 
-class HlsjsIPFSLoader {
+class HlsjsIpnsLoader {
   constructor(config) {
     this._abortFlag = [ false ];
     this.ipfs = config.ipfs
-    this.hash = config.ipfsHash
+    this.hash = config.ipnsHash
     if (config.debug === false) {
       this.debug = function() {}
     } else if (config.debug === true) {
@@ -116,7 +116,10 @@
     }, console.error)
   }
 }
-async function getFile(ipfs, rootHash, filename, options, debug, abortFlag) {
+async function getFile(ipfs, hash, filename, options, debug, abortFlag) {
+  const asyncGen = await ipfs.name.resolve(hash),
+    h = await asyncGen.next(),
+    rootHash = h.value
   debug(`Fetching hash for '${rootHash}/${filename}'`)
   const path = `${rootHash}/${filename}`
   try {
@@ -153,4 +156,4 @@
   return value
 }
 
-exports = module.exports = HlsjsIPFSLoader
+exports = module.exports = HlsjsIpnsLoader

Solamente faltaría hacer browserify al loader con este pequeño cambio para resolver enlaces IPNS

browserify -s HlsjsIpnsLoader -o js/hlsjs-ipns-loader.js hlsjs-ipns-loader.js

Y se genera el fichero con el resultado para el navegador en la carpeta js/

Podemos usarlo tal y como se hace en el proyecto p2p-media-loader-demo solo que podremos pasarle como parámetro una dirección de dominio que resuelve el enlace IPNS

Dejo una prueba de concepto en p2p.manalejandro.com

PD: No me hago responsable del contenido que me he encontrado en la red IPFS para realizar el ejemplo

Saludos y hasta la próxima