68 lines
2.4 KiB
Python
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
|
|
})
|