v25/v25/web/client/remotestorage.py
timotheyca da1d9a23d6 readme
and some untested `exact` and `flag` code also
2021-12-22 13:30:05 +03:00

68 lines
2.4 KiB
Python

from json import dumps
from typing import Tuple, Optional, Iterable
import requests
from v25.messaging.encoding import Encoding
from v25.messaging.message import Message
from v25.messaging.subject import Subject, PrivateSubject
from v25.storage.storage import PushStorage
class RemoteStorage(PushStorage):
def __init__(self, url: str, subject: PrivateSubject):
self.url = url
self.subject = subject
def api(self, s: str):
return f'{self.url}/{s}'
def req(self, api: str, o: object):
source = dumps(o)
req = requests.post(self.api(api), json={
'source': source,
'subject': self.subject.dumps(),
'signature': Encoding.encode(self.subject.skey.sign(source.encode()).signature),
})
return req.json()
def check(self, subject: Subject) -> dict:
return self.req('check', subject.dumps())
def push(self, m: Message) -> None:
self.req('push', m.dumps())
def edit(self, old: Message, new: Message):
self.req('edit', {'old': old.dumps(), 'new': new.dumps()})
def delete(self, m: Message):
self.req('delete', m.dumps())
def pull(self, pair: Tuple[Subject, Subject], params: Optional[dict] = None) -> Iterable[Message]:
return map(Message.loads,
self.req('pull', {'params': params, 'pair': [subject.dumps() for subject in pair]}))
def exact(self, sfrom: Subject, sto: Subject, idnonce: bytes, editnonce: Optional[bytes]) -> Optional[Message]:
raise NotImplementedError
def flags(self, m: Message, flags: str):
self.req('flags', {'m': m.dumps(), 'flags': flags})
def events(self, sfrom: Subject, sto: Subject, after: Optional[bytes]) -> Iterable[Tuple[bytes, bytes]]:
return [(Encoding.decode(ev[0]), Encoding.decode(ev[1])) for ev in
self.req('events', {'sfrom': sfrom.dumps(), 'sto': sto.dumps(),
'after': Encoding.encode(after)})]
def typing(self, sfrom: Subject, sto: Subject, last: float) -> float:
return self.req('typing', {
'sfrom': sfrom.dumps(),
'sto': sto.dumps(),
'last': last
})
def subscribe(self, subject: Subject, subscription: dict):
self.req('subscribe', {
'subject': subject.dumps(),
'subscription': subscription
})