Static site hosting via tangled
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}