Pglet protocol
Pglet is a language-agnostic UI server which can be run locally, self-hosted in your local network or used as a hosted service.
One of the design goals of Pglet was comfort progress updates from CI/CD workflows, internal tools and scheduled jobs written in Bash and PowerShell, so the protocol had to be simple and fast.
The protocol is text-based and was partially inspired by Redis protocol.
Communication channel
Pglet client is used to establish a communication channel with Pglet service. Client is a part of pglet
(or pglet.exe
on Windows) executable which is automatically downloaded by a client library you use or can be downloaded manually from releases.
For every new connection to a page (pglet page <name>
) or a new app session (pglet app <name>
) Pglet client creates two FIFO named pipes on macOS/Linux or two named pipes on Windows:
- Command pipe - bi-directional pipe for sending command requests and receiving responses.
- Event pipe - read-only pipe with a constant stream of events (click, change, etc.) generated by a user.
Pglet client returns the name/path of command pipe and to get the name of event pipe append .events
to a command pipe name.
Command messages
Request
Each request to a command pipe represents a single- or multi-line command in the format:
<command> [value_1] [value_2] ... [property_1=value] [property_2=value] ...
For example, command adding a new Text
control to a page:
add text value="Hello, world!"
or adding multiple controls at once to a stack named footer
:
add to=footer
textbox id=firstName
button id=cancel text=Cancel
Properties parsing is quite relaxed. If the value doesn't have spaces you can ommit quotes, for example text=Hello
. Both single and double quotes can be used to enclose the value with spaces, for example: value="World's best coffee"
, or value='"quoted" text'
. The following escape symbols are supported: \n
, \t
, \"
, \'
.
Response
Successful response has the following format:
<number_of_additional_result_lines> [value]
result_line_1
result_line_2
...
For example, the result of get firstName value
command reading the value
property of firstName
textbox might look like:
0 John Smith
If you are reading the value of multiline=true
textbox then the result will look like:
2 First line
Second line
Third line
where 2
means "result has 2 more lines".
The response of commands non-returning any values is just 0
.
note
Certain commands may not have a response at all. These are fire-and-forget commands with the names ending on "f": addf
, setf
, appendf
, cleanf
, removef
. Fire-and-forget commands are handy when you are quickly doing a lot of control modifications and don't care about the results, for example, updaing progress bar in a loop.
Events
Read event pipe to wait and receive events fired by users interacting with a web page.
Each event message is a single line in the format:
<event_target> <event_name> [event_data]
where <event_target>
is ID of a control generated the event, <event_name>
is event name, e.g. click
, change
and [event_data]
is optional event data attached to a control with data
property (usually, used with buttons).
For example, a serie of event might look like:
firstName change John
agreeTOS change true
ok click
cancel click
...