Skip to content

Commit adc12b8

Browse files
committed
matching: support REF-AUS βœ…πŸ“
1 parent e04d785 commit adc12b8

14 files changed

+2561
-15
lines changed

β€Žlib/match-with-schedule-trip.js

+1
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ const createMatchGtfsRtTripUpdateWithScheduleStopTimes = async (cfg, opt = {}) =
189189

190190
const cache = await createCache({
191191
noCaching: NO_CACHING,
192+
prefix: 'match',
192193
ttl: process.env.MATCHING_CACHING_TTL
193194
? parseInt(process.env.MATCHING_CACHING_TTL) * 1000
194195
: 24 * 60 * 60 * 1000, // 24 hours

β€Žlib/match.js

+80-4
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ import {register} from './metrics.js'
1616
import {
1717
jsonCodec as natsJson,
1818
} from './nats.js'
19+
import {
20+
createMergeVdvFahrtWithRefAusSollFahrtAndAusIstFahrts,
21+
} from './merge-vdv-sollfahrts-istfahrts.js'
1922
import {
2023
createMatchWithGtfs,
2124
} from './raw-match.js'
@@ -39,12 +42,17 @@ const isProgrammerError = (err) => {
3942
return PROGRAMMER_ERRORS.some(Err => err instanceof Err)
4043
}
4144

45+
const KIND_SOLLFAHRT = 'sollfahrt'
4246
const KIND_ISTFAHRT = 'istfahrt'
4347

4448
// todo: DRY with OpenDataVBB/nats-consuming-gtfs-rt-server
49+
const NATS_JETSTREAM_REF_AUS_SOLLFAHRT_STREAM_NAME = `REF_AUS_SOLLFAHRT_${MAJOR_VERSION}`
4550
const NATS_JETSTREAM_AUS_ISTFAHRT_STREAM_NAME = `AUS_ISTFAHRT_${MAJOR_VERSION}`
4651
const NATS_JETSTREAM_GTFSRT_STREAM_NAME = `GTFS_RT_${MAJOR_VERSION}`
4752

53+
const vdvMergingLogger = createLogger('vdv-merging', {
54+
level: (process.env.LOG_LEVEL_VDV_MERGING || 'WARN').toLowerCase(),
55+
})
4856
const logger = createLogger('matching', {
4957
level: (process.env.LOG_LEVEL_MATCHING || 'warn').toLowerCase(),
5058
})
@@ -184,13 +192,21 @@ const runGtfsMatching = async (cfg, opt = {}) => {
184192
})
185193
const vdvFahrtHaltsTotal = new Summary({
186194
name: 'vdv_fahrt_halts_total',
187-
help: 'number of IstHalts per AUS IstFahrt',
195+
help: 'number of SollHalts/IstHalts per REF-AUS SollFahrt/AUS IstFahrt',
188196
registers: [register],
189197
labelNames: [
190198
'kind', // sollfahrt, istfahrt
191199
],
192200
})
193201

202+
const {
203+
storeRefAusSollFahrt: storeVdvRefAusSollFahrtForLaterMerging,
204+
storeAusIstFahrt: storeVdvAusIstFahrtForLaterMerging,
205+
mergeVdvFahrtWithRefAusSollFahrtAndAusIstFahrts,
206+
} = await createMergeVdvFahrtWithRefAusSollFahrtAndAusIstFahrts({
207+
logger: vdvMergingLogger,
208+
})
209+
194210
const {
195211
matchVdvAusIstFahrtWithGtfs,
196212
stop: stopMatching,
@@ -222,7 +238,7 @@ const runGtfsMatching = async (cfg, opt = {}) => {
222238
}
223239
}
224240

225-
const processVdvNatsMsg = async (msg, kind, kindTitle, haltsField) => {
241+
const processVdvNatsMsg = async (msg, kind, kindTitle, haltsField, storeVdvFahrt) => {
226242
const tReceived = Date.now()
227243
const {
228244
subject,
@@ -293,20 +309,24 @@ const runGtfsMatching = async (cfg, opt = {}) => {
293309
kind,
294310
}, vdvFahrt[haltsField].length)
295311

312+
await storeVdvFahrt(vdvFahrt)
313+
const mergedVdvFahrt = await mergeVdvFahrtWithRefAusSollFahrtAndAusIstFahrts(vdvFahrt)
314+
// todo: trace-log?
315+
296316
const {
297317
item: gtfsRtTripUpdate,
298318
isMatched,
299319
isCached,
300320
matchingTime,
301-
} = await matchVdvAusIstFahrtWithGtfs(vdvFahrt)
321+
} = await matchVdvAusIstFahrtWithGtfs(mergedVdvFahrt)
302322

303323
if (isMatched || publishUnmatchedTripUpdates) {
304324
publishGtfsRtTripUpdateToNats(gtfsRtTripUpdate, {
305325
isMatched,
306326
isCached,
307327
matchingTime,
308328
// todo: log just a slice?
309-
[kind]: vdvFahrt,
329+
[kind]: mergedVdvFahrt,
310330
natsMsgSeq: msg.seq,
311331
})
312332
}
@@ -365,14 +385,70 @@ const runGtfsMatching = async (cfg, opt = {}) => {
365385
}
366386
}
367387

388+
const processRefAusSollFahrtMsg = async (msg) => {
389+
await processVdvNatsMsg(
390+
msg,
391+
KIND_SOLLFAHRT,
392+
'REF-AUS SollFahrt',
393+
'SollHalts',
394+
storeVdvRefAusSollFahrtForLaterMerging,
395+
)
396+
}
397+
398+
// subscribe to REF-AUS SollFahrt messages
399+
{
400+
{
401+
// query details of the NATS JetStream stream for AUS IstFahrts
402+
const stream = await natsJetstreamClient.streams.get(NATS_JETSTREAM_REF_AUS_SOLLFAHRT_STREAM_NAME)
403+
const streamInfo = await stream.info()
404+
serviceLogger.debug({
405+
streamInfo,
406+
}, 'using NATS JetStream stream for REF-AUS SollFahrts')
407+
// todo: assert some properties?
408+
// strictEqual(streamInfo.config.discard, 'old', `NATS JetStream's discard must be "old"`)
409+
}
410+
411+
const sollFahrtsConsumer = await natsJetstreamClient.consumers.get(
412+
NATS_JETSTREAM_REF_AUS_SOLLFAHRT_STREAM_NAME,
413+
natsConsumerName,
414+
)
415+
416+
{
417+
// query details of the (externally created) NATS JetStream consumer
418+
const consumerInfo = await sollFahrtsConsumer.info()
419+
serviceLogger.debug({
420+
stream: NATS_JETSTREAM_REF_AUS_SOLLFAHRT_STREAM_NAME,
421+
consumerInfo,
422+
}, 'using NATS JetStream consumer for REF-AUS SollFahrts')
423+
// todo: assert some properties?
424+
// strictEqual(consumerInfo.config.deliver_policy, 'new', `REF-AUS JetStream consumer's deliver_policy must be "new"`)
425+
// strictEqual(consumerInfo.config.ack_policy, 'explicit', `REF-AUS JetStream consumer's ack_policy must be "explicit"`)
426+
}
427+
428+
const sollFahrtsSub = await sollFahrtsConsumer.consume()
429+
// We're not interested in the values, processRefAusSollFahrtMsg() publishes by itself.
430+
asyncConsume(
431+
mapConcurrently(
432+
sollFahrtsSub[Symbol.asyncIterator](),
433+
matchConcurrency,
434+
processRefAusSollFahrtMsg,
435+
),
436+
).catch(abortWithError)
437+
438+
// todo: support SollUmlauf – would require adapting vdv-453-nats-adapter
439+
}
440+
368441
const processAusIstFahrtMsg = async (msg) => {
369442
await processVdvNatsMsg(
370443
msg,
371444
KIND_ISTFAHRT,
372445
'AUS IstFahrt',
446+
'IstHalts',
447+
storeVdvAusIstFahrtForLaterMerging,
373448
)
374449
}
375450

451+
// subscribe to AUS IstFahrt messages
376452
{
377453
{
378454
// query details of the NATS JetStream stream for AUS IstFahrts

0 commit comments

Comments
Β (0)