kopia lustrzana https://github.com/cirospaciari/socketify.py
56 wiersze
2.2 KiB
Markdown
56 wiersze
2.2 KiB
Markdown
|
|
# Plugins / Extensions
|
|
|
|
You can add more functionality to request, response, and websocket objects, for this you can use `app.register(extension)` to register an extension.
|
|
Be aware that using extensions can have a performance impact and using it with `request_response_factory_max_items`, `websocket_factory_max_items`
|
|
or the equivalent on CLI `--req-res-factory-maxitems`, `--ws-factory-maxitems` will reduce this performance impact.
|
|
|
|
Extensions must follow the signature `def extension(request, response, ws)`, request, response, and ws objects contain `method` decorator that binds a method to an instance,
|
|
and also a `property(name: str, default_value: any = None)` that dynamic adds an property to the instance.
|
|
|
|
```python
|
|
from socketify import App, OpCode
|
|
|
|
app = App()
|
|
|
|
def extension(request, response, ws):
|
|
@request.method
|
|
async def get_user(self):
|
|
token = self.get_header("token")
|
|
return { "name": "Test" } if token else { "name", "Anonymous" }
|
|
|
|
@response.method
|
|
def msgpack(self, value: any):
|
|
self.write_header(b'Content-Type', b'application/msgpack')
|
|
data = msgpack.packb(value, default=encode_datetime, use_bin_type=True)
|
|
return self.end(data)
|
|
|
|
@ws.method
|
|
def send_pm(self, to_username: str, message: str):
|
|
user_data = self.get_user_data()
|
|
pm_topic = f"pm-{to_username}+{user_data.username}"
|
|
|
|
# if topic exists just send the message
|
|
if app.num_subscribers(pm_topic) > 0:
|
|
# send private message
|
|
return self.publish(pm_topic, message, OpCode.TEXT)
|
|
|
|
# if the topic not exists create it and signal the user
|
|
# subscribe to the conversation
|
|
self.subscribe(pm_topic)
|
|
# signal user that you want to talk and create an pm room
|
|
# all users must subscribe to signal-{username}
|
|
self.publish(f"signal-{to_username}", {
|
|
"type": "pm",
|
|
"username": user_data.username,
|
|
"message": message
|
|
}, OpCode.TEXT)
|
|
# this property can be used on extension methods and/or middlewares
|
|
request.property("cart", [])
|
|
|
|
# extensions must be registered before routes
|
|
app.register(extension)
|
|
```
|
|
|
|
### Next [SSL](ssl.md)
|