push inbox POSTs on to a background thread
This commit is contained in:
parent
cc65892586
commit
69032ea476
2 changed files with 33 additions and 8 deletions
|
@ -37,6 +37,9 @@ class Module(ModuleManager.BaseModule):
|
||||||
self.server.ap_inbox, authenticated=False)
|
self.server.ap_inbox, authenticated=False)
|
||||||
self.events.on("api.get.ap-outbox").hook(
|
self.events.on("api.get.ap-outbox").hook(
|
||||||
self.server.ap_outbox, authenticated=False)
|
self.server.ap_outbox, authenticated=False)
|
||||||
|
def unload(self):
|
||||||
|
if not self.server == None:
|
||||||
|
self.server.unload()
|
||||||
|
|
||||||
@utils.hook("received.command.fediverse")
|
@utils.hook("received.command.fediverse")
|
||||||
@utils.hook("received.command.fedi", alias_of="fediverse")
|
@utils.hook("received.command.fedi", alias_of="fediverse")
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import base64, binascii, json, os, urllib.parse, uuid
|
import base64, binascii, json, os, queue, theading, urllib.parse, uuid
|
||||||
from src import ModuleManager, utils
|
from src import ModuleManager, utils
|
||||||
|
|
||||||
from . import ap_activities, ap_actor, ap_security, ap_utils
|
from . import ap_activities, ap_actor, ap_security, ap_utils
|
||||||
|
@ -11,6 +11,33 @@ class Server(object):
|
||||||
self.username = username
|
self.username = username
|
||||||
self.instance = instance
|
self.instance = instance
|
||||||
|
|
||||||
|
self._request_queue = queue.Queue()
|
||||||
|
self._request_thread = threading.Thread(target=self._request_loop)
|
||||||
|
self._request_thread.daemon = True
|
||||||
|
self._request_thread.start()
|
||||||
|
|
||||||
|
def _request_loop(self):
|
||||||
|
url_for = self.exports.get_one("url-for")
|
||||||
|
|
||||||
|
key_id = self._ap_keyid_url(url_for)
|
||||||
|
private_key = ap_security.PrivateKey(self.bot.config["tls-key"], key_id)
|
||||||
|
|
||||||
|
self_id = self._ap_self_url(url_for)
|
||||||
|
our_actor = ap_actor.Actor(self_id)
|
||||||
|
|
||||||
|
del url_for
|
||||||
|
|
||||||
|
while True:
|
||||||
|
obj = self._request_queue.get()
|
||||||
|
if obj == "kill":
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
actor, activity = obj
|
||||||
|
actor.inbox.send(our_actor, activity, private_key)
|
||||||
|
|
||||||
|
def unload(self):
|
||||||
|
self._request_queue.put("kill")
|
||||||
|
|
||||||
def _random_id(self):
|
def _random_id(self):
|
||||||
return binascii.hexlify(os.urandom(3)).decode("ascii")
|
return binascii.hexlify(os.urandom(3)).decode("ascii")
|
||||||
|
|
||||||
|
@ -185,18 +212,13 @@ class Server(object):
|
||||||
if not new_follower in followers:
|
if not new_follower in followers:
|
||||||
followers.add(new_follower)
|
followers.add(new_follower)
|
||||||
|
|
||||||
key_id = self._ap_keyid_url(event["url_for"])
|
|
||||||
private_key = self._private_key(key_id)
|
|
||||||
|
|
||||||
our_actor = ap_actor.Actor(self_id)
|
|
||||||
|
|
||||||
actor = ap_actor.Actor(new_follower)
|
actor = ap_actor.Actor(new_follower)
|
||||||
actor.load()
|
actor.load()
|
||||||
accept = ap_activities.Accept(data["id"], data)
|
accept = ap_activities.Accept(data["id"], data)
|
||||||
actor.inbox.send(our_actor, accept, private_key)
|
self._request_queue.put([actor, accept])
|
||||||
|
|
||||||
follow_id = "data:%s" % str(uuid.uuid4())
|
follow_id = "data:%s" % str(uuid.uuid4())
|
||||||
follow = ap_activities.Follow(follow_id, actor.url)
|
follow = ap_activities.Follow(follow_id, actor.url)
|
||||||
actor.inbox.send(our_actor, follow, private_key)
|
self._request_queue.put([actor, follow])
|
||||||
else:
|
else:
|
||||||
event["response"].code = 404
|
event["response"].code = 404
|
||||||
|
|
Loading…
Reference in a new issue