Pronouns labels on Bluesky
1import { label } from "./label.js"; 2import { DID, RELAY } from "./constants.js"; 3import { EventStream } from "./types.js"; 4import fs from "node:fs"; 5import WebSocket from "ws"; 6 7const subscribe = async () => { 8 let cursor = 0; 9 let intervalID: NodeJS.Timeout; 10 const cursorFile = fs.readFileSync("cursor.txt", "utf8"); 11 const relay = cursorFile ? RELAY.concat("&cursor=", cursorFile) : RELAY; 12 const ws = new WebSocket(relay); 13 if (cursorFile) console.log(`Initiate firehose at cursor ${cursorFile}`); 14 15 ws.on("error", (err) => console.error(err)); 16 17 ws.on("open", () => { 18 intervalID = setInterval(() => { 19 console.log(`${new Date().toISOString()}: ${cursor}`); 20 fs.writeFile("cursor.txt", cursor.toString(), (err) => { 21 if (err) console.log(err); 22 }); 23 }, 60000); 24 }); 25 26 ws.on("close", () => clearInterval(intervalID)); 27 28 ws.on("message", (data) => { 29 const event: EventStream = JSON.parse(data.toString()); 30 cursor = event.time_us; 31 if ( 32 event.commit?.record?.subject?.uri?.includes(`${DID}/app.bsky.feed.post`) 33 ) 34 label(event.did, event.commit.record.subject.uri.split("/").pop()!); 35 }); 36}; 37 38subscribe();