Architecture

The overall picture looks like this

../_images/arch.drawio.svg

Upon connecting to the local iRacing instance the Racelogger registers with the backend with a unique id (this is generated via the current iRacing weekend info from telemetry).

The manager announces the provider changes on the manager.provider topic.

The analysis and archive components listen to this topic and prepare themselves to receive data from the topic live.state.{id} to which the Racelogger will post its data.

At the end of recording the Racelogger calls the remove_provider endpoint. The manager in turn announces this event on the topic manager.provider

Endpoints

Prefix

Description

User

Access

racelog.public.

used for public access (mainly frontend)

anonymous

call, subscribe

racelog.dataprovider.

used by racelogger to publish race data

datapublisher

call, publish, subscribe

racelog.manager.

used by the backend apps

backend

call, register, publish, subscribe

racelog.admin.

used by admin CLI

admin

call, register, publish, subscribe

Crossbar

The following snippet can be used as a template for a crossbar server.

  1{
  2    "version": 2,
  3    "controller": {},
  4    "workers": [
  5        {
  6            "type": "router",
  7            "realms": [                                
  8                {
  9                    "name": "racelog",
 10                    "roles": [
 11                        {
 12                            "name": "anonymous",
 13                            "permissions": [
 14                                {
 15                                    "uri": "racelog.public",
 16                                    "match": "prefix",
 17                                    "allow": {
 18                                        "call": true,
 19                                        "register": false,
 20                                        "publish": false,
 21                                        "subscribe": true
 22                                    },
 23                                    "disclose": {
 24                                        "caller": false,
 25                                        "publisher": false
 26                                    },
 27                                    "cache": true
 28                                }
 29                            ]
 30                        },
 31                        {
 32                            "name": "racedata_provider",
 33                            "permissions": [
 34                                {
 35                                    "uri": "racelog.dataprovider", 
 36                                    "match": "prefix",
 37                                    "allow": {
 38                                        "call": true,
 39                                        "register": false,
 40                                        "publish": true,
 41                                        "subscribe": true
 42                                    },
 43                                    "disclose": {
 44                                        "caller": false,
 45                                        "publisher": false
 46                                    },
 47                                    "cache": true
 48                                }
 49                            ]
 50                        },
 51                        {
 52                            "name": "backend",
 53                            "permissions": [
 54                                {
 55                                    "uri": "racelog.", 
 56                                    "match": "prefix",
 57                                    "allow": {
 58                                        "call": true,
 59                                        "register": true,
 60                                        "publish": true,
 61                                        "subscribe": true
 62                                    },
 63                                    "disclose": {
 64                                        "caller": false,
 65                                        "publisher": false
 66                                    },
 67                                    "cache": true
 68                                }
 69                            ]
 70                        }
 71                    ]
 72                }
 73            ],
 74            "transports": [
 75                {
 76                    "type": "web",
 77                    "endpoint": {
 78                        "type": "tcp",
 79                        "port": 8080
 80                    },                    
 81                    "paths": {
 82                        "info": {
 83                            "type": "nodeinfo"
 84                         },  
 85                                                
 86                         "ws": {
 87                             "type": "websocket",
 88                             "options": {
 89                                 "auto_ping_interval": 30000,
 90                                 "compression": {
 91                                    "deflate": {
 92                                       "request_no_context_takeover": false,
 93                                       "request_max_window_bits": 11,
 94                                       "no_context_takeover": false,
 95                                       "max_window_bits": 11,
 96                                       "memory_level": 4
 97                                    }
 98                                 }
 99
100                             },
101                             "auth": {
102                                "anonymous": {
103                                    "type": "static",
104                                    "role": "anonymous"
105                                },
106                                "ticket": {
107                                    "type": "static",
108                                    "principals": {
109                                        "dataprovider": {
110                                            "ticket": "<ENTER_SECRET_HERE>",
111                                            "role": "racedata_provider"
112                                        },
113                                        "backend": {
114                                            "ticket": "<ENTER_SECRET_HERE>",
115                                            "role": "backend"
116                                        }
117                                    }
118                                }
119                            }
120                             
121                         }
122                    }
123                }
124            ]
125        }
126    ]
127}

Migration

Racelogger

Current

Access

New

racelog.register_provider

call

racelog.dataprovider.register_provider

racelog.remove_provider

call

racelog.dataprovider.remove_provider

racelog.store_event_extra_data

call

racelog.dataprovider.provide_event_extra_data

racelog.state.{id}

publish

racelog.public.live.state.{id}

Web

Current

Access

New

Where

Description

racelog.archive.event_info

call

racelog.public.get_event_info

load event

get info about selected event

racelog.archive.events

call

racelog.public.get_events

startup

get list of stored events

racelog.list_providers

call

racelog.public.list_providers

startup/request

get list of current race data providers

racelog.get_track_info

call

racelog.public.get_track_info

load event

get info about track

racelog.analysis.archive

call

racelog.public.archive.get_event_analysis

load event

get stored analysis data

racelog.analysis.live

call

racelog.public.live.get_event_analysis

live

get current live analysis data

racelog.state.{id}

topic

racelog.public.live.state.{id}

live

get current state from racelogger

racelog.archive.wamp.delta

call

racelog.public.archive.state

race replay

used to get state messages for a time range