1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
import "https://unpkg.com/eventemitter3@latest/dist/eventemitter3.umd.min.js"
export default class SoktDeer {
/** @type {string} */
token = '';
/** @type {boolean} */
loggedIn = false;
/** @type {WebSocket} */
ws;
/** @type {import("node:events").EventEmitter} */
wsEvents = new EventEmitter3();
/** @type {any[]} */
messages = [];
constructor(wsUri = "wss://sokt.meltland.dev") {
this.ws = new WebSocket(wsUri);
this.ws.onmessage = (rdata) => {
const data = JSON.parse(rdata.data.toString());
console.info("SD", "INCOMING", data)
if ('command' in data) return this.wsEvents.emit(data.command, data);
if ('error' in data
&& Object.keys(data).filter(k => !['error', 'code'].includes(k)).length > 0)
return this.wsEvents.emit(
Object.keys(data).filter(k => !['error', 'code'].includes(k))[0],
data
)
if ('error' in data) return this.wsEvents.emit('error', data);
}
this.wsEvents.on('greet', greetp => {
this.messages = greetp.messages
})
this.wsEvents.on('new_post', ({ data: post }) => {
this.messages.push(post)
})
setInterval(ping, 5000)
}
login(username, password) {
return new Promise((resolve, reject) => {
this.ws.send(JSON.stringify({
command: "login_pswd",
username,
password
}))
this.wsEvents.once('token', token => {
this.token = token;
resolve(token)
})
this.wsEvents.once('error', error => {
if (error.error) {
reject(error.code)
}
})
})
}
loginToken(token) {
return new Promise((resolve, reject) => {
this.ws.send(JSON.stringify({
command: "login_token",
token
}))
this.wsEvents.once('error', error => {
if (error.error) reject(error.code)
else resolve()
})
})
}
ping() {
this.ws.send(JSON.stringify({ command: "ping" }))
}
}
|