Now that we have our structure file, agent, $json
conversion library and mark file, our back-end is complete. Before we start writing our front-end, though, we should give a brief overview of how Eyre works.
Eyre is the HTTP server vane of Arvo. Eyre has a handful of different subsystems, but the main two are the channel system and the scry interface. These two are what we'll focus on here.
In order to use the channel system or perform scries, a web client must have authenticated with the ship's web login code (e.g. lidlut-tabwed-pillex-ridrup
) and obtained a session cookie. Our front-end will be served directly from the ship by the %docket
agent, so we can assume a session cookie was already obtained when the user logged into landscape, and skip over authentication.
Channels
Eyre's channel system is the main way to interact with agents from a web client. It provides a JSON interface to the ordinary poke and subscription system for Gall agents.
First, a unique channel ID is generated by the web client (@urbit/http-api
uses the current Unix time concatenated with a random hex string). The client then sends a poke or subscription request for the channel, and Eyre automatically opens a new channel with that ID. Once open, the client can then connect to the channel and receive any events such as poke acks, watch acks, facts from subscriptions, etc.
The new channel is an SSE (Server Sent Event↗) stream, and can be handled by an EventSource
object in Javascript. The @urbit/http-api
library we'll use abstracts this for us, so we won't need to deal with an EventSource
object directly. The channel can handle multiple concurrent subscriptions to different agent subscription paths, and different agents can be poked through the one channel. This means a client only needs to open a single channel for all of its interactions with the ship. Each subscription is given a different ID, so they can be individually unsubscribed later.
A channel will timeout after 12 hours of inactivity, and the timeout is reset every time Eyre receives a message of any kind from the client. Additionally, each subscription on the channel may only accumulate 50 unacknowledged facts before it's considered "clogged", in which case the individual clogged subscription will be closed by Eyre after a short delay. All events of any kind which Eyre sends out on the channel must be ack'd by the client. Ack'ing one event will also ack all previous events too. The @urbit/http-api
library we'll use automatically acks events for us, so we don't need to worry about clogged subscriptions or manually ack'ing events.
Eyre expects a particular JSON object structure for each of these different requests, but the @urbit/http-api
library we'll use includes functions to send pokes, subscription requests, etc, so we won't need to manually construct the JSON objects in our front-end.
Scries
Eyre's scry interface is separate to the channel system. Scries are performed by a simple GET request to a path with a format of /~/scry/{agent}{path}.{mark}
. If successful, the HTTP response will contain the result with the mark specified. If unsuccessful, an HTTP error will be thrown in response.
The @urbit/http-api
library we'll use includes a function for performing scries, so we'll not need to manually send GET requests to the ship.
Resources
The Eyre vane documentation - This section of the vane docs covers all aspects of Eyre.
Eyre External API Reference - This section of the Eyre documentation contains reference material for Eyre's external API.
The Eyre Guide - This section of the Eyre documentation walks through using Eyre's external API at a low level (using
curl
).