@simrail-sdk/core v0.1.1
SimRail Core SDK
This is the Core SDK (community edition) for interacting with the SimRail APIs.
This Core SDK module builds on top of an API module (like @simrail-sdk/api
) to provide:
- A more developer-friendly API to prototype with. (where an API module is just about interfacing with SimRail's remote APIs)
- Live updates on specific resources. (servers, stations, trains)
- Event subcriptions on resources.
- Caching of remote API responses.
If you are looking for the SDK module extending on data provided by SimRail's remote APIs, check out wait for the regular SDK module (@simrail-sdk/sdk
).
This module requires the use of an API module to be able to extend it. By default
this module will use @simrail-sdk/api
. To provide another API module
or a custom one, check out the example Providing a (custom) API or Core API class below.
Content index
- [Module dependencies][module-dependencies] - [Module package dependencies][module-package-dependencies] - [Internal module dependencies][internal-module-dependencies] - [Module code statistics][module-code-statistics]
Usage details
Installation
Using NPM:
$ npm i @simrail-sdk/core
or
$ npm i github:simrail-sdk/core#VERSION
Where VERSION
specifies the version to install.
Examples
Simple SDK usage
import Sdk from "@simrail-sdk/core";
const sdk = new Sdk({
api: {
endpoints: {
liveData: "https://panel.simrail.eu:8084",
timetable: "https://api1.aws.simrail.eu:8082/api",
},
},
});
//
// Servers
//
// Retrieve a map of Server instances.
const servers = await sdk.servers();
// Retrieve a single Server instance.
const serverCode: Sdk.Server.Code = "en1";
let en1 = servers[serverCode];
// -- or --
en1 = await sdk.server(serverCode);
// Access server data
const isActive = en1.isActive;
const region = en1.region;
// ...
// Update live data (specified in Server.LiveData)
await en1.update();
//
// Stations
//
// Retrieve a map of Station instances.
let stations = await en1.stations();
// -- or --
stations = await sdk.stations(serverCode);
// Retrieve a single Station instance.
const stationCode: Sdk.Station.Code = "KO";
let katowice = stations[stationCode];
// -- or --
katowice = await en1.station(stationCode);
// -- or --
katowice = await sdk.station(serverCode, stationCode);
// Access station data
const difficultyLevel = katowice.difficultyLevel;
const dispatchers = katowice.dispatchers;
...
// Update live data (specified in Station.LiveData)
await katowice.update();
//
// Trains
//
// Retrieve a list of active train numbers.
const activeTrains = await en1.activeTrainNumbers();
// Retrieve a single Train instance.
const trainNumber: Sdk.Train.Number = "4144";
let t4144 = await en1.train(trainNumber);
// -- or --
t4144 = await sdk.train(serverCode, trainNumber);
// Access train data
const arrivesAt = t4144.destination.arrivesAt;
const length = t4144.length;
...
// Access live data
const coords = [t4144.liveData.longitude, t4144.liveData.latitude];
const speed = t4144.liveData.speed;
...
Automatic updates and events
import Sdk from "@simrail-sdk/core";
const sdk = new Sdk(...);
const train = await sdk.train("en1", "4144");
//
// Train live data
//
const liveData = train.liveData;
let liveDataSubscription;
if (liveData.available === true) {
// Subscribe to live data events.
liveDataSubscription = liveData.events.subscribe((event) => {
// Filter events by type.
switch (event.type) {
case Sdk.Train.LiveData.Event.Type.AvailableChanged:
console.log(`Value of "LiveData.available" changed to "${event.available}"!`); break;
case Sdk.Train.LiveData.Event.Type.DataUpdated:
console.log(`Value of "LiveData.data" changed to "${JSON.stringify(event.data)}"!`); break;
case Sdk.Train.LiveData.Event.Type.InPlayableAreaChanged:
console.log(`Value of "LiveData.inPlayableArea" changed to "${event.inPlayableArea}"!`); break;
}
});
// Specify the update interval and start auto updates.
liveData.autoUpdateInterval = 10000;
liveData.autoUpdate = true;
}
// When done, cancel the subscription
liveDataSubscription?.unsubscribe();
//
// Train timetables
//
// Subscribe to timetable events.
const timetableSubscription = train.timetable.events.subscribe((event) => {
switch (event.type) {
case Sdk.Train.Timetable.Event.Type.CurrentChanged:
console.log(`Value of "Timetable.current" changed! Next train stop: ${event.current.name}`);
}
});
// Enable live data for some events to be emited.
train.liveData.autoUpdate = true;
// And clean up
timetableSubscription.unsubscribe();
TypeScript strict type checking
To enable strict type checking when using TypeScript, install a
Core Setup module like @simrail-sdk/core-setup-pl
.
import Sdk from "@simrail-sdk/core";
import { Server, Station, Types } from "@simrail-sdk/core-setup-pl";
// Inject `Types` into the `Sdk` instance to enable strict type checking.
const sdk = new Sdk<Types>(...);
const en1 = sdk.server(Server.Code.EN1);
const en2 = sdk.server("en2");
const będzin = sdk.station("en1", Station.Code.B);
const düsseldorf = sdk.station("en1", "Dü"); // <-- Fails because Düsseldorf doesn't exist.
const katowice = sdk.station("en1", "KO");
const train4144 = sdk.train("en1", "4144");
const train4145 = sdk.train("en1", "4145"); // <-- Fails because 4145 doesn't exist.
// Obtaining a list of server/station codes:
const serverCodes = Object.values(Server.Code);
const stationCodes = Object.values(Station.Code);
Working with result caching
import Sdk from "@simrail-sdk/core";
// Cache configuration can be specified at SDK class construction.
const sdk = new Sdk({
api: {
/** Specifies a config for requests to the timetable endpoint. */
timetable: {
cache: {
/**
* Specifies if caching is enabled.
* @default true
*/
enabled: true,
/**
* Specifies for how long a timetable record is cached in seconds.
* This value also specifies the update interval for auto updates.
* @default 1440
*/
retention: 1440,
/**
* Specifies if only one timetable record should be cached.
*
* When set to:
* - `true` only the last timetable record will be cached.
* - `false` a timetable record will be cached for
* each server that was queried for a timetable.
* Use this when you are actively querying multiple servers.
*
* @default true
*/
singleRecordOnly: true,
},
},
/** Specifies a config for requests to the live data endpoint. */
liveData: {
cache: {
// Values displayed are the defaults.
activeServers: { enabled: true, retention: 30 },
activeStations: { enabled: true, retention: 30 },
activeTrains: { enabled: true, retention: 5 },
},
},
...
},
});
// If you need to, flush cached data.
sdk.api.flushCache();
// Or
sdk.api.flushActiveServerCache();
sdk.api.flushActiveStationCache();
sdk.api.flushActiveTrainCache();
sdk.api.flushTimetableCache();
Providing a (custom) API or Core API class
import CoreApi from "@simrail-sdk/api-core-node";
import Api from "@simrail-sdk/api";
import Sdk from "@simrail-sdk/core";
// By default the SDK will use the API class from package `@simrail-sdk/api`.
// To provide another API class or a custom one, just include the instance in the SDK config.
const api = new Api(...);
const sdk = new Sdk({ api }); // <-- Inject API here
// Or alternatively, to provide a different *Core API* class, include this in the API config.
const coreApi = new CoreApi(...);
const api = new Api({ core: coreApi }); // <-- Inject Core API here
const sdk = new Sdk({ api: api }); // <-- Inject API here
API reference
NOTE: The API reference section doesn't account for namespace
s, this unfortunately means the documentation below is not entirely complete. Please investigate the TypeScript definition files for the full API.
api-reference-@simrail-sdk/core: @simrail-sdk/core "View module \"@simrail-sdk/core\"" api-reference-common: common "View module \"common\"" api-reference-common/index.d.ts: common/index.d.ts "View module \"common/index.d.ts\"" api-reference-common/index.ts: common/index.ts "View module \"common/index.ts\"" api-reference-index: index "View module \"index\"" api-reference-index.d.ts: index.d.ts "View module \"index.d.ts\"" api-reference-node_modules/@simrail-sdk/api/index.d.ts: node_modules/@simrail-sdk/api/index.d.ts "View module \"node_modules/@simrail-sdk/api/index.d.ts\"" api-reference-node_modules/@simrail-sdk/api-core-node/index.d.ts: node_modules/@simrail-sdk/api-core-node/index.d.ts "View module \"node_modules/@simrail-sdk/api-core-node/index.d.ts\"" api-reference-node_modules/@simrail-sdk/api-core-node/types/liveData/index.d.ts: node_modules/@simrail-sdk/api-core-node/types/liveData/index.d.ts "View module \"node_modules/@simrail-sdk/api-core-node/types/liveData/index.d.ts\"" api-reference-node_modules/@simrail-sdk/api-core-node/types/timetable/index.d.ts: node_modules/@simrail-sdk/api-core-node/types/timetable/index.d.ts "View module \"node_modules/@simrail-sdk/api-core-node/types/timetable/index.d.ts\"" api-reference-line/index.ts: line/index.ts "View module \"line/index.ts\"" api-reference-server/index.ts: server/index.ts "View module \"server/index.ts\"" api-reference-train/index.ts: train/index.ts "View module \"train/index.ts\"" api-reference-train/liveData/index.ts: train/liveData/index.ts "View module \"train/liveData/index.ts\"" api-reference-station/index.ts: station/index.ts "View module \"station/index.ts\"" api-reference-train/timetable/index.ts: train/timetable/index.ts "View module \"train/timetable/index.ts\"" api-reference-train/timetable/entry/index.ts: train/timetable/entry/index.ts "View module \"train/timetable/entry/index.ts\"" api-reference-track/index.ts: track/index.ts "View module \"track/index.ts\"" api-reference-index.ts: index.ts "View module \"index.ts\"" api-reference-line: line "View module \"line\"" api-reference-line/index.d.ts: line/index.d.ts "View module \"line/index.d.ts\"" api-reference-server: server "View module \"server\"" api-reference-server/index.d.ts: server/index.d.ts "View module \"server/index.d.ts\"" api-reference-station: station "View module \"station\"" api-reference-station/index.d.ts: station/index.d.ts "View module \"station/index.d.ts\"" api-reference-track: track "View module \"track\"" api-reference-track/index.d.ts: track/index.d.ts "View module \"track/index.d.ts\"" api-reference-train: train "View module \"train\"" api-reference-train/index.d.ts: train/index.d.ts "View module \"train/index.d.ts\"" api-reference-train/liveData: train/liveData "View module \"train/liveData\"" api-reference-train/liveData/index.d.ts: train/liveData/index.d.ts "View module \"train/liveData/index.d.ts\"" api-reference-train/timetable/entry: train/timetable/entry "View module \"train/timetable/entry\"" api-reference-train/timetable/entry/index.d.ts: train/timetable/entry/index.d.ts "View module \"train/timetable/entry/index.d.ts\"" api-reference-train/timetable: train/timetable "View module \"train/timetable\"" api-reference-train/timetable/index.d.ts: train/timetable/index.d.ts "View module \"train/timetable/index.d.ts\""
class Entry
↑
Implements: Data
Type params: | Extends | Optional | Default |
---|---|---|---|
Types | Entry.Types | No | N/A |
EntryType | Entry.Type | Yes | Entry.Type |
Since: 0.1.0
Definition: train/timetable/entry/index.ts:23
new Entry.constructor(config)
↑
Type params: | Extends | Optional | Default |
---|---|---|---|
Types | Types <Types > | No | N/A |
EntryType | Type | Yes | Type |
Arguments: | Type |
---|---|
config | Config <Types | EntryType > |
Returns: Entry
<Types
| EntryType
>
Since: 0.1.0
Definition: train/timetable/entry/index.ts:97
property Entry.data
↑
read-only
Type: Data
<EntryType
>
Since: 0.1.0
Definition: train/timetable/entry/index.ts:27
property Entry.timetable
↑
read-only
Type: Timetable
<Types
>
Since: 0.1.0
Definition: train/timetable/entry/index.ts:25
property Entry.arrivesAt
↑
read-only
Since: 0.1.0
Definition: train/timetable/entry/index.ts:29
property Entry.departsAt
↑
read-only
Since: 0.1.0
Definition: train/timetable/entry/index.ts:33
property Entry.first
↑
read-only
Since: 0.1.0
Definition: train/timetable/entry/index.ts:37
property Entry.index
↑
read-only
Since: 0.1.0
Definition: train/timetable/entry/index.ts:41
property Entry.kilometrage
↑
read-only
Since: 0.1.0
Definition: train/timetable/entry/index.ts:45
property Entry.last
↑
read-only
Since: 0.1.0
Definition: train/timetable/entry/index.ts:49
property Entry.line
↑
read-only
Since: 0.1.0
Definition: train/timetable/entry/index.ts:53
property Entry.localTrack
↑
read-only
Since: 0.1.0
Definition: train/timetable/entry/index.ts:57
property Entry.maxSpeed
↑
read-only
Since: 0.1.0
Definition: train/timetable/entry/index.ts:61
property Entry.name
↑
read-only
Since: 0.1.0
Definition: train/timetable/entry/index.ts:65
property Entry.platform
↑
read-only
Since: 0.1.0
Definition: train/timetable/entry/index.ts:69
property Entry.pointId
↑
read-only
Since: 0.1.0
Definition: train/timetable/entry/index.ts:73
property Entry.radioChannels
↑
read-only
Since: 0.1.0
Definition: train/timetable/entry/index.ts:77
property Entry.stationCategory
↑
read-only
Since: 0.1.0
Definition: train/timetable/entry/index.ts:81
property Entry.supervisedBy
↑
read-only
Since: 0.1.0
Definition: train/timetable/entry/index.ts:85
property Entry.trainType
↑
read-only
Since: 0.1.0
Definition: train/timetable/entry/index.ts:89
property Entry.type
↑
read-only
Since: 0.1.0
Definition: train/timetable/entry/index.ts:93
method Entry.next()
↑
Returns: undefined
| Entry
<Types
| Type
>
Since: 0.1.0
Definition: train/timetable/entry/index.ts:102
method Entry.previous()
↑
Returns: undefined
| Entry
<Types
| Type
>
Since: 0.1.0
Definition: train/timetable/entry/index.ts:108
class LiveData
↑
Specifies live data of a train.
See LiveData.get()
for an await
able constructor method.
Implements: Data
Type params: | Extends | Description |
---|---|---|
Types | LiveData.Train.Types | Type information about the LiveData and SDK. |
Since: 0.1.0
Definition: train/liveData/index.ts:36
new LiveData.constructor(config, callback)
↑
Type params: | Extends |
---|---|
Types | Types <string | string | string | string | Types > |
Arguments: | Type |
---|---|
config | Config <Types > |
callback | Callback <Types > |
Returns: LiveData
<Types
>
Since: 0.1.0
Definition: train/liveData/index.ts:214
property LiveData.events
↑
read-only
Specifies a live data event emitter.
Type: Emitter
<Types
>
Since: 0.1.0
Definition: train/liveData/index.ts:39
property LiveData.sdk
↑
read-only
Specifies a reference to the Sdk
class instance.
Type: Sdk
<Types
>
Since: 0.1.0
Definition: train/liveData/index.ts:42
property LiveData.train
↑
read-only
Specifies a reference to the Train
the live data belongs to.
Type: Train
<Types
>
Since: 0.1.0
Definition: train/liveData/index.ts:45
property LiveData.autoUpdate
api-reference-train/liveData/index.ts~LiveData.au
11 months ago