+ requester.(subscription)
+ end
+
+ def discover(topic, getter \\ &HTTPoison.get/1) do
+ with {:ok, response} <- getter.(topic),
+ status_code when status_code in 200..299 <- response.status_code,
+ body <- response.body,
+ doc <- XML.parse_document(body),
+ url when not is_nil(url) <- XML.string_from_xpath(~S{/feed/link[@rel="self"]/@href}, doc),
+ hub when not is_nil(hub) <- XML.string_from_xpath(~S{/feed/link[@rel="hub"]/@href}, doc) do
+ {:ok, %{url: url, hub: hub}}
+ else e ->
+ {:error, e}
+ end
+ end
+
+ def request_subscription(websub, poster \\ &HTTPoison.post/3, timeout \\ 10_000) do
+ data = [
+ "hub.mode": "subscribe",
+ "hub.topic": websub.topic,
+ "hub.secret": websub.secret,
+ "hub.callback": "https://social.heldscal.la/callback"
+ ]
+
+ # This checks once a second if we are confirmed yet
+ websub_checker = fn ->
+ helper = fn (helper) ->
+ :timer.sleep(1000)
+ websub = Repo.get_by(WebsubClientSubscription, id: websub.id, state: "accepted")
+ if websub, do: websub, else: helper.(helper)
+ end
+ helper.(helper)
+ end