yosup/web/index.js
William Casarin c075d3dd0e add all the things
Signed-off-by: William Casarin <jb55@jb55.com>
2022-08-04 08:51:56 -07:00

111 lines
2.2 KiB
JavaScript

async function damus_init()
{
const relay = await Relay("wss://relay.damus.io")
const now = (new Date().getTime()) / 1000
const el = document.querySelector("#content")
const model = {events: []}
el.innerHTML = render_initial_content()
model.el = el.querySelector("#home")
relay.subscribe("test_sub_id", {kinds: [1], limit: 20})
relay.event = (sub_id, ev) => {
insert_event_sorted(model.events, ev)
if (model.realtime)
render_home_view(model)
}
relay.eose = () => {
model.realtime = true
render_home_view(model)
}
return relay
}
function render_home_view(model) {
model.el.innerHTML = render_events(model.events)
}
function render_initial_content() {
return `<ul id="home"> </ul>`
}
function insert_event_sorted(evs, new_ev) {
for (let i = 0; i < evs.length; i++) {
const ev = evs[i]
if (new_ev.id === ev.id) {
return false
}
if (new_ev.created_at > ev.created_at) {
evs.splice(i, 0, new_ev)
return true
}
}
evs.push(new_ev)
return true
}
function render_events(evs) {
return evs.map(render_event).join("\n")
}
function render_event(ev) {
return `<li>${ev.content}</li>`
}
function Relay(relay, opts={})
{
if (!(this instanceof Relay))
return new Relay(relay, opts)
this.relay = relay
this.opts = opts
const me = this
return new Promise((resolve, reject) => {
const ws = me.ws = new WebSocket(relay);
let resolved = false
ws.onmessage = (m) => { handle_message(me, m) }
ws.onclose = () => { me.close && me.close() }
ws.onerror = () => { me.error && me.error() }
ws.onopen = () => {
if (resolved) {
me.open.bind(me)
return
}
resolved = true
resolve(me)
}
})
}
Relay.prototype.subscribe = function relay_subscribe(sub_id, ...filters) {
const tosend = ["REQ", sub_id, ...filters]
console.log("sending", tosend)
this.ws.send(JSON.stringify(tosend))
}
function handle_message(relay, msg)
{
const data = JSON.parse(msg.data)
if (data.length >= 2) {
switch (data[0]) {
case "EVENT":
if (data.length < 3)
return
return relay.event && relay.event(data[1], data[2])
case "EOSE":
return relay.eose && relay.eose(data[1])
case "NOTICE":
return relay.note && relay.note(...data.slice(1))
}
}
}
const relay = damus_init()