Static site hosting via tangled
at main 1.5 kB view raw
1import EventEmitter from "node:events"; 2 3export class KnotEventListener extends EventEmitter { 4 constructor({ knotDomain, reconnectTimeout = 10000 }) { 5 super(); 6 this.knotDomain = knotDomain; 7 this.reconnectTimeout = reconnectTimeout; 8 this.connection = null; 9 } 10 11 async start() { 12 this.connection = new WebSocket(`wss://${this.knotDomain}/events`); 13 this.connection.onmessage = (event) => this.handleMessage(event); 14 this.connection.onerror = (event) => this.handleError(event); 15 this.connection.onclose = () => this.handleClose(); 16 return new Promise((resolve) => { 17 this.connection.onopen = () => { 18 console.log("Knot event listener connected to:", this.knotDomain); 19 resolve(); 20 }; 21 }); 22 } 23 24 async handleMessage(event) { 25 const data = JSON.parse(event.data); 26 if (data.nsid === "sh.tangled.git.refUpdate") { 27 const event = { 28 details: { 29 ownerDid: data.event.repoDid, 30 repoName: data.event.repoName, 31 }, 32 }; 33 this.emit("refUpdate", event); 34 } 35 } 36 37 handleError(event) { 38 console.error("Knot event listener error:", event); 39 this.emit("error", event); 40 } 41 42 handleClose() { 43 console.log("Knot event listener closed"); 44 this.emit("close"); 45 if (this.reconnectTimeout) { 46 setTimeout(() => { 47 console.log("Knot event listener reconnecting..."); 48 this.start(); 49 }, this.reconnectTimeout).unref(); 50 } 51 } 52}