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
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							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") | |
|       }) | |
|     }) | |
|   } | |
| }
 |