socketify.py/docs/extensions.md

56 wiersze
2.2 KiB
Markdown

2023-01-06 19:11:19 +00:00
# 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)