Skip to main content
Version: Next

Websocket Server

Example Websocket server application built on top of Tremor and meant to be a demonstration of linked transports.

Setup

tip

All the code here is available in the git repository as well.

Sources

We configure a websocket onramp listening on port 8139:

  - id: ws
type: ws
linked: true
codec: string
preprocessors:
- lines
config:
host: 0.0.0.0
port: 8139

Message flow

Incoming websocket messages from a client's websocket connection are sent to the pipeline echo and the output of it is sent back again from the same connection.

binding:
- id: main
links:
"/onramp/ws/{instance}/out": ["/pipeline/echo/{instance}/in"]
"/pipeline/echo/{instance}/out": ["/onramp/ws/{instance}/in"]

Processing logic

Implementation for the echo pipeline (techincally, echo with one twist):

define script process
script
match event of
# snot is a badger
case "snot" => "badger"
default => event
end
end;

create script process;

# main request processing
select event from in into process;
select event from process into out;

# tremor runtime errors from the processing script
select event from process/err into err;

Testing

Assuming you have all the code from the git repository, run the following to start our application:

docker-compose up

Test the websocket server with a tool like websocat.

note

Can be installed via cargo install websocat for the lazy/impatient amongst us

# anything you type and enter, will be echoed back
# except snot which begets badger
$ websocat ws://localhost:8139
hello
hello
world
world
snot
badger
goodbye
goodbye

If there's internal tremor error while processing the incoming message (eg: codec or preprocessor failure), the error should be bubbled up to the client. To test this out, change the codec in the onramp configuration to be json from string and send an malformed json input:

# after changing the onramp codec to json
$ echo "{" | websocat -n1 ws://localhost:8139
{"error":"SIMD JSON error: Syntax at character 0 ('{')","event_id":0,"source_id":"tremor://localhost/onramp/ws/01/in"}