Podping: word that a feed has changed, which hosts write to the Hive blockchain and anyone can read. A client then fetches the feed that changed instead of polling every feed on a schedule.
A consumer reads blocks from any Hive API node and picks out the custom_json operations that the podping writers post. The calls are JSON-RPC requests that any client can send as a POST, and a ping in the blocks of an answer looks like this:
{:block 110254833 :timestamp #inst "2026-09-26T16:44:57Z"
:account "podping.eee" :id "pp_podcast_update" :version "1.1"
:medium "podcast" :reason "update"
:iris ["https://media.rss.com/…/feed.xml"]}
Anyone can write a custom_json, so only the accounts that the podping account follows on the chain may write podpings, which is how the project publishes its writers.
Polling is on the JVM only. In ClojureScript, send the calls one by one, since the nodes answer a page from any origin.
A host announces a change through podping.cloud, with the token that the host was given.
Podping: word that a feed has changed, which hosts write to the Hive
blockchain and anyone can read. A client then fetches the feed that
changed instead of polling every feed on a schedule.
A consumer reads blocks from any Hive API node and picks out the
custom_json operations that the podping writers post. The calls are
JSON-RPC requests that any client can send as a POST, and a ping in the
blocks of an answer looks like this:
{:block 110254833 :timestamp #inst "2026-09-26T16:44:57Z"
:account "podping.eee" :id "pp_podcast_update" :version "1.1"
:medium "podcast" :reason "update"
:iris ["https://media.rss.com/…/feed.xml"]}
Anyone can write a custom_json, so only the accounts that the podping
account follows on the chain may write podpings, which is how the
project publishes its writers.
Polling is on the JVM only. In ClojureScript, send the calls one by
one, since the nodes answer a page from any origin.
A host announces a change through podping.cloud, with the token that
the host was given.(affected pings urls)The URLs among urls that any of pings concerns, in the order given.
The podcast:guid of each URL is computed once, not again for every ping.
The URLs among `urls` that any of `pings` concerns, in the order given. The podcast:guid of each URL is computed once, not again for every ping.
(call! call)(call! call params)(call! call params opts)Send call with its params, when it takes any, as opts say, and
give the body of the answer.
Each node is tried in turn until one answers. The opts are these:
A node fails on an exception, a status other than 200, or an answer that isn't JSON or holds a JSON-RPC error, which proxies send with a 200. When every node fails, the exception names them all.
In ClojureScript, the body comes in a promise, which is rejected with that exception. The public nodes answer a page from any origin.
Send `call` with its `params`, when it takes any, as `opts` say, and give the body of the answer. Each node is tried in turn until one answers. The `opts` are these: - :nodes, the nodes to try, nodes by default - :node, the one node to try - :timeout-seconds, the time that each node gets, 10 by default - :user-agent, as http/send! takes it - :send, the function that sends each request, client/send! by default A node fails on an exception, a status other than 200, or an answer that isn't JSON or holds a JSON-RPC error, which proxies send with a 200. When every node fails, the exception names them all. In ClojureScript, the body comes in a promise, which is rejected with that exception. The public nodes answer a page from any origin.
The calls that a consumer makes to a node:
The calls that a consumer makes to a node: - :head-block, for the newest block and the last irreversible one - :blocks, with :from and :count, for a run of blocks with their operations, of which a hundred answer in about a second - :operations, with :block, for the operations of one block - :following, for the accounts that podping follows, its writers
The URL of podping.cloud, the service that writes a podping for a host, unless the options give another service as :gateway.
The URL of podping.cloud, the service that writes a podping for a host, unless the options give another service as :gateway.
(head-block body)The position of the chain in body, the answer to a :head-block call,
as a map of :block, :irreversible and :time. The irreversible block,
which a fork can no longer take back, is some seconds behind the head.
The position of the chain in `body`, the answer to a :head-block call, as a map of :block, :irreversible and :time. The irreversible block, which a fork can no longer take back, is some seconds behind the head.
Public Hive API nodes, tried in this order until one answers.
Public Hive API nodes, tried in this order until one answers.
(notify! token url)(notify! token
url
{:keys [send timeout-seconds] :or {send client/send!} :as opts})Announce with the token of the service that the feed at url changed,
by the call of notify-request with opts, and give a map of the :status
of the answer, in ClojureScript in a promise.
The opts are those of notify-request, :send, the function that sends
the request, client/send! by default, and the :timeout-seconds of
http/send!. Nothing that the network or the service does throws: the
result of a call that fails, or of an answer that isn't a success, has
a :podping/not-notified diagnostic under :error.
Announce with the `token` of the service that the feed at `url` changed, by the call of notify-request with `opts`, and give a map of the :status of the answer, in ClojureScript in a promise. The `opts` are those of notify-request, :send, the function that sends the request, client/send! by default, and the :timeout-seconds of http/send!. Nothing that the network or the service does throws: the result of a call that fails, or of an answer that isn't a success, has a :podping/not-notified diagnostic under :error.
(notify-request token url)(notify-request
token
url
{:keys [medium reason user-agent]
:or {medium "podcast" reason "update" user-agent client/user-agent}
:as opts})The call that a host makes with opts to announce that the feed at
url changed, with the token that the service gave the host.
The token can be a hidden text of dk.simongray.wary-fetch.secret, and
the request has it in a header as a hidden text. The opts are these:
The call that a host makes with `opts` to announce that the feed at `url` changed, with the `token` that the service gave the host. The token can be a hidden text of dk.simongray.wary-fetch.secret, and the request has it in a header as a hidden text. The `opts` are these: - :medium, "podcast" by default - :reason, which is "update", "live" or "liveEnd", "update" by default - :gateway, the URL of another service that takes the same call, in place of gateway - :user-agent, the User-Agent, client/user-agent by default
(pinged? ping url)Whether ping concerns the feed at url, with the URLs compared as
podcast:guid compares them, so the scheme and a trailing slash don't
tell them apart.
Whether `ping` concerns the feed at `url`, with the URLs compared as podcast:guid compares them, so the scheme and a trailing slash don't tell them apart.
(pings body)The podpings in body, the answer to a :blocks or an :operations call,
in the order of the chain.
The podpings in `body`, the answer to a :blocks or an :operations call, in the order of the chain.
(poll!)(poll! from)(poll! from
{:keys [max-blocks verify? up-to]
:or {max-blocks 100 verify? true up-to :head}
:as opts})Poll the chain for the podpings after the block from, up to its
head, with opts. This is the one step that a poller repeats, and it
gives a map of these:
from for the next stepoptsWithout from, or with nil, the step starts at the head. The opts
are these:
The :block is the last block that a node answered with, so the next step reads a block that an answer left out.
Nothing that a node or the network does throws. When no node answers a call, the :error is a :podping/unavailable diagnostic. The result has the pings of the blocks that the step read before that call, and :block names the last of those blocks.
Poll the chain for the podpings after the block `from`, up to its head, with `opts`. This is the one step that a poller repeats, and it gives a map of these: - :pings, from the writers that podping follows, in chain order - :refused, the pings of each other account - :block, the last block read, which is `from` for the next step - :writers, to give back in `opts` - :error, when no node answered a call Without `from`, or with nil, the step starts at the head. The `opts` are these: - :max-blocks, the most blocks that one step reads, 100 by default, which is five minutes of the chain. A poller that's behind reads on from :block. - :up-to, which is :head by default, or :irreversible, the last block that a fork can't take back - :writers from the last step, so the step doesn't read them again - :verify? false, to keep each ping, whatever account wrote it - :nodes, :node, :timeout-seconds and :send, as call! takes them The :block is the last block that a node answered with, so the next step reads a block that an answer left out. Nothing that a node or the network does throws. When no node answers a call, the :error is a :podping/unavailable diagnostic. The result has the pings of the blocks that the step read before that call, and :block names the last of those blocks.
(request call)(request call params)(request call params {:keys [node] :or {node (first nodes)} :as opts})The JSON-RPC request map for call, one of calls, with its params
when it takes any, sent to the :node of opts, or else the first of
nodes.
The JSON-RPC request map for `call`, one of calls, with its `params` when it takes any, sent to the :node of `opts`, or else the first of nodes.
(writers body)The accounts that may write podpings, from body, the answer to a
:following call. They're podping itself and the accounts it follows,
which is how the project publishes its writers.
The accounts that may write podpings, from `body`, the answer to a :following call. They're podping itself and the accounts it follows, which is how the project publishes its writers.
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |