mirror of
https://github.com/lnbits/lnbits-legend.git
synced 2025-02-25 15:10:41 +01:00
87 lines
2.5 KiB
Markdown
87 lines
2.5 KiB
Markdown
---
|
|
layout: default
|
|
parent: For developers
|
|
title: Websockets
|
|
nav_order: 2
|
|
---
|
|
|
|
|
|
Websockets
|
|
=================
|
|
|
|
`websockets` are a great way to add a two way instant data channel between server and client. This example was taken from the `copilot` extension, we create a websocket endpoint which can be restricted by `id`, then can feed it data to broadcast to any client on the socket using the `updater(extension_id, data)` function (`extension` has been used in place of an extension name, wreplace to your own extension):
|
|
|
|
|
|
```sh
|
|
from fastapi import Request, WebSocket, WebSocketDisconnect
|
|
|
|
class ConnectionManager:
|
|
def __init__(self):
|
|
self.active_connections: List[WebSocket] = []
|
|
|
|
async def connect(self, websocket: WebSocket, extension_id: str):
|
|
await websocket.accept()
|
|
websocket.id = extension_id
|
|
self.active_connections.append(websocket)
|
|
|
|
def disconnect(self, websocket: WebSocket):
|
|
self.active_connections.remove(websocket)
|
|
|
|
async def send_personal_message(self, message: str, extension_id: str):
|
|
for connection in self.active_connections:
|
|
if connection.id == extension_id:
|
|
await connection.send_text(message)
|
|
|
|
async def broadcast(self, message: str):
|
|
for connection in self.active_connections:
|
|
await connection.send_text(message)
|
|
|
|
|
|
manager = ConnectionManager()
|
|
|
|
|
|
@extension_ext.websocket("/ws/{extension_id}", name="extension.websocket_by_id")
|
|
async def websocket_endpoint(websocket: WebSocket, extension_id: str):
|
|
await manager.connect(websocket, extension_id)
|
|
try:
|
|
while True:
|
|
data = await websocket.receive_text()
|
|
except WebSocketDisconnect:
|
|
manager.disconnect(websocket)
|
|
|
|
|
|
async def updater(extension_id, data):
|
|
extension = await get_extension(extension_id)
|
|
if not extension:
|
|
return
|
|
await manager.send_personal_message(f"{data}", extension_id)
|
|
```
|
|
|
|
Example vue-js function for listening to the websocket:
|
|
|
|
```
|
|
initWs: async function () {
|
|
if (location.protocol !== 'http:') {
|
|
localUrl =
|
|
'wss://' +
|
|
document.domain +
|
|
':' +
|
|
location.port +
|
|
'/extension/ws/' +
|
|
self.extension.id
|
|
} else {
|
|
localUrl =
|
|
'ws://' +
|
|
document.domain +
|
|
':' +
|
|
location.port +
|
|
'/extension/ws/' +
|
|
self.extension.id
|
|
}
|
|
this.ws = new WebSocket(localUrl)
|
|
this.ws.addEventListener('message', async ({data}) => {
|
|
const res = JSON.parse(data.toString())
|
|
console.log(res)
|
|
})
|
|
},
|
|
```
|