garmsync garmsync
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

168 lines
3.7 KiB

import WebSocket from "ws";
export default class Trimlog {
constructor({username, password}) {
this.username = username;
this.password = password;
this.socket = null;
this.inbox = [];
}
send(key, data) {
this.socket.send(JSON.stringify({
[key]: data,
register: {
clientId: this.username,
clientSecret: this.password,
},
}));
}
waitFor(key) {
return new Promise((resolve, reject) => {
const ws = this.socket;
setInterval(() => {
if (ws !== this.socket) {
reject("disconnected");
}
for (const [i, data] of this.inbox.entries()) {
if (!!data[key]) {
this.inbox.splice(i, 1);
return data[key];
}
}
}, 100)
})
}
connect() {
return new Promise((resolve, reject) => {
if (this.socket != null) {
this.socket.close();
}
let answered = false;
const ws = new WebSocket("wss://i.stifred.dev/");
ws.on("open", () => {
ws.send(JSON.stringify({register: {
clientId: this.username,
clientSecret: this.password,
}}));
const interval = setInterval(() => {
if (this.socket !== ws) {
clearInterval(interval);
}
ws.send(JSON.stringify({ping: {
reference: "ping:" + new Date().toISOString(),
register: {
clientId: this.username,
clientSecret: this.password,
},
}}))
}, 60000)
this.socket = ws;
})
ws.on("message", (data) => {
data = JSON.parse(data);
if (data.signal) {
return
}
console.log(JSON.stringify(data, 0, 4));
if (!answered) {
if (data.connection?.active) {
answered = true;
return resolve();
} else if (data.error != null) {
return reject(data.error.message);
}
}
this.inbox.push(data);
})
ws.on("error", (err) => {
if (!answered) {
answered = true;
return reject(err);
}
})
ws.on("close", () => {
if (this.socket === ws) {
this.socket = null;
console.log("Socket closed")
this.connect().then(() => {
console.log("Socket reconnected")
})
}
})
})
}
submit(message) {
return new Promise((resolve, reject) => {
const reference = Date.now().toString(36) + Math.random().toString(36).replace(".", "");
let answered = false;
let sent = false;
const ws = new WebSocket("wss://i.stifred.dev/");
ws.on("open", () => {
ws.send(JSON.stringify({register: {
clientId: this.username,
clientSecret: this.password,
}}));
})
ws.on("message", (data) => {
data = JSON.parse(data);
console.log(JSON.stringify(data, 0, 4));
if (data.signal?.reference === reference) {
if (!answered) {
answered = true;
resolve();
ws.close();
}
}
if (!answered && !sent) {
if (data.connection?.active) {
ws.send(JSON.stringify({
...message,
ping: { reference },
register: {
clientId: this.username,
clientSecret: this.password,
}
}));
sent = true;
}
}
this.inbox.push(data);
})
ws.on("error", (err) => {
if (!answered) {
answered = true;
return reject(err);
}
})
ws.on("close", () => {
console.log("Socket closed")
})
})
}
}