mirror of
https://github.com/public-transport/db-vendo-client.git
synced 2025-02-22 22:59:35 +02:00
stop()
This commit is contained in:
parent
0e68a375e1
commit
98670d5e08
15 changed files with 493 additions and 32 deletions
|
@ -1,7 +0,0 @@
|
||||||
const formatStopReq = (ctx, stopRef) => {
|
|
||||||
// TODO
|
|
||||||
};
|
|
||||||
|
|
||||||
export {
|
|
||||||
formatStopReq,
|
|
||||||
};
|
|
21
index.js
21
index.js
|
@ -4,8 +4,6 @@ import readStations from 'db-hafas-stations';
|
||||||
|
|
||||||
import {defaultProfile} from './lib/default-profile.js';
|
import {defaultProfile} from './lib/default-profile.js';
|
||||||
import {validateProfile} from './lib/validate-profile.js';
|
import {validateProfile} from './lib/validate-profile.js';
|
||||||
import {INVALID_REQUEST} from './lib/errors.js';
|
|
||||||
import {HafasError} from './lib/errors.js';
|
|
||||||
|
|
||||||
// background info: https://github.com/public-transport/hafas-client/issues/286
|
// background info: https://github.com/public-transport/hafas-client/issues/286
|
||||||
const FORBIDDEN_USER_AGENTS = [
|
const FORBIDDEN_USER_AGENTS = [
|
||||||
|
@ -254,12 +252,10 @@ const createClient = (profile, userAgent, opt = {}) => {
|
||||||
: results;
|
: results;
|
||||||
};
|
};
|
||||||
|
|
||||||
const stop = async (stop, opt = {}) => { // TODO
|
const stop = async (stop, opt = {}) => {
|
||||||
if ('object' === typeof stop) {
|
if (isObj(stop) && stop.id) {
|
||||||
stop = profile.formatStation(stop.id);
|
stop = stop.id;
|
||||||
} else if ('string' === typeof stop) {
|
} else if ('string' !== typeof stop) {
|
||||||
stop = profile.formatStation(stop);
|
|
||||||
} else {
|
|
||||||
throw new TypeError('stop must be an object or a string.');
|
throw new TypeError('stop must be an object or a string.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -273,15 +269,8 @@ const createClient = (profile, userAgent, opt = {}) => {
|
||||||
const req = profile.formatStopReq({profile, opt}, stop);
|
const req = profile.formatStopReq({profile, opt}, stop);
|
||||||
|
|
||||||
const {res} = await profile.request({profile, opt}, userAgent, req);
|
const {res} = await profile.request({profile, opt}, userAgent, req);
|
||||||
if (!res || !Array.isArray(res.locL) || !res.locL[0]) {
|
|
||||||
throw new HafasError('invalid response, expected locL[0]', null, {
|
|
||||||
// This problem occurs on invalid input. 🙄
|
|
||||||
code: INVALID_REQUEST,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const ctx = {profile, opt, res, common};
|
const ctx = {profile, opt, res, common};
|
||||||
return profile.parseLocation(ctx, res.locL[0]);
|
return profile.parseStop(ctx, res, stop);
|
||||||
};
|
};
|
||||||
|
|
||||||
const nearby = async (location, opt = {}) => {
|
const nearby = async (location, opt = {}) => {
|
||||||
|
|
|
@ -3,7 +3,6 @@ import {products} from '../lib/products.js';
|
||||||
import {ageGroup, ageGroupFromAge, ageGroupLabel} from './age-group.js';
|
import {ageGroup, ageGroupFromAge, ageGroupLabel} from './age-group.js';
|
||||||
|
|
||||||
import {formatStationBoardReq} from '../format/station-board-req.js';
|
import {formatStationBoardReq} from '../format/station-board-req.js';
|
||||||
import {formatStopReq} from '../format/stop-req.js';
|
|
||||||
import {formatTripReq} from '../format/trip-req.js';
|
import {formatTripReq} from '../format/trip-req.js';
|
||||||
import {formatNearbyReq} from '../format/nearby-req.js';
|
import {formatNearbyReq} from '../format/nearby-req.js';
|
||||||
|
|
||||||
|
@ -63,7 +62,7 @@ const defaultProfile = {
|
||||||
|
|
||||||
formatStationBoardReq,
|
formatStationBoardReq,
|
||||||
formatLocationsReq: notImplemented,
|
formatLocationsReq: notImplemented,
|
||||||
formatStopReq,
|
formatStopReq: notImplemented,
|
||||||
formatTripReq,
|
formatTripReq,
|
||||||
formatNearbyReq,
|
formatNearbyReq,
|
||||||
formatJourneysReq: notImplemented,
|
formatJourneysReq: notImplemented,
|
||||||
|
@ -92,6 +91,7 @@ const defaultProfile = {
|
||||||
parseHintByCode,
|
parseHintByCode,
|
||||||
parsePrice,
|
parsePrice,
|
||||||
parseTickets,
|
parseTickets,
|
||||||
|
parseStop: notImplemented,
|
||||||
|
|
||||||
formatAddress,
|
formatAddress,
|
||||||
formatCoord,
|
formatCoord,
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
"refreshJourneysEndpointTickets": "https://app.vendo.noncd.db.de/mob/angebote/recon",
|
"refreshJourneysEndpointTickets": "https://app.vendo.noncd.db.de/mob/angebote/recon",
|
||||||
"refreshJourneysEndpointPolyline": "https://app.vendo.noncd.db.de/mob/trip/recon",
|
"refreshJourneysEndpointPolyline": "https://app.vendo.noncd.db.de/mob/trip/recon",
|
||||||
"locationsEndpoint": "https://app.vendo.noncd.db.de/mob/location/search",
|
"locationsEndpoint": "https://app.vendo.noncd.db.de/mob/location/search",
|
||||||
|
"stopEndpoint": "https://app.vendo.noncd.db.de/mob/location/details/",
|
||||||
"nearbyEndpoint": "https://app.vendo.noncd.db.de/mob/location/nearby",
|
"nearbyEndpoint": "https://app.vendo.noncd.db.de/mob/location/nearby",
|
||||||
"tripEndpoint": "https://app.vendo.noncd.db.de/mob/zuglauf/",
|
"tripEndpoint": "https://app.vendo.noncd.db.de/mob/zuglauf/",
|
||||||
"boardEndpoint": "https://app.vendo.noncd.db.de/mob/bahnhofstafel/",
|
"boardEndpoint": "https://app.vendo.noncd.db.de/mob/bahnhofstafel/",
|
||||||
|
|
|
@ -7,8 +7,10 @@ import {formatJourneysReq, formatRefreshJourneyReq} from './journeys-req.js';
|
||||||
import {formatTripReq} from './trip-req.js';
|
import {formatTripReq} from './trip-req.js';
|
||||||
import {formatLocationFilter} from './location-filter.js';
|
import {formatLocationFilter} from './location-filter.js';
|
||||||
import {formatLocationsReq} from './locations-req.js';
|
import {formatLocationsReq} from './locations-req.js';
|
||||||
|
import {formatStopReq} from './stop-req.js';
|
||||||
import {formatNearbyReq} from './nearby-req.js';
|
import {formatNearbyReq} from './nearby-req.js';
|
||||||
import {formatStationBoardReq} from './station-board-req.js';
|
import {formatStationBoardReq} from './station-board-req.js';
|
||||||
|
import {parseStop} from './parse-stop.js';
|
||||||
|
|
||||||
const profile = {
|
const profile = {
|
||||||
...baseProfile,
|
...baseProfile,
|
||||||
|
@ -21,8 +23,11 @@ const profile = {
|
||||||
formatTripReq,
|
formatTripReq,
|
||||||
formatNearbyReq,
|
formatNearbyReq,
|
||||||
formatLocationsReq,
|
formatLocationsReq,
|
||||||
|
formatStopReq,
|
||||||
formatStationBoardReq,
|
formatStationBoardReq,
|
||||||
formatLocationFilter,
|
formatLocationFilter,
|
||||||
|
|
||||||
|
parseStop,
|
||||||
};
|
};
|
||||||
|
|
||||||
export {
|
export {
|
||||||
|
|
47
p/dbnav/parse-stop.js
Normal file
47
p/dbnav/parse-stop.js
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
|
||||||
|
|
||||||
|
const parseStop = (ctx, l, id) => {
|
||||||
|
const {profile, common, opt} = ctx;
|
||||||
|
|
||||||
|
if (!l) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
let stop = {
|
||||||
|
type: 'station',
|
||||||
|
id: id,
|
||||||
|
name: l.haltName,
|
||||||
|
};
|
||||||
|
|
||||||
|
stop.products = profile.parseProducts(ctx, l.produktGattungen?.map(p => p.produktGattung));
|
||||||
|
if (opt.linesOfStops) {
|
||||||
|
stop.lines = l.produktGattungen?.flatMap(p => {
|
||||||
|
const foundProduct = profile.products.find(pp => pp.dbnav == p.produktGattung);
|
||||||
|
return p.produkte?.map(l => {
|
||||||
|
return {
|
||||||
|
type: 'line',
|
||||||
|
name: l.name,
|
||||||
|
productName: l.name && l.name.split(' ')[0] || undefined,
|
||||||
|
mode: foundProduct?.mode,
|
||||||
|
product: foundProduct?.id,
|
||||||
|
public: true,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (common && common.locations && common.locations[stop.id]) {
|
||||||
|
delete stop.type;
|
||||||
|
stop = {
|
||||||
|
...common.locations[stop.id],
|
||||||
|
...stop,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO isMeta
|
||||||
|
// TODO entrances
|
||||||
|
return stop;
|
||||||
|
};
|
||||||
|
|
||||||
|
export {
|
||||||
|
parseStop,
|
||||||
|
};
|
16
p/dbnav/stop-req.js
Normal file
16
p/dbnav/stop-req.js
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
import {getHeaders} from './header.js';
|
||||||
|
|
||||||
|
const formatStopReq = (ctx, stopRef) => {
|
||||||
|
const {profile} = ctx;
|
||||||
|
|
||||||
|
return {
|
||||||
|
endpoint: profile.stopEndpoint,
|
||||||
|
path: stopRef,
|
||||||
|
headers: getHeaders('application/x.db.vendo.mob.location.v3+json'),
|
||||||
|
method: 'get',
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export {
|
||||||
|
formatStopReq,
|
||||||
|
};
|
|
@ -16,9 +16,9 @@ What doesn't work (yet, see TODO's scattered around the code):
|
||||||
|
|
||||||
* `journeys()` details like scheduledDays, stop/station groups, some line details ...
|
* `journeys()` details like scheduledDays, stop/station groups, some line details ...
|
||||||
* loadFactor and other details in boards
|
* loadFactor and other details in boards
|
||||||
* certain stop details like products for `locations()` and geopositions and remarks for boards – this can be remedied by turning on `enrichStations` in the options, enriching location info with [db-hafas-stations](https://github.com/derhuerst/db-hafas-stations).
|
* certain stop details like products for `locations()` and geopositions and remarks for boards – this can be remedied by turning on `enrichStations` in the config, enriching location info with [db-hafas-stations](https://github.com/derhuerst/db-hafas-stations).
|
||||||
* some query options/filters (e.g. routingMode for journeys, direction for boards)
|
* some query options/filters (e.g. routingMode for journeys, direction for boards)
|
||||||
* all other endpoints (`tripsByName()`, `radar()`, `journeysFromTrip()`, `reachableFrom()`, `remarks()`, `lines()`, `stop()`, `station()`)
|
* all other endpoints (`tripsByName()`, `radar()`, `journeysFromTrip()`, `reachableFrom()`, `remarks()`, `lines()`, `station()`)
|
||||||
|
|
||||||
Depending on the configured profile, db-vendo-client will use multiple different DB APIs that offer varying functionality, so choose wisely:
|
Depending on the configured profile, db-vendo-client will use multiple different DB APIs that offer varying functionality, so choose wisely:
|
||||||
|
|
||||||
|
@ -26,11 +26,12 @@ Depending on the configured profile, db-vendo-client will use multiple different
|
||||||
| ------------- | ------------- | ------------- |
|
| ------------- | ------------- | ------------- |
|
||||||
| no API key required | ✅ | ✅ |
|
| no API key required | ✅ | ✅ |
|
||||||
| max duration boards | 12h | 1h |
|
| max duration boards | 12h | 1h |
|
||||||
| remarks | not for boards | ✅ |
|
| remarks | not for boards | ✅ (still no `remarks()` endpoint) |
|
||||||
| cancelled trips | not contained in boards | contained with cancelled flag |
|
| cancelled trips | not contained in boards | contained with cancelled flag |
|
||||||
| tickets | only for `refreshJourney()` | only for `refreshJourney()`, mutually exclusive with polylines |
|
| tickets | only for `refreshJourney()` | only for `refreshJourney()`, mutually exclusive with polylines |
|
||||||
| polylines | only for `trip()` | only for `refreshJourney()/trip()`, mutually exclusive with tickets |
|
| polylines | only for `trip()` | only for `refreshJourney()/trip()`, mutually exclusive with tickets |
|
||||||
| trip ids used | HAFAS trip ids for journeys, RIS trip ids for boards | HAFAS trip ids |
|
| trip ids used | HAFAS trip ids for journeys, RIS trip ids for boards | HAFAS trip ids |
|
||||||
|
| `stop()` | ❌ | ✅ |
|
||||||
| assumed backend API stability | less stable | more stable |
|
| assumed backend API stability | less stable | more stable |
|
||||||
|
|
||||||
Feel free to report anything that you stumble upon via Issues or create a PR :)
|
Feel free to report anything that you stumble upon via Issues or create a PR :)
|
||||||
|
@ -54,7 +55,7 @@ Use it as a dependency, e.g. just replacing [hafas-client](https://github.com/pu
|
||||||
npm i db-vendo-client
|
npm i db-vendo-client
|
||||||
```
|
```
|
||||||
|
|
||||||
See an example in [api.js](api.js). It shows how you can use `db-vendo-client` together with `hafas-rest-api` in order to run a [FPTF](https://github.com/public-transport/friendly-public-transport-format) API server. The [Dockerfile](Dockerfile) serves this API:
|
See an example in [api.js](api.js). It shows how you can use `db-vendo-client` together with [hafas-rest-api](https://github.com/public-transport/hafas-rest-api/) in order to run a [FPTF](https://github.com/public-transport/friendly-public-transport-format) API server. The [Dockerfile](Dockerfile) serves this API:
|
||||||
|
|
||||||
```
|
```
|
||||||
docker run -e USER_AGENT=my-awesome-program -p 3000:3000 ghcr.io/public-transport/db-vendo-client
|
docker run -e USER_AGENT=my-awesome-program -p 3000:3000 ghcr.io/public-transport/db-vendo-client
|
||||||
|
|
|
@ -6,7 +6,7 @@ const require = createRequire(import.meta.url);
|
||||||
import tap from 'tap';
|
import tap from 'tap';
|
||||||
|
|
||||||
import {createClient} from '../index.js';
|
import {createClient} from '../index.js';
|
||||||
import {profile as rawProfile} from '../p/db/index.js';
|
import {profile as rawProfile} from '../p/dbnav/index.js';
|
||||||
const res = require('./fixtures/dbnav-departures.json');
|
const res = require('./fixtures/dbnav-departures.json');
|
||||||
import {dbnavDepartures as expected} from './fixtures/dbnav-departures.js';
|
import {dbnavDepartures as expected} from './fixtures/dbnav-departures.js';
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ const require = createRequire(import.meta.url);
|
||||||
import tap from 'tap';
|
import tap from 'tap';
|
||||||
|
|
||||||
import {createClient} from '../index.js';
|
import {createClient} from '../index.js';
|
||||||
import {profile as rawProfile} from '../p/db/index.js';
|
import {profile as rawProfile} from '../p/dbnav/index.js';
|
||||||
const res = require('./fixtures/dbnav-refresh-journey.json');
|
const res = require('./fixtures/dbnav-refresh-journey.json');
|
||||||
import {dbNavJourney as expected} from './fixtures/dbnav-refresh-journey.js';
|
import {dbNavJourney as expected} from './fixtures/dbnav-refresh-journey.js';
|
||||||
|
|
||||||
|
|
25
test/dbnav-stop.js
Normal file
25
test/dbnav-stop.js
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
// todo: use import assertions once they're supported by Node.js & ESLint
|
||||||
|
// https://github.com/tc39/proposal-import-assertions
|
||||||
|
import {createRequire} from 'module';
|
||||||
|
const require = createRequire(import.meta.url);
|
||||||
|
|
||||||
|
import tap from 'tap';
|
||||||
|
|
||||||
|
import {createClient} from '../index.js';
|
||||||
|
import {profile as rawProfile} from '../p/dbnav/index.js';
|
||||||
|
const res = require('./fixtures/dbnav-stop.json');
|
||||||
|
import {dbnavDepartures as expected} from './fixtures/dbnav-stop.js';
|
||||||
|
|
||||||
|
const client = createClient(rawProfile, 'public-transport/hafas-client:test');
|
||||||
|
const {profile} = client;
|
||||||
|
|
||||||
|
const opt = {
|
||||||
|
linesOfStops: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
tap.test('parses a dbnav stop correctly', (t) => {
|
||||||
|
const ctx = {profile, opt, common: null, res};
|
||||||
|
const stop = profile.parseStop(ctx, res, '8000096');
|
||||||
|
t.same(stop, expected);
|
||||||
|
t.end();
|
||||||
|
});
|
|
@ -476,7 +476,6 @@ tap.test('locations named Jungfernheide', async (t) => {
|
||||||
t.end();
|
t.end();
|
||||||
});
|
});
|
||||||
|
|
||||||
/*
|
|
||||||
tap.test('stop', async (t) => {
|
tap.test('stop', async (t) => {
|
||||||
const s = await client.stop(regensburgHbf);
|
const s = await client.stop(regensburgHbf);
|
||||||
|
|
||||||
|
@ -486,6 +485,7 @@ tap.test('stop', async (t) => {
|
||||||
t.end();
|
t.end();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
tap.test('line with additionalName', async (t) => {
|
tap.test('line with additionalName', async (t) => {
|
||||||
const {departures} = await client.departures(potsdamHbf, {
|
const {departures} = await client.departures(potsdamHbf, {
|
||||||
when,
|
when,
|
||||||
|
|
|
@ -5109,6 +5109,142 @@
|
||||||
"ssl": -1,
|
"ssl": -1,
|
||||||
"wait": 445
|
"wait": 445
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "d50b6b1f76add52cd3eb6ffa13dea4d4",
|
||||||
|
"_order": 0,
|
||||||
|
"cache": {},
|
||||||
|
"request": {
|
||||||
|
"bodySize": 0,
|
||||||
|
"cookies": [],
|
||||||
|
"headers": [
|
||||||
|
{
|
||||||
|
"_fromType": "array",
|
||||||
|
"name": "content-type",
|
||||||
|
"value": "application/x.db.vendo.mob.location.v3+json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_fromType": "array",
|
||||||
|
"name": "accept-encoding",
|
||||||
|
"value": "gzip, br, deflate"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_fromType": "array",
|
||||||
|
"name": "accept",
|
||||||
|
"value": "application/x.db.vendo.mob.location.v3+json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_fromType": "array",
|
||||||
|
"name": "accept-language",
|
||||||
|
"value": "en"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_fromType": "array",
|
||||||
|
"name": "user-agent",
|
||||||
|
"value": "public-transport/hafas-client:test"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_fromType": "array",
|
||||||
|
"name": "connection",
|
||||||
|
"value": "keep-alive"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_fromType": "array",
|
||||||
|
"name": "x-correlation-id",
|
||||||
|
"value": "null"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "host",
|
||||||
|
"value": "app.vendo.noncd.db.de"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"headersSize": 369,
|
||||||
|
"httpVersion": "HTTP/1.1",
|
||||||
|
"method": "GET",
|
||||||
|
"queryString": [],
|
||||||
|
"url": "https://app.vendo.noncd.db.de/mob/location/details/8000309"
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"bodySize": 1945,
|
||||||
|
"content": {
|
||||||
|
"mimeType": "application/x.db.vendo.mob.location.v3+json",
|
||||||
|
"size": 1945,
|
||||||
|
"text": "{\"haltName\":\"Regensburg Hbf\",\"produktGattungen\":[{\"produktGattung\":\"HOCHGESCHWINDIGKEITSZUEGE\",\"produkte\":[{\"name\":\"ICE\"}]},{\"produktGattung\":\"INTERCITYUNDEUROCITYZUEGE\",\"produkte\":[{\"name\":\"IC\"},{\"name\":\"NJ\"}]},{\"produktGattung\":\"INTERREGIOUNDSCHNELLZUEGE\",\"produkte\":[{\"name\":\"BUS\"}]},{\"produktGattung\":\"NAHVERKEHRSONSTIGEZUEGE\",\"produkte\":[{\"name\":\"ALX\"},{\"name\":\"OPB\"},{\"name\":\"RB\"},{\"name\":\"RE\"},{\"name\":\"ag\"},{\"name\":\"Bus EV\"},{\"name\":\"Bus EV\"},{\"name\":\"Bus EV\"},{\"name\":\"Bus EV\"},{\"name\":\"Bus RB23\"},{\"name\":\"Bus RE23\"},{\"name\":\"Bus RE25\"}]},{\"produktGattung\":\"BUSSE\",\"produkte\":[{\"name\":\"Bus 1\"},{\"name\":\"Bus 2\"},{\"name\":\"Bus 3\"},{\"name\":\"Bus 4\"},{\"name\":\"Bus 5\"},{\"name\":\"Bus 5\"},{\"name\":\"Bus 5A\"},{\"name\":\"Bus 6\"},{\"name\":\"Bus 7\"},{\"name\":\"Bus 8\"},{\"name\":\"Bus 8A\"},{\"name\":\"Bus 9\"},{\"name\":\"Bus 10\"},{\"name\":\"Bus 11\"},{\"name\":\"Bus 11A\"},{\"name\":\"Bus 12\"},{\"name\":\"Bus 13\"},{\"name\":\"Bus 14\"},{\"name\":\"Bus 15\"},{\"name\":\"Bus 16\"},{\"name\":\"Bus 17\"},{\"name\":\"Bus 18\"},{\"name\":\"Bus 19\"},{\"name\":\"Bus 20\"},{\"name\":\"Bus 21\"},{\"name\":\"Bus 22\"},{\"name\":\"Bus 23\"},{\"name\":\"Bus 24\"},{\"name\":\"Bus 26\"},{\"name\":\"Bus 27\"},{\"name\":\"Bus 28\"},{\"name\":\"Bus 29\"},{\"name\":\"Bus 30\"},{\"name\":\"Bus 31\"},{\"name\":\"Bus 32\"},{\"name\":\"Bus 33\"},{\"name\":\"Bus 34\"},{\"name\":\"Bus 35\"},{\"name\":\"Bus 38\"},{\"name\":\"Bus 41\"},{\"name\":\"Bus 42\"},{\"name\":\"Bus 43\"},{\"name\":\"Bus 71\"},{\"name\":\"Bus 73\"},{\"name\":\"Bus 73\"},{\"name\":\"Bus 73\"},{\"name\":\"Bus 75\"},{\"name\":\"Bus 77\"},{\"name\":\"Bus 80\"},{\"name\":\"Bus 105\"},{\"name\":\"Bus 117\"},{\"name\":\"Bus 6010\"},{\"name\":\"Bus A\"},{\"name\":\"Bus C1\"},{\"name\":\"Bus C6\"},{\"name\":\"Bus D\"},{\"name\":\"Bus DULT\"},{\"name\":\"Bus N1\"},{\"name\":\"Bus N2\"},{\"name\":\"Bus N3\"},{\"name\":\"Bus N4\"},{\"name\":\"Bus N5\"},{\"name\":\"Bus N6\"},{\"name\":\"Bus N7\"},{\"name\":\"Bus X1\"},{\"name\":\"Bus X4\"},{\"name\":\"Bus X6\"},{\"name\":\"Bus X9\"},{\"name\":\"Bus21/24\"},{\"name\":\"Bus26/27\"},{\"name\":\"Bus36/37\"}]},{\"produktGattung\":\"ANRUFPFLICHTIGEVERKEHRE\",\"produkte\":[{\"name\":\"RUF 32\"}]}]}"
|
||||||
|
},
|
||||||
|
"cookies": [
|
||||||
|
{
|
||||||
|
"domain": ".app.vendo.noncd.db.de",
|
||||||
|
"httpOnly": true,
|
||||||
|
"name": "TS01be2125",
|
||||||
|
"path": "/",
|
||||||
|
"secure": true,
|
||||||
|
"value": "01d513bcd1b9bf9e9663294318145959b6eb5e2a2b5df7da01060b1dc5e7ff5985ac13cb509abfbace0e7798ec534a603b2c68e08c"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"headers": [
|
||||||
|
{
|
||||||
|
"name": "date",
|
||||||
|
"value": "Wed, 08 Jan 2025 22:50:18 GMT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "content-type",
|
||||||
|
"value": "application/x.db.vendo.mob.location.v3+json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "content-length",
|
||||||
|
"value": "1945"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "connection",
|
||||||
|
"value": "keep-alive"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "server-timing",
|
||||||
|
"value": "intid;desc=6025e1514766819a, intid;desc=6025e1514766819a, intid;desc=6025e1514766819a, intid;desc=6025e1514766819a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "x-correlation-id",
|
||||||
|
"value": "null"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "strict-transport-security",
|
||||||
|
"value": "max-age=16070400; includeSubDomains"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "x-xss-protection",
|
||||||
|
"value": "0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "content-security-policy",
|
||||||
|
"value": "frame-ancestors 'none';"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "x-content-type-options",
|
||||||
|
"value": "nosniff"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_fromType": "array",
|
||||||
|
"name": "set-cookie",
|
||||||
|
"value": "TS01be2125=01d513bcd1b9bf9e9663294318145959b6eb5e2a2b5df7da01060b1dc5e7ff5985ac13cb509abfbace0e7798ec534a603b2c68e08c; Path=/; Domain=.app.vendo.noncd.db.de; Secure; HTTPOnly"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"headersSize": 655,
|
||||||
|
"httpVersion": "HTTP/1.1",
|
||||||
|
"redirectURL": "",
|
||||||
|
"status": 200,
|
||||||
|
"statusText": "OK"
|
||||||
|
},
|
||||||
|
"startedDateTime": "2025-01-08T22:50:18.535Z",
|
||||||
|
"time": 170,
|
||||||
|
"timings": {
|
||||||
|
"blocked": -1,
|
||||||
|
"connect": -1,
|
||||||
|
"dns": -1,
|
||||||
|
"receive": 0,
|
||||||
|
"send": 0,
|
||||||
|
"ssl": -1,
|
||||||
|
"wait": 170
|
||||||
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"pages": [],
|
"pages": [],
|
||||||
|
|
247
test/fixtures/dbnav-stop.js
vendored
Normal file
247
test/fixtures/dbnav-stop.js
vendored
Normal file
|
@ -0,0 +1,247 @@
|
||||||
|
const dbnavDepartures = {
|
||||||
|
type: 'station',
|
||||||
|
name: 'Stuttgart Hbf',
|
||||||
|
id: '8000096',
|
||||||
|
products: {
|
||||||
|
nationalExpress: true,
|
||||||
|
national: true,
|
||||||
|
regionalExpress: true,
|
||||||
|
regional: true,
|
||||||
|
suburban: true,
|
||||||
|
bus: true,
|
||||||
|
ferry: false,
|
||||||
|
subway: false,
|
||||||
|
tram: true,
|
||||||
|
taxi: false,
|
||||||
|
},
|
||||||
|
lines: [
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
name: 'ICE',
|
||||||
|
productName: 'ICE',
|
||||||
|
mode: 'train',
|
||||||
|
product: 'nationalExpress',
|
||||||
|
public: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
name: 'RJ',
|
||||||
|
productName: 'RJ',
|
||||||
|
mode: 'train',
|
||||||
|
product: 'nationalExpress',
|
||||||
|
public: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
name: 'RJX',
|
||||||
|
productName: 'RJX',
|
||||||
|
mode: 'train',
|
||||||
|
product: 'nationalExpress',
|
||||||
|
public: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
name: 'TGV',
|
||||||
|
productName: 'TGV',
|
||||||
|
mode: 'train',
|
||||||
|
product: 'nationalExpress',
|
||||||
|
public: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
name: 'EC',
|
||||||
|
productName: 'EC',
|
||||||
|
mode: 'train',
|
||||||
|
product: 'national',
|
||||||
|
public: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
name: 'IC',
|
||||||
|
productName: 'IC',
|
||||||
|
mode: 'train',
|
||||||
|
product: 'national',
|
||||||
|
public: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
name: 'NJ',
|
||||||
|
productName: 'NJ',
|
||||||
|
mode: 'train',
|
||||||
|
product: 'national',
|
||||||
|
public: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
name: 'BUS',
|
||||||
|
productName: 'BUS',
|
||||||
|
mode: 'train',
|
||||||
|
product: 'regionalExpress',
|
||||||
|
public: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
name: 'Bus',
|
||||||
|
productName: 'Bus',
|
||||||
|
mode: 'train',
|
||||||
|
product: 'regionalExpress',
|
||||||
|
public: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
name: 'D',
|
||||||
|
productName: 'D',
|
||||||
|
mode: 'train',
|
||||||
|
product: 'regionalExpress',
|
||||||
|
public: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
name: 'DBK',
|
||||||
|
productName: 'DBK',
|
||||||
|
mode: 'train',
|
||||||
|
product: 'regionalExpress',
|
||||||
|
public: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
name: 'EN',
|
||||||
|
productName: 'EN',
|
||||||
|
mode: 'train',
|
||||||
|
product: 'regionalExpress',
|
||||||
|
public: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
name: 'FLX',
|
||||||
|
productName: 'FLX',
|
||||||
|
mode: 'train',
|
||||||
|
product: 'regionalExpress',
|
||||||
|
public: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
name: 'WB',
|
||||||
|
productName: 'WB',
|
||||||
|
mode: 'train',
|
||||||
|
product: 'regionalExpress',
|
||||||
|
public: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
name: 'GA',
|
||||||
|
productName: 'GA',
|
||||||
|
mode: 'train',
|
||||||
|
product: 'regional',
|
||||||
|
public: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
name: 'IRE',
|
||||||
|
productName: 'IRE',
|
||||||
|
mode: 'train',
|
||||||
|
product: 'regional',
|
||||||
|
public: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
name: 'MEX',
|
||||||
|
productName: 'MEX',
|
||||||
|
mode: 'train',
|
||||||
|
product: 'regional',
|
||||||
|
public: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
name: 'RB',
|
||||||
|
productName: 'RB',
|
||||||
|
mode: 'train',
|
||||||
|
product: 'regional',
|
||||||
|
public: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
name: 'RE',
|
||||||
|
productName: 'RE',
|
||||||
|
mode: 'train',
|
||||||
|
product: 'regional',
|
||||||
|
public: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
name: 'Bus EV',
|
||||||
|
productName: 'Bus',
|
||||||
|
mode: 'train',
|
||||||
|
product: 'regional',
|
||||||
|
public: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
name: 'BusMEX90',
|
||||||
|
productName: 'BusMEX90',
|
||||||
|
mode: 'train',
|
||||||
|
product: 'regional',
|
||||||
|
public: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
name: 'S 1',
|
||||||
|
productName: 'S',
|
||||||
|
mode: 'train',
|
||||||
|
product: 'suburban',
|
||||||
|
public: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
name: 'S 2',
|
||||||
|
productName: 'S',
|
||||||
|
mode: 'train',
|
||||||
|
product: 'suburban',
|
||||||
|
public: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
name: 'Bus 40',
|
||||||
|
productName: 'Bus',
|
||||||
|
mode: 'bus',
|
||||||
|
product: 'bus',
|
||||||
|
public: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
name: 'Bus 42',
|
||||||
|
productName: 'Bus',
|
||||||
|
mode: 'bus',
|
||||||
|
product: 'bus',
|
||||||
|
public: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
name: 'BusMEX90',
|
||||||
|
productName: 'BusMEX90',
|
||||||
|
mode: 'bus',
|
||||||
|
product: 'bus',
|
||||||
|
public: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
name: 'STB U1',
|
||||||
|
productName: 'STB',
|
||||||
|
mode: 'train',
|
||||||
|
product: 'tram',
|
||||||
|
public: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
name: 'STB U5',
|
||||||
|
productName: 'STB',
|
||||||
|
mode: 'train',
|
||||||
|
product: 'tram',
|
||||||
|
public: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
export {
|
||||||
|
dbnavDepartures,
|
||||||
|
};
|
1
test/fixtures/dbnav-stop.json
vendored
Normal file
1
test/fixtures/dbnav-stop.json
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
{"haltName":"Stuttgart Hbf","produktGattungen":[{"produktGattung":"HOCHGESCHWINDIGKEITSZUEGE","produkte":[{"name":"ICE"},{"name":"RJ"},{"name":"RJX"},{"name":"TGV"}]},{"produktGattung":"INTERCITYUNDEUROCITYZUEGE","produkte":[{"name":"EC"},{"name":"IC"},{"name":"NJ"}]},{"produktGattung":"INTERREGIOUNDSCHNELLZUEGE","produkte":[{"name":"BUS"},{"name":"Bus"},{"name":"D"},{"name":"DBK"},{"name":"EN"},{"name":"FLX"},{"name":"WB"}]},{"produktGattung":"NAHVERKEHRSONSTIGEZUEGE","produkte":[{"name":"GA"},{"name":"IRE"},{"name":"MEX"},{"name":"RB"},{"name":"RE"},{"name":"Bus EV"},{"name":"BusMEX90"}]},{"produktGattung":"SBAHNEN","produkte":[{"name":"S 1"},{"name":"S 2"}]},{"produktGattung":"BUSSE","produkte":[{"name":"Bus 40"},{"name":"Bus 42"},{"name":"BusMEX90"}]},{"produktGattung":"STRASSENBAHN","produkte":[{"name":"STB U1"},{"name":"STB U5"}]}]}
|
Loading…
Add table
Reference in a new issue