{"_id":"hafas-gtfs-rt-feed","_rev":"55-19744c5e5ffcc662fc4b47e1d33f1c06","name":"hafas-gtfs-rt-feed","dist-tags":{"latest":"8.2.6","next":"7.0.0-alpha.1"},"versions":{"0.1.0":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"0.1.0","main":"index.js","keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"ISC","engines":{"node":">=8"},"dependencies":{"gtfs-rt-bindings":"^3.0.0"},"devDependencies":{"bvg-hafas":"^2.0.0","hafas-monitor-trips":"^2.0.2","length-prefixed-stream":"^2.0.0"},"scripts":{"test":"node test.js | tap-min"},"gitHead":"55d8022d042bb137fcb3b8652a1d48862ea3de6b","_id":"hafas-gtfs-rt-feed@0.1.0","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-aDGUEUdGBu/G+jGu8j1dkr5xggnnCYn+cbGuaxpXbv1munwEUaAcPbpDjl3p57wD1vWxRQ+zfU2uZCx2M6MTQg==","shasum":"9655ed4ad26086896555d9632387c8a7627aef69","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-0.1.0.tgz","fileCount":4,"unpackedSize":9635,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdA54XCRA9TVsSAnZWagAA2v8P/3wCad8mN+6zCb1w8pB4\nwIkJKL3JbiEbxr1eupMUNXrhWw6MJ+aYoFvT/R95Zv73GwUTFj1hIaNN2i/a\nZBo5wY2EktdGGnWzBb8Qbd8xvJW0VO8+giZsDl/NLhKKNQi/jUN+VotmW2y1\ngS0nYOP/Pcoei0UJBuj5vEjNj1QQPBf+zmJlIVTXx63ibSVnuUVubvDQwLSX\nsdrQhs2uR6/2iE4s0wmCqQzY63cJqtyart4PpKEhJtWmGDV12Dv9KQUMgF13\nVdz0t8MPBulfWFaNRWrwUzvLvt2GHZxgqwXVlpvdbO42IN1b/LcDah2QElKL\nGkCu9pDhQ5CYs5amy378N2a3NjiX6ymhHuDy3bFWBe7OsfGq4pjr6p2TsLAn\nwv3LEraJR0cnGMuPNWLPdfZDde3qHyT4XGiZYQmnBmpX9uDoMen0vmY6Cxa3\nGWIA4Pg8htbxVRpM0lfBs7jH4w8F1LoPsLFiOM4iMArjtFz2tKgZ+2RRuMVd\nmdiBHfWvzt/T8qLmebLmzQHFsXc2A9BOZDuLhl9adds0ti2DopMQpJwJczCP\nt9DVoGW5Rn7tAHfe6KFEcX8SwriDDBH6hNeSuVH54mrSQfbyK/VpQlKD4Qia\n9bpiiUq0wt4Xi61K3Ih84qT7yCBj+ycO0R0bgfVFk90+s+hKn+5bL+InYgBi\nrcyt\r\n=AScH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIADYECQxU6qrfNGXGESWKUXBK5ZdnUVdMi0HJOJ2mpCMAiEAl6ZfqffEKd3MwOUWyeswnJb0tYJ5Q0OFXDJyVNUa1tk="}]},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_0.1.0_1560518166849_0.02593510439767055"},"_hasShrinkwrap":false},"0.1.1":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"0.1.1","main":"index.js","keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"ISC","engines":{"node":">=8"},"dependencies":{"gtfs-rt-bindings":"^3.0.0"},"devDependencies":{"bvg-hafas":"^2.0.0","hafas-monitor-trips":"^2.0.2","length-prefixed-stream":"^2.0.0"},"scripts":{"test":"node test.js | tap-min"},"gitHead":"2d5ff32b24ee45719ae920ecf087264bc12fb3f8","_id":"hafas-gtfs-rt-feed@0.1.1","_nodeVersion":"12.4.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-RUEhXAqGD0M9mBHbnXxJrIaFWlbV6V74m9MLzfVMkf5jaxXrhSA09GPtL4GyL4+PDfTJaopmedBLFs6Fp+6E3Q==","shasum":"43beeaf07dbc1f5177524abb0fadfaabec32c7e0","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-0.1.1.tgz","fileCount":4,"unpackedSize":9889,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdMi5+CRA9TVsSAnZWagAAfLAQAJNc44X03eb/R6HrdJYS\nUN4RL3DnoDZQmLtp2B85EUV70DWbSAwJCfyqIgtoCggc2kYC15iw6YHxdhYQ\nHXaagx6gqtv/p6GWgFVLVgPpNkXdavxXvJqNY98KBLCVAABeL9068lmQt2tt\nXDZ49IB2TNbFYBP6Flk4ZJ9YdPNkz+CG03b9K953FheLWHJTvpwRVW2iNRe6\nBZv1vqfp3yIMQa+JT5g/oYuBm4eJiuDIh1Gq0GrDhVzM/Ium5P5d8U/MDHws\nfzcHjqzzK4/hLBucqoVaWzZlB+dCUoiHceI1cuZPL3DtaJT+eaSBEtbMDwTH\nq0ZHgSGnIpgEP8LY/uyb42ewJXnf95Y5VqTCH1N6BdeE7AmwTA6ReIL3rp5F\nTaqkwCV+FFyJUY29Bi+0GUPFfVQqzUCWxpASYehXvVpAK5s23hWJxDjy+P36\nfMLC51CkoC5fB8vc9JgnMLx/f351A58+ZuOroxR2B0gNBBRbror0NZC7SMFt\njtev0XA8Zd6HFA0KvYWe5kaGndGnfzIw44u3brosF3npAMmfumr/scqQPt8R\n8ry7ljLidz/rwjt2YUfFM0zDh9X9E6ZGSB17254CvJO4rMV9SlY/dW+UbuGg\nERm3vvo2FdB5jq+3O0yk9Yfx1q54TypSiExNc1jgbDxYIIOfiEWcNCV5FFKT\nX3Ht\r\n=V2hv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDTOQM9Ayz06pV4WeP+EEH8tlPZaapuStDLGdKr3MEZ/AiEAgs6g4Bzo/1DamnnZcjXsbUE7N0LaVaUCKthlPybBBwQ="}]},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_0.1.1_1563569789694_0.8031611312351139"},"_hasShrinkwrap":false},"0.2.0":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"0.2.0","main":"index.js","keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"ISC","engines":{"node":">=8"},"dependencies":{"gtfs-rt-bindings":"^3.0.0"},"devDependencies":{"bvg-hafas":"^2.0.0","hafas-monitor-trips":"^2.0.2","length-prefixed-stream":"^2.0.0"},"scripts":{"test":"node test.js | tap-min"},"gitHead":"164ddc7945afbd77ac3749072b8685cd4a2f66e1","_id":"hafas-gtfs-rt-feed@0.2.0","_nodeVersion":"12.4.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-qRj34MhZxvZOulYtz9qO49/UJeKFBtK6dyDo5Cqc8vh1BKAJbd37UsXhJQMv794S3NNz6PbCr8W3E38cdIcypQ==","shasum":"99166252b80ab34296efac079f91f2de494d39c4","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-0.2.0.tgz","fileCount":5,"unpackedSize":10173,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdMjy6CRA9TVsSAnZWagAA6twQAJUX5MzQPH5zHOJT/rYd\nnfpYv12RDL/rIW1s+Toau6fIb717SMa7TbD66w9usrqUAz7ciu9kCohGrf2+\n9nawZNEH5l/BUmAibxjUd8LVkneg6rzXkf3BvfgR4Qc2HdAJuQ3g5kIc3vZ5\ne1JB4AViJCOsP5j5+mrfXGQkroNFOZlnzuUeZ/1zbXvQldefPmqdlsbs3Ijd\nAYWZ3Cf47BSByEAPvXfzbU2LpeF8O+9P9rP6l61FIQNgzjD0bEjBRGxq9t2Z\n/BYXjPYJ0OwALLL3fg9rkFXdsIYYjsLGgSVvgxvElCdJaWdgu//VydV5ulDJ\n3nZsbyD3rcIS9WWl2wwLavQjssSwa3ljDPBqVyvZ1Er/+Iv3YlrqWjKzez0P\n1tnCQ1LRowe2g/3SV+34TYD1S7Jj0kafFX8M9moK/pMPA9Xw6qGCxCLOhZ3R\nxRxxZCz3WjdNHkIK6k6kDSqs7eKfLQUA/VjH/XwlTvGcvYOETjhCjc6pr4t6\nRBew9Tr7rWz+RytzqDs7cIWv6eIboxP95M9rUfmeddePih3Qc2xL7T1BurVp\nx28wscd5LyQHT4VLt/0m8mVaMLgH0CE/3GUxYlpxgnpLdxp4S448VC9WORaH\nXWv5mOPCXf8rhtRaLWbVp+esdlFg19c6+/Yvfjt78/A0g+2sr+0Yo7J0W+/e\n9GWS\r\n=Y4sd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHRqzJsJL5VasPycvpxq5eJvUylPMQyNW0fvd6ait6ZrAiB3BZJqOXZqaRMmQgSSfTYPghump8GGy5qzKjaYnAY/5Q=="}]},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_0.2.0_1563573433051_0.274542610588993"},"_hasShrinkwrap":false},"1.0.0":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"1.0.0","main":"index.js","keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"ISC","engines":{"node":">=10"},"dependencies":{"debug":"^4.1.1","gtfs-rt-bindings":"^3.1.0","gtfs-rt-differential-to-full-dataset":"^1.0.0"},"devDependencies":{"bvg-hafas":"^3.0.0","hafas-monitor-trips":"^3.0.0","length-prefixed-stream":"^2.0.0"},"peerDependencies":{"hafas-client":"^5"},"scripts":{"test":"node test.js | tap-min"},"gitHead":"6b9f38bd4c3500380e10e4163e05da9a3308a8a3","_id":"hafas-gtfs-rt-feed@1.0.0","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-8K53VexyAlXwnsrXSTNdCpyDcO8tOk5LR+5RqK1nYbRpaYMLBe+KzSKUS7YzcixZLsh1yR68S3BLITGz/QXsyw==","shasum":"af7485f0b7eb2a06550d22d0c20dcfa94c5a2f3a","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-1.0.0.tgz","fileCount":6,"unpackedSize":11358,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJebSK2CRA9TVsSAnZWagAAAbQP/1vTlYYTYDnVwUCorOKR\nWFQUp4KkplMtmfcxlo8smUM83yizJhPSHb/A8RHXmvWeIuXW0lru/pwdruy5\nzdJQtinzFAT/uOzNfYglXFYc7Zjg/rWaizvd8cR0gx/JHEoh5VL0/niaX1xs\nEUwA47/QBOk3ZxWUHEM4PmGJfj8oEUvsqJPUGodUDoy/006UqRgcP7dZjfsn\nRDS3XuTfgRCjERkkiu89063CwqK7IxXY4pBxoSPhzkIgzC7OYIHxpAfK+74G\n51iV1cGRg7za7jZo69qDoDtTD9YTDJUSFnhqUvxjb52R/9NpM9kC1mZ56Jgo\nPzndZZtUIL0XdI1jNZslSlZcZuhp5ne1tByBA7QgLVCVtZsgaO9QlW1ORwW5\np6EXrR54iMvijCrCg7vAd9CCVQvjAu3fpV3kd0KeaiQ7wQn7+d1ulLplGzoV\nHk1btcWpYBYiQHJQr1JDAE4pa1LA5EaB8S8eOLcU+fOs65jlb2Cv2M/T+C30\nPqR4OkfxQLSoiHAun//K1IYlhBilU80T0ToQPLFCtFN+o4PcKDBoEi4ykDUm\npsGTgE9MFVebl62pSraRDL+2LUr9O8g0zcWD5z2DPFqvakg1qvNnxG+/xeFK\njkP0PZEcfVtM6WcwclVlMGUmUdidaTON7OhTZTpGCDwUcsp9+fszExM0W+4T\nUyBh\r\n=icbN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEqb18ETwV0zsr3jA6a38RVQlltDwDuxUbe/OvlAUmTVAiEAqxxCbZ0wPuqSTdiVO5pxdQBUril5CQxCXG6EYXTOL2o="}]},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_1.0.0_1584210613647_0.8753225805011002"},"_hasShrinkwrap":false},"1.0.1":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"1.0.1","main":"index.js","keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"ISC","engines":{"node":">=10"},"dependencies":{"debug":"^4.1.1","gtfs-rt-bindings":"^3.1.0","gtfs-rt-differential-to-full-dataset":"^1.0.0"},"devDependencies":{"bvg-hafas":"^3.0.0","hafas-monitor-trips":"^3.0.0","length-prefixed-stream":"^2.0.0"},"peerDependencies":{"hafas-client":"^5"},"scripts":{"test":"node test.js | tap-min"},"gitHead":"bd9004b33eed0787f52a5bda83f537a3a8c75040","_id":"hafas-gtfs-rt-feed@1.0.1","_nodeVersion":"13.11.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-7X9gCwZofV716wXy5cVwfudDirfoTRXLEn3n5kUOGGhCFQakP2rYRKVIilwKKzChtADdI8AN9ke7NZDCNG05lg==","shasum":"632092ec9bd5e48a5ca67d97cf4c4b979b04bd11","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-1.0.1.tgz","fileCount":6,"unpackedSize":11586,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJepKUACRA9TVsSAnZWagAAaAAQAI1TohmE2f3WjAiyhhbD\nDCTLWYdfeCM6At0jaOztYkS3TAH84uWA0gLP/tcZH9blz64MzoSFVXP/xZiU\nKWG59izfSYZ6Onddb6CcD+tmmsvCS0OPZQOXfv/5R+JicsUAspr7EWsSJtux\nUurXCsy6jc1d9wKPt0XUgYdNF232qq56d4GkGR6ztHOKcR0kJXxDC6laI3/V\nW056N/I4mf1N98oKXx8P+mvEXPUrAgTE04UQK11KH40JWcFgkX83IiRanHmL\nPDj0jkpF+bqgcqnLeNGgtn+oiecVhNNoAguaXUowmciB6e8rOjry/Kd+UwVw\nxCBkUjT07XJILLKet/rd4g3V6/D6/x8a9B2qTKOo5F7qlM8xA99wtZJEl64q\n55WqoAqnBLUBnXIKUGvqQuFnWuB4kIECKpFp0m1XROneEcqaUXLyDCgroS1p\nGMQZayTyB63QH1oyzyb31FhQBepR/mPf+pmBM9d3raYGxQAdYu/aJKQrJFau\nKNLfhfqThm4fWz5mrQh7jPPmtNXwpxRTSF01rDCu9PMbfc3CkvIXHCP/enxX\ncNMlKkeiVmohGRKcvfR2b8TrpSigF5Lxi1Ai/6v4gsTbOA7SlcH6Yw6yU4wc\n32TAp+3kdsWszgn1cEt/cXXGueW8HAuquJxASX7EL4/KLSi93DQFGoCxRmEd\nj4X1\r\n=Ht2M\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDi31h05P/sz7Ngzk3buIEymzljVUXCR4NpC19Gp0ZJoAiEA1TNXHUQMGk3rjw4hIv5RqBFaW7CTi5/JheNUsHk7fwg="}]},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_1.0.1_1587848447779_0.015361095492474552"},"_hasShrinkwrap":false},"2.0.0":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"2.0.0","main":"index.js","keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=10"},"dependencies":{"debug":"^4.1.1","gtfs-rt-bindings":"^3.1.0","gtfs-rt-differential-to-full-dataset":"^1.0.0"},"devDependencies":{"bvg-hafas":"^3.0.0","hafas-monitor-trips":"^3.0.0","length-prefixed-stream":"^2.0.0"},"peerDependencies":{"hafas-client":"^5"},"scripts":{"test":"node test.js | tap-min"},"gitHead":"6e2af361659d0eef895e99c7e8bb027a2fc84f02","_id":"hafas-gtfs-rt-feed@2.0.0","_nodeVersion":"14.2.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-h5VN8Jzawv8Z1HHdBUMYLh5qoBBDoYc3cupTBlbbyJ6J4LP1LMVzm2SiUMohYydBUQA6tVOK31p6OLyJo3M/Fg==","shasum":"522c1b33019f0df9ee19abd9a05f1a466c831dcf","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-2.0.0.tgz","fileCount":8,"unpackedSize":26612,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe2P6tCRA9TVsSAnZWagAAyyMP+gLj2fIJrhd7EtTOSugB\nf2pHqu2TTQP3exi5Os3nC4BYGxeVX67UH4vclUSTL8rzv08LOT+KSS2ntICx\nThTlG3yow2FsaRr/+yk0H0yjgK/BBnMd4RAYFYbTs1IqUNNZGYndBUbLiQpq\nwudPx1dHQg4UvOX91+gvSFLoiEp518c9mWJHEvzkuGVw8+F4LAmDDjVIm/Rk\nR2yzB2byouKTeXR1+4hSaq+RQdNsOqHld5ZmjmegxEOo6fG/syenik2m5vk8\nxW0A87G5lzjJs3rp9O12GZ+i7IWCD04Gh/tD/yQuWhYHslabUr2apEZblMpx\nkX8FgV4AznLc3amlb0cXHdmuqaprAsrf77HlMUSGuvf1NGm8tdoWV4HTRyi3\nEzn8aYoTDVPpUHEyalXcbB8FUBao2PD9/+wkM/VKLDXxG93Bcp9/egvOLmGo\nP6x5HMvsXLgOKFcpIQI6iUnc8nodsK4QPpymZRft/KWBTNJNCc1YRHuRJJ5e\n4VEAFdnJMpD1Et7J94HSvBOGDcBuwRGkQ+Xmaho8upfQz0OB24Ys4NNKte+O\nHzAe32BPvJvvnFhPo/Aq0Z1EK5DP/ZXkoXn+utYr0WFdBqdIKOyku5iJNk6P\nXKwO3GpsAJcZQBNzqTkYf8/ro1L28VG9mP+TfNGI6rz613MABthoT3UgrdWo\ncJky\r\n=TSve\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD1cjDSBqpOSe0rTrUgOt4FXW+Q63Lb6iY7boF5B+IfBQIgT2oqVpyXKHU2pu1Q7C1hA5YMGHU/8srwOW9IrIC9dAg="}]},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_2.0.0_1591279277178_0.35239962269666125"},"_hasShrinkwrap":false},"3.0.0":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"3.0.0","main":"index.js","keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=10"},"dependencies":{"debug":"^4.1.1","gtfs-rt-bindings":"^3.1.0","gtfs-rt-differential-to-full-dataset":"^1.0.0"},"devDependencies":{"bvg-hafas":"^3.0.0","hafas-monitor-trips":"^3.0.0","length-prefixed-stream":"^2.0.0"},"peerDependencies":{"hafas-client":"^5"},"scripts":{},"gitHead":"68a9f45315906838445a455ea850f2c3216e9d6e","_id":"hafas-gtfs-rt-feed@3.0.0","_nodeVersion":"14.9.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-EygtVaK/25l8rRizO1PwI6AhyN+dRHEAwk5EcFoVPjkJvM3GlqsDe5SS0MU4GcqNyORKC6jxZnR/QXbeKBMN1g==","shasum":"392e47e2360c071c98299e2d481eca1a455ddff0","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-3.0.0.tgz","fileCount":8,"unpackedSize":26700,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJflB4aCRA9TVsSAnZWagAAmwMQAJcHxZAZNW6I7xXkgOvE\nt60l/r7BCdLYC1EXEUdMSb2vHWp5i2BPm/Yb1tY5N0i/2IUpHH/H0D8TDBM2\nIpOZMY0kfblV75wTMMrLcdJvUdG7Ai9dsljIrmjg6L7z7l94qDiOesSH/d9C\nO6Tw9sF4+kSl+E+Gg1GC4Bx1gELbPmHEWG9kwqe7V4JLWS814B2CIr+vDGvA\n1JouCgfeSaDNVJv7IEo3sQe9nd3la6FLHT9iCIqQVMCmyP5p+Llv4CnD08p1\n2afXTbwbIE3qvdEkZWNSpzuv7uYJDadKM93ASw/4JdV3KGiPeSoENmaDHTVX\nuVTUKg/CqjKd8q0Ysrbk/xm+elkVt2oV2oURqepSe8AR1mcXryP7F/gbQ0Y0\nKIqs/G5NyC0xVBGp2WHUK50h8aO+yd2dFLJrUWrtNp/z+VakaIGqlpBQMzbj\ntwbtdH1fKLr6h/fRt0WhsfkHq11kOLHP1JMKE9ffxJuhJYAFJ3Bbr6F2WvQR\nzE2Nyl81fMHJdZCe/RECjM92aUVxb6+OEdhGEqhmpmsE8AUM0xVfkeOZDGjY\nGLTlkPPRthP0WDWqiOQzbA0dXqONG+takhJ9VbPEmIFfxNDrN+YkXF35Aayc\nJU8t7lT8YnVZsQWZupg4ksqUbFlAZ7eSZzs5OOoHz/rc+2FO8oxIeGyQiIZ6\nJwXC\r\n=8FLg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAMKT0TMI6ETVpSbe0uplTyYEJUUGTZq/mDEwA0OwB8DAiBh29UEigrCqsPq7AXvJBwOZXPUwxxkNYkamxEc7xMBWg=="}]},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_3.0.0_1603542553738_0.08020316590333976"},"_hasShrinkwrap":false},"3.1.0":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"3.1.0","main":"index.js","keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=10"},"dependencies":{"debug":"^4.1.1","gtfs-rt-bindings":"^3.1.0","gtfs-rt-differential-to-full-dataset":"^1.0.0","lodash":"^4.17.20","luxon":"^1.25.0"},"devDependencies":{"bvg-hafas":"^3.0.0","eslint":"^7.14.0","hafas-monitor-trips":"^3.0.0","length-prefixed-stream":"^2.0.0","tap-min":"^2.0.0","tape":"^5.0.1"},"peerDependencies":{"hafas-client":"^5"},"scripts":{"lint":"eslint .","test":"node test/index.js | tap-min","prepublishOnly":"npm run lint && npm test"},"gitHead":"e2ac49ce3ccc40dd5729e73349e265063f79dfb0","_id":"hafas-gtfs-rt-feed@3.1.0","_nodeVersion":"15.3.0","_npmVersion":"6.14.9","dist":{"integrity":"sha512-FzWSAhDU5XaVlVXm4LXGf+iFOPZfe+nvbBnSQkVP3QEbOn7NwpXTgVJT/0GRSW9aMkH8SY8vmoHiDAJkI9Kb+g==","shasum":"648fd661f104933a10722502ad689e9bf377b80b","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-3.1.0.tgz","fileCount":9,"unpackedSize":29066,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf1hbZCRA9TVsSAnZWagAAt94P/1il9Afx9SWpLefxUhF6\nJkVDPbnFC0vwytRUwviLjWIVgDjPyA6oEH42sxIsJdyHvYIoxdqFEfsn0dYR\n5Ux3Kiohl5PHXtehWvwQt9pOg8egMXDw1KtCyB2i14ESR0RAtcTYyRhUyE6K\nkRzQNqjtYDNzPLdND7/RKJ/3+UwQyv4zE+08gqTzPb31nOceg9P6jT9vJ6xl\nXkUPfStX2YTrfTXHPc2Xg8Dtlyz4Jz0toT+HSDJZDNMuHnYTPFDiwHUWG2uJ\nYmsBIEw5fNGs8IvyOMvZI4aGGlMZNU/pkR+xs8EOYarIeGvznfxLMy1v/eIg\nmR55UR8/KrteVPfDdj/it9MYasuRgO93twiawocFJKdrIh+BcYyV3JrKeG5/\nLrCECr+812vyk/ZIFsS1YLTYbr6OrEJNd3NjhL5nVt/NeV29lhCyH3iH5+TP\nPrAxdP71HXwJ/XSV2k0IWtPkeFBuD5WawzmxfNWz6mAh2rV0MRGIgX9fnl84\nTCMwLXZCkaoZ4cTK3abkFrNjQboI2bDBlNRnBoSWHG/+0V+O6Pm40TbKHFwD\nMwBKge83zf1syJhYbHVxWOYcaREdFIaeI2wSQOaDiltuAS0t/JwammcSwwWB\nD+BM6N3u3SWNVfeiHnMLW+yG+zBho3898aTSoZFlihKwx3X+qre4FKwnzxWD\nGYU+\r\n=c4Z4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDSChBtAPL7ZwBfNsyLDZ7mKjNN7ThmovRGzVy+1CQf9AIgc5JcLZ+cpJh1u8kDHh08fPLV1NBH4/eQ3DO95hHTAUU="}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_3.1.0_1607866072860_0.8658143010283714"},"_hasShrinkwrap":false},"3.2.0":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"3.2.0","main":"index.js","keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=10"},"dependencies":{"debug":"^4.1.1","gtfs-rt-bindings":"^3.1.0","gtfs-rt-differential-to-full-dataset":"^1.0.0","lodash":"^4.17.20","luxon":"^1.25.0"},"devDependencies":{"bvg-hafas":"^3.0.0","eslint":"^7.14.0","hafas-monitor-trips":"^3.0.0","length-prefixed-stream":"^2.0.0","tap-min":"^2.0.0","tape":"^5.0.1"},"peerDependencies":{"hafas-client":"^5"},"scripts":{"lint":"eslint .","test":"node test/index.js | tap-min","prepublishOnly":"npm run lint && npm test"},"gitHead":"a1b7fd3ac8986528b58fb23799ab6e20b99cc2b1","_id":"hafas-gtfs-rt-feed@3.2.0","_nodeVersion":"15.3.0","_npmVersion":"6.14.9","dist":{"integrity":"sha512-7id76lMMMKHMxpzzKxOY6bH/5wm82f/SmYdaFSJ8Tz1yw5esSZRUmdnCihGa6lxGzz2EMWyjgnEJ3ylOADcMrA==","shasum":"df06328324866ee3bbe92abdd9033bac5548c63f","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-3.2.0.tgz","fileCount":9,"unpackedSize":29106,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf1n45CRA9TVsSAnZWagAAwdQP/jSqljsleGtdNlsbq8mS\n2dTO8z2Y6MgumX+rnv9uGIGod0yR0vIfiOyvQp8wBs9ERVw0u69mr/ZlqAF+\n7hNDT9qP7Q5/dmnbIfm0mJM5kDg3eLT3QEPAv8rMG7NB/4R3I6bLV4E4uXsO\nEVyC0pbNE3Oy3n7VOwIjMmUf9mpWCqnayf6MuLk26jWs/SELQyGkYgqQ3TmO\nLMskpmfnmJLOEXpcbT0VPMtm23dgZyEolHPlp0x5FFc8Rc1J474Fczk8EZq8\nAprmH2JLNJAgO+xKeeqyVgnMkPAH0cvxK2G5mnYixZ8LEJ8n4IlZK6nhdy2I\nBGe5by7is44RkLBZ43T0m7USkeKlYFsX1Q6OI+SdsuTLhQMq9JuApza/zTud\n0R+vye/NbZYuTsbyqZMKscw4exAD/E3GPvYoXV0PIJdBs8y1vLPl57Ll3OJo\n2esgGOlgjcUGEQcoQ1qvpi3niahA1qZArSwu0/BekJByyJEOg+H6d5wDPr5S\nTf504hcxtIwLqbKDFdyw2mxUoRT0DrJM/S0EcU4lBBh8OrXN1VKqWw/dd8T7\nZoGzLYkFj8GBAm/GjJQa6s3duVvNtB228KGne5R7N4RVqvt7CG511BBs9pVi\npGpYmUWms0p4UNZkn7dL/aFQhv6jVEqM5qyqUS+wc5QTQSJDmGxWJ4eyfN4s\nS+py\r\n=nNr9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQClAcTICUz7Ocg05PyQYsuOrfcsZE4NoCZNguEiLJsQowIhAOaQX2amnwCZCHPNTqkNSlD8C4lyVlfX4nbqkmsLv4iG"}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_3.2.0_1607892537304_0.5524745681584744"},"_hasShrinkwrap":false},"3.3.0":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"3.3.0","main":"index.js","keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=10"},"dependencies":{"debug":"^4.1.1","gtfs-rt-bindings":"^3.1.0","gtfs-rt-differential-to-full-dataset":"^1.0.0","lodash":"^4.17.20","luxon":"^1.25.0"},"devDependencies":{"bvg-hafas":"^3.0.0","eslint":"^7.14.0","hafas-monitor-trips":"^3.0.0","length-prefixed-stream":"^2.0.0","tap-min":"^2.0.0","tape":"^5.0.1"},"peerDependencies":{"hafas-client":"^5"},"scripts":{"lint":"eslint .","test":"node test/index.js | tap-min","prepublishOnly":"npm run lint && npm test"},"gitHead":"d7c210873855fdd53fa698c45d978d41ee99f7b6","_id":"hafas-gtfs-rt-feed@3.3.0","_nodeVersion":"15.3.0","_npmVersion":"6.14.9","dist":{"integrity":"sha512-THzAwwGCYlKn742grlIyPha7kMcLf/sasE6WayXMCrtDmh50kkX1umbJKDpsZV862qiMpVq2dOjLv/tEEsCEug==","shasum":"562c77c07b44b531e563aeb40cb8d2c44be3a20e","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-3.3.0.tgz","fileCount":9,"unpackedSize":29473,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf50y3CRA9TVsSAnZWagAAWA8QAJGTokhhIfWQS7NovXhk\ncoqBmybaqdVCaIZ3T0AEmugsEC9bWMs30guGPKSPRBfz9jgu83al/YBvgaoT\nv2FK8hY94WJQvg/DawARAkx2XorFX2pSU5PHurg1++juIJMSArr3oC2ZAEyw\nVLP93sz2anhPBgSQbz7hyprfbYdPZoz7EFA6x3pRaZN0OQ0DMFzxnJYQcsLV\nZp56VQRcPmVYVWoZWMM2ZgVAwkF8sGkKaZRAAhXKJaPs0EWTxAHNTGgtU5bQ\ncK4aDiyEjvLPTWiS/Jig0zrs8VP9dTUtO2rE+NbGJmuxmSxKQnGe6Adlt5N1\natyPm/U4mHe3RvDeIoIXxl9ZCZR1DPNPTLJkwpX4fYwsHpZCoWj9ukoak+o1\nH1SIucrMjroLMO1MWz6FucVkBk7qWg2AwUSYHcSNRiUZNrcO0ByGMUCp+5GW\nMeDqMlCuDsX+rJGl+19E0dfWD+rZ4VmCzTBoY1FspvCQrxoO6OWm79hD8RNn\nEKqtVLc8OQaj/J423XYtF+NjDIm0k9n/F5JekShRxB+MoKmATiXjo0LjkY6g\niL//cv0PGPzC1HckxeyU8kFrNk32GpFsFoyQVRi8b/DZPYOIjCLy+kdxNQqT\nQ+yycybVhruQJHjRGK41BuSoE5CBwH0PuoFwLK+d2q3To4n2oRCxe4dtK/Xl\n632W\r\n=sPYm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEpWIt/XgWgtn2jw9RFTuKq/lyA/p1qDxgGfhtDTr6FFAiBDxBZdJh71fcDpMh3qxBu70jjqMgQx4T7uY3f1Eoo9jw=="}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_3.3.0_1608993975236_0.31911782245445464"},"_hasShrinkwrap":false},"3.4.0":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"3.4.0","main":"index.js","keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=10"},"dependencies":{"debug":"^4.1.1","gtfs-rt-bindings":"^3.1.0","gtfs-rt-differential-to-full-dataset":"^1.0.0","lodash":"^4.17.20","luxon":"^1.25.0"},"devDependencies":{"bvg-hafas":"^3.0.0","eslint":"^7.14.0","hafas-monitor-trips":"^3.0.0","length-prefixed-stream":"^2.0.0","tap-min":"^2.0.0","tape":"^5.0.1"},"peerDependencies":{"hafas-client":"^5"},"scripts":{"lint":"eslint .","test":"node test/index.js | tap-min","prepublishOnly":"npm run lint && npm test"},"gitHead":"0dd53a622cd25b8eb3f3a20431b56b0b009e1990","_id":"hafas-gtfs-rt-feed@3.4.0","_nodeVersion":"15.3.0","_npmVersion":"6.14.9","dist":{"integrity":"sha512-prUXGGZE+bxb3sVSE/rL8JmfRnuIwWNjynfxfbqzGFG/Vi5qRZQthfw29oMq7+OyZw3r3SyX54D7nRULX7P+EA==","shasum":"9c5ab8c9c09c7738fd54935273e19686856fa758","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-3.4.0.tgz","fileCount":9,"unpackedSize":29631,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf73QqCRA9TVsSAnZWagAAQxcP+wa6G+JRBZ16vPgnabFI\nLd/ww7WCH4k+Sh7d+384r0ss6zoAhl3gYPGRTJ6qDABDkbUFAmMgkWlZGZKo\nOVDYETviLzgMgL9AJUmll0FsH4EkrWQ1R6pXJ4hLFeMzSlXyOuPQO/g5F7AW\n+ddkswqmNgYO6gQT/gBI1eDKchsOYV+g+tf8nk1+/BmlGmDNrW3RGT/iBH+8\njhm4NfCLhGvbxkkuOs3Q+YMGx/cyJ9NC4LrMf8HzQTcVxGwAAGKSWsWXM2Ub\nDF71QgJ+qlbkUPuFnBwFM59PGpJcuzKx6R+1QdzQ3EhfUHt3IU7O4+n11gN8\neOjiY3MLE1r0oLuWj9fpcf3AmZUJebj5WJDr2ADWhPKbrJTLi2mIq+B6Xcw2\nJ6G4DrKRSTWHwlPeICcfX95eMAo2tnWVYzlmmP7W8vfRYHXiNe91ATg4clyb\nQKyAjVW+xSnCRlzFOY1bkmxP3zaqiIT/BT98Ion5Sog7mpIaJS3tXg2zAEdr\nNfbORcBBk7bq3yNn4SWzOKh0xvS47EpKWaig4ShS1TANnFucLESmOZLlg/bE\n64XdF8YfAIWV+7DKAtWy80DvW3XMGnxW9AhzhXDAFbD+tLDyRk40ve7X+7a/\ndO8tRYYdSEktGobYKYgllbx5lkwdQkG/DGeujPKZEmGQ1/uWrnuPQrOYhkFS\nCWZj\r\n=Hpiw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFrYUR0g8TWURuEHKU0jnALNSSMdedY29CTpJ5qgCBQcAiBY7vClpTrXOlxs0yzWYCdVtw4TFrpuo5yuakdLjqZ/WA=="}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_3.4.0_1609528361396_0.1551091941252285"},"_hasShrinkwrap":false},"4.0.0-alpha.1":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"4.0.0-alpha.1","main":"index.js","keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=12"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^3.1.0","gtfs-rt-differential-to-full-dataset":"^1.1.0","hafas-monitor-trips":"^4.0.0","live-moving-average":"^1.1.0","lodash":"^4.17.20","luxon":"^1.25.0","match-gtfs-rt-to-gtfs":"^3.4.0","ndjson":"^2.0.0","p-limit":"^3.0.2","parallel-stream":"^1.1.2","pino":"^6.7.0","serve-buffer":"^2.3.0"},"peerDependencies":{"gtfs-via-postgres":"^2.4.2","hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^7.11.0","gtfs-via-postgres":"^2.4.2","hafas-client":"*","print-gtfs-rt-cli":"^1.2.0","sample-gtfs-feed":"^0.7.0","slugg":"^1.2.1","tokenize-vbb-station-name":"^1.1.0"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"readme":"# hafas-gtfs-rt-feed\n\n**Generate a [GTFS Realtime](https://developers.google.com/transit/gtfs-realtime/) feed by polling a [HAFAS endpoint](https://github.com/public-transport/hafas-client#background).**\n\n[![npm version](https://img.shields.io/npm/v/hafas-gtfs-rt-feed.svg)](https://www.npmjs.com/package/hafas-gtfs-rt-feed)\n[![build status](https://img.shields.io/travis/derhuerst/hafas-gtfs-rt-feed.svg)](https://travis-ci.org/derhuerst/hafas-gtfs-rt-feed)\n[![Prosperity/Apache license](https://img.shields.io/static/v1?label=license&message=Prosperity%2FApache&color=0997E8)](#license)\n[![support me via GitHub Sponsors](https://img.shields.io/badge/support%20me-donate-fa7664.svg)](https://github.com/sponsors/derhuerst)\n[![chat with me on Twitter](https://img.shields.io/badge/chat%20with%20me-on%20Twitter-1da1f2.svg)](https://twitter.com/derhuerst)\n\n`hafas-gtfs-rt-feed`\n\n1. gets a [`hafas-client`](https://github.com/public-transport/hafas-client) instance passed in, and uses [`hafas-monitor-trips`](https://github.com/derhuerst/hafas-monitor-trips) to poll live data about all vehicles in the specified bounding box.\n2. uses [`match-gtfs-rt-to-gtfs`](https://github.com/derhuerst/match-gtfs-rt-to-gtfs) to match the HAFAS-ish data against static GTFS data imported in a database using [`gtfs-via-postgres`](https://github.com/derhuerst/gtfs-via-postgres).\n3. uses [`gtfs-rt-differential-to-full-dataset`](https://github.com/derhuerst/gtfs-rt-differential-to-full-dataset) to aggregate the data into a single [GTFS Realtime (GTFS-RT)](https://developers.google.com/transit/gtfs-realtime/) feed, and [`serve-buffer`](https://github.com/derhuerst/serve-buffer) to serve the feed from memory.\n\n\n## Installing\n\n```shell\nnpm install hafas-gtfs-rt-feed\n```\n\n\n## Usage\n\n```shell\ntodo\n```\n\n\n## Related\n\n- [`hafas-gtfs-rt-server-example`](https://github.com/derhuerst/hafas-gtfs-rt-server-example) – Using [`hafas-client`](https://github.com/public-transport/hafas-client), [`hafas-monitor-trips`](https://github.com/derhuerst/hafas-monitor-trips) & [`hafas-gtfs-rt-feed`](https://github.com/derhuerst/hafas-gtfs-rt-feed) as a GTFS-RT server.\n- [`match-gtfs-rt-to-gtfs`](https://github.com/derhuerst/match-gtfs-rt-to-gtfs) – Match realtime transit data (e.g. from [GTFS Realtime](https://gtfs.org/reference/realtime/v2/)) with [GTFS Static](https://gtfs.org/reference/static) data, even if they don't share an ID.\n- [`gtfs-rt-differential-to-full-dataset`](https://github.com/derhuerst/gtfs-rt-differential-to-full-dataset) – Transform a continuous [GTFS Realtime](https://developers.google.com/transit/gtfs-realtime/) stream of [`DIFFERENTIAL` incrementality](https://developers.google.com/transit/gtfs-realtime/reference/#enum-incrementality) data into a [`FULL_DATASET`](https://developers.google.com/transit/gtfs-realtime/reference/#enum-incrementality) dump.\n- [`transloc-to-gtfs-real-time`](https://github.com/jonathonwpowell/transloc-to-gtfs-real-time) – Transform Transloc Real Time API to the GTFS RealTime Format\n\n\n## License\n\nThis project is dual-licensed: **My contributions are licensed under the [*Prosperity Public License*](https://prosperitylicense.com), [contributions of other people](https://github.com/derhuerst/hafas-gtfs-rt-feed/graphs/contributors) are licensed as [Apache 2.0](https://apache.org/licenses/LICENSE-2.0)**.\n\n> This license allows you to use and share this software for noncommercial purposes for free and to try this software for commercial purposes for thirty days.\n\n> Personal use for research, experiment, and testing for the benefit of public knowledge, personal study, private entertainment, hobby projects, amateur pursuits, or religious observance, without any anticipated commercial application, doesn’t count as use for a commercial purpose.\n\n[Buy a commercial license](https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b) or read more about [why I sell private licenses for my projects](https://gist.github.com/derhuerst/0ef31ee82b6300d2cafd03d10dd522f7).\n\n\n## Contributing\n\nIf you have a question or have difficulties using `hafas-gtfs-rt-feed`, please double-check your code and setup first. If you think you have found a bug or want to propose a feature, refer to [the issues page](https://github.com/derhuerst/hafas-gtfs-rt-feed/issues).\n\nBy contributing, you agree to release your modifications under the [Apache 2.0 license](LICENSE-APACHE).\n","readmeFilename":"readme.md","gitHead":"b2de3dca05a1a696d35278e35520f270c3e40b1d","_id":"hafas-gtfs-rt-feed@4.0.0-alpha.1","_nodeVersion":"15.5.0","_npmVersion":"7.3.0","dist":{"integrity":"sha512-9uVQlvVxPNZWL8YwKEW7vtxcTsUD2omrZTkKBzPf5T5g4ZKwJ0NVaBgarn3TnygDenPtA43X0i11wEc6Qs2O+A==","shasum":"7c4c3f37a01da8c76392a673154154786f8ba0fd","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-4.0.0-alpha.1.tgz","fileCount":12,"unpackedSize":35126,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf9iExCRA9TVsSAnZWagAApLAP/0zV+V77+iTErG0Bd8vl\nFmZfhkFyPMbdlK387yQ85cs+bGtCLylkobHyT3BjHJ1TDnkLquyV4juZ0rIR\n+OdXmV7+5kQEZGKpRgpTbC6tqH4vTKpereQzMXVDu+T3mejmvGDYqPpYQXkK\notWqBXqRmvjidxAydPJdJT/ucPp+2LW1/Ge1T5N0ZEuPaQ7WeRo/ztbL/7X2\nyYrmO7ysDPyv6U7CKoeJYqxRXb07ucuMus8/i9I/A9yNvKrXznd0ptBNyT7C\nbp35gpFccMBHXnyFpSy7Wi3+038MSTxcjsAmqUEtYla9YufPvIu0hlB8DMsK\nzj6y/OheeRfqHRwTWx+vGl4vu5+0P6UjTXPRgQNsE17N774oJgt5p0tk5Kf7\nJbPkdTozBmy6sdbstrMDtEx/rCxJfVpepg3p3LlTcJwoAHUXCjL5NxWHgzAm\nCUORqqh9klwRTuOT0V9AoJxt7df/mvNPQfHi4Nx5PWYviSHvX00QkQNxLMt5\nLAY1XBFD1uOmPbMA6qCZN5hHxZDUpfsfW72EjgIr4d3NYhg/UqK/urnQielc\nnSTGqO9X2CJC5QVusCFCPDKsX3bKHecww5438rnwneMMwPsRWu+J1oOPhm0B\npdl54VkqAHiaGuRcLtSG5dKAhTRvX1l5L7tqWfOSKIt6yQDwRAKbjvM7gysZ\nwg4l\r\n=W3/Z\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB26Zek8hS1MI0dru5B+bvDArdPAVO3PZaxyvqwua4NCAiEAtKepE2WUfpETn2c2jUSozPZcG9heqijvksk491goDn8="}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_4.0.0-alpha.1_1609965872794_0.5555036814768131"},"_hasShrinkwrap":false},"4.0.0-alpha.3":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"4.0.0-alpha.3","main":"index.js","keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=12"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^3.1.0","gtfs-rt-differential-to-full-dataset":"^1.1.0","hafas-monitor-trips":"^4.0.0","live-moving-average":"^1.1.0","lodash":"^4.17.20","luxon":"^1.25.0","match-gtfs-rt-to-gtfs":"^3.4.0","node-nats-streaming":"^0.3.2","p-limit":"^3.0.2","pino":"^6.7.0","serve-buffer":"^2.3.0","speedometer":"^1.1.0"},"peerDependencies":{"gtfs-via-postgres":"^2.4.2","hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^7.11.0","gtfs-via-postgres":"^2.4.2","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","print-gtfs-rt-cli":"^1.2.0","sample-gtfs-feed":"^0.7.0","slugg":"^1.2.1","tokenize-vbb-station-name":"^1.1.0"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"readme":"# hafas-gtfs-rt-feed\n\n**Generate a [GTFS Realtime](https://developers.google.com/transit/gtfs-realtime/) feed by polling a [HAFAS endpoint](https://github.com/public-transport/hafas-client#background).**\n\n[![npm version](https://img.shields.io/npm/v/hafas-gtfs-rt-feed.svg)](https://www.npmjs.com/package/hafas-gtfs-rt-feed)\n[![build status](https://img.shields.io/travis/derhuerst/hafas-gtfs-rt-feed.svg)](https://travis-ci.org/derhuerst/hafas-gtfs-rt-feed)\n[![Prosperity/Apache license](https://img.shields.io/static/v1?label=license&message=Prosperity%2FApache&color=0997E8)](#license)\n[![support me via GitHub Sponsors](https://img.shields.io/badge/support%20me-donate-fa7664.svg)](https://github.com/sponsors/derhuerst)\n[![chat with me on Twitter](https://img.shields.io/badge/chat%20with%20me-on%20Twitter-1da1f2.svg)](https://twitter.com/derhuerst)\n\n`hafas-gtfs-rt-feed`\n\n1. gets a [`hafas-client`](https://github.com/public-transport/hafas-client) instance passed in, and uses [`hafas-monitor-trips`](https://github.com/derhuerst/hafas-monitor-trips) to poll live data about all vehicles in the specified bounding box.\n2. uses [`match-gtfs-rt-to-gtfs`](https://github.com/derhuerst/match-gtfs-rt-to-gtfs) to match the HAFAS-ish data against static GTFS data imported in a database using [`gtfs-via-postgres`](https://github.com/derhuerst/gtfs-via-postgres).\n3. uses [`gtfs-rt-differential-to-full-dataset`](https://github.com/derhuerst/gtfs-rt-differential-to-full-dataset) to aggregate the data into a single [GTFS Realtime (GTFS-RT)](https://developers.google.com/transit/gtfs-realtime/) feed, and [`serve-buffer`](https://github.com/derhuerst/serve-buffer) to serve the feed from memory.\n\n\n## Installing\n\n```shell\nnpm install hafas-gtfs-rt-feed\n```\n\n\n## Usage\n\n```shell\ntodo\n```\n\n\n## Related\n\n- [`hafas-gtfs-rt-server-example`](https://github.com/derhuerst/hafas-gtfs-rt-server-example) – Using [`hafas-client`](https://github.com/public-transport/hafas-client), [`hafas-monitor-trips`](https://github.com/derhuerst/hafas-monitor-trips) & [`hafas-gtfs-rt-feed`](https://github.com/derhuerst/hafas-gtfs-rt-feed) as a GTFS-RT server.\n- [`match-gtfs-rt-to-gtfs`](https://github.com/derhuerst/match-gtfs-rt-to-gtfs) – Match realtime transit data (e.g. from [GTFS Realtime](https://gtfs.org/reference/realtime/v2/)) with [GTFS Static](https://gtfs.org/reference/static) data, even if they don't share an ID.\n- [`gtfs-rt-differential-to-full-dataset`](https://github.com/derhuerst/gtfs-rt-differential-to-full-dataset) – Transform a continuous [GTFS Realtime](https://developers.google.com/transit/gtfs-realtime/) stream of [`DIFFERENTIAL` incrementality](https://developers.google.com/transit/gtfs-realtime/reference/#enum-incrementality) data into a [`FULL_DATASET`](https://developers.google.com/transit/gtfs-realtime/reference/#enum-incrementality) dump.\n- [`transloc-to-gtfs-real-time`](https://github.com/jonathonwpowell/transloc-to-gtfs-real-time) – Transform Transloc Real Time API to the GTFS RealTime Format\n\n\n## License\n\nThis project is dual-licensed: **My contributions are licensed under the [*Prosperity Public License*](https://prosperitylicense.com), [contributions of other people](https://github.com/derhuerst/hafas-gtfs-rt-feed/graphs/contributors) are licensed as [Apache 2.0](https://apache.org/licenses/LICENSE-2.0)**.\n\n> This license allows you to use and share this software for noncommercial purposes for free and to try this software for commercial purposes for thirty days.\n\n> Personal use for research, experiment, and testing for the benefit of public knowledge, personal study, private entertainment, hobby projects, amateur pursuits, or religious observance, without any anticipated commercial application, doesn’t count as use for a commercial purpose.\n\n[Buy a commercial license](https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b) or read more about [why I sell private licenses for my projects](https://gist.github.com/derhuerst/0ef31ee82b6300d2cafd03d10dd522f7).\n\n\n## Contributing\n\nIf you have a question or have difficulties using `hafas-gtfs-rt-feed`, please double-check your code and setup first. If you think you have found a bug or want to propose a feature, refer to [the issues page](https://github.com/derhuerst/hafas-gtfs-rt-feed/issues).\n\nBy contributing, you agree to release your modifications under the [Apache 2.0 license](LICENSE-APACHE).\n","readmeFilename":"readme.md","gitHead":"2f28b0e731feaa391ee495a3049b560a2fecf964","_id":"hafas-gtfs-rt-feed@4.0.0-alpha.3","_nodeVersion":"15.5.0","_npmVersion":"7.3.0","dist":{"integrity":"sha512-jzPv3IOp8oRzOiNRXppEnnoQUHQ5lqo8SgfTIfBmDS1ydo7ww0lFRZRb3Re3mYolifFMdSo46xLiuQWGoY+L8A==","shasum":"7d1b01af7b7d28402b7e152d0714c45558f410c3","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-4.0.0-alpha.3.tgz","fileCount":14,"unpackedSize":39072,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf/exbCRA9TVsSAnZWagAAzNUP/2Wwakx7vGVLHg+zYlAQ\nkBnGzWewuv0FuohmLVNUTYwAtariHWJolhZU1J+e7zIsPUSkgNVHw0uUCEPP\nck1UqTm30mV2/Q8a93lzogYwoEIk4sA4zPrVXMu42pkgdzPFK8Rtqw6jelvW\nVjjnKcPzDvH82zMzX37dI3hVakkHPWmB8rqQAPzeQPnFGVbfrgy6X2S7mr6P\nbGQBjFQ6SgWpZ0nB0+iUxrmD7LuZ79lvGC7TVIFE68DLbO7tCTyzzcG31oxx\n7inUxya1wDlDAYR2YXAUIk7ZdzXW3f0RliB7EWccuROLowdcrdy59dEw9N6z\nE58XSHmZOLRv1C9qPAaPXQyfYyVg0WNBOuX0yDQGvPgU22pLpbWmiI29PanY\nN4parmI3VvbXJD0lGSfeBipFOuwZz/WxV+rL4Mua38Ap2jKfQlmCxb6MWQM6\nHBjUvMdhOFLwoNs1wbEZzyQOIMDr/mw3WTnzVJgQZjhYewslA5u44TC+/8PZ\n7jExkWHR+4BiWLM7Ge+yL9umVml0E9vs1zxfKY/JlONNcvG6IcY+F4Bg8327\n6fQNTU6+Tx+bBdGQU+TJ/Vd64AYupG2whjaeffJrXVIZ2wYnkWwqzKOWt8Oe\nNzEwHkUWvSDpvN402D9zXm5hMI1HNajx91J2VoKW991NPMnEs0cl5coJt9jh\nTA6W\r\n=oLRi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCm5Kg81yDqt8W4J0B/EF3Y7WW+x8It6bJQHFv6FDOApwIgBYYmuJWJ/UsTImDG9bIlynLSzwgK8c5NRSkPfm8yGtA="}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_4.0.0-alpha.3_1610476635181_0.8285017088770104"},"_hasShrinkwrap":false},"4.0.0-alpha.4":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"4.0.0-alpha.4","main":"index.js","keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=12"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^3.1.0","gtfs-rt-differential-to-full-dataset":"^1.1.0","hafas-monitor-trips":"^4.0.0","live-moving-average":"^1.1.0","lodash":"^4.17.20","luxon":"^1.25.0","match-gtfs-rt-to-gtfs":"^3.4.0","node-nats-streaming":"^0.3.2","p-limit":"^3.0.2","pino":"^6.7.0","serve-buffer":"^2.3.0","speedometer":"^1.1.0"},"peerDependencies":{"gtfs-via-postgres":"^2.4.2","hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^7.11.0","gtfs-via-postgres":"^2.4.2","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","print-gtfs-rt-cli":"^1.2.0","sample-gtfs-feed":"^0.7.0","slugg":"^1.2.1","tokenize-vbb-station-name":"^1.1.0"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"readme":"# hafas-gtfs-rt-feed\n\n**Generate a [GTFS Realtime](https://developers.google.com/transit/gtfs-realtime/) feed by polling a [HAFAS endpoint](https://github.com/public-transport/hafas-client#background).**\n\n[![npm version](https://img.shields.io/npm/v/hafas-gtfs-rt-feed.svg)](https://www.npmjs.com/package/hafas-gtfs-rt-feed)\n[![build status](https://img.shields.io/travis/derhuerst/hafas-gtfs-rt-feed.svg)](https://travis-ci.org/derhuerst/hafas-gtfs-rt-feed)\n[![Prosperity/Apache license](https://img.shields.io/static/v1?label=license&message=Prosperity%2FApache&color=0997E8)](#license)\n[![support me via GitHub Sponsors](https://img.shields.io/badge/support%20me-donate-fa7664.svg)](https://github.com/sponsors/derhuerst)\n[![chat with me on Twitter](https://img.shields.io/badge/chat%20with%20me-on%20Twitter-1da1f2.svg)](https://twitter.com/derhuerst)\n\n`hafas-gtfs-rt-feed`\n\n1. gets a [`hafas-client`](https://github.com/public-transport/hafas-client) instance passed in, and uses [`hafas-monitor-trips`](https://github.com/derhuerst/hafas-monitor-trips) to poll live data about all vehicles in the specified bounding box.\n2. uses [`match-gtfs-rt-to-gtfs`](https://github.com/derhuerst/match-gtfs-rt-to-gtfs) to match the HAFAS-ish data against static GTFS data imported in a database using [`gtfs-via-postgres`](https://github.com/derhuerst/gtfs-via-postgres).\n3. uses [`gtfs-rt-differential-to-full-dataset`](https://github.com/derhuerst/gtfs-rt-differential-to-full-dataset) to aggregate the data into a single [GTFS Realtime (GTFS-RT)](https://developers.google.com/transit/gtfs-realtime/) feed, and [`serve-buffer`](https://github.com/derhuerst/serve-buffer) to serve the feed from memory.\n\n\n## Installing\n\n```shell\nnpm install hafas-gtfs-rt-feed\n```\n\n\n## Usage\n\n```shell\ntodo\n```\n\n\n## Related\n\n- [`hafas-gtfs-rt-server-example`](https://github.com/derhuerst/hafas-gtfs-rt-server-example) – Using [`hafas-client`](https://github.com/public-transport/hafas-client), [`hafas-monitor-trips`](https://github.com/derhuerst/hafas-monitor-trips) & [`hafas-gtfs-rt-feed`](https://github.com/derhuerst/hafas-gtfs-rt-feed) as a GTFS-RT server.\n- [`match-gtfs-rt-to-gtfs`](https://github.com/derhuerst/match-gtfs-rt-to-gtfs) – Match realtime transit data (e.g. from [GTFS Realtime](https://gtfs.org/reference/realtime/v2/)) with [GTFS Static](https://gtfs.org/reference/static) data, even if they don't share an ID.\n- [`gtfs-rt-differential-to-full-dataset`](https://github.com/derhuerst/gtfs-rt-differential-to-full-dataset) – Transform a continuous [GTFS Realtime](https://developers.google.com/transit/gtfs-realtime/) stream of [`DIFFERENTIAL` incrementality](https://developers.google.com/transit/gtfs-realtime/reference/#enum-incrementality) data into a [`FULL_DATASET`](https://developers.google.com/transit/gtfs-realtime/reference/#enum-incrementality) dump.\n- [`transloc-to-gtfs-real-time`](https://github.com/jonathonwpowell/transloc-to-gtfs-real-time) – Transform Transloc Real Time API to the GTFS RealTime Format\n\n\n## License\n\nThis project is dual-licensed: **My contributions are licensed under the [*Prosperity Public License*](https://prosperitylicense.com), [contributions of other people](https://github.com/derhuerst/hafas-gtfs-rt-feed/graphs/contributors) are licensed as [Apache 2.0](https://apache.org/licenses/LICENSE-2.0)**.\n\n> This license allows you to use and share this software for noncommercial purposes for free and to try this software for commercial purposes for thirty days.\n\n> Personal use for research, experiment, and testing for the benefit of public knowledge, personal study, private entertainment, hobby projects, amateur pursuits, or religious observance, without any anticipated commercial application, doesn’t count as use for a commercial purpose.\n\n[Buy a commercial license](https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b) or read more about [why I sell private licenses for my projects](https://gist.github.com/derhuerst/0ef31ee82b6300d2cafd03d10dd522f7).\n\n\n## Contributing\n\nIf you have a question or have difficulties using `hafas-gtfs-rt-feed`, please double-check your code and setup first. If you think you have found a bug or want to propose a feature, refer to [the issues page](https://github.com/derhuerst/hafas-gtfs-rt-feed/issues).\n\nBy contributing, you agree to release your modifications under the [Apache 2.0 license](LICENSE-APACHE).\n","readmeFilename":"readme.md","gitHead":"c95935332f7166392f6108ce3b90eba8b5713584","_id":"hafas-gtfs-rt-feed@4.0.0-alpha.4","_nodeVersion":"15.5.0","_npmVersion":"7.3.0","dist":{"integrity":"sha512-H2P5Y9DlM3At3+E5u77bRYb2bSwkouSOnd0x4jLPwOjEg2CBvfMxG+moJpOrzPHh3aVBLtYcB8FMW4hyFRa+/g==","shasum":"e1e6f193b95fccd9cfe40f3c1ee9f7302b3793de","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-4.0.0-alpha.4.tgz","fileCount":14,"unpackedSize":39099,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf/e/gCRA9TVsSAnZWagAAGpoP/0qR+rBIeH0kaB7wtQMT\npKeL5uxHL6je7UAcvx+S2UFpirzxeM80f6YRn8SFM/1XLjXW5r1pJ8arltnk\nSLBbj0ZSB5NpPZgELlhKTLzw0XiNtMbSYIZpsV+oopRTrGA4GX3nKER1Iu9K\n6TcaRCfyL0N/0N4aUb0HmAfxRuJSejNFqrf3sl66Gr/Hf+0enVd45ZealuLg\nmDHZdnHo1wdjQlWpAxs1Cycbr5SUK9aQ7unT16ydMRUuzTjR/YGXdO0sHjez\nYCMBA8qy5WtKUN3Q/GsKedUitK/ZxAuwVLCEcYLKe2gHdMeJ2gfkPluEIXZX\n6pROliKxwR189JhFhChKOMuiXH0KzEuQ5LFtVHUFWTHbHxwfNu7aeGOdfnL+\nP063XH4MmS4MCb/XfP/uHQIS3ipZ/40bDrU04kecM/TZNHt0RJLQP52IdvUh\niW89bu1QHJTku9DKkNg3g21xPL2yp1Z1zipcI7WboIExgHV8uk5Ols1XVrsp\nPZaLVwqbl8eF2PIO5+hP+SNuFKZui8ZJibiHRk0BhZ3HRjSQ/DW9DncE9lcq\nQ7dw7vdOzB5w4LotnzCTX319Wku26uwOeyUOdtYXcMXfxwnM4UDf5mR0vcgI\nN1//VD1M4TdjNBDYbTa85HYqyQsMucczHoy3zDx7LtBwfspBtVYRYtrAbhxh\nqUQR\r\n=Hu4e\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDBYW+1X5in/iZ/5CMfHGg1dx23NEaBou+Mz7TdwvSxTAIgRG8fBRmwzrXiEPe5L1ll4/msBiQxkKboHM64QFuaB4Q="}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_4.0.0-alpha.4_1610477535674_0.5754679696124663"},"_hasShrinkwrap":false},"4.0.0-alpha.5":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"4.0.0-alpha.5","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=12"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^3.1.0","gtfs-rt-differential-to-full-dataset":"^1.1.0","gtfs-via-postgres":"^2.4.2","hafas-monitor-trips":"^4.0.0","live-moving-average":"^1.1.0","lodash":"^4.17.20","luxon":"^1.25.0","match-gtfs-rt-to-gtfs":"^3.4.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","p-limit":"^3.0.2","pino":"^6.7.0","serve-buffer":"^2.3.0","speedometer":"^1.1.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^7.11.0","gtfs-via-postgres":"^2.4.2","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","print-gtfs-rt-cli":"^1.2.0","sample-gtfs-feed":"^0.7.0","slugg":"^1.2.1","tokenize-vbb-station-name":"^1.1.0"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"readme":"# hafas-gtfs-rt-feed\n\n**Generate a [GTFS Realtime (GTFS-RT)](https://developers.google.com/transit/gtfs-realtime/) feed by polling a [HAFAS endpoint](https://github.com/public-transport/hafas-client#background).**\n\n[![npm version](https://img.shields.io/npm/v/hafas-gtfs-rt-feed.svg)](https://www.npmjs.com/package/hafas-gtfs-rt-feed)\n[![build status](https://img.shields.io/travis/derhuerst/hafas-gtfs-rt-feed.svg)](https://travis-ci.org/derhuerst/hafas-gtfs-rt-feed)\n[![Prosperity/Apache license](https://img.shields.io/static/v1?label=license&message=Prosperity%2FApache&color=0997E8)](#license)\n[![support me via GitHub Sponsors](https://img.shields.io/badge/support%20me-donate-fa7664.svg)](https://github.com/sponsors/derhuerst)\n[![chat with me on Twitter](https://img.shields.io/badge/chat%20with%20me-on%20Twitter-1da1f2.svg)](https://twitter.com/derhuerst)\n\n`hafas-gtfs-rt-feed` consists of several components, connected to each other via the [NATS Streaming](https://docs.nats.io/nats-streaming-concepts/intro) channels:\n\n1. `monitor-hafas`: Given a [`hafas-client` instance](https://github.com/public-transport/hafas-client), it uses [`hafas-monitor-trips`](https://github.com/derhuerst/hafas-monitor-trips) to poll live data about all vehicles in the configured geographic area.\n2. `match-with-gtfs`: Uses [`match-gtfs-rt-to-gtfs`](https://github.com/derhuerst/match-gtfs-rt-to-gtfs) to match this data against [static GTFS](https://developers.google.com/transit/gtfs) data imported into a database.\n3. `serve-as-gtfs-rt`: Uses [`gtfs-rt-differential-to-full-dataset`](https://github.com/derhuerst/gtfs-rt-differential-to-full-dataset) to aggregate the matched data into a single [GTFS-RT](https://developers.google.com/transit/gtfs-realtime/) feed, and serves the feed via HTTP.\n\n`monitor-hafas` sends data to `match-with-gtfs` via two NATS Streaming channels `trips` & `movements`; `match-with-gtfs` sends data to `serve-as-gtfs-rt` via two channels `matched-trips` & `matched-movements`.\n\n```\n                   GTFS data in a            clients\nHAFAS API          PostgreSQL DB                ^\n   ^ |                  ^ |                     | GTFS-RT\n   | |                  | |                     |\n   | v                  | v                     |\nmonitor-hafas      match-with-gtfs        serve-as-gtfs-rt\n   ||                 ^^   ||                   ^  ^\n   ||                 ||   ||                   |  |\n   |+----> trips -----+|   |+--> matched-trips -+  |\n   +-----> movements --+   +---> matched-movements +\n```\n\n\n## Usage\n\nSome preparations are necessary for `hafas-gtfs-rt-feed` to work. Let's get started!\n\nRun `npm init` inside a new directory to initialize an empty [npm](https://docs.npmjs.com/cli/v6/commands/npm)-based project.\n\n```sh\nmkdir deutsche-bahn-gtfs-rt-feed\ncd deutsche-bahn-gtfs-rt-feed\nnpm init\n```\n\n### set up NATS Streaming\n\n[Install and run the NATS Streaming Server](https://docs.nats.io/nats-streaming-server/run) as documented.\n\n*Note:* If you run Nats Streaming on a different host or port, pass a custom `NATS_URL` environment variable into all `hafas-gtfs-rt-feed` components.\n\n### set up PostgreSQL\n\nMake sure you have a reasonably recent version of [PostgreSQL](https://www.postgresql.org) installed and running. There are guides for many operating systems and environments available on the internet.\n\n*Note:* If you run PostgreSQL on a different host or port, pass custom [`PG*` environment variables](https://www.postgresql.org/docs/13/libpq-envars.html) into the `match.js` component.\n\n### install `hafas-gtfs-rt-feed`\n\nUse the [npm CLI](https://docs.npmjs.com/getting-started/configuring-your-local-environment):\n\n```shell\nnpm install hafas-gtfs-rt-feed@next\n# added 153 packages in 12s\n```\n\n### set up a `hafas-client` instance\n\n`hafas-gtfs-rt-feed` is agnostic to the HAFAS API it pulls data from: To fetch data, `monitor-hafas` just uses the `hafas-client` you passed in, which you must point towards one out of many HAFAS API endpoints.\n\nSet up [`hafas-client` as documented](https://github.com/public-transport/hafas-client/blob/ba27f549520082e576560d235c34f397b0f6e06a/readme.md#usage). A very basic example using the [Deutsche Bahn (DB) endpoint](https://github.com/public-transport/hafas-client/blob/5/p/db/readme.md):\n\n```js\n// deutsche-bahn-hafas.js\nconst createClient = require('hafas-client')\nconst dbProfile = require('hafas-client/p/db')\n\n// create hafas-client configured to use Deutsche Bahn's HAFAS API\nconst client = createClient(dbProfile, 'my-awesome-program')\n\nmodule.exports = client\n```\n\n### build the GTFS matching database\n\n`match-with-gtfs` needs a pre-populated matching database to run; It uses [`gtfs-via-postgres`](https://npmjs.com/package/gtfs-via-postgres) and [`match-gtfs-rt-to-gtfs`](https://npmjs.com/package/match-gtfs-rt-to-gtfs) underneath.\n\nFirst, we're going to use [`gtfs-via-postgres`](https://npmjs.com/package/gtfs-via-postgres)'s `gtfs-to-sql` command-line tool to import our GTFS data into PostgreSQL.\n\n*Note:* Make sure you have an up-to-date [GTFS Static](https://developers.google.com/transit/gtfs) dataset, unzipped into individual `.txt` files.\n\n```sh\n# create a PostgreSQL database `gtfs`\npsql -c 'create database gtfs'\n# configure all subsequent commands to use it\nexport PGDATABASE=gtfs\n# import all .txt files\nnode_modules/.bin/gtfs-to-sql -d -u path/to/gtfs/files/*.txt\n```\n\nYou database `gtfs` should contain *basic* GTFS data now.\n\n---\n\n[`match-gtfs-rt-to-gtfs`](https://npmjs.com/package/match-gtfs-rt-to-gtfs) works by matching HAFAS stops & lines against GTFS stops & lines, using their IDs and *their names*. Usually, HAFAS & GTFS stop/line names don't have the same format, so they need to be normalized.\n\nYou'll have to implement this normalization logic. A simplified (but very naive) normalization logic *may* look like this:\n\n```js\n// hafas-info.js\nmodule.exports = {\n\tendpointName: 'some-hafas-api',\n\tnormalizeStopName: name => name.toLowerCase().replace(/\\s+/g, ' ').trim(),\n\tnormalizeLineName: name => name.toLowerCase().replace(/\\s+/g, ' ').trim(),\n}\n```\n\n```js\n// gtfs-info.js\nmodule.exports = {\n\tendpointName: 'some-gtfs-feed',\n\tnormalizeStopName: name => name.toLowerCase().replace(/\\s+St\\.$/, ''),\n\tnormalizeLineName: name => name.toLowerCase(),\n}\n```\n\n`match-gtfs-rt-to-gtfs` needs some special matching indices in the database to work efficiently. Now that we have implemented some normalization logic, we're going to pass it to `match-gtfs-rt-to-gtfs`'s `build-gtfs-match-index` command-line tool:\n\n```sh\n# add matching indices to the `gtfs` database\nnode_modules/.bin/build-gtfs-match-index path/to/hafas-info.js path/to/gtfs-info.js\n```\n\n*Note:* `hafas-gtfs-rt-feed` is data- & region-agnostic, so it depends on your HAFAS-endpoint-specific name normalization logic to match as many HAFAS trips/vehicles as possible against the GTFS data. The ratio matched items would ideally be 100%, because GTFS-RT feeds are intended to be consumed *along* a GTFS dataset with *matching IDs*.\n\n### run all components\n\nNow that we've set everything up, let's run all `hafas-gtfs-rt-feed` components to check if they are working!\n\nAll three components need to be run in parallel, so just open three terminals to run them. They will start logging [pino-formatted](https://getpino.io/#/?id=usage) log messages.\n\n```shell\n# specify the bounding box to be monitored (required)\nexport BBOX='{\"north\": 1.1, \"west\": 22.2, \"south\": 3.3, \"east\": 33.3}'\n# start monitor-hafas\nnode_modules/.bin/monitor-hafas deutsche-bahn-hafas.js\n# todo: sample logs\n```\n\n```shell\nnode_modules/.bin/match-with-gtfs\n# todo: sample logs\n```\n\n```shell\nnode_modules/.bin/serve-as-gtfs-rt\n```\n\n### inspecting the feed\n\nYour GTFS-RT feed should now be served at `http://localhost:3000/`, and within a few moments, it should contain data! 👏\n\nYou can verify this using many available GTFS-RT tools; Here are two of them to quickly inspect the feed:\n\n- [`print-gtfs-rt-cli`](https://github.com/derhuerst/print-gtfs-rt-cli) is a command-line tool, use it with `curl`: `curl 'http://localhost:3000/' -s | print-gtfs-rt`.\n- [`gtfs-rt-inspector`](https://public-transport.github.io/gtfs-rt-inspector/?feedUrl=http%3A%2F%2Flocalhost%3A3000%2F%0A) is a web app that can inspect any [CORS](https://enable-cors.org)-enabled GTFS-RT feed (that includes yours).\n\nAfter `monitor.js` has fetched some data from HAFAS, and after `match.js` has matched it against the GTFS (or failed or timed out doing so), you should see [`TripUpdate`s](https://developers.google.com/transit/gtfs-realtime/reference/#message-tripupdate) & [`VehiclePosition`s](https://developers.google.com/transit/gtfs-realtime/reference/#message-vehicleposition).\n\n\n## Related\n\n- [`hafas-gtfs-rt-server-example`](https://github.com/derhuerst/hafas-gtfs-rt-server-example) – Using [`hafas-client`](https://github.com/public-transport/hafas-client), [`hafas-monitor-trips`](https://github.com/derhuerst/hafas-monitor-trips) & [`hafas-gtfs-rt-feed`](https://github.com/derhuerst/hafas-gtfs-rt-feed) as a GTFS-RT server.\n- [`match-gtfs-rt-to-gtfs`](https://github.com/derhuerst/match-gtfs-rt-to-gtfs) – Match realtime transit data (e.g. from [GTFS Realtime](https://gtfs.org/reference/realtime/v2/)) with [GTFS Static](https://gtfs.org/reference/static) data, even if they don't share an ID.\n- [`gtfs-rt-differential-to-full-dataset`](https://github.com/derhuerst/gtfs-rt-differential-to-full-dataset) – Transform a continuous [GTFS Realtime](https://developers.google.com/transit/gtfs-realtime/) stream of [`DIFFERENTIAL` incrementality](https://developers.google.com/transit/gtfs-realtime/reference/#enum-incrementality) data into a [`FULL_DATASET`](https://developers.google.com/transit/gtfs-realtime/reference/#enum-incrementality) dump.\n- [`transloc-to-gtfs-real-time`](https://github.com/jonathonwpowell/transloc-to-gtfs-real-time) – Transform Transloc Real Time API to the GTFS RealTime Format\n\n\n## License\n\nThis project is dual-licensed: **My contributions are licensed under the [*Prosperity Public License*](https://prosperitylicense.com), [contributions of other people](https://github.com/derhuerst/hafas-gtfs-rt-feed/graphs/contributors) are licensed as [Apache 2.0](https://apache.org/licenses/LICENSE-2.0)**.\n\n> This license allows you to use and share this software for noncommercial purposes for free and to try this software for commercial purposes for thirty days.\n\n> Personal use for research, experiment, and testing for the benefit of public knowledge, personal study, private entertainment, hobby projects, amateur pursuits, or religious observance, without any anticipated commercial application, doesn’t count as use for a commercial purpose.\n\n[Buy a commercial license](https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b) or read more about [why I sell private licenses for my projects](https://gist.github.com/derhuerst/0ef31ee82b6300d2cafd03d10dd522f7).\n\n\n## Contributing\n\nIf you have a question or have difficulties using `hafas-gtfs-rt-feed`, please double-check your code and setup first. If you think you have found a bug or want to propose a feature, refer to [the issues page](https://github.com/derhuerst/hafas-gtfs-rt-feed/issues).\n\nBy contributing, you agree to release your modifications under the [Apache 2.0 license](LICENSE-APACHE).\n","readmeFilename":"readme.md","gitHead":"091b05d28d9d0aeca02de9755bad79cb762c6126","_id":"hafas-gtfs-rt-feed@4.0.0-alpha.5","_nodeVersion":"15.6.0","_npmVersion":"7.4.0","dist":{"integrity":"sha512-qaYTtZE8OYCWojCLTkjpNBSa1pknQeg03Q8KINxmB+6yKxwNFbjZNytnBWTPCIai0xo7GQwR5664+vspmdyGVQ==","shasum":"a770cc84e3a085ce78114166afae691df32a2715","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-4.0.0-alpha.5.tgz","fileCount":17,"unpackedSize":48708,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgCHk9CRA9TVsSAnZWagAAvWsP/jKbIVE7cJn9ykFq2dyT\nNpaU2NTpkdO8jy/HyZsFqEi57AtZvwO0u8yY/L7SweabKEXlZR1JYd4GKy5x\nJTGYV/vY21D2JyRs4bnl10GnphilmzXGVkgO0pnkA2peWMC1OsjMHEC4A0+M\nGQk4DfdBrCAGWDSoQdsSKylGI3FRJnhSJKW/NS/HSWPJZl+fR0azO9JEy6PB\nG1xlEgCZ3lwL4mV7U0R+V5AM8Ftfz8pTwDesh5gYP5SlM1OLvf1x8c7ca92t\nr6LOkz5GzbXcI318y/+xuHRm8uJAtOcWfNedkwp99whBEgE69WnhH22O5G6q\n7iFo6j30PovR47/VgVJLVYL6kRWIBt7fS3FH+7Z3CCF0ITEIw6UuYAhavU/u\nQZ2pYWnCh+Bs4Tdz0oGq5LwEq90+g6MiyCS8ovoR7CPyGpicP0fM4xICqlX2\nCiysrOS+oJK6AJwmJmV6mJpcal29bd+DmcME8DHqlBO66NTU7vMNPrhyiz/6\nwfqZcKANzg2CbmKUJR+QfaHp751H3mK4pNvxP+mgS/KXKBknfSzsavpqOxaw\nJk5yFXqDu9igdpADRtZkrrs0MQ0sClQr5eh7EPmAAoU/Ju8lQpGq2Rl/jY1g\nzVY5OyyebAjRsNiE/ohYiVxllerxYtpLIpDBDwnyqyBsxCj/2MJ2R5XWo8Sk\nUyfQ\r\n=FkuZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCgh6znqeuj/VjhRp0zEAloSt3V31Dyxgs45Kmb/wUgiwIgT9XfTAuqNP0jP53J7seXfvQdWdNrguxvrXtWCG/0Ow0="}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_4.0.0-alpha.5_1611168060927_0.06107441590235618"},"_hasShrinkwrap":false},"4.0.0-alpha.6":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"4.0.0-alpha.6","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=12"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^3.1.0","gtfs-rt-differential-to-full-dataset":"^1.1.0","gtfs-via-postgres":"^2.4.2","hafas-monitor-trips":"^4.0.0","live-moving-average":"^1.1.0","lodash":"^4.17.20","luxon":"^1.25.0","match-gtfs-rt-to-gtfs":"^3.4.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","p-limit":"^3.0.2","pino":"^6.7.0","serve-buffer":"^2.3.0","speedometer":"^1.1.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^7.11.0","gtfs-via-postgres":"^2.4.2","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","print-gtfs-rt-cli":"^1.2.0","sample-gtfs-feed":"^0.7.0","slugg":"^1.2.1","tokenize-vbb-station-name":"^1.1.0"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"readme":"# hafas-gtfs-rt-feed\n\n**Generate a [GTFS Realtime (GTFS-RT)](https://developers.google.com/transit/gtfs-realtime/) feed by polling a [HAFAS endpoint](https://github.com/public-transport/hafas-client#background).**\n\n[![npm version](https://img.shields.io/npm/v/hafas-gtfs-rt-feed.svg)](https://www.npmjs.com/package/hafas-gtfs-rt-feed)\n[![build status](https://img.shields.io/travis/derhuerst/hafas-gtfs-rt-feed.svg)](https://travis-ci.org/derhuerst/hafas-gtfs-rt-feed)\n[![Prosperity/Apache license](https://img.shields.io/static/v1?label=license&message=Prosperity%2FApache&color=0997E8)](#license)\n[![support me via GitHub Sponsors](https://img.shields.io/badge/support%20me-donate-fa7664.svg)](https://github.com/sponsors/derhuerst)\n[![chat with me on Twitter](https://img.shields.io/badge/chat%20with%20me-on%20Twitter-1da1f2.svg)](https://twitter.com/derhuerst)\n\n`hafas-gtfs-rt-feed` consists of several components, connected to each other via the [NATS Streaming](https://docs.nats.io/nats-streaming-concepts/intro) channels:\n\n1. `monitor-hafas`: Given a [`hafas-client` instance](https://github.com/public-transport/hafas-client), it uses [`hafas-monitor-trips`](https://github.com/derhuerst/hafas-monitor-trips) to poll live data about all vehicles in the configured geographic area.\n2. `match-with-gtfs`: Uses [`match-gtfs-rt-to-gtfs`](https://github.com/derhuerst/match-gtfs-rt-to-gtfs) to match this data against [static GTFS](https://developers.google.com/transit/gtfs) data imported into a database.\n3. `serve-as-gtfs-rt`: Uses [`gtfs-rt-differential-to-full-dataset`](https://github.com/derhuerst/gtfs-rt-differential-to-full-dataset) to aggregate the matched data into a single [GTFS-RT](https://developers.google.com/transit/gtfs-realtime/) feed, and serves the feed via HTTP.\n\n`monitor-hafas` sends data to `match-with-gtfs` via two NATS Streaming channels `trips` & `movements`; `match-with-gtfs` sends data to `serve-as-gtfs-rt` via two channels `matched-trips` & `matched-movements`.\n\n```\n                   GTFS data in a            clients\nHAFAS API          PostgreSQL DB                ^\n   ^ |                  ^ |                     | GTFS-RT\n   | |                  | |                     |\n   | v                  | v                     |\nmonitor-hafas      match-with-gtfs        serve-as-gtfs-rt\n   ||                 ^^   ||                   ^  ^\n   ||                 ||   ||                   |  |\n   |+----> trips -----+|   |+--> matched-trips -+  |\n   +-----> movements --+   +---> matched-movements +\n```\n\n\n## Usage\n\nSome preparations are necessary for `hafas-gtfs-rt-feed` to work. Let's get started!\n\nRun `npm init` inside a new directory to initialize an empty [npm](https://docs.npmjs.com/cli/v6/commands/npm)-based project.\n\n```sh\nmkdir deutsche-bahn-gtfs-rt-feed\ncd deutsche-bahn-gtfs-rt-feed\nnpm init\n```\n\n### set up NATS Streaming\n\n[Install and run the NATS Streaming Server](https://docs.nats.io/nats-streaming-server/run) as documented.\n\n*Note:* If you run Nats Streaming on a different host or port, pass a custom `NATS_URL` environment variable into all `hafas-gtfs-rt-feed` components.\n\n### set up PostgreSQL\n\nMake sure you have a reasonably recent version of [PostgreSQL](https://www.postgresql.org) installed and running. There are guides for many operating systems and environments available on the internet.\n\n*Note:* If you run PostgreSQL on a different host or port, pass custom [`PG*` environment variables](https://www.postgresql.org/docs/13/libpq-envars.html) into the `match.js` component.\n\n### install `hafas-gtfs-rt-feed`\n\nUse the [npm CLI](https://docs.npmjs.com/getting-started/configuring-your-local-environment):\n\n```shell\nnpm install hafas-gtfs-rt-feed@next\n# added 153 packages in 12s\n```\n\n### set up a `hafas-client` instance\n\n`hafas-gtfs-rt-feed` is agnostic to the HAFAS API it pulls data from: To fetch data, `monitor-hafas` just uses the `hafas-client` you passed in, which you must point towards one out of many HAFAS API endpoints.\n\nSet up [`hafas-client` as documented](https://github.com/public-transport/hafas-client/blob/ba27f549520082e576560d235c34f397b0f6e06a/readme.md#usage). A very basic example using the [Deutsche Bahn (DB) endpoint](https://github.com/public-transport/hafas-client/blob/5/p/db/readme.md):\n\n```js\n// deutsche-bahn-hafas.js\nconst createClient = require('hafas-client')\nconst dbProfile = require('hafas-client/p/db')\n\n// create hafas-client configured to use Deutsche Bahn's HAFAS API\nconst client = createClient(dbProfile, 'my-awesome-program')\n\nmodule.exports = client\n```\n\n### build the GTFS matching database\n\n`match-with-gtfs` needs a pre-populated matching database to run; It uses [`gtfs-via-postgres`](https://npmjs.com/package/gtfs-via-postgres) and [`match-gtfs-rt-to-gtfs`](https://npmjs.com/package/match-gtfs-rt-to-gtfs) underneath.\n\nFirst, we're going to use [`gtfs-via-postgres`](https://npmjs.com/package/gtfs-via-postgres)'s `gtfs-to-sql` command-line tool to import our GTFS data into PostgreSQL.\n\n*Note:* Make sure you have an up-to-date [GTFS Static](https://developers.google.com/transit/gtfs) dataset, unzipped into individual `.txt` files.\n\n```sh\n# create a PostgreSQL database `gtfs`\npsql -c 'create database gtfs'\n# configure all subsequent commands to use it\nexport PGDATABASE=gtfs\n# import all .txt files\nnode_modules/.bin/gtfs-to-sql -d -u path/to/gtfs/files/*.txt\n```\n\nYou database `gtfs` should contain *basic* GTFS data now.\n\n---\n\n[`match-gtfs-rt-to-gtfs`](https://npmjs.com/package/match-gtfs-rt-to-gtfs) works by matching HAFAS stops & lines against GTFS stops & lines, using their IDs and *their names*. Usually, HAFAS & GTFS stop/line names don't have the same format, so they need to be normalized.\n\nYou'll have to implement this normalization logic. A simplified (but very naive) normalization logic *may* look like this:\n\n```js\n// hafas-info.js\nmodule.exports = {\n\tendpointName: 'some-hafas-api',\n\tnormalizeStopName: name => name.toLowerCase().replace(/\\s+/g, ' ').trim(),\n\tnormalizeLineName: name => name.toLowerCase().replace(/\\s+/g, ' ').trim(),\n}\n```\n\n```js\n// gtfs-info.js\nmodule.exports = {\n\tendpointName: 'some-gtfs-feed',\n\tnormalizeStopName: name => name.toLowerCase().replace(/\\s+St\\.$/, ''),\n\tnormalizeLineName: name => name.toLowerCase(),\n}\n```\n\n`match-gtfs-rt-to-gtfs` needs some special matching indices in the database to work efficiently. Now that we have implemented some normalization logic, we're going to pass it to `match-gtfs-rt-to-gtfs`'s `build-gtfs-match-index` command-line tool:\n\n```sh\n# add matching indices to the `gtfs` database\nnode_modules/.bin/build-gtfs-match-index path/to/hafas-info.js path/to/gtfs-info.js\n```\n\n*Note:* `hafas-gtfs-rt-feed` is data- & region-agnostic, so it depends on your HAFAS-endpoint-specific name normalization logic to match as many HAFAS trips/vehicles as possible against the GTFS data. The ratio matched items would ideally be 100%, because GTFS-RT feeds are intended to be consumed *along* a GTFS dataset with *matching IDs*.\n\n### run all components\n\nNow that we've set everything up, let's run all `hafas-gtfs-rt-feed` components to check if they are working!\n\nAll three components need to be run in parallel, so just open three terminals to run them. They will start logging [pino-formatted](https://getpino.io/#/?id=usage) log messages.\n\n```shell\n# specify the bounding box to be monitored (required)\nexport BBOX='{\"north\": 1.1, \"west\": 22.2, \"south\": 3.3, \"east\": 33.3}'\n# start monitor-hafas\nnode_modules/.bin/monitor-hafas deutsche-bahn-hafas.js\n# todo: sample logs\n```\n\n```shell\nnode_modules/.bin/match-with-gtfs\n# todo: sample logs\n```\n\n```shell\nnode_modules/.bin/serve-as-gtfs-rt\n```\n\n### inspecting the feed\n\nYour GTFS-RT feed should now be served at `http://localhost:3000/`, and within a few moments, it should contain data! 👏\n\nYou can verify this using many available GTFS-RT tools; Here are two of them to quickly inspect the feed:\n\n- [`print-gtfs-rt-cli`](https://github.com/derhuerst/print-gtfs-rt-cli) is a command-line tool, use it with `curl`: `curl 'http://localhost:3000/' -s | print-gtfs-rt`.\n- [`gtfs-rt-inspector`](https://public-transport.github.io/gtfs-rt-inspector/?feedUrl=http%3A%2F%2Flocalhost%3A3000%2F%0A) is a web app that can inspect any [CORS](https://enable-cors.org)-enabled GTFS-RT feed (that includes yours).\n\nAfter `monitor.js` has fetched some data from HAFAS, and after `match.js` has matched it against the GTFS (or failed or timed out doing so), you should see [`TripUpdate`s](https://developers.google.com/transit/gtfs-realtime/reference/#message-tripupdate) & [`VehiclePosition`s](https://developers.google.com/transit/gtfs-realtime/reference/#message-vehicleposition).\n\n\n## Related\n\n- [`hafas-gtfs-rt-server-example`](https://github.com/derhuerst/hafas-gtfs-rt-server-example) – Using [`hafas-client`](https://github.com/public-transport/hafas-client), [`hafas-monitor-trips`](https://github.com/derhuerst/hafas-monitor-trips) & [`hafas-gtfs-rt-feed`](https://github.com/derhuerst/hafas-gtfs-rt-feed) as a GTFS-RT server.\n- [`match-gtfs-rt-to-gtfs`](https://github.com/derhuerst/match-gtfs-rt-to-gtfs) – Match realtime transit data (e.g. from [GTFS Realtime](https://gtfs.org/reference/realtime/v2/)) with [GTFS Static](https://gtfs.org/reference/static) data, even if they don't share an ID.\n- [`gtfs-rt-differential-to-full-dataset`](https://github.com/derhuerst/gtfs-rt-differential-to-full-dataset) – Transform a continuous [GTFS Realtime](https://developers.google.com/transit/gtfs-realtime/) stream of [`DIFFERENTIAL` incrementality](https://developers.google.com/transit/gtfs-realtime/reference/#enum-incrementality) data into a [`FULL_DATASET`](https://developers.google.com/transit/gtfs-realtime/reference/#enum-incrementality) dump.\n- [`transloc-to-gtfs-real-time`](https://github.com/jonathonwpowell/transloc-to-gtfs-real-time) – Transform Transloc Real Time API to the GTFS RealTime Format\n\n\n## License\n\nThis project is dual-licensed: **My contributions are licensed under the [*Prosperity Public License*](https://prosperitylicense.com), [contributions of other people](https://github.com/derhuerst/hafas-gtfs-rt-feed/graphs/contributors) are licensed as [Apache 2.0](https://apache.org/licenses/LICENSE-2.0)**.\n\n> This license allows you to use and share this software for noncommercial purposes for free and to try this software for commercial purposes for thirty days.\n\n> Personal use for research, experiment, and testing for the benefit of public knowledge, personal study, private entertainment, hobby projects, amateur pursuits, or religious observance, without any anticipated commercial application, doesn’t count as use for a commercial purpose.\n\n[Buy a commercial license](https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b) or read more about [why I sell private licenses for my projects](https://gist.github.com/derhuerst/0ef31ee82b6300d2cafd03d10dd522f7).\n\n\n## Contributing\n\nIf you have a question or have difficulties using `hafas-gtfs-rt-feed`, please double-check your code and setup first. If you think you have found a bug or want to propose a feature, refer to [the issues page](https://github.com/derhuerst/hafas-gtfs-rt-feed/issues).\n\nBy contributing, you agree to release your modifications under the [Apache 2.0 license](LICENSE-APACHE).\n","readmeFilename":"readme.md","gitHead":"3ccb2a37f71fea56e14160d41fc40834f8058892","_id":"hafas-gtfs-rt-feed@4.0.0-alpha.6","_nodeVersion":"15.6.0","_npmVersion":"7.4.0","dist":{"integrity":"sha512-JgOuxvlhcUKcEQzd8Q6QZRaALb7J5Ptiq32U5e5WkAJB3rRe5Q/mDBwMcU0E/spxYmP2sC1ZzK8YrvZf9mOsfA==","shasum":"29c5d111a6247cf22b6b4da099a0219a04ce2d1a","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-4.0.0-alpha.6.tgz","fileCount":17,"unpackedSize":48744,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgC2UmCRA9TVsSAnZWagAAtcIQAJCWN7HvqTtCEo4Pg9TI\nM7rgiQjhKmWWRnFJoNN5RFdL+vmjdQsQ6eTV1CnogeaVIcWNbczFduTssnod\ngMHlfCEixlnOTeP+YPZ4OmvR+YtJOoPQ7AnNZPLraZHGfo2LeiHC3bbnMVA5\n1Pm8+ildScu3wVOupoCp5Hy+op3s4Ee7PH9yo45PE5J9DtuWDqjskFgDAyze\nKMRJ5RprkDdolKSAlHAbJ0z8v8Xb3AfavscC8pzUEJcMi5r0AGGx3hd688i+\nM/rJxXKuHeyeMroZ9UD7k+gXYLDQvuYp6YpkZ1fc4Bt3I5Gd4zRYQjCanok6\nJA9ska35g+cWxj5jp5PpiqjYuRmxGFAdlmtuD00WuZI75Pghgz10iVz+pd7D\nQ1M1kNlJD7W8bcow08vtz0QBJE+mr0wBIGNo0v6CddYrrdrILneHBZpkNSkd\neI2lChrcvP3laba92o7VBLkCtyZKkIK7ErppVvhRRIYTNcs5r+a8pNJI4PpR\nOly+GbXITwgHK6c2/Z6b7TsBODvraf8jjvsNIEci2KzlCQtBAcuuSte2IF4y\ngIPjN/nog1OxgMsUDgCIwNASUup1kOPEp7XUv/GZkktvg1ksG/gGQGYZ0zMZ\nRwKN6RRtMitMEVEUwlcIDAFaXO9osVb97eOo6YoIfzsCWBt/ANyIHowp2O5G\nnZJO\r\n=2zqG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC/TPvFn41funjF2WqwYDQO59+ifEUdJyFjomHDD4nIGgIhAPgAU0mUev3Bb76kbrICPtwjgqPU1vy2aD0cXPQ2m7ej"}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_4.0.0-alpha.6_1611359525819_0.4454063771501846"},"_hasShrinkwrap":false},"4.0.0-alpha.7":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"4.0.0-alpha.7","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=12"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^3.1.0","gtfs-rt-differential-to-full-dataset":"^1.1.0","gtfs-via-postgres":"^2.4.2","hafas-monitor-trips":"^4.0.0","live-moving-average":"^1.1.0","lodash":"^4.17.20","luxon":"^1.25.0","match-gtfs-rt-to-gtfs":"^3.4.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","p-limit":"^3.0.2","pino":"^6.7.0","serve-buffer":"^2.3.0","speedometer":"^1.1.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^7.11.0","gtfs-via-postgres":"^2.4.2","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","print-gtfs-rt-cli":"^1.2.0","sample-gtfs-feed":"^0.7.0","slugg":"^1.2.1","tokenize-vbb-station-name":"^1.1.0"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint && npm test"},"readme":"# hafas-gtfs-rt-feed\n\n**Generate a [GTFS Realtime (GTFS-RT)](https://developers.google.com/transit/gtfs-realtime/) feed by polling a [HAFAS endpoint](https://github.com/public-transport/hafas-client#background).**\n\n[![npm version](https://img.shields.io/npm/v/hafas-gtfs-rt-feed.svg)](https://www.npmjs.com/package/hafas-gtfs-rt-feed)\n[![build status](https://img.shields.io/travis/derhuerst/hafas-gtfs-rt-feed.svg)](https://travis-ci.org/derhuerst/hafas-gtfs-rt-feed)\n[![Prosperity/Apache license](https://img.shields.io/static/v1?label=license&message=Prosperity%2FApache&color=0997E8)](#license)\n[![support me via GitHub Sponsors](https://img.shields.io/badge/support%20me-donate-fa7664.svg)](https://github.com/sponsors/derhuerst)\n[![chat with me on Twitter](https://img.shields.io/badge/chat%20with%20me-on%20Twitter-1da1f2.svg)](https://twitter.com/derhuerst)\n\n`hafas-gtfs-rt-feed` consists of several components, connected to each other via the [NATS Streaming](https://docs.nats.io/nats-streaming-concepts/intro) channels:\n\n1. `monitor-hafas`: Given a [`hafas-client` instance](https://github.com/public-transport/hafas-client), it uses [`hafas-monitor-trips`](https://github.com/derhuerst/hafas-monitor-trips) to poll live data about all vehicles in the configured geographic area.\n2. `match-with-gtfs`: Uses [`match-gtfs-rt-to-gtfs`](https://github.com/derhuerst/match-gtfs-rt-to-gtfs) to match this data against [static GTFS](https://developers.google.com/transit/gtfs) data imported into a database.\n3. `serve-as-gtfs-rt`: Uses [`gtfs-rt-differential-to-full-dataset`](https://github.com/derhuerst/gtfs-rt-differential-to-full-dataset) to aggregate the matched data into a single [GTFS-RT](https://developers.google.com/transit/gtfs-realtime/) feed, and serves the feed via HTTP.\n\n`monitor-hafas` sends data to `match-with-gtfs` via two NATS Streaming channels `trips` & `movements`; `match-with-gtfs` sends data to `serve-as-gtfs-rt` via two channels `matched-trips` & `matched-movements`.\n\n```\n                   GTFS data in a            clients\nHAFAS API          PostgreSQL DB                ^\n   ^ |                  ^ |                     | GTFS-RT\n   | |                  | |                     |\n   | v                  | v                     |\nmonitor-hafas      match-with-gtfs        serve-as-gtfs-rt\n   ||                 ^^   ||                   ^  ^\n   ||                 ||   ||                   |  |\n   |+----> trips -----+|   |+--> matched-trips -+  |\n   +-----> movements --+   +---> matched-movements +\n```\n\n\n## Usage\n\nSome preparations are necessary for `hafas-gtfs-rt-feed` to work. Let's get started!\n\nRun `npm init` inside a new directory to initialize an empty [npm](https://docs.npmjs.com/cli/v6/commands/npm)-based project.\n\n```sh\nmkdir deutsche-bahn-gtfs-rt-feed\ncd deutsche-bahn-gtfs-rt-feed\nnpm init\n```\n\n### set up NATS Streaming\n\n[Install and run the NATS Streaming Server](https://docs.nats.io/nats-streaming-server/run) as documented.\n\n*Note:* If you run Nats Streaming on a different host or port, pass a custom `NATS_URL` environment variable into all `hafas-gtfs-rt-feed` components.\n\n### set up PostgreSQL\n\nMake sure you have a reasonably recent version of [PostgreSQL](https://www.postgresql.org) installed and running. There are guides for many operating systems and environments available on the internet.\n\n*Note:* If you run PostgreSQL on a different host or port, pass custom [`PG*` environment variables](https://www.postgresql.org/docs/13/libpq-envars.html) into the `match.js` component.\n\n### install `hafas-gtfs-rt-feed`\n\nUse the [npm CLI](https://docs.npmjs.com/getting-started/configuring-your-local-environment):\n\n```shell\nnpm install hafas-gtfs-rt-feed@next\n# added 153 packages in 12s\n```\n\n### set up a `hafas-client` instance\n\n`hafas-gtfs-rt-feed` is agnostic to the HAFAS API it pulls data from: To fetch data, `monitor-hafas` just uses the `hafas-client` you passed in, which you must point towards one out of many HAFAS API endpoints.\n\nSet up [`hafas-client` as documented](https://github.com/public-transport/hafas-client/blob/ba27f549520082e576560d235c34f397b0f6e06a/readme.md#usage). A very basic example using the [Deutsche Bahn (DB) endpoint](https://github.com/public-transport/hafas-client/blob/5/p/db/readme.md):\n\n```js\n// deutsche-bahn-hafas.js\nconst createClient = require('hafas-client')\nconst dbProfile = require('hafas-client/p/db')\n\n// create hafas-client configured to use Deutsche Bahn's HAFAS API\nconst client = createClient(dbProfile, 'my-awesome-program')\n\nmodule.exports = client\n```\n\n### build the GTFS matching database\n\n`match-with-gtfs` needs a pre-populated matching database to run; It uses [`gtfs-via-postgres`](https://npmjs.com/package/gtfs-via-postgres) and [`match-gtfs-rt-to-gtfs`](https://npmjs.com/package/match-gtfs-rt-to-gtfs) underneath.\n\nFirst, we're going to use [`gtfs-via-postgres`](https://npmjs.com/package/gtfs-via-postgres)'s `gtfs-to-sql` command-line tool to import our GTFS data into PostgreSQL.\n\n*Note:* Make sure you have an up-to-date [GTFS Static](https://developers.google.com/transit/gtfs) dataset, unzipped into individual `.txt` files.\n\n```sh\n# create a PostgreSQL database `gtfs`\npsql -c 'create database gtfs'\n# configure all subsequent commands to use it\nexport PGDATABASE=gtfs\n# import all .txt files\nnode_modules/.bin/gtfs-to-sql -d -u path/to/gtfs/files/*.txt\n```\n\nYou database `gtfs` should contain *basic* GTFS data now.\n\n---\n\n[`match-gtfs-rt-to-gtfs`](https://npmjs.com/package/match-gtfs-rt-to-gtfs) works by matching HAFAS stops & lines against GTFS stops & lines, using their IDs and *their names*. Usually, HAFAS & GTFS stop/line names don't have the same format, so they need to be normalized.\n\nYou'll have to implement this normalization logic. A simplified (but very naive) normalization logic *may* look like this:\n\n```js\n// hafas-info.js\nmodule.exports = {\n\tendpointName: 'some-hafas-api',\n\tnormalizeStopName: name => name.toLowerCase().replace(/\\s+/g, ' ').trim(),\n\tnormalizeLineName: name => name.toLowerCase().replace(/\\s+/g, ' ').trim(),\n}\n```\n\n```js\n// gtfs-info.js\nmodule.exports = {\n\tendpointName: 'some-gtfs-feed',\n\tnormalizeStopName: name => name.toLowerCase().replace(/\\s+St\\.$/, ''),\n\tnormalizeLineName: name => name.toLowerCase(),\n}\n```\n\n`match-gtfs-rt-to-gtfs` needs some special matching indices in the database to work efficiently. Now that we have implemented some normalization logic, we're going to pass it to `match-gtfs-rt-to-gtfs`'s `build-gtfs-match-index` command-line tool:\n\n```sh\n# add matching indices to the `gtfs` database\nnode_modules/.bin/build-gtfs-match-index path/to/hafas-info.js path/to/gtfs-info.js\n```\n\n*Note:* `hafas-gtfs-rt-feed` is data- & region-agnostic, so it depends on your HAFAS-endpoint-specific name normalization logic to match as many HAFAS trips/vehicles as possible against the GTFS data. The ratio matched items would ideally be 100%, because GTFS-RT feeds are intended to be consumed *along* a GTFS dataset with *matching IDs*.\n\n### run all components\n\nNow that we've set everything up, let's run all `hafas-gtfs-rt-feed` components to check if they are working!\n\nAll three components need to be run in parallel, so just open three terminals to run them. They will start logging [pino-formatted](https://getpino.io/#/?id=usage) log messages.\n\n```shell\n# specify the bounding box to be monitored (required)\nexport BBOX='{\"north\": 1.1, \"west\": 22.2, \"south\": 3.3, \"east\": 33.3}'\n# start monitor-hafas\nnode_modules/.bin/monitor-hafas deutsche-bahn-hafas.js\n# todo: sample logs\n```\n\n```shell\nnode_modules/.bin/match-with-gtfs\n# todo: sample logs\n```\n\n```shell\nnode_modules/.bin/serve-as-gtfs-rt\n```\n\n### inspecting the feed\n\nYour GTFS-RT feed should now be served at `http://localhost:3000/`, and within a few moments, it should contain data! 👏\n\nYou can verify this using many available GTFS-RT tools; Here are two of them to quickly inspect the feed:\n\n- [`print-gtfs-rt-cli`](https://github.com/derhuerst/print-gtfs-rt-cli) is a command-line tool, use it with `curl`: `curl 'http://localhost:3000/' -s | print-gtfs-rt`.\n- [`gtfs-rt-inspector`](https://public-transport.github.io/gtfs-rt-inspector/?feedUrl=http%3A%2F%2Flocalhost%3A3000%2F%0A) is a web app that can inspect any [CORS](https://enable-cors.org)-enabled GTFS-RT feed (that includes yours).\n\nAfter `monitor.js` has fetched some data from HAFAS, and after `match.js` has matched it against the GTFS (or failed or timed out doing so), you should see [`TripUpdate`s](https://developers.google.com/transit/gtfs-realtime/reference/#message-tripupdate) & [`VehiclePosition`s](https://developers.google.com/transit/gtfs-realtime/reference/#message-vehicleposition).\n\n\n## Related\n\n- [`hafas-gtfs-rt-server-example`](https://github.com/derhuerst/hafas-gtfs-rt-server-example) – Using [`hafas-client`](https://github.com/public-transport/hafas-client), [`hafas-monitor-trips`](https://github.com/derhuerst/hafas-monitor-trips) & [`hafas-gtfs-rt-feed`](https://github.com/derhuerst/hafas-gtfs-rt-feed) as a GTFS-RT server.\n- [`match-gtfs-rt-to-gtfs`](https://github.com/derhuerst/match-gtfs-rt-to-gtfs) – Match realtime transit data (e.g. from [GTFS Realtime](https://gtfs.org/reference/realtime/v2/)) with [GTFS Static](https://gtfs.org/reference/static) data, even if they don't share an ID.\n- [`gtfs-rt-differential-to-full-dataset`](https://github.com/derhuerst/gtfs-rt-differential-to-full-dataset) – Transform a continuous [GTFS Realtime](https://developers.google.com/transit/gtfs-realtime/) stream of [`DIFFERENTIAL` incrementality](https://developers.google.com/transit/gtfs-realtime/reference/#enum-incrementality) data into a [`FULL_DATASET`](https://developers.google.com/transit/gtfs-realtime/reference/#enum-incrementality) dump.\n- [`transloc-to-gtfs-real-time`](https://github.com/jonathonwpowell/transloc-to-gtfs-real-time) – Transform Transloc Real Time API to the GTFS RealTime Format\n\n\n## License\n\nThis project is dual-licensed: **My contributions are licensed under the [*Prosperity Public License*](https://prosperitylicense.com), [contributions of other people](https://github.com/derhuerst/hafas-gtfs-rt-feed/graphs/contributors) are licensed as [Apache 2.0](https://apache.org/licenses/LICENSE-2.0)**.\n\n> This license allows you to use and share this software for noncommercial purposes for free and to try this software for commercial purposes for thirty days.\n\n> Personal use for research, experiment, and testing for the benefit of public knowledge, personal study, private entertainment, hobby projects, amateur pursuits, or religious observance, without any anticipated commercial application, doesn’t count as use for a commercial purpose.\n\n[Buy a commercial license](https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b) or read more about [why I sell private licenses for my projects](https://gist.github.com/derhuerst/0ef31ee82b6300d2cafd03d10dd522f7).\n\n\n## Contributing\n\nIf you have a question or have difficulties using `hafas-gtfs-rt-feed`, please double-check your code and setup first. If you think you have found a bug or want to propose a feature, refer to [the issues page](https://github.com/derhuerst/hafas-gtfs-rt-feed/issues).\n\nBy contributing, you agree to release your modifications under the [Apache 2.0 license](LICENSE-APACHE).\n","readmeFilename":"readme.md","gitHead":"b4b95394a7a3f471016217d7588d941edcb40cfb","_id":"hafas-gtfs-rt-feed@4.0.0-alpha.7","_nodeVersion":"15.6.0","_npmVersion":"7.4.0","dist":{"integrity":"sha512-xSA6V+yJqf+Oa43gQXlbxtjLF30jv/rq1D23fjluLaU9EpKYr0qkwOAZaYxvQDqy69W8VxnSG1DkHOTlepHdFw==","shasum":"9a65553c3f77f7235d561706b2eba552c233959a","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-4.0.0-alpha.7.tgz","fileCount":17,"unpackedSize":48781,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgDcVgCRA9TVsSAnZWagAAoMAP+wfkVpRpklhhpi2MKUYE\nZN++CVeap+77/MTvkc86BQgn9H4k3M8gFqGluAlxwzjqSj++5P76fa3G94du\nUBHqJKJkB+QObxl+vUe65Pt9//fgQsWl0e2cCDpCMCpfsYTFG/HC4oqLa1MB\nqSoj0S8eIfUGGwqjWY/BbJB3QI/mAfmlQd15YzIj54s+IZhqRYuO+5WnCw2V\ngHvEE648wd1QvGtI/okjt4tIQzolK23eKOwd3XbuahyOgO1fFaQ71ry3SWoo\niaul0RuwPUfdho+SJ2+844QK4zRvSgbcjOCDDJmaJH/jCuUPwrdkIxmA0JQe\nuYfyTw1wZeQhRDJ8TkYcBi7mAeohuhlYSaCjQaqab6gNb87n2g+mlIZl5Bd9\nhMeYDdK12oK/DV/azDrWUmW7+6ADyJUcKPZhtOco7T2xnMDQVs6biHffDi3D\nItxOLmMdlK8KYm0gUvJir6CruqfhlPx2ff9PJTeKWeIioCLowSx2/YA5WVFg\nnRoM+gw6UuMDmj+tY4ZhCbg+Mp+FdzEijILfTIOcxEXf7qNfivNnsn6d3BqG\nIZlbbMvWDKYPX0rg5Zgcm91BbjCTRgLFMCczV+WBRm+LG+60sM4zhc8FgGta\nxt527usNu2p399a1RiPUezUBg+fkrMw82R8b/TLzty7+LGW+gJ1LEN6S11kt\nDVYi\r\n=VGN9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFR38sKKm/yC0Cq7S9r3n4R1Ubu4iZ5qBF7FG6KtZKmrAiAkju0y0LUSlT3wEFGC7yaCuQk+cLasisPmR1Vrsy/dwA=="}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_4.0.0-alpha.7_1611515231879_0.6871396896134527"},"_hasShrinkwrap":false},"4.0.0":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"4.0.0","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=12"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^3.1.0","gtfs-rt-differential-to-full-dataset":"^1.1.0","gtfs-via-postgres":"^2.4.2","hafas-monitor-trips":"^4.0.0","live-moving-average":"^1.1.0","lodash":"^4.17.20","luxon":"^1.25.0","match-gtfs-rt-to-gtfs":"^3.4.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","p-limit":"^3.0.2","pino":"^6.7.0","serve-buffer":"^2.3.0","speedometer":"^1.1.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^7.11.0","gtfs-via-postgres":"^2.4.2","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","print-gtfs-rt-cli":"^1.2.0","sample-gtfs-feed":"^0.7.0","slugg":"^1.2.1","tokenize-vbb-station-name":"^1.1.0"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"gitHead":"ed9d2ebf631f9cd3f1e97510e3a8e348b78ca730","_id":"hafas-gtfs-rt-feed@4.0.0","_nodeVersion":"15.6.0","_npmVersion":"7.4.0","dist":{"integrity":"sha512-2bf1pHftBuJ4OSZ+mqXMHKreJTdjEbs8jPh0F/gPCiG5MVmNT3Jg1rKVUo4yE49L8E2jHQQxYPC9wAHnzHZoqQ==","shasum":"2781cd73b65fc99a8c11a688d58325ab0c42801e","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-4.0.0.tgz","fileCount":17,"unpackedSize":48756,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgEC7UCRA9TVsSAnZWagAA2xoP/RdnoCrX23v5WPdop/O9\noehu/rNtJW3su9vdDxUGXGsVeouIUcy7g75C4FCHvtg5B2KrzTO8QFV8iGbR\nsCDYnxP9KwQUTuwOiPD0xUXqnRmLxf6FePaaepC5ozxyzsikCIfxltj1lJM1\nEje+q19s3ycawZEIy5duEZiA+7y2ZI3PQ9++3g22/rRDqnDBUrxDb4noy5kC\nA4gQDndJMxbdF6oGZBGSBIAvbVJsbf9sGJ0MTiN1uaYlm66SzJtjGBbeSzaF\n7hWj0VVfhjaU86j+JPhnvbvWL8uUXc+V7ZkJ+XqHe2OpBCp0FUFS/f+UtNXM\n9UZKKVSTj7Hxvvf0Tc8FQGXHJ6v2VKQKCPb69t+gLbz74XYEPcH/NHDZACd0\nYvGHvXyHPfl6cIudUd/ejrFne8rrpIa5X0yhnMZFH4/0qCgrSwCjuU30pN2q\nWXEeQGtAygrJ70LAbd2luiRHmmlCy2S+eWLfElxc6n/e1xqdtUa4KoFss7ZK\nJ+Ul2L1k7DIu5mjm5NVy8+f07FhhuaIn7GzZnKy5Y3OzBTLtldrZWeG00PRc\nz4rzliZT7H79LMR313GEpK/M2YaFqtjBv2gBEHeUmmQ0Xg/b1tJoiJ/e7mxK\n/6N8FTaC3aT9EexB68eWRXwq5Xms7M2JCVmthK50Q6YpKZi/cxDLKWSvMO64\nvAbG\r\n=v69y\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD7/GGr75jGM3Flkq6j067mwe03Yh1daHkD9jPGO5ZGvAIhAP9xH1VOo6lE3j9q2WjFMBsp2lqsIfWzbLicE7m4qZNn"}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_4.0.0_1611673299566_0.3670698213128367"},"_hasShrinkwrap":false},"4.0.1":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"4.0.1","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=12"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^3.1.0","gtfs-rt-differential-to-full-dataset":"^1.1.0","gtfs-via-postgres":"^2.4.2","hafas-monitor-trips":"^4.0.0","live-moving-average":"^1.1.0","lodash":"^4.17.20","luxon":"^1.25.0","match-gtfs-rt-to-gtfs":"^3.4.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","p-limit":"^3.0.2","pino":"^6.7.0","serve-buffer":"^2.3.0","speedometer":"^1.1.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^7.11.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","print-gtfs-rt-cli":"^1.2.0","sample-gtfs-feed":"^0.7.0","slugg":"^1.2.1","tokenize-vbb-station-name":"^1.1.0"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"gitHead":"113a9ec2ccd0d3dd0b0d983d15ed3f7eae1272e0","_id":"hafas-gtfs-rt-feed@4.0.1","_nodeVersion":"15.6.0","_npmVersion":"7.4.0","dist":{"integrity":"sha512-JDkljYQVZ2hdvEDcg/aq6SANuA1FInVUXCh3Cep+FVn1Vie+F55KIP5mDjkpYpOaqozWLS/FAXd8RRtgFo+hzg==","shasum":"31a8938887de71c6330c9789ec0cd1444119d1b6","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-4.0.1.tgz","fileCount":17,"unpackedSize":48798,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgHzqMCRA9TVsSAnZWagAA9dsP/2CYCsOYe6kEPGWu2Sym\n+2qaXgjbcHfb9njPlxvzKpdmskfcQyIyibzcqiPav3Sqa5yL1Kt9QwEmkKdp\n/bspQC8f3oysPik6FjWucJp8eE0AIAv0xlmmyKJI7WxcvzB6f5CbKE+lW421\nOY82GN9K9XAKrpdTaHLb6MYjniKT8qlAjNTCEOXiz5ZtqSB+L55PIR9X+Oos\nPddbbbX6mErTI19cPe9whpeTkivU4uA0J9tzfpj+K9AEpsXQfgbMdyAbRE5+\ny4js/zvr8lpImjQgxnh/qcUogGlhASQpBiFag21AqUW6JDe0GnKnF1O6bUUg\nvMovtAlW004a0iSlEVy23ZVNqceaLBNZjcxm5JorGbcEYMRBXxpSHZdLkKaG\nwfjlEDzZqfYhQnTjyesCb77+Gnl4T/GjdLk/VsGmP8bPraIssJWNhEFpLva0\nu6IHv0hT+tLLR5OpjvV5LP2GuqbIq4Uh+P9xOM8wCDKvYhEkzjFRKP2lHr+a\nQGuyOFYOokiexgd0SDwvJrCiZSar2zZdsYBsSQ5kNDC0sL0DJvHxUz9yT6BN\nL0t9djCSv9zVNzaCw8Sgb16DdgEvlv6I0cMA+Z6f2pDVqdb50jkUGW7XEn0Q\nFT+bXgSfKi8KL3NY2/3nqMVJOVv7NfpPj93wv1nNnH3srXwyjRQKQiyD9YBe\n6f0k\r\n=RoYX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC001GpoWpOlnFcQAJyHyUbFXw5oC3W5fx4fAuujPbkAgIhAM3+r0OnNq1n5a+1o0wekA8oPClmPrDnhPZY26zSmaAx"}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_4.0.1_1612659340171_0.3223035948226465"},"_hasShrinkwrap":false},"4.0.2":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"4.0.2","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=12"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^3.1.0","gtfs-rt-differential-to-full-dataset":"^1.1.0","gtfs-via-postgres":"^2.4.2","hafas-monitor-trips":"^4.0.0","live-moving-average":"^1.1.0","lodash":"^4.17.20","luxon":"^1.25.0","match-gtfs-rt-to-gtfs":"^3.4.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","p-limit":"^3.0.2","pino":"^6.7.0","serve-buffer":"^2.3.0","speedometer":"^1.1.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^7.11.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","print-gtfs-rt-cli":"^1.2.0","sample-gtfs-feed":"^0.7.0","slugg":"^1.2.1","tokenize-vbb-station-name":"^1.1.0"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"gitHead":"e7360c15ea017418d989f01c1f86e0fb8a1d6d13","_id":"hafas-gtfs-rt-feed@4.0.2","_nodeVersion":"15.6.0","_npmVersion":"7.5.4","dist":{"integrity":"sha512-xBA4DeltaHeiFBz6QHpIRFGupTZj9O7Qa2/OJ0VTM3lyGrg6trZEKbEmvXfXFiCf+cuivxVoq8UKQFkUMqbWag==","shasum":"98379b128906359c6e2214fa625395fc5d3a07fb","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-4.0.2.tgz","fileCount":17,"unpackedSize":48865,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgMVuRCRA9TVsSAnZWagAARSsP/0INaOayjwuSUhBNdv4K\nl5fliwpeCz1YeOUR7qT5cRBz9USYXScQu7H16sa2/6HGsj3NH9ouCrejdRhh\nB2VJhd0SVvkdo8xotc13yEk90F+XxnNXhRRPxpSINBPR8nW9IFtn0m3cMpUI\nhBMYadTZKXQUOND22GP/N7sIDTTQfiZJF3i4b5iFLajQW/dHa2cVgowZ/o5k\nGXkckInyisK5HgywSL4U61CC7BeEorRx7Q4exPdA3hZvLZFNJ8D9dDJ4QzK9\nkA0bb/1blapHzPZ4KGOMCgM7kx9zUV9sMzaUAt5jZXY81kUfb8JG5gRBPyUm\n5FZ7zYyj0O9k7xCVNWjtq3C8MxFItrxNs3hemypYxUW9pKJpw58pF9fcTfoD\nLE3fbQNcpKqorP61ftA7AQi1+S+//eeMkGu36ukZ7x+Lf1QkHrCR+nz21d8q\nO9GQKg1MHtAoTRXbVwHuAXysz9tqMWRUQSGWpSYR+A5UXwzpstjlikMgvZqM\nIlJ61MBrxQNm24ijg00FpxpMTxGz4bL9A6zZ4imAGAhCq71qP7j7Ty9QEnv2\nYC9Yz09VLiQ/xoD5MVM1mEHJDf3lam3QPGXaljIjRl0wc9BhRu0KiUY0QE7t\nicMC4+nvcCAukZO7ftPRqYksLJx/Ti6EaTCfH0uLdbOaWcRf6L9pLFwl8xnR\nlJ81\r\n=vALa\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGoHbh/zvZvfaNPN0OK/M11C9AloS9zb76zv1dOhyrHYAiA8Xqbh2Wnq7u3Jy2Exi2l7PwV16q2m9Jiku437uvDDiA=="}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_4.0.2_1613847440959_0.10028547372296548"},"_hasShrinkwrap":false},"4.1.0":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"4.1.0","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=12"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^3.1.0","gtfs-rt-differential-to-full-dataset":"^1.1.0","gtfs-via-postgres":"^2.4.2","hafas-monitor-trips":"^4.0.0","live-moving-average":"^1.1.0","lodash":"^4.17.20","luxon":"^1.25.0","match-gtfs-rt-to-gtfs":"^3.4.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","p-limit":"^3.0.2","pino":"^6.7.0","serve-buffer":"^2.3.0","speedometer":"^1.1.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^7.11.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","print-gtfs-rt-cli":"^1.2.0","sample-gtfs-feed":"^0.7.0","slugg":"^1.2.1","tokenize-vbb-station-name":"^1.1.0"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"gitHead":"b0f619cab0cee936f73047e09c02b1ea5b7468be","_id":"hafas-gtfs-rt-feed@4.1.0","_nodeVersion":"15.9.0","_npmVersion":"7.5.3","dist":{"integrity":"sha512-WYBWZ4Tz8+XQrSaNSc7uhBoY0zhctlQ+vKxT8290FCwM434G4jixFUJPhiMv9ImtEDIpAS/0xKH2iPTBFVMujg==","shasum":"1975575b3b1f377d6711930704c880851849b3cc","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-4.1.0.tgz","fileCount":17,"unpackedSize":49653,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgN4g3CRA9TVsSAnZWagAAlIsP/2FdeGACl0+t9JB7USxs\neQ840SKQIK9FK2lvK9CDYQvYJ6VWU53XSkZD2JrpyczW77FHVXmlUwTpAfeL\nGDKpMg3YmmdHLC61nmlesEKuxuqbKRgGezXflpK9C7W19iFqbyUm8bvGLjV7\nns64Xv5rGpa2p36U+8g73obywKOSFXV2VBQez27Kwd6EDsCgenRqGwnDGQx2\nKE6bsQy0Sqi3rO8v1vfiVYZpv0RG+Sy9LgM0hNr5OobqYlrGtgcU2ihWE7uz\nUey/HGkP4WzXpUzEYoJja4MVYfQV9761lIxGua6OGyZEaEtJUTAwXr3EWvNt\njn2oHpiw3lsorvt0C7X4nuHE81SIJwXRHR7fzTnZEXbEkCro7TKGLcHC1U8d\n7Ac2zvgq8TckDTt5WQal3AvhfqhqaVQr48iuG4/BYXAsZyg3wias106yG7wI\n0pi9SpE37pQkaYxEHw5eus2amPtGQMIzPnIg99N20PgfxKGADUkaYMShkQ6u\n/pdC7KVeTQ2fzvmHyihKjTnqXefuCSMYOh8svkyToIJNbd87u2Ak7NCaTsfV\nPh1aQxCxrQ0IQCs4o3reA8JHclWG1kBNmrCCueckJpX6fqr8j015T/GwHeKQ\nSBrZS//C+S1OGLkY1h0df/9TLsE6GiIVXNpUFyACZHa3PgWHOl2RjVEEwT5G\nY30J\r\n=RZBw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEQgM3Sglkx0s0MnCjoEAz6ykPVUUmeN5AX5jNS/OcHEAiEA8C8RB7K9fgEmYnFshdPly3Ni22ydqmUtuT/MDLj7vic="}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_4.1.0_1614252086931_0.2825074660478517"},"_hasShrinkwrap":false},"4.2.0":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"4.2.0","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=12"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^3.1.0","gtfs-rt-differential-to-full-dataset":"^1.1.0","gtfs-via-postgres":"^2.4.2","hafas-monitor-trips":"^4.1.0","live-moving-average":"^1.1.0","lodash":"^4.17.20","luxon":"^1.25.0","match-gtfs-rt-to-gtfs":"^3.6.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","p-limit":"^3.0.2","pino":"^6.7.0","serve-buffer":"^2.3.0","speedometer":"^1.1.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^7.11.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","print-gtfs-rt-cli":"^1.2.0","sample-gtfs-feed":"^0.7.0","slugg":"^1.2.1","tokenize-vbb-station-name":"^1.1.0"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"gitHead":"8999b47141c1dda0b5d2e134ddecf8a3ea9aa1bf","_id":"hafas-gtfs-rt-feed@4.2.0","_nodeVersion":"15.9.0","_npmVersion":"7.5.3","dist":{"integrity":"sha512-nmqHvZqQ+f0BghomM1gRQjMzRH3QGnBy/OmeYpcTUHYFsurw7wopgOX5W44Pn6TS4A1x3wP+RQlWJ2G6HSPMPA==","shasum":"b226c05851bb8ab1a14e7e2f431e7aae0898c294","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-4.2.0.tgz","fileCount":18,"unpackedSize":52059,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgOuMDCRA9TVsSAnZWagAAsToP/iWcgUWWZw5DrdrtoGOW\nSjzeW1BozRwG8j1ggpwZk2cHdIOiD2fFtVa9g21+ORS1Ap4U4L8wmrRzKqe2\n4zWzJV0orjKzT637NAqmIij9nvCtROQ5jr1jmt9EmGRHxfzyo+h6tgcXEQmx\nMr8sv9jXXjOcJURYlNuuXqdeLJ1zqQmA/12Z5EFmp+5K6px58T6w6VmoK064\nnvaaFl04r+IZ+cRA64hyT6xl0gFwD0rFSSg3Sjt8ZliJ3EvdvuFLWObMztxj\n8ZyuFiiERMK2TivRruJMhSoPwPsNitX1fDA8E7Ce/wKdFbH97ApGjHqwHg5G\n8rylvXcMgQ8kNnuPf/h6jHPuMrGRkAzVb2ytLtm3JFgxOnXKkXbakVSYYw97\nXcV/5+yNYwIYXckuLSZipA4e9EVQd4RcYYm2yCSbRCM20PLBpX0YoBXlMZsI\nSg7CgtE+VZVzfdvj8dY5MZRfdSR66V58Kyqn192DJFJBgDrgTJlX2g5tENvo\ndAkz2O9vaJQZeIKO2Ij80xQ4nIkTnGk9O4hlmaqTRXsK2P44ddhJi/J4VdVN\nbISHBYDXDGw9PvcKJlTlBtft9D+vuE1PU0dfCRBiQ7H4f+YPMdV/UGOFqgmA\nyMHQcJj/eiNaPQ0yojj98dHkcmqWF1Vlho89FfVHD4D+M34moRcUwkZFGvva\nvGJn\r\n=IPJh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC2F/Ht8CQuh/FDwd6CRMmokcHisX/jgfCBmMwUWhuvKQIgZY8APwpoqh2C4LEZ4ishHzFadeTC/jZ1MDObCqINa5g="}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_4.2.0_1614471938904_0.34282745645207147"},"_hasShrinkwrap":false},"4.3.0":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"4.3.0","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=12"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^3.1.0","gtfs-rt-differential-to-full-dataset":"^1.1.0","gtfs-via-postgres":"^2.4.2","hafas-monitor-trips":"^4.1.0","live-moving-average":"^1.1.0","lodash":"^4.17.20","luxon":"^1.25.0","match-gtfs-rt-to-gtfs":"^3.7.3","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^6.7.0","serve-buffer":"^2.3.0","speedometer":"^1.1.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^7.11.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","print-gtfs-rt-cli":"^1.2.0","sample-gtfs-feed":"^0.10.3","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"gitHead":"b5444dd9255d61012d7e7e001f79a9dad0048566","_id":"hafas-gtfs-rt-feed@4.3.0","_nodeVersion":"16.5.0","_npmVersion":"7.19.1","dist":{"integrity":"sha512-p2UIozYoxNUOPS/scEC/SPPP6VHMc2I87T4SYI0RDQRuDXDf7Nanf5LeyExZNY67sX8/pHj8ZHOKzxWMQB3eJw==","shasum":"d2a8ec4f78056e59ea79d08728bd0632bda9ddcd","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-4.3.0.tgz","fileCount":18,"unpackedSize":52005,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhLPx6CRA9TVsSAnZWagAAMXMP/R5MGt26qHmb/W/qAToH\nc1VAJ+GVJhop6YSnHFO8rk9IE0ZggqdZ6PxkhXKciWIeAKFFP5zD6A423M/7\nTFmiLun0Qf0daSVwmun1qjVjDHnClT1yjxTeuAco5j5DZAEJ9I77706vY9tR\nsYyfrzkBCNdoZEBaZ6hTgHdzINTHp2UZHtce5xTrROiVQz7Wf/k+SMnooZnb\neYxpGxbLprpYdEf+ywfTuBhS2B5cKtJ6qtYa/sXVvge5dPmG4CZoFkBJJcol\njZ0RmcYvcgOE5MVSUN9NxEImwwfX2LN7NDs80+44wbYtjwUVM9J8ScedZGFf\nMp0dKW/sVBMfw9Zq7mAIYXRm1QvxH7IA/syG7cgO8L4HYaJUYlA4G4mmaSLW\nUf71Hhvw59OX2UeNH8UMxEb3pIP518oukd+W2ai48dW4pQ8zrQGgMO4AUPUq\nGh9f8GrSTdhGdETkOOmrWRUfMpzNT/tenmBWVNkQYQcGN5IzCHWGmc+FYSFq\nI7l6uu10eFTAxuiGfGV7yQf9nYqjyEqprOC8otnDH7Yf4YXuIfE5L5VkEbzd\nI4ybomH7vXFfogV+ECIn5kMaPZcdJmSNDyvtDEqUzJejFvHKbaE+4ih9NP10\nOPP9clii3NwSJn+230ga+38OqG8wqqcVZL7WOeBOA9kq7xGiYcQ+4jD50/7k\nbhqE\r\n=Ozti\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDu/FS2bM/EMNRGiBWjKbuLWxwY/ByAVARE4nYzGhhnGgIge6qwYLDw+mlc31uwC9J1kODkiPX5rt11beAgaLc4PHI="}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_4.3.0_1630338169918_0.26167557422598886"},"_hasShrinkwrap":false},"5.0.0":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"5.0.0","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=14"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.0.1","gtfs-via-postgres":"^2.4.2","hafas-monitor-trips":"^4.1.0","live-moving-average":"^1.1.0","lodash":"^4.17.20","luxon":"^2.0.2","match-gtfs-rt-to-gtfs":"^3.7.3","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^6.7.0","serve-buffer":"^2.3.0","speedometer":"^1.1.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^7.11.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","print-gtfs-rt-cli":"^2.0.0","sample-gtfs-feed":"^0.10.3","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"readme":"# hafas-gtfs-rt-feed\n\n**Generate a [GTFS Realtime (GTFS-RT)](https://developers.google.com/transit/gtfs-realtime/) feed by polling a [HAFAS endpoint](https://github.com/public-transport/hafas-client#background).**\n\n[![npm version](https://img.shields.io/npm/v/hafas-gtfs-rt-feed.svg)](https://www.npmjs.com/package/hafas-gtfs-rt-feed)\n[![build status](https://img.shields.io/github/workflow/status/derhuerst/hafas-gtfs-rt-feed/test/master)](https://github.com/derhuerst/hafas-gtfs-rt-feed/actions)\n[![Prosperity/Apache license](https://img.shields.io/static/v1?label=license&message=Prosperity%2FApache&color=0997E8)](#license)\n[![support me via GitHub Sponsors](https://img.shields.io/badge/support%20me-donate-fa7664.svg)](https://github.com/sponsors/derhuerst)\n[![chat with me on Twitter](https://img.shields.io/badge/chat%20with%20me-on%20Twitter-1da1f2.svg)](https://twitter.com/derhuerst)\n\n\n## Architecture\n\n`hafas-gtfs-rt-feed` consists of several components, connected to each other via the [NATS Streaming](https://docs.nats.io/nats-streaming-concepts/intro) channels:\n\n1. `monitor-hafas`: Given a [`hafas-client` instance](https://github.com/public-transport/hafas-client), it uses [`hafas-monitor-trips`](https://github.com/derhuerst/hafas-monitor-trips) to poll live data about all vehicles in the configured geographic area.\n2. `match-with-gtfs`: Uses [`match-gtfs-rt-to-gtfs`](https://github.com/derhuerst/match-gtfs-rt-to-gtfs) to match this data against [static GTFS](https://developers.google.com/transit/gtfs) data imported into a database.\n3. `serve-as-gtfs-rt`: Uses [`gtfs-rt-differential-to-full-dataset`](https://github.com/derhuerst/gtfs-rt-differential-to-full-dataset) to aggregate the matched data into a single [GTFS-RT](https://developers.google.com/transit/gtfs-realtime/) feed, and serves the feed via HTTP.\n\n`monitor-hafas` sends data to `match-with-gtfs` via two NATS Streaming channels `trips` & `movements`; `match-with-gtfs` sends data to `serve-as-gtfs-rt` via two channels `matched-trips` & `matched-movements`.\n\n```\n                   GTFS data in a            clients\nHAFAS API          PostgreSQL DB                ^\n   ^ |                  ^ |                     | GTFS-RT\n   | |                  | |                     |\n   | v                  | v                     |\nmonitor-hafas      match-with-gtfs        serve-as-gtfs-rt\n   ||                 ^^   ||                   ^  ^\n   ||                 ||   ||                   |  |\n   |+----> trips -----+|   |+--> matched-trips -+  |\n   +-----> movements --+   +---> matched-movements +\n```\n\n\n## Usage\n\nSome preparations are necessary for `hafas-gtfs-rt-feed` to work. Let's get started!\n\nRun `npm init` inside a new directory to initialize an empty [npm](https://docs.npmjs.com/cli/v6/commands/npm)-based project.\n\n```sh\nmkdir deutsche-bahn-gtfs-rt-feed\ncd deutsche-bahn-gtfs-rt-feed\nnpm init\n```\n\n### set up NATS Streaming\n\n[Install and run the NATS Streaming Server](https://docs.nats.io/nats-streaming-server/run) as documented.\n\n*Note:* If you run Nats Streaming on a different host or port, pass a custom `NATS_URL` environment variable into all `hafas-gtfs-rt-feed` components.\n\n### set up PostgreSQL\n\nMake sure you have a reasonably recent version of [PostgreSQL](https://www.postgresql.org) installed and running. There are guides for many operating systems and environments available on the internet.\n\n*Note:* If you run PostgreSQL on a different host or port, pass custom [`PG*` environment variables](https://www.postgresql.org/docs/13/libpq-envars.html) into the `match.js` component.\n\n### install `hafas-gtfs-rt-feed`\n\nUse the [npm CLI](https://docs.npmjs.com/getting-started/configuring-your-local-environment):\n\n```shell\nnpm install hafas-gtfs-rt-feed\n# added 153 packages in 12s\n```\n\n### set up a `hafas-client` instance\n\n`hafas-gtfs-rt-feed` is agnostic to the HAFAS API it pulls data from: To fetch data, `monitor-hafas` just uses the `hafas-client` you passed in, which you must point towards one out of many HAFAS API endpoints.\n\nSet up [`hafas-client` as documented](https://github.com/public-transport/hafas-client/blob/ba27f549520082e576560d235c34f397b0f6e06a/readme.md#usage). A very basic example using the [Deutsche Bahn (DB) endpoint](https://github.com/public-transport/hafas-client/blob/5/p/db/readme.md):\n\n```js\n// deutsche-bahn-hafas.js\nconst createClient = require('hafas-client')\nconst dbProfile = require('hafas-client/p/db')\n\n// create hafas-client configured to use Deutsche Bahn's HAFAS API\nconst client = createClient(dbProfile, 'my-awesome-program')\n\nmodule.exports = client\n```\n\n### build the GTFS matching database\n\n`match-with-gtfs` needs a pre-populated matching database to run; It uses [`gtfs-via-postgres`](https://npmjs.com/package/gtfs-via-postgres) and [`match-gtfs-rt-to-gtfs`](https://npmjs.com/package/match-gtfs-rt-to-gtfs) underneath.\n\nFirst, we're going to use [`gtfs-via-postgres`](https://npmjs.com/package/gtfs-via-postgres)'s `gtfs-to-sql` command-line tool to import our GTFS data into PostgreSQL.\n\n*Note:* Make sure you have an up-to-date [GTFS Static](https://developers.google.com/transit/gtfs) dataset, unzipped into individual `.txt` files.\n\n```sh\n# create a PostgreSQL database `gtfs`\npsql -c 'create database gtfs'\n# configure all subsequent commands to use it\nexport PGDATABASE=gtfs\n# import all .txt files\nnode_modules/.bin/gtfs-to-sql -d -u path/to/gtfs/files/*.txt\n```\n\nYou database `gtfs` should contain *basic* GTFS data now.\n\n---\n\n[`match-gtfs-rt-to-gtfs`](https://npmjs.com/package/match-gtfs-rt-to-gtfs) works by matching HAFAS stops & lines against GTFS stops & lines, using their IDs and *their names*. Usually, HAFAS & GTFS stop/line names don't have the same format, so they need to be normalized.\n\nYou'll have to implement this normalization logic. A simplified (but very naive) normalization logic *may* look like this:\n\n```js\n// hafas-info.js\nmodule.exports = {\n\tendpointName: 'some-hafas-api',\n\tnormalizeStopName: name => name.toLowerCase().replace(/\\s+/g, ' ').trim(),\n\tnormalizeLineName: name => name.toLowerCase().replace(/\\s+/g, ' ').trim(),\n}\n```\n\n```js\n// gtfs-info.js\nmodule.exports = {\n\tendpointName: 'some-gtfs-feed',\n\tnormalizeStopName: name => name.toLowerCase().replace(/\\s+St\\.$/, ''),\n\tnormalizeLineName: name => name.toLowerCase(),\n}\n```\n\n`match-gtfs-rt-to-gtfs` needs some special matching indices in the database to work efficiently. Now that we have implemented some normalization logic, we're going to pass it to `match-gtfs-rt-to-gtfs`'s `build-gtfs-match-index` command-line tool:\n\n```sh\n# add matching indices to the `gtfs` database\nnode_modules/.bin/build-gtfs-match-index path/to/hafas-info.js path/to/gtfs-info.js\n```\n\n*Note:* `hafas-gtfs-rt-feed` is data- & region-agnostic, so it depends on your HAFAS-endpoint-specific name normalization logic to match as many HAFAS trips/vehicles as possible against the GTFS data. The ratio matched items would ideally be 100%, because GTFS-RT feeds are intended to be consumed *along* a GTFS dataset with *matching IDs*.\n\n### run all components\n\nNow that we've set everything up, let's run all `hafas-gtfs-rt-feed` components to check if they are working!\n\nAll three components need to be run in parallel, so just open three terminals to run them. They will start logging [pino-formatted](https://getpino.io/#/?id=usage) log messages.\n\n```shell\n# specify the bounding box to be monitored (required)\nexport BBOX='{\"north\": 1.1, \"west\": 22.2, \"south\": 3.3, \"east\": 33.3}'\n# start monitor-hafas\nnode_modules/.bin/monitor-hafas deutsche-bahn-hafas.js\n# todo: sample logs\n```\n\n```shell\nnode_modules/.bin/match-with-gtfs\n# todo: sample logs\n```\n\n```shell\nnode_modules/.bin/serve-as-gtfs-rt\n```\n\n### inspecting the feed\n\nYour GTFS-RT feed should now be served at `http://localhost:3000/`, and within a few moments, it should contain data! 👏\n\nYou can verify this using many available GTFS-RT tools; Here are two of them to quickly inspect the feed:\n\n- [`print-gtfs-rt-cli`](https://github.com/derhuerst/print-gtfs-rt-cli) is a command-line tool, use it with `curl`: `curl 'http://localhost:3000/' -s | print-gtfs-rt`.\n- [`gtfs-rt-inspector`](https://public-transport.github.io/gtfs-rt-inspector/?feedUrl=http%3A%2F%2Flocalhost%3A3000%2F%0A) is a web app that can inspect any [CORS](https://enable-cors.org)-enabled GTFS-RT feed; Paste `http://localhost:3000/` into the url field to inspect yours.\n\nAfter `monitor.js` has fetched some data from HAFAS, and after `match.js` has matched it against the GTFS (or failed or timed out doing so), you should see [`TripUpdate`s](https://developers.google.com/transit/gtfs-realtime/reference/#message-tripupdate) & [`VehiclePosition`s](https://developers.google.com/transit/gtfs-realtime/reference/#message-vehicleposition).\n\n\n## Related\n\n- [`hafas-gtfs-rt-server-example`](https://github.com/derhuerst/hafas-gtfs-rt-server-example) – Using [`hafas-client`](https://github.com/public-transport/hafas-client), [`hafas-monitor-trips`](https://github.com/derhuerst/hafas-monitor-trips) & [`hafas-gtfs-rt-feed`](https://github.com/derhuerst/hafas-gtfs-rt-feed) as a GTFS-RT server.\n- [`match-gtfs-rt-to-gtfs`](https://github.com/derhuerst/match-gtfs-rt-to-gtfs) – Match realtime transit data (e.g. from [GTFS Realtime](https://gtfs.org/reference/realtime/v2/)) with [GTFS Static](https://gtfs.org/reference/static) data, even if they don't share an ID.\n- [`gtfs-rt-differential-to-full-dataset`](https://github.com/derhuerst/gtfs-rt-differential-to-full-dataset) – Transform a continuous [GTFS Realtime](https://developers.google.com/transit/gtfs-realtime/) stream of [`DIFFERENTIAL` incrementality](https://developers.google.com/transit/gtfs-realtime/reference/#enum-incrementality) data into a [`FULL_DATASET`](https://developers.google.com/transit/gtfs-realtime/reference/#enum-incrementality) dump.\n- [`transloc-to-gtfs-real-time`](https://github.com/jonathonwpowell/transloc-to-gtfs-real-time) – Transform Transloc Real Time API to the GTFS RealTime Format\n\n\n## License\n\nThis project is dual-licensed: **My contributions are licensed under the [*Prosperity Public License*](https://prosperitylicense.com), [contributions of other people](https://github.com/derhuerst/hafas-gtfs-rt-feed/graphs/contributors) are licensed as [Apache 2.0](https://apache.org/licenses/LICENSE-2.0)**.\n\n> This license allows you to use and share this software for noncommercial purposes for free and to try this software for commercial purposes for thirty days.\n\n> Personal use for research, experiment, and testing for the benefit of public knowledge, personal study, private entertainment, hobby projects, amateur pursuits, or religious observance, without any anticipated commercial application, doesn’t count as use for a commercial purpose.\n\n[Buy a commercial license](https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b) or read more about [why I sell private licenses for my projects](https://gist.github.com/derhuerst/0ef31ee82b6300d2cafd03d10dd522f7).\n\n\n## Contributing\n\nIf you have a question or have difficulties using `hafas-gtfs-rt-feed`, please double-check your code and setup first. If you think you have found a bug or want to propose a feature, refer to [the issues page](https://github.com/derhuerst/hafas-gtfs-rt-feed/issues).\n\nBy contributing, you agree to release your modifications under the [Apache 2.0 license](LICENSE-APACHE).\n","readmeFilename":"readme.md","gitHead":"1da0cad6fdbef00d5efac21d751f510c3e980fa2","_id":"hafas-gtfs-rt-feed@5.0.0","_nodeVersion":"16.5.0","_npmVersion":"7.19.1","dist":{"integrity":"sha512-8KBrgGVNMgMupbq/f5xxHooiRBymlKHVAKaXCb4Yex0EXTrZp1Jc1NyOSL68G4lhqTJBOAoEa/MDiEHXGGUFKQ==","shasum":"e3f4c0c7ef4293c8b5ca98e3b2c3692aceae22a7","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-5.0.0.tgz","fileCount":17,"unpackedSize":51341,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGEZNllMOrZZO2ynn5g2PeYuCXsgbTrScYjO4hWri4dmAiBgRIf5WztKzp9k1kp4q7/296B+1pKreaPAu9oppcZkEA=="}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_5.0.0_1632165742650_0.9097970263997914"},"_hasShrinkwrap":false},"5.0.1":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"5.0.1","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=14"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.0.1","gtfs-via-postgres":"^2.4.2","hafas-monitor-trips":"^4.1.0","live-moving-average":"^1.1.0","lodash":"^4.17.20","luxon":"^2.0.2","match-gtfs-rt-to-gtfs":"^4.0.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^6.7.0","serve-buffer":"^2.3.0","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^7.11.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^7.0.1","print-gtfs-rt-cli":"^2.0.0","sample-gtfs-feed":"^0.10.3","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"gitHead":"1aa1352d3f862f0c6168b87c8e30bc3cac869bc6","_id":"hafas-gtfs-rt-feed@5.0.1","_nodeVersion":"16.10.0","_npmVersion":"7.24.0","dist":{"integrity":"sha512-k+qAf5uC5+/ptSuLRFRQu1BLKddFX1yvOPvbow6A9vtbm7ytBhY5wAGJ7n8xUmGkh/2cUfwtWZhroD8iiLsYgg==","shasum":"3752ca9b4e851b0af743d517445b9bd766e16051","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-5.0.1.tgz","fileCount":17,"unpackedSize":51512,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD72qmcrXjdy/2GCoZUKXX8lNANHnQITwfgJ532nS0l6gIhANLIDZv3wOF+0ccd8mf57e64zcdEGa/eWSHQVmy4Bi7L"}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_5.0.1_1632768597752_0.8217816503887803"},"_hasShrinkwrap":false},"5.1.0":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"5.1.0","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=14"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.0.1","gtfs-via-postgres":"^2.4.2","hafas-monitor-trips":"^4.2.1","lodash":"^4.17.20","luxon":"^2.0.2","match-gtfs-rt-to-gtfs":"^4.0.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^6.7.0","prom-client":"^14.0.0","serve-buffer":"^2.3.0","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^7.11.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^7.0.1","print-gtfs-rt-cli":"^2.0.0","sample-gtfs-feed":"^0.10.3","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"gitHead":"bb866b66e90cda1025704e1e39f189b103179364","_id":"hafas-gtfs-rt-feed@5.1.0","_nodeVersion":"16.10.0","_npmVersion":"7.24.0","dist":{"integrity":"sha512-MRX14HRAk89uVAparBVlbjFMbuK+JaMzZBAoo6C2F8p5h7DCnp7llDnv7k1jEmZBkC29WAM9aqFyHfrzmekUWQ==","shasum":"9cd3d1d2583843c476778f74fca967e53ecbc4e3","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-5.1.0.tgz","fileCount":20,"unpackedSize":58476,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF+YyTu5p4sjVfOB2QUewowKcNRi/b88n98Mv1uD4OnHAiEA5hl4hh3XKPT/RSp+YoWPJfFGHIX7ZtZwwaGxSXEPJNU="}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_5.1.0_1633905714371_0.7417284022612356"},"_hasShrinkwrap":false},"5.2.0":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"5.2.0","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=14"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.0.1","gtfs-via-postgres":"^2.4.2","hafas-monitor-trips":"^4.2.1","lodash":"^4.17.20","luxon":"^2.0.2","match-gtfs-rt-to-gtfs":"^4.0.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^6.7.0","prom-client":"^14.0.0","serve-buffer":"^2.3.0","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^7.11.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^7.0.1","print-gtfs-rt-cli":"^2.0.0","sample-gtfs-feed":"^0.10.3","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"gitHead":"700e57607589a632b89383945d8b83f6891f96bc","_id":"hafas-gtfs-rt-feed@5.2.0","_nodeVersion":"16.10.0","_npmVersion":"7.24.0","dist":{"integrity":"sha512-c7vUrCTvKpHlWGt7VarRtDsLmfRPZw/8t+sg+XfxU9C6AIw4MW2XBS1Hqf/yRY0nPHHGGijS3utcIXui1djytA==","shasum":"642cc75795804d9fb0340f1679ea16411e0dac23","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-5.2.0.tgz","fileCount":20,"unpackedSize":58660,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDnHzk56NZdmwSFBVk0oGV2IXH2jCxc1GAs2/5l+s0OjwIhAPylwmQZWlN4x5BNtCREYrjgUa1+Bg8aTIKRbx7IrO64"}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_5.2.0_1633959610150_0.2509673924543392"},"_hasShrinkwrap":false},"5.3.0":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"5.3.0","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=14"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.0.1","gtfs-via-postgres":"^2.4.2","hafas-monitor-trips":"^4.2.1","lodash":"^4.17.20","luxon":"^2.0.2","match-gtfs-rt-to-gtfs":"^4.0.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^6.7.0","prom-client":"^14.0.0","serve-buffer":"^2.3.0","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^7.11.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^7.0.1","print-gtfs-rt-cli":"^2.0.0","sample-gtfs-feed":"^0.10.3","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"gitHead":"9b437bfcd0c1f6017eb3dfe9e5e461fe8d40406d","_id":"hafas-gtfs-rt-feed@5.3.0","_nodeVersion":"16.10.0","_npmVersion":"7.24.0","dist":{"integrity":"sha512-HTUdlb536GbL6DafMRlcXnZR2BrEDZSpBTyDoTHQAJQCfUsKGgq6nRx96OKXcgyfJMGsxKe41mL44ocRVAgeIQ==","shasum":"8c874181d0e256f5e8d0e2c78661bcbc59d9dde1","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-5.3.0.tgz","fileCount":20,"unpackedSize":59617,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCw8rTllD3T81Ron2vBiay95AamjOKh0+DQZAOVNAhEUQIgWVqRnb+XDVVDoh9Y831fJs+nknUkAtyVtUDbPZWi8jk="}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_5.3.0_1633968366248_0.9208308573722697"},"_hasShrinkwrap":false},"5.4.0":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"5.4.0","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","debug-gtfs-matching":"debug-matching.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=14"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.0.1","gtfs-via-postgres":"^2.4.2","hafas-monitor-trips":"^4.2.1","lodash":"^4.17.20","luxon":"^2.0.2","match-gtfs-rt-to-gtfs":"^4.0.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^6.7.0","prom-client":"^14.0.0","serve-buffer":"^2.3.0","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^7.11.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^7.0.1","print-gtfs-rt-cli":"^2.0.0","sample-gtfs-feed":"^0.10.3","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"gitHead":"8bb7b5d42c7cfea63c6c9ed60aec00a525d5eedc","_id":"hafas-gtfs-rt-feed@5.4.0","_nodeVersion":"16.11.1","_npmVersion":"8.0.0","dist":{"integrity":"sha512-HowzNiHG3kMCv4NMVJwJz+ioJf7TJY9JwNKrCCoYJymtBifOX6GlcijwoU1jaEgVPjCli8Xe/LDWF1gGJwNxwA==","shasum":"050246e586f31b98f1a9766af44efc4a23c7235f","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-5.4.0.tgz","fileCount":21,"unpackedSize":61495,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBuJPHqhgvMxmnX6OTSjbBzSGgSxsQIujX/oymZbfQ8QAiAzvWMiy+zxKg++GbF3VvUOXbeDnye+2b7wGL2Osa/HKA=="}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_5.4.0_1634806745344_0.09081391773634162"},"_hasShrinkwrap":false},"6.0.0-alpha.1":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"6.0.0-alpha.1","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","debug-gtfs-matching":"debug-matching.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=14"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.0.1","gtfs-via-postgres":"^3.0.1","hafas-monitor-trips":"^5.0.0","lodash":"^4.17.20","luxon":"^2.0.2","match-gtfs-rt-to-gtfs":"^5.0.0-alpha.1","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^7.0.5","prom-client":"^14.0.0","serve-buffer":"^2.3.0","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^8.1.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^7.0.1","print-gtfs-rt-cli":"^2.0.0","sample-gtfs-feed":"^0.10.3","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint && npm test"},"readme":"# hafas-gtfs-rt-feed\n\n**Generate a [GTFS Realtime (GTFS-RT)](https://developers.google.com/transit/gtfs-realtime/) feed by polling a [HAFAS endpoint](https://github.com/public-transport/hafas-client#background).**\n\n[![npm version](https://img.shields.io/npm/v/hafas-gtfs-rt-feed.svg)](https://www.npmjs.com/package/hafas-gtfs-rt-feed)\n[![build status](https://img.shields.io/github/workflow/status/derhuerst/hafas-gtfs-rt-feed/test/master)](https://github.com/derhuerst/hafas-gtfs-rt-feed/actions)\n[![Prosperity/Apache license](https://img.shields.io/static/v1?label=license&message=Prosperity%2FApache&color=0997E8)](#license)\n[![support me via GitHub Sponsors](https://img.shields.io/badge/support%20me-donate-fa7664.svg)](https://github.com/sponsors/derhuerst)\n[![chat with me on Twitter](https://img.shields.io/badge/chat%20with%20me-on%20Twitter-1da1f2.svg)](https://twitter.com/derhuerst)\n\n\n## Architecture\n\n`hafas-gtfs-rt-feed` consists of several components, connected to each other via the [NATS Streaming](https://docs.nats.io/nats-streaming-concepts/intro) channels:\n\n1. `monitor-hafas`: Given a [`hafas-client` instance](https://github.com/public-transport/hafas-client), it uses [`hafas-monitor-trips`](https://github.com/derhuerst/hafas-monitor-trips) to poll live data about all vehicles in the configured geographic area.\n2. `match-with-gtfs`: Uses [`match-gtfs-rt-to-gtfs`](https://github.com/derhuerst/match-gtfs-rt-to-gtfs) to match this data against [static GTFS](https://developers.google.com/transit/gtfs) data imported into a database.\n3. `serve-as-gtfs-rt`: Uses [`gtfs-rt-differential-to-full-dataset`](https://github.com/derhuerst/gtfs-rt-differential-to-full-dataset) to aggregate the matched data into a single [GTFS-RT](https://developers.google.com/transit/gtfs-realtime/) feed, and serves the feed via HTTP.\n\n`monitor-hafas` sends data to `match-with-gtfs` via two NATS Streaming channels `trips` & `movements`; `match-with-gtfs` sends data to `serve-as-gtfs-rt` via two channels `matched-trips` & `matched-movements`.\n\n```\n                   GTFS data in a            clients\nHAFAS API          PostgreSQL DB                ^\n   ^ |                  ^ |                     | GTFS-RT\n   | |                  | |                     |\n   | v                  | v                     |\nmonitor-hafas      match-with-gtfs        serve-as-gtfs-rt\n   ||                 ^^   ||                   ^  ^\n   ||                 ||   ||                   |  |\n   |+----> trips -----+|   |+--> matched-trips -+  |\n   +-----> movements --+   +---> matched-movements +\n```\n\n\n## Usage\n\nSome preparations are necessary for `hafas-gtfs-rt-feed` to work. Let's get started!\n\nRun `npm init` inside a new directory to initialize an empty [npm](https://docs.npmjs.com/cli/v6/commands/npm)-based project.\n\n```sh\nmkdir deutsche-bahn-gtfs-rt-feed\ncd deutsche-bahn-gtfs-rt-feed\nnpm init\n```\n\n### set up NATS Streaming\n\n[Install and run the NATS Streaming Server](https://docs.nats.io/nats-streaming-server/run) as documented.\n\n*Note:* If you run Nats Streaming on a different host or port, pass a custom `NATS_STREAMING_URL` environment variable into all `hafas-gtfs-rt-feed` components.\n\n### set up PostgreSQL\n\nMake sure you have a reasonably recent version of [PostgreSQL](https://www.postgresql.org) installed and running. There are guides for many operating systems and environments available on the internet.\n\n*Note:* If you run PostgreSQL on a different host or port, pass custom [`PG*` environment variables](https://www.postgresql.org/docs/13/libpq-envars.html) into the `match.js` component.\n\n### install `hafas-gtfs-rt-feed`\n\nUse the [npm CLI](https://docs.npmjs.com/getting-started/configuring-your-local-environment):\n\n```shell\nnpm install hafas-gtfs-rt-feed\n# added 153 packages in 12s\n```\n\n### set up a `hafas-client` instance\n\n`hafas-gtfs-rt-feed` is agnostic to the HAFAS API it pulls data from: To fetch data, `monitor-hafas` just uses the `hafas-client` you passed in, which you must point towards one out of many HAFAS API endpoints.\n\nSet up [`hafas-client` as documented](https://github.com/public-transport/hafas-client/blob/ba27f549520082e576560d235c34f397b0f6e06a/readme.md#usage). A very basic example using the [Deutsche Bahn (DB) endpoint](https://github.com/public-transport/hafas-client/blob/5/p/db/readme.md):\n\n```js\n// deutsche-bahn-hafas.js\nconst createClient = require('hafas-client')\nconst dbProfile = require('hafas-client/p/db')\n\n// create hafas-client configured to use Deutsche Bahn's HAFAS API\nconst client = createClient(dbProfile, 'my-awesome-program')\n\nmodule.exports = client\n```\n\n### build the GTFS matching database\n\n`match-with-gtfs` needs a pre-populated matching database to run; It uses [`gtfs-via-postgres`](https://npmjs.com/package/gtfs-via-postgres) and [`match-gtfs-rt-to-gtfs`](https://npmjs.com/package/match-gtfs-rt-to-gtfs) underneath.\n\nFirst, we're going to use [`gtfs-via-postgres`](https://npmjs.com/package/gtfs-via-postgres)'s `gtfs-to-sql` command-line tool to import our GTFS data into PostgreSQL.\n\n*Note:* Make sure you have an up-to-date [GTFS Static](https://developers.google.com/transit/gtfs) dataset, unzipped into individual `.txt` files.\n\n```sh\n# create a PostgreSQL database `gtfs`\npsql -c 'create database gtfs'\n# configure all subsequent commands to use it\nexport PGDATABASE=gtfs\n# import all .txt files\nnode_modules/.bin/gtfs-to-sql -d -u path/to/gtfs/files/*.txt\n```\n\nYou database `gtfs` should contain *basic* GTFS data now.\n\n---\n\n[`match-gtfs-rt-to-gtfs`](https://npmjs.com/package/match-gtfs-rt-to-gtfs) works by matching HAFAS stops & lines against GTFS stops & lines, using their IDs and *their names*. Usually, HAFAS & GTFS stop/line names don't have the same format, so they need to be normalized.\n\nYou'll have to implement this normalization logic. A simplified (but very naive) normalization logic *may* look like this:\n\n```js\n// hafas-info.js\nmodule.exports = {\n\tendpointName: 'some-hafas-api',\n\tnormalizeStopName: name => name.toLowerCase().replace(/\\s+/g, ' ').trim(),\n\tnormalizeLineName: name => name.toLowerCase().replace(/\\s+/g, ' ').trim(),\n}\n```\n\n```js\n// gtfs-info.js\nmodule.exports = {\n\tendpointName: 'some-gtfs-feed',\n\tnormalizeStopName: name => name.toLowerCase().replace(/\\s+St\\.$/, ''),\n\tnormalizeLineName: name => name.toLowerCase(),\n}\n```\n\n`match-gtfs-rt-to-gtfs` needs some special matching indices in the database to work efficiently. Now that we have implemented some normalization logic, we're going to pass it to `match-gtfs-rt-to-gtfs`'s `build-gtfs-match-index` command-line tool:\n\n```sh\n# add matching indices to the `gtfs` database\nnode_modules/.bin/build-gtfs-match-index path/to/hafas-info.js path/to/gtfs-info.js\n```\n\n*Note:* `hafas-gtfs-rt-feed` is data- & region-agnostic, so it depends on your HAFAS-endpoint-specific name normalization logic to match as many HAFAS trips/vehicles as possible against the GTFS data. The ratio matched items would ideally be 100%, because GTFS-RT feeds are intended to be consumed *along* a GTFS dataset with *matching IDs*.\n\n### run all components\n\nNow that we've set everything up, let's run all `hafas-gtfs-rt-feed` components to check if they are working!\n\nAll three components need to be run in parallel, so just open three terminals to run them. They will start logging [pino-formatted](https://getpino.io/#/?id=usage) log messages.\n\n```shell\n# specify the bounding box to be monitored (required)\nexport BBOX='{\"north\": 1.1, \"west\": 22.2, \"south\": 3.3, \"east\": 33.3}'\n# start monitor-hafas\nnode_modules/.bin/monitor-hafas deutsche-bahn-hafas.js\n# todo: sample logs\n```\n\n```shell\nnode_modules/.bin/match-with-gtfs\n# todo: sample logs\n```\n\n```shell\nnode_modules/.bin/serve-as-gtfs-rt\n```\n\n### inspecting the feed\n\nYour GTFS-RT feed should now be served at `http://localhost:3000/`, and within a few moments, it should contain data! 👏\n\nYou can verify this using many available GTFS-RT tools; Here are two of them to quickly inspect the feed:\n\n- [`print-gtfs-rt-cli`](https://github.com/derhuerst/print-gtfs-rt-cli) is a command-line tool, use it with `curl`: `curl 'http://localhost:3000/' -s | print-gtfs-rt`.\n- [`gtfs-rt-inspector`](https://public-transport.github.io/gtfs-rt-inspector/?feedUrl=http%3A%2F%2Flocalhost%3A3000%2F%0A) is a web app that can inspect any [CORS](https://enable-cors.org)-enabled GTFS-RT feed; Paste `http://localhost:3000/` into the url field to inspect yours.\n\nAfter `monitor.js` has fetched some data from HAFAS, and after `match.js` has matched it against the GTFS (or failed or timed out doing so), you should see [`TripUpdate`s](https://developers.google.com/transit/gtfs-realtime/reference/#message-tripupdate) & [`VehiclePosition`s](https://developers.google.com/transit/gtfs-realtime/reference/#message-vehicleposition).\n\n### metrics\n\nAll three components (`monitor-hafas`, `match-with-gtfs`, `serve-as-gtfs-rt`) expose [Prometheus](https://prometheus.io)-compatible metrics via HTTP. You can fetch and process them using e.g. Prometheus, [VictoriaMetrics](https://victoriametrics.com) or the [Grafana Agent](https://grafana.com/docs/grafana-cloud/agent/).\n\nAs an example, we're going to inspect `monitor-hafas`'s metrics. Enable them by running it with an `METRICS_SERVER_PORT=9323` environment variable and query its metrics via HTTP:\n\n```shell\ncurl 'http://localhost:9323/metrics'\n```\n\n```\n# HELP nats_streaming_sent_total nr. of messages published to NATS streaming\n# TYPE nats_streaming_sent_total counter\nnats_streaming_sent_total{channel=\"movements\"} 1673\nnats_streaming_sent_total{channel=\"trips\"} 1162\n\n# HELP hafas_reqs_total nr. of HAFAS requests\n# TYPE hafas_reqs_total counter\nhafas_reqs_total{call=\"radar\"} 90\nhafas_reqs_total{call=\"trip\"} 1165\n\n# HELP hafas_response_time_seconds HAFAS response time\n# TYPE hafas_response_time_seconds summary\nhafas_response_time_seconds{quantile=\"0.05\",call=\"radar\"} 1.0396666666666665\nhafas_response_time_seconds{quantile=\"0.5\",call=\"radar\"} 3.8535000000000004\nhafas_response_time_seconds{quantile=\"0.95\",call=\"radar\"} 6.833\nhafas_response_time_seconds_sum{call=\"radar\"} 338.22600000000006\nhafas_response_time_seconds_count{call=\"radar\"} 90\nhafas_response_time_seconds{quantile=\"0.05\",call=\"trip\"} 2.4385\nhafas_response_time_seconds{quantile=\"0.5\",call=\"trip\"} 28.380077380952383\nhafas_response_time_seconds{quantile=\"0.95\",call=\"trip\"} 54.51257142857143\nhafas_response_time_seconds_sum{call=\"trip\"} 33225.48200000005\nhafas_response_time_seconds_count{call=\"trip\"} 1165\n\n# HELP monitored_tiles_total nr. of tiles being monitored\n# TYPE monitored_tiles_total gauge\nmonitored_tiles_total 30\n\n# HELP monitored_trips_total nr. of trips being monitored\n# TYPE monitored_trips_total gauge\nmonitored_trips_total 588\n```\n\n### controlling the number of requests to HAFAS\n\nCurrently, there is no mechanism to influence the total rate of requests to HAFAS *directly*, no prioritisation between the \"find trips in a bounding box\" (`hafas-client`'s `radar()`) and \"refresh a trip\" (`hafas-client`'s `trip()`) requests, and no logic to efficiently use requests up to a certain configured limit.\n\nHowever, there are some dials to influence the amount requests of both types:\n\n- By defining a smaller or larger bounding box via the `BBOX` environment variable, you can control the total number of monitored trips, and thus the rate of requests.\n- By setting `FETCH_TRIPS_INTERVAL`, you can choose how often each monitored trip shall be refreshed. Note that this is a *minimum* interval; If it takes too longer to refresh all trips, the interval will be longer, hence the rate of `trip()` requests will be lower.\n- You can throttle the total number of requests to HAFAS by [throttling `hafas-client`](https://github.com/public-transport/hafas-client/blob/5/throttle.js), but depending on the rate you configure, this might cause the refresh of all monitored trips (as well as finding new trips to monitor) to take longer than configured using `FETCH_TRIPS_INTERVAL`, so consider it as a secondary tool.\n\n\n## Related\n\n- [`hafas-gtfs-rt-server-example`](https://github.com/derhuerst/hafas-gtfs-rt-server-example) – Using [`hafas-client`](https://github.com/public-transport/hafas-client), [`hafas-monitor-trips`](https://github.com/derhuerst/hafas-monitor-trips) & [`hafas-gtfs-rt-feed`](https://github.com/derhuerst/hafas-gtfs-rt-feed) as a GTFS-RT server.\n- [`match-gtfs-rt-to-gtfs`](https://github.com/derhuerst/match-gtfs-rt-to-gtfs) – Match realtime transit data (e.g. from [GTFS Realtime](https://gtfs.org/reference/realtime/v2/)) with [GTFS Static](https://gtfs.org/reference/static) data, even if they don't share an ID.\n- [`gtfs-rt-differential-to-full-dataset`](https://github.com/derhuerst/gtfs-rt-differential-to-full-dataset) – Transform a continuous [GTFS Realtime](https://developers.google.com/transit/gtfs-realtime/) stream of [`DIFFERENTIAL` incrementality](https://developers.google.com/transit/gtfs-realtime/reference/#enum-incrementality) data into a [`FULL_DATASET`](https://developers.google.com/transit/gtfs-realtime/reference/#enum-incrementality) dump.\n- [`transloc-to-gtfs-real-time`](https://github.com/jonathonwpowell/transloc-to-gtfs-real-time) – Transform Transloc Real Time API to the GTFS RealTime Format\n\n\n## License\n\nThis project is dual-licensed: **My contributions are licensed under the [*Prosperity Public License*](https://prosperitylicense.com), [contributions of other people](https://github.com/derhuerst/hafas-gtfs-rt-feed/graphs/contributors) are licensed as [Apache 2.0](https://apache.org/licenses/LICENSE-2.0)**.\n\n> This license allows you to use and share this software for noncommercial purposes for free and to try this software for commercial purposes for thirty days.\n\n> Personal use for research, experiment, and testing for the benefit of public knowledge, personal study, private entertainment, hobby projects, amateur pursuits, or religious observance, without any anticipated commercial application, doesn’t count as use for a commercial purpose.\n\n[Buy a commercial license](https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b) or read more about [why I sell private licenses for my projects](https://gist.github.com/derhuerst/0ef31ee82b6300d2cafd03d10dd522f7).\n\n\n## Contributing\n\nIf you have a question or have difficulties using `hafas-gtfs-rt-feed`, please double-check your code and setup first. If you think you have found a bug or want to propose a feature, refer to [the issues page](https://github.com/derhuerst/hafas-gtfs-rt-feed/issues).\n\nBy contributing, you agree to release your modifications under the [Apache 2.0 license](LICENSE-APACHE).\n","readmeFilename":"readme.md","gitHead":"1ed6c887436b72be197575a49141e000814389e1","_id":"hafas-gtfs-rt-feed@6.0.0-alpha.1","_nodeVersion":"17.0.1","_npmVersion":"8.1.2","dist":{"integrity":"sha512-ETIFxXkfzwFV0iTtx9ewFIQTSRWi653Nmrk8PmxyDTMwI1SOH90dzMJzFf2EC4BPd+wS45h1hzu39gC/bn6Tag==","shasum":"5cff719825fcecddd96fd9a8a9c710dffbb8b34c","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-6.0.0-alpha.1.tgz","fileCount":21,"unpackedSize":63473,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAlDZCHPXoLfljtUgcfhGiam5qD2quRrvZ0q4htwpdsXAiAHT1+NQ2fX2wIM1GA3+kFgZ36IAju6wZnPE7+BX8o75g=="}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_6.0.0-alpha.1_1636134278045_0.7601742595491314"},"_hasShrinkwrap":false},"5.5.0":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"5.5.0","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","debug-gtfs-matching":"debug-matching.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=14"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.0.1","gtfs-via-postgres":"^2.4.2","hafas-monitor-trips":"^5.0.0","lodash":"^4.17.20","luxon":"^2.0.2","match-gtfs-rt-to-gtfs":"^4.0.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^7.0.5","prom-client":"^14.0.0","serve-buffer":"^2.3.0","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^8.1.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^7.0.1","print-gtfs-rt-cli":"^2.0.0","sample-gtfs-feed":"^0.10.3","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"gitHead":"88c8af5b73430f299ccf9c54fb99a31fa6fb15c6","_id":"hafas-gtfs-rt-feed@5.5.0","_nodeVersion":"17.0.1","_npmVersion":"8.1.3","dist":{"integrity":"sha512-wNku0yS20GtZ97YGgQfwU5V7YDLK4yT34PfInF6/XhQ9CYAQsAAfT4+iozVaVjztr9uSRsFdf4rQrHGKP2W3pQ==","shasum":"559a1cfad81cf1e9f86742e1e06de820a96904a3","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-5.5.0.tgz","fileCount":21,"unpackedSize":63446,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhlotaCRA9TVsSAnZWagAAa2cP/2KTdI8xv2btaRd8AEey\nbdm+3BOnkhkt4Uo3TsEIKW235elCPkq2iYNQMxswUpY22bTqtyeBRKUUgPjq\nDRO3E6R/RnMUqejOlD3fAGagL1wgVflsV7JTXm/DJ8Cos8u/1tfX8CG2kbpn\njFiFepQqEKoQq+PiotsLZfRqVEioiwJsxTXA+sDU9KSbwHLLIhz4pwt92t9O\n4mJfsttnJU/hGjPKIvbpdVKvZJcGf6OWI89nV9hTl5OZXT6StIOYU62NFXJe\n8COiTIZ3ilKYPtpIgIInrHO4Pv5ezI7Y8IugKtT7WBaiHeKpyL1u2WbEsa3p\nWBNxnbXa7nMufw/K2ApS60yjB7eQc0Yao9IFf7kYKly+R73hoszrDRXyTTeV\nFSzZ6NdkRhI2EktbB44mdn95ENngb/QR5Kg6ifgZOK5Wf+2YPd6d2gUw92lC\nxeZig2r3pHuwm0bR/2O0uCYrQKm7BjaCFK5xxKdW/cuIEY14r1AQ2Is5yOhq\nBlUKP/va6QQNkTuFm7HoVkuzk4qIL8UkmtRw3+n6M4ehc0yhiejtCSx7IPh3\n2SITJSSNCHC3+is0qIkt2aaxrdTHjii2uv/fD4NgNYI8G1GjrD8JuSdh9dPK\nFs22EvhXSIsbSNG/Rv8t7LxDqSFesVmq2N+atQHfW8BvKpzjgFLzVP+A/uPG\nTUUW\r\n=J/ro\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD0XtG1LksoLAt6MCQktVHOnC5hunncEhhLgdGEtdbtPQIgUtyb5/q0UPUJGeH1xDmULdNnpbMoFNQpR10aNfVVlcA="}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_5.5.0_1637256026738_0.06819258500875525"},"_hasShrinkwrap":false},"6.0.0":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"6.0.0","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","debug-gtfs-matching":"debug-matching.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=16"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.0.1","gtfs-via-postgres":"^3.0.1","hafas-monitor-trips":"^5.0.0","lodash":"^4.17.20","luxon":"^2.0.2","match-gtfs-rt-to-gtfs":"^5.0.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^7.0.5","prom-client":"^14.0.0","serve-buffer":"^3.0.3","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^8.1.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^7.0.1","print-gtfs-rt-cli":"^2.0.0","sample-gtfs-feed":"^0.10.3","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"gitHead":"b2afbf78a9697cceddd97330e663ca8bbb00eae9","_id":"hafas-gtfs-rt-feed@6.0.0","_nodeVersion":"17.0.1","_npmVersion":"8.1.3","dist":{"integrity":"sha512-E7/MBH3iK0C4CzdWbd1WMzw0xt+Xf4zgKgc4gqrVsb21gT6jPPGodZKN+jIJra4NZ2Xdpn7Grt+e8nnOFjmcUQ==","shasum":"31732e00059a74646bb6a4678194532120555e3d","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-6.0.0.tgz","fileCount":21,"unpackedSize":62972,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhlqOHCRA9TVsSAnZWagAADosQAIWDzFi0h1mUOvd/u2bl\ndNGXLfBCK+Jk+iT/jIoCNCx4ykQ0kXRkTxODNJYt5x0y56hdFjgFuxBRO7Zg\nQd3eGa4ENMSVlj49Sf5wSk2RfxB1X/uMv8cwbM7D/WqX59eWYZK42uXa0Bxx\nRE/D7bhWbR0JvzGTO/ZYOFZPZ7dNLw96BFaE77fEvFm6cuQIMHT7L4ftc/47\ni/+xo6QBwW072Mp6TsrxlXSZhQiZImL+IeHqZluWAG/RlG5e6KZr8dPzPCbE\n4mVYHVKuOA8OFi+Kd1iRlZ6CNllOUnOOx0RpVfqOei+xr4lUYdRgJo1bC304\niYQ8+My5GSJKXW31PG7MRdxg+SjZObP972y7+ppi1hxc5OoYSC2jWHxA9p/a\nwtcdrhtcGXvd1aSRchLCyVSVtQ6cgRVCtt+aiX1z+ZUTha0KQcWPtAmdeYeZ\nU7xWR3Q9fDg4sWO9ssFFM/REIbTd9eY/hervB3Xm2KBBAsZexjuoVuNUUOdl\n6JPfiPxt1rurBMtVWff5X7d8R/n2Gn8ITZ5vr7OM48d4gBnET2qrwaoQZXJ6\nnyO9ZRQphI8cCA9wiwvN7loxb2nwstkeXGtn/nZOTNx/4HrHsey7+s6IFtqP\ndfzGbGEK2sFbJ2/zVp6LE5qXXZ9FKdysVf1sOJ4I/ax+LDwFX/zsk32hBNDf\n0JJc\r\n=fhk2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD+Xh7/eqddQDdDAd0k7f4Iq/6EHjNHinP/7DXwX04qFQIhAO0u+dqnqQo3PizMAyJqwAfguj3ZlEJdn4MaAWGBapqN"}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_6.0.0_1637262215721_0.9662508403903038"},"_hasShrinkwrap":false},"6.1.0":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"6.1.0","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","debug-gtfs-matching":"debug-matching.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=16"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.0.1","gtfs-via-postgres":"^3.0.1","hafas-monitor-trips":"^5.0.0","lodash":"^4.17.20","luxon":"^2.0.2","match-gtfs-rt-to-gtfs":"^5.0.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^7.0.5","prom-client":"^14.0.0","send":"^0.17.2","serve-buffer":"^3.0.3","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^8.1.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^7.0.1","print-gtfs-rt-cli":"^2.0.0","sample-gtfs-feed":"^0.10.3","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"gitHead":"7c93eafc907f2dd8f2ea050085be9f68875584f8","_id":"hafas-gtfs-rt-feed@6.1.0","_nodeVersion":"17.2.0","_npmVersion":"8.3.0","dist":{"integrity":"sha512-ix2objZS2imjDHNUItRo+dlBQL/Hfmtqd3iReSCevpbUlj+yXnMZ/UgrCnZVvzeDS84G+IMVtx62C6v98lF5/Q==","shasum":"f60faa2d93eb40ae493aec2f6a5a1c4613372039","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-6.1.0.tgz","fileCount":23,"unpackedSize":67927,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhyPB+CRA9TVsSAnZWagAAyT4QAIDXW9Xlr3s3b5ydaVBv\nR0T98W+pPmLE7nBqEGjO3Od3zAlwFkJ18/I+4YbuYgJ0vRLRAaHMsA02cPtR\nYy61gzwh2rcpSt+oyEB64YpCfebYR2UVpK4IvQpkn2n6YqVsZ0UO7oXSqNfY\nK1rejOmzaQjzhK1MmCZcuIISNB95XuW9NoqvysGoBU7YBvvpwPnfdsG2mMvq\nTia9AvfHsTS4rrYIrn6WVmYGsLCPCweA3HRsN8FssaxnVXiMKlPMTbpA0aRz\nocArygal22kSsRPvqL4Jrzc1akYg0eBJdvGfeOALYZHY6QUg0RgO9c/zsHXZ\naKrBHhEs+YJuezn8Qs8CKIv7ibYs/oFdIWIFuTAKAcY2MYQKL5vKw1rnURsY\nkIviemJ0aLTwCZ6k6Yu9WdZpVhrNv4c0Pjc97bYC/x0zQ4SZH1Q/lSvo3jfJ\nvc2lvczif8yUstp8XOhknVUj176dkRh7bDurtioGQSwbROjnGEaKvpYpYjeG\n+uYm5nOV93yzl8gT4sbiBkCx0XoadHK0gtJXRHabwrRqeWhO1yzIx6wEPFdC\ndg9ctq0bDmWazgoy+4CYN/xSxn4k+NYT5M4hkiuwwU2YqtRPKF/3C6gmeoKX\nL9AoKbU/kmsDG7MDTSeh+gj4IXUZH1UQMvXBbHAJenKhH3Oe1/laQiVBeNhN\ntbg/\r\n=Cs7G\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGUq6c0qq0jtX2TDQ8Lm66J0M/SV5hOQVbDtPR5s680rAiEAuiyVTA1XNhnWZh6/YsFE7SQ8wO8tv+HdYkXjxn+QCnI="}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_6.1.0_1640558717912_0.15073061718166758"},"_hasShrinkwrap":false},"6.2.0":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"6.2.0","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","debug-gtfs-matching":"debug-matching.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=16"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.0.1","gtfs-via-postgres":"^3.0.1","hafas-monitor-trips":"^5.1.0","lodash":"^4.17.20","luxon":"^2.0.2","match-gtfs-rt-to-gtfs":"^5.0.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^7.0.5","prom-client":"^14.0.0","send":"^0.17.2","serve-buffer":"^3.0.3","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^8.1.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^7.0.1","print-gtfs-rt-cli":"^2.0.0","sample-gtfs-feed":"^0.10.3","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint && npm test"},"gitHead":"7ad745ab3fc187150d8a836b453b00ab0a49b2a8","_id":"hafas-gtfs-rt-feed@6.2.0","_nodeVersion":"17.2.0","_npmVersion":"8.3.0","dist":{"integrity":"sha512-+lU7X1jxBUmeLwXaWVKQxYy8MwKFb4X+E1MSM4WnBLBbzgoo8NV8HZRbkQuzuRTfTJiCtkqB14EoxbdutXlLwA==","shasum":"6b5ecb19bd0130017b4500d5dba5eaa45493d92f","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-6.2.0.tgz","fileCount":23,"unpackedSize":70133,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhzdvRCRA9TVsSAnZWagAAlWoP/iqNh+gLYUiv/1Fv7U7g\nDsguB7eYFsPjaLklIIVlNr8exEOjb6Za3tgjvVbstZd++wCKBHoxKrSGncJZ\nr3TbKjaAT17Ii8AvhI/fs7Cvh2NfNrG5xk2ZZttRsPeX6XZZcUohtf35rWVq\n2pUVe9xurvx8eaIkDJvybxvvdn/WpGu8Ff856CEL5AcgwVuBIqRX1K1UsVfk\nMsrHL7cjolAvJufHTmBqLlqQL5Gi935Q73NHPgt5qB0ZpV6mu0Y51zzPWrXp\nqFYYXk7kIlVZnrddr1IBLkNmo0/6h13LjOLHPvzKvPM3kx/U+mjiLclz00uQ\nnV1SOg6wJy5YygCdkxoHYrOrynDR8mlyog79PkJFIDmNG0Qm1/WgkqXONOcw\ndbtKBNRisUabTHMTiUeBG+mMsdipbg9Qr8EevxHmemEavogiLSdnrgRaGITj\n80DFNnwXT8sRjKjTa6TT2sRuAhNY02QZj1hQLkMoP/CdUL8Fkd6IqWmH6PvT\nYJeqTEsr6vxG6NTTYxe1ILAP+HxrWEBHg9avGp5TV9R7mOtoYmfe7jm8o2zf\nhh/lZipt7Q7eYoNa1FLBpH0/BmfWMpkrOD1DpGVK2LkkMDFqWzPUjGCZX2gh\nRDp+qM+vdFwhHYNLTb4i3TfqcA/9gKxwh3ldQ/OOx7eIhOBLF7CjfLwV4wcf\nML5t\r\n=Qc0C\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD8XkS8pK/7xuYJpLzDDYqaMD9/Mq3/UFW5eFCMfHCjlgIhAOsXPkMmRKOmcufHGDwQSjWF7zyzL4CpgCOkdyWs1f0C"}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_6.2.0_1640881104876_0.2615911294428035"},"_hasShrinkwrap":false},"7.0.0-alpha.1":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"7.0.0-alpha.1","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","debug-gtfs-matching":"debug-matching.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=16"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.0.1","gtfs-via-postgres":"^3.0.1","hafas-monitor-trips":"^6.0.0","lodash":"^4.17.20","luxon":"^2.0.2","match-gtfs-rt-to-gtfs":"^5.0.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^7.0.5","prom-client":"^14.0.0","send":"^0.17.2","serve-buffer":"^3.0.3","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^8.1.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^7.0.1","print-gtfs-rt-cli":"^2.0.0","sample-gtfs-feed":"^0.10.3","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"readme":"# hafas-gtfs-rt-feed\n\n**Generate a [GTFS Realtime (GTFS-RT)](https://developers.google.com/transit/gtfs-realtime/) feed by polling a [HAFAS endpoint](https://github.com/public-transport/hafas-client#background).**\n\n[![npm version](https://img.shields.io/npm/v/hafas-gtfs-rt-feed.svg)](https://www.npmjs.com/package/hafas-gtfs-rt-feed)\n[![build status](https://img.shields.io/github/workflow/status/derhuerst/hafas-gtfs-rt-feed/test/master)](https://github.com/derhuerst/hafas-gtfs-rt-feed/actions)\n[![Prosperity/Apache license](https://img.shields.io/static/v1?label=license&message=Prosperity%2FApache&color=0997E8)](#license)\n[![support me via GitHub Sponsors](https://img.shields.io/badge/support%20me-donate-fa7664.svg)](https://github.com/sponsors/derhuerst)\n[![chat with me on Twitter](https://img.shields.io/badge/chat%20with%20me-on%20Twitter-1da1f2.svg)](https://twitter.com/derhuerst)\n\n\n## Architecture\n\n`hafas-gtfs-rt-feed` consists of several components, connected to each other via the [NATS Streaming](https://docs.nats.io/nats-streaming-concepts/intro) channels:\n\n1. `monitor-hafas`: Given a [`hafas-client` instance](https://github.com/public-transport/hafas-client), it uses [`hafas-monitor-trips`](https://github.com/derhuerst/hafas-monitor-trips) to poll live data about all vehicles in the configured geographic area.\n2. `match-with-gtfs`: Uses [`match-gtfs-rt-to-gtfs`](https://github.com/derhuerst/match-gtfs-rt-to-gtfs) to match this data against [static GTFS](https://developers.google.com/transit/gtfs) data imported into a database.\n3. `serve-as-gtfs-rt`: Uses [`gtfs-rt-differential-to-full-dataset`](https://github.com/derhuerst/gtfs-rt-differential-to-full-dataset) to aggregate the matched data into a single [GTFS-RT](https://developers.google.com/transit/gtfs-realtime/) feed, and serves the feed via HTTP.\n\n`monitor-hafas` sends data to `match-with-gtfs` via two NATS Streaming channels `trips` & `movements`; `match-with-gtfs` sends data to `serve-as-gtfs-rt` via two channels `matched-trips` & `matched-movements`.\n\n```\n                   GTFS data in a            clients\nHAFAS API          PostgreSQL DB                ^\n   ^ |                  ^ |                     | GTFS-RT\n   | |                  | |                     |\n   | v                  | v                     |\nmonitor-hafas      match-with-gtfs        serve-as-gtfs-rt\n   ||                 ^^   ||                   ^  ^\n   ||                 ||   ||                   |  |\n   |+----> trips -----+|   |+--> matched-trips -+  |\n   +-----> movements --+   +---> matched-movements +\n```\n\n\n## Usage\n\nSome preparations are necessary for `hafas-gtfs-rt-feed` to work. Let's get started!\n\nRun `npm init` inside a new directory to initialize an empty [npm](https://docs.npmjs.com/cli/v6/commands/npm)-based project.\n\n```sh\nmkdir deutsche-bahn-gtfs-rt-feed\ncd deutsche-bahn-gtfs-rt-feed\nnpm init\n```\n\n### set up NATS Streaming\n\n[Install and run the NATS Streaming Server](https://docs.nats.io/nats-streaming-server/run) as documented.\n\n*Note:* If you run Nats Streaming on a different host or port, pass a custom `NATS_STREAMING_URL` environment variable into all `hafas-gtfs-rt-feed` components.\n\n### set up PostgreSQL\n\nMake sure you have a reasonably recent version of [PostgreSQL](https://www.postgresql.org) installed and running. There are guides for many operating systems and environments available on the internet.\n\n*Note:* If you run PostgreSQL on a different host or port, pass custom [`PG*` environment variables](https://www.postgresql.org/docs/13/libpq-envars.html) into the `match.js` component.\n\n### install `hafas-gtfs-rt-feed`\n\nUse the [npm CLI](https://docs.npmjs.com/getting-started/configuring-your-local-environment):\n\n```shell\nnpm install hafas-gtfs-rt-feed\n# added 153 packages in 12s\n```\n\n### set up a `hafas-client` instance\n\n`hafas-gtfs-rt-feed` is agnostic to the HAFAS API it pulls data from: To fetch data, `monitor-hafas` just uses the `hafas-client` you passed in, which you must point towards one out of many HAFAS API endpoints.\n\nSet up [`hafas-client` as documented](https://github.com/public-transport/hafas-client/blob/ba27f549520082e576560d235c34f397b0f6e06a/readme.md#usage). A very basic example using the [Deutsche Bahn (DB) endpoint](https://github.com/public-transport/hafas-client/blob/5/p/db/readme.md):\n\n```js\n// deutsche-bahn-hafas.js\nconst createClient = require('hafas-client')\nconst dbProfile = require('hafas-client/p/db')\n\n// create hafas-client configured to use Deutsche Bahn's HAFAS API\nconst client = createClient(dbProfile, 'my-awesome-program')\n\nmodule.exports = client\n```\n\n### build the GTFS matching database\n\n`match-with-gtfs` needs a pre-populated matching database to run; It uses [`gtfs-via-postgres`](https://npmjs.com/package/gtfs-via-postgres) and [`match-gtfs-rt-to-gtfs`](https://npmjs.com/package/match-gtfs-rt-to-gtfs) underneath.\n\nFirst, we're going to use [`gtfs-via-postgres`](https://npmjs.com/package/gtfs-via-postgres)'s `gtfs-to-sql` command-line tool to import our GTFS data into PostgreSQL.\n\n*Note:* Make sure you have an up-to-date [GTFS Static](https://developers.google.com/transit/gtfs) dataset, unzipped into individual `.txt` files.\n\n```sh\n# create a PostgreSQL database `gtfs`\npsql -c 'create database gtfs'\n# configure all subsequent commands to use it\nexport PGDATABASE=gtfs\n# import all .txt files\nnode_modules/.bin/gtfs-to-sql -d -u path/to/gtfs/files/*.txt\n```\n\nYou database `gtfs` should contain *basic* GTFS data now.\n\n---\n\n[`match-gtfs-rt-to-gtfs`](https://npmjs.com/package/match-gtfs-rt-to-gtfs) works by matching HAFAS stops & lines against GTFS stops & lines, using their IDs and *their names*. Usually, HAFAS & GTFS stop/line names don't have the same format, so they need to be normalized.\n\nYou'll have to implement this normalization logic. A simplified (but very naive) normalization logic *may* look like this:\n\n```js\n// hafas-info.js\nmodule.exports = {\n\tendpointName: 'some-hafas-api',\n\tnormalizeStopName: name => name.toLowerCase().replace(/\\s+/g, ' ').trim(),\n\tnormalizeLineName: name => name.toLowerCase().replace(/\\s+/g, ' ').trim(),\n}\n```\n\n```js\n// gtfs-info.js\nmodule.exports = {\n\tendpointName: 'some-gtfs-feed',\n\tnormalizeStopName: name => name.toLowerCase().replace(/\\s+St\\.$/, ''),\n\tnormalizeLineName: name => name.toLowerCase(),\n}\n```\n\n`match-gtfs-rt-to-gtfs` needs some special matching indices in the database to work efficiently. Now that we have implemented some normalization logic, we're going to pass it to `match-gtfs-rt-to-gtfs`'s `build-gtfs-match-index` command-line tool:\n\n```sh\n# add matching indices to the `gtfs` database\nnode_modules/.bin/build-gtfs-match-index path/to/hafas-info.js path/to/gtfs-info.js\n```\n\n*Note:* `hafas-gtfs-rt-feed` is data- & region-agnostic, so it depends on your HAFAS-endpoint-specific name normalization logic to match as many HAFAS trips/vehicles as possible against the GTFS data. The ratio matched items would ideally be 100%, because GTFS-RT feeds are intended to be consumed *along* a GTFS dataset with *matching IDs*.\n\n### run all components\n\nNow that we've set everything up, let's run all `hafas-gtfs-rt-feed` components to check if they are working!\n\nAll three components need to be run in parallel, so just open three terminals to run them. They will start logging [pino-formatted](https://getpino.io/#/?id=usage) log messages.\n\n```shell\n# specify the bounding box to be monitored (required)\nexport BBOX='{\"north\": 1.1, \"west\": 22.2, \"south\": 3.3, \"east\": 33.3}'\n# start monitor-hafas\nnode_modules/.bin/monitor-hafas deutsche-bahn-hafas.js\n# todo: sample logs\n```\n\n```shell\nnode_modules/.bin/match-with-gtfs\n# todo: sample logs\n```\n\n```shell\nnode_modules/.bin/serve-as-gtfs-rt\n```\n\n### inspecting the feed\n\nYour GTFS-RT feed should now be served at `http://localhost:3000/`, and within a few moments, it should contain data! 👏\n\nYou can verify this using many available GTFS-RT tools; Here are two of them to quickly inspect the feed:\n\n- [`print-gtfs-rt-cli`](https://github.com/derhuerst/print-gtfs-rt-cli) is a command-line tool, use it with `curl`: `curl 'http://localhost:3000/' -s | print-gtfs-rt`.\n- [`gtfs-rt-inspector`](https://public-transport.github.io/gtfs-rt-inspector/?feedUrl=http%3A%2F%2Flocalhost%3A3000%2F%0A) is a web app that can inspect any [CORS](https://enable-cors.org)-enabled GTFS-RT feed; Paste `http://localhost:3000/` into the url field to inspect yours.\n\nAfter `monitor.js` has fetched some data from HAFAS, and after `match.js` has matched it against the GTFS (or failed or timed out doing so), you should see [`TripUpdate`s](https://developers.google.com/transit/gtfs-realtime/reference/#message-tripupdate) & [`VehiclePosition`s](https://developers.google.com/transit/gtfs-realtime/reference/#message-vehicleposition).\n\n### metrics\n\nAll three components (`monitor-hafas`, `match-with-gtfs`, `serve-as-gtfs-rt`) expose [Prometheus](https://prometheus.io)-compatible metrics via HTTP. You can fetch and process them using e.g. Prometheus, [VictoriaMetrics](https://victoriametrics.com) or the [Grafana Agent](https://grafana.com/docs/grafana-cloud/agent/).\n\nAs an example, we're going to inspect `monitor-hafas`'s metrics. Enable them by running it with an `METRICS_SERVER_PORT=9323` environment variable and query its metrics via HTTP:\n\n```shell\ncurl 'http://localhost:9323/metrics'\n```\n\n```\n# HELP nats_streaming_sent_total nr. of messages published to NATS streaming\n# TYPE nats_streaming_sent_total counter\nnats_streaming_sent_total{channel=\"movements\"} 1673\nnats_streaming_sent_total{channel=\"trips\"} 1162\n\n# HELP hafas_reqs_total nr. of HAFAS requests\n# TYPE hafas_reqs_total counter\nhafas_reqs_total{call=\"radar\"} 90\nhafas_reqs_total{call=\"trip\"} 1165\n\n# HELP hafas_response_time_seconds HAFAS response time\n# TYPE hafas_response_time_seconds summary\nhafas_response_time_seconds{quantile=\"0.05\",call=\"radar\"} 1.0396666666666665\nhafas_response_time_seconds{quantile=\"0.5\",call=\"radar\"} 3.8535000000000004\nhafas_response_time_seconds{quantile=\"0.95\",call=\"radar\"} 6.833\nhafas_response_time_seconds_sum{call=\"radar\"} 338.22600000000006\nhafas_response_time_seconds_count{call=\"radar\"} 90\nhafas_response_time_seconds{quantile=\"0.05\",call=\"trip\"} 2.4385\nhafas_response_time_seconds{quantile=\"0.5\",call=\"trip\"} 28.380077380952383\nhafas_response_time_seconds{quantile=\"0.95\",call=\"trip\"} 54.51257142857143\nhafas_response_time_seconds_sum{call=\"trip\"} 33225.48200000005\nhafas_response_time_seconds_count{call=\"trip\"} 1165\n\n# HELP monitored_tiles_total nr. of tiles being monitored\n# TYPE monitored_tiles_total gauge\nmonitored_tiles_total 30\n\n# HELP monitored_trips_total nr. of trips being monitored\n# TYPE monitored_trips_total gauge\nmonitored_trips_total 588\n```\n\n### controlling the number of requests to HAFAS\n\nCurrently, there is no mechanism to influence the total rate of requests to HAFAS *directly*, no prioritisation between the \"find trips in a bounding box\" (`hafas-client`'s `radar()`) and \"refresh a trip\" (`hafas-client`'s `trip()`) requests, and no logic to efficiently use requests up to a certain configured limit.\n\nHowever, there are some dials to influence the amount requests of both types:\n\n- By defining a smaller or larger bounding box via the `BBOX` environment variable, you can control the total number of monitored trips, and thus the rate of requests.\n- By setting `FETCH_TRIPS_INTERVAL`, you can choose how often each monitored trip shall be refreshed. Note that this is a *minimum* interval; If it takes too longer to refresh all trips, the interval will be longer, hence the rate of `trip()` requests will be lower.\n- You can throttle the total number of requests to HAFAS by [throttling `hafas-client`](https://github.com/public-transport/hafas-client/blob/5/throttle.js), but depending on the rate you configure, this might cause the refresh of all monitored trips (as well as finding new trips to monitor) to take longer than configured using `FETCH_TRIPS_INTERVAL`, so consider it as a secondary tool.\n\n### exposing feed metadata\n\nIf you pass metadata about the GTFS-Static feed used, `serve-as-gtfs-rt` will expose it via HTTP:\n\n```shell\nserve-as-gtfs-rt \\\n\t--static-feed-info path/to/gtfs/files/feed_info.txt \\\n\t--static-feed-url https://data.ndovloket.nl/flixbus/flixbus-eu.zip\n\ncurl 'http://localhost:3000/feed_info.csv'\n# feed_publisher_name,feed_publisher_url,feed_lang,feed_start_date,feed_end_date,feed_version\n# openOV,http://openov.nl,en,20210108,20210221,20210108\n\ncurl 'http://localhost:3000/feed_info.csv' -I\n# HTTP/1.1 302 Found\n# location: https://data.ndovloket.nl/flixbus/flixbus-eu.zip\n```\n\n### on-demand mode\n\nOptionally, you can run your GTFS-RT feed in a demand-responsive mode, where it will only fetch data from HAFAS as long someone requests the GTFS-RT feed.\n\nIt lets `serve-as-gtfs-rt` signal demand for fresh data to `monitor-hafas` via the `demand` NATS Streaming channel. You'll have to run `monitor-hafas` with `--on-demand` and `serve-as-gtfs-rt` with `--signal-demand`.\n\n\n## Related\n\n- [`hafas-gtfs-rt-server-example`](https://github.com/derhuerst/hafas-gtfs-rt-server-example) – Using [`hafas-client`](https://github.com/public-transport/hafas-client), [`hafas-monitor-trips`](https://github.com/derhuerst/hafas-monitor-trips) & [`hafas-gtfs-rt-feed`](https://github.com/derhuerst/hafas-gtfs-rt-feed) as a GTFS-RT server.\n- [`match-gtfs-rt-to-gtfs`](https://github.com/derhuerst/match-gtfs-rt-to-gtfs) – Match realtime transit data (e.g. from [GTFS Realtime](https://gtfs.org/reference/realtime/v2/)) with [GTFS Static](https://gtfs.org/reference/static) data, even if they don't share an ID.\n- [`gtfs-rt-differential-to-full-dataset`](https://github.com/derhuerst/gtfs-rt-differential-to-full-dataset) – Transform a continuous [GTFS Realtime](https://developers.google.com/transit/gtfs-realtime/) stream of [`DIFFERENTIAL` incrementality](https://developers.google.com/transit/gtfs-realtime/reference/#enum-incrementality) data into a [`FULL_DATASET`](https://developers.google.com/transit/gtfs-realtime/reference/#enum-incrementality) dump.\n- [`transloc-to-gtfs-real-time`](https://github.com/jonathonwpowell/transloc-to-gtfs-real-time) – Transform Transloc Real Time API to the GTFS RealTime Format\n\n\n## License\n\nThis project is dual-licensed: **My contributions are licensed under the [*Prosperity Public License*](https://prosperitylicense.com), [contributions of other people](https://github.com/derhuerst/hafas-gtfs-rt-feed/graphs/contributors) are licensed as [Apache 2.0](https://apache.org/licenses/LICENSE-2.0)**.\n\n> This license allows you to use and share this software for noncommercial purposes for free and to try this software for commercial purposes for thirty days.\n\n> Personal use for research, experiment, and testing for the benefit of public knowledge, personal study, private entertainment, hobby projects, amateur pursuits, or religious observance, without any anticipated commercial application, doesn’t count as use for a commercial purpose.\n\n[Buy a commercial license](https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b) or read more about [why I sell private licenses for my projects](https://gist.github.com/derhuerst/0ef31ee82b6300d2cafd03d10dd522f7).\n\n\n## Contributing\n\nIf you have a question or have difficulties using `hafas-gtfs-rt-feed`, please double-check your code and setup first. If you think you have found a bug or want to propose a feature, refer to [the issues page](https://github.com/derhuerst/hafas-gtfs-rt-feed/issues).\n\nBy contributing, you agree to release your modifications under the [Apache 2.0 license](LICENSE-APACHE).\n","readmeFilename":"readme.md","gitHead":"04a3ac955d53b156b07e90456e2135bddfde5310","_id":"hafas-gtfs-rt-feed@7.0.0-alpha.1","_nodeVersion":"17.2.0","_npmVersion":"8.3.0","dist":{"integrity":"sha512-P8fdVnT6q0fDy5SZzeiwJxB/0eCO4sFGx6wIGe7BaZUeoj1NgYtwdLV4KgOFM7zPGR08EOcjm4NnAR6b/qDLcA==","shasum":"d78537dea3b722e5b3f9bbd3039fb560062b0ba8","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-7.0.0-alpha.1.tgz","fileCount":23,"unpackedSize":72974,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh4Ig1CRA9TVsSAnZWagAAGWEQAI/MT/lrNoQ7mMRbJu6e\nYopD7Dz/M3DV7yCJAAb/JNteRYglB065BitJNfFiLuXoSsYVwWJ6evmxm5l2\nV8InFb+uCD5X01uIW55FwOs+rjqjRpxpPEd3QRI24+KeqP1UuiRrQgIMXqB0\n9noAgPCqoBfwAc8qlkOoAYOzv++S+njDjcn/orOPFfqAj0xIWqpsKmWz/XlQ\nEwZtYh8fzrRMniIjDBOAbKw0ErYoewDVMtLuhgDYkgHqgrn1aNIVZJPkanEp\n4d2Sd8VWRaTwaJT4EKKcZdFDSBpn8QEKdTyZbLInWeKLW/NcdyD8hoLhtkyW\n9oRf1l26qtEAM5ktg8VIB6w1cjzeDZy+ZGWPRDc06j00gY0xUyeqp+pROg1N\n6ES+PsbwjQakCpMB4xu3i90YUJdIpzrtMqK1kTiM4C8DpD2LifvCmI5J6iYr\nFz9YSPR6/LbAVUoBGS4obVtkDov+0hKL0N/VGosnh8hk5XoLhwpH3BWKF0gS\nlueiWrF/Qm/CHY9eGWY3b7DLX+J9Q1DQvQs7hf82P10HiE3AWcZXWIHLQuOA\nY1ThpvEZb/O12R8gdcp2bX6CQz6wf9hYH/0rnkMT5TUugTVwRuDkAtgC56lS\nMLGSTD3FUKCZSkX9u7hg1LoToc9HxG9ERbwAt+0fEGkKJHA17k/0g2n7qnK/\nr4C6\r\n=CXLj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB2NOdUtSY5iCpG6wtVA09AM1KypZduVBw9qu9o0UQPBAiEA4khBdhMku1FMUCO7HpEVKR0HQ8A/k6w+y6IdXCWnxXA="}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_7.0.0-alpha.1_1642104885360_0.11921322953589963"},"_hasShrinkwrap":false},"7.0.0":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"7.0.0","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","debug-gtfs-matching":"debug-matching.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=16"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.0.1","gtfs-via-postgres":"^3.0.1","hafas-monitor-trips":"^6.0.0","lodash":"^4.17.20","luxon":"^2.0.2","match-gtfs-rt-to-gtfs":"^5.0.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^7.0.5","prom-client":"^14.0.0","send":"^0.17.2","serve-buffer":"^3.0.3","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^8.1.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^7.0.1","print-gtfs-rt-cli":"^2.0.0","sample-gtfs-feed":"^0.10.3","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"gitHead":"a23be22469a2aad6ba2a32bf0c9c7550b15f2394","_id":"hafas-gtfs-rt-feed@7.0.0","_nodeVersion":"17.2.0","_npmVersion":"8.3.0","dist":{"integrity":"sha512-iZ7lp3K3g0G0gNgJEMCBR6dilHM1rvF8Ol8Roy8yEFdF2JzwXv+A2zkcmL3zSXCal2Wfmf8m+izDWnyMxKv9mQ==","shasum":"c05d2e417ea6cef5ae4d9935d1d3bd12c6232e64","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-7.0.0.tgz","fileCount":23,"unpackedSize":72966,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh4tSYCRA9TVsSAnZWagAAr0IP/1ikVY2lmGVLP/ZlxcCM\nhGDYSwX2M3++394l+9Kg55s4MUBu52q9vpp1CVzgJoxfUCcUcZpUxUhJOEpR\noCdIYoYqvOVaXQ4ClyXDkf5Dw0I076sE6LvTzD5KjnyzmBd72dcNizwDyS+p\nLcAjBg1QP1DewH/8lJAv2s8i+rzR+bK29NF3oa+pY1mEHNFEvjX5p7NW9Eu+\n3rkhq/+cQCccA6cByQDnktVMtZAgBdvH3cFyVnfm6mTqDBTKMXBJonkukNQv\nHXG5d+80myY/ZOvTSbJSL+fJBI9ErfJFd7N+2LvTsCji3jOUdmyn/PF9BGh3\nN4cwu9lm5mjiLY1AxmdEsPq63Nmuss0arROyGXyHh2VzOhSoa1Zz9jLMb59z\njB2tTN7a88vcZuJYSpEgTyHvVPZzR3NHF0RdcgpK1R79doBUYsqrGjhT02Wp\nvNGBmkcmSa3QpGZOAmIggQZa3HBdeFZ8csg+J4omZbiiCYcPZJiv4RhbCgzd\n8NGkrKGgPMQFgmXABhj+Y/1Lt8JRKReY7FpK/B8Ju7M7hPhRKcSUYQE6k+XO\npd5iz70xpvPcrNyy0Wi+erD9sLhUO82HVACaBzeYS1uBR8y4p1w0E4NXtRgy\np6WuhZJK7bD5p0G8w0Spr6lZVi4hbCSO9P4HbtGN4Fi1bCY1aFBububIKacn\nxrUY\r\n=0+9L\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF/357VGeyFmRsbfBIbun0z5BGWOqV4KQ8wqlFEZfo8vAiEA4Yp2niLNNGmxAZXKj/ZCPEggJxth7ypaexMex4kobfA="}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_7.0.0_1642255512543_0.9006985463295407"},"_hasShrinkwrap":false},"7.0.1":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"7.0.1","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","debug-gtfs-matching":"debug-matching.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=16"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.0.1","gtfs-via-postgres":"^3.0.1","hafas-monitor-trips":"^6.0.0","lodash":"^4.17.20","luxon":"^2.0.2","match-gtfs-rt-to-gtfs":"^5.0.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^7.0.5","prom-client":"^14.0.0","send":"^0.17.2","serve-buffer":"^3.0.3","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^8.1.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^7.0.1","print-gtfs-rt-cli":"^2.0.0","sample-gtfs-feed":"^0.10.3","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"gitHead":"afe590a259c98745306e24e9a955ce64e8e77d22","_id":"hafas-gtfs-rt-feed@7.0.1","_nodeVersion":"17.2.0","_npmVersion":"8.3.0","dist":{"integrity":"sha512-UzWnk6DA4tprwaqyK9IeM9QkbXxu4DW/MRnN4T8K+/PTa/L839HeznGUS1l6YTnS9qjgzL2RzmD55RzscOiCow==","shasum":"e7a090564411693c588a9f6943c6b9a39ddb5de1","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-7.0.1.tgz","fileCount":23,"unpackedSize":76022,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh5W8hCRA9TVsSAnZWagAAHKEP/iMEToorpO3qAXUjVm9q\nU8uKEBQAaAoK00GnLR4Cq3S5VXXq8tGVl/9a+tBBP25SObcbsEjg0UlH2fJc\nIDakWEE20HMMiQa743G+gBpedzfZy5BLwBe0JUmDs0OECkeheQixBO3De8YJ\nVcjJq2i8Mn3D0zoiqeW8ZFTp7j2gL4KiLQgqe/yQCbIvBo959d7HJPb1SUKS\nornQUxkOeU/gxUZg7aj9nax45NjoJOTbMCIKJGubbyL6p2J2qn5W2PP6I5Zs\nBJ+cfKSZm/WmaZuqDNeEAwbWoNfLG8Nuseo2c0qeUbY350wXjn17mF4baGOz\nPj5A1FUPrym0dsoRf5GC+IOLRyhew5JVygQvB0MjOFrpUAZdKkW9F1zRzpH0\nADZcvhdz7yUhtzrpKIPN5zKWL2T01K6VtgO+7xck58uKuZ8e+0f3bkKz+al1\nmyuqjL35+mfwpJyv9G6Z8AUcuQdfn/sx4QNqHUTD5QiGKfXRIWRdmp2UVSa8\nv1xtAD+IKCE4revSKMjDJ1p7pUG/wCoMeayDevTAkJPJ9/WydgiGD54C9hRd\nQXJ8ADz+K1IJH32kdgXOe45SPOGVta9JqOwhFJRf4ZOnOsEY7vAZg7mXXNIJ\nFcqU6rf7ITcyQEvFiM1S1mU+z0Im7dPEbV4GaAl2ixPnEEWPLbhMmZqJ/Gnq\norBs\r\n=K0YS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCoID0lqZcLdcosKdk+GWUPeBEZTDIsPRmd7Z2J8YU+dgIgHsBJiIqv8GGOBN7zhVmgecHARveiG0JdXfqUTsM8Z5U="}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_7.0.1_1642426144754_0.38954778192616923"},"_hasShrinkwrap":false},"7.1.0":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"7.1.0","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","debug-gtfs-matching":"debug-matching.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=16"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.1.0","gtfs-via-postgres":"^3.0.1","hafas-monitor-trips":"^6.0.0","lodash":"^4.17.20","luxon":"^2.0.2","match-gtfs-rt-to-gtfs":"^5.0.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^7.0.5","prom-client":"^14.0.0","send":"^0.17.2","serve-buffer":"^3.0.3","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^8.1.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^7.0.1","print-gtfs-rt-cli":"^2.0.0","sample-gtfs-feed":"^0.10.3","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"gitHead":"4f4ca8efe0c58c83db1667ae941de6e8e2f04148","_id":"hafas-gtfs-rt-feed@7.1.0","_nodeVersion":"17.2.0","_npmVersion":"8.3.0","dist":{"integrity":"sha512-P9md+yTBH1UjfabMZYVHDrW7YdIsgCwkipkfEC7OgqTcxFz/iXKBJjrXf13RsF8JRjVaIokcjkLav2vPMnj8jQ==","shasum":"56ae7652f3ef02230ab09d229b48f55f14615f10","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-7.1.0.tgz","fileCount":23,"unpackedSize":77051,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh5sPtCRA9TVsSAnZWagAAv+0P/RzqWmBfby1w851SRlzU\nX2KkeEOAEsOPmf+WLRz7bOI0Knoc4xxSsomUY5sd6bujCHfv3EuobqtwPwTE\nVh7PMSTxUFTkFvcRyiaWjVCvnVyqFzLwmSQWe7eDMyelFl0kUBNQs2beRI3L\nJTGKA758WHu0tKvemEJ2mM8jrZYjutUPBr0xqVLawvurswUiB8zlv7e4HF8m\njjgU5odcXihUr6eVZ3ota4mGkX8XDXpzDJue8zcnHC0Y+tyaXR85prwZrG3k\n3HLpE7xpGk7CTCB2qiZeNT3AVCHpfXPfrnmhXHsvtbDWaFC5gl8xPXsi35xW\nUx+aOI5w2DI4KknRyYlPVbqi0Ksn6l9tS3RBShTFDD/4FCFnsdXzHSqFb2K0\nlD+/BMh5EXwCDkUOx70batVVc8ur4XJevqH7E3FB7wmkRkp3tHybaNXgzqbm\nYBwyHwP+OQGhw7CDanCzdHR/sR03iLMSrWzxOa4oerUnZs2xOWx0pZU990Eq\ncQfOQCAbfRVjQ5YI693XnBEYYpAfXT4/dWoZlcUy3iOr0QecWO6JixOa58QG\nzBptLwkuT5Vo9AjX4vWziXGEPvdovxECvP+YwQR9N4wfO+xweIoVommgjPsy\nJ6mhBPL28cudgNrdE9aO7oYUgqRtAf8AOG0v+C7Lc/8kjvGIQ9xaMRUZYZy5\nDoFJ\r\n=WGnS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFKy5IkTAshU+mVBiK8T2SHE6eqJN9eVKNrVvByGoTgaAiEA8JSyIcJOOB0lFjSoWWgmysOrNOO6SCVwMMnPeaSWoYY="}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_7.1.0_1642513388982_0.6509555827215985"},"_hasShrinkwrap":false},"7.2.0":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"7.2.0","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","debug-gtfs-matching":"debug-matching.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=16"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.1.0","gtfs-via-postgres":"^3.0.1","hafas-monitor-trips":"^6.0.0","lodash":"^4.17.20","luxon":"^2.0.2","match-gtfs-rt-to-gtfs":"^5.0.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^7.0.5","prom-client":"^14.0.0","send":"^0.17.2","serve-buffer":"^3.0.3","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^8.1.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^7.0.1","print-gtfs-rt-cli":"^2.0.0","sample-gtfs-feed":"^0.10.3","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"gitHead":"24e1452665aac9706dcf7571e9a0820e25126fb7","_id":"hafas-gtfs-rt-feed@7.2.0","_nodeVersion":"17.5.0","_npmVersion":"8.4.1","dist":{"integrity":"sha512-byQw06oPNPRgQ6K2xs2RVTsZpQ2lT7AFSSiRbSPQ0bwK5pDtV7DDiIU0/Pj6vQrSLWiioYQymEd10oe2otBsig==","shasum":"aaf40f35ecce9d827af890dab3cb5a0b60161afd","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-7.2.0.tgz","fileCount":23,"unpackedSize":77389,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiDpEVACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoR7hAAjCsPXKSyEe3AaUHzro9kqbS2im/zrCGhXzpH7WQYtj4//GJR\r\nfcnbUJxxMGr8T4HHaMysql0a5KOdBb3/f8bE2weiEK5BJ1HYKR2J/TMDx4j8\r\nyGv3qCAwHVPg55ni070GOl8l729VHug+YJNGyE/vtx1qq091xfRxO7bnGmWH\r\nOOj6+T9WpmIRFfwDUiRKdaL41B1YriwnPBpBjECULTfQYLl7WKksKCu+aqsE\r\nL1HtGMltSsvN+8agVM/vj2+KhsyOutQ65gJ5TSTajtWMAykn9asSsguV1OnF\r\nAlLvkBGkjOsgN3RMEyvnAfO2vgt5j4JBoe+GhNbe0iR79HVjxukqzHhUetW9\r\nxcM4+vbGqNKa2o0gqkySgtS/N1y2QVb3TgmlwB69tmTDeDKocrp3XQ4fNtaL\r\nZFw+IkLfrfBAL5DzNoxXiT2hFgPadCWhhqgeXtcRcjGDaEt2HdMhTL4ZT63T\r\np0UJMu0TUh08hz2JmAcNkLCIYCNjg9pClaU+qvcwl8TFp5Pzqh6/ZihY1Z1G\r\nyMUiVeHPOWTEFlFhjxfge/txrgUDLLWFlULYGx5QgQ7I+5HYtJHuSclDFAB5\r\nzYdTWjsVPUccFg2X+TfHEgfq8ZCtsks/pupt/WgJAgNn9CfppA6ZmhUGgib8\r\n9gCzhZchzlBNLtm0usS3VCJaxykwO3FE2s0=\r\n=ILi8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD1xcaUkZVJjA7BFgwpH1AMcZvOjguyrCJZMnnrhazZGgIgIEqeUU14V5cLeRknIOPFobgO7SvCO/3nIqxU3+OngPs="}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_7.2.0_1645121813198_0.21759352250865072"},"_hasShrinkwrap":false},"7.3.0":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"7.3.0","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","debug-gtfs-matching":"debug-matching.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=16"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.1.0","gtfs-via-postgres":"^3.0.1","hafas-monitor-trips":"^6.2.0","lodash":"^4.17.20","luxon":"^2.0.2","match-gtfs-rt-to-gtfs":"^5.0.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^7.0.5","prom-client":"^14.0.0","send":"^0.17.2","serve-buffer":"^3.0.3","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^8.1.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^7.0.1","print-gtfs-rt-cli":"^2.0.0","sample-gtfs-feed":"^0.10.3","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"gitHead":"49220402082d1e58f38a1a497700597846f835e2","_id":"hafas-gtfs-rt-feed@7.3.0","_nodeVersion":"17.5.0","_npmVersion":"8.4.1","dist":{"integrity":"sha512-/BMEbLBio5QyNfoRN6qDrv/iVhUFgJVDf9JNY06v/vKYojQ9Ch3X1dLDyv/l+pWWP+FsGSdHl9RnLcDrH7/l4Q==","shasum":"92e4a244b79826593db7970743ccda09dc4e1ed6","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-7.3.0.tgz","fileCount":23,"unpackedSize":78493,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiFTpJACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo0bA/9HK5awSl1l1XYjEdHII4HyjCun2c0AEL6uWqvQ2IkZ0ERTwyN\r\nOkHA+TdKvrxYQKAx6NPDSJoWAnm28JiihQbq5Uwvl6l0CxbSI5GsWoFipbpg\r\nEiJ3KDbFnOIV9gBh2OXpmEwZH4Lt3hoNPpyih/vpY8mNZLsyvQE85bbTo619\r\nX5ngNBhsTbtLFTTZuPA7PyQoonnIMdsS+qKpkE+nu0knS93ZjzUYMD89Mk2x\r\n5Ee6MhKC3Os6oIyEchdU55Wk4x3mPkIN7c/9hklJn+dptnkHJLduWBJZxSUJ\r\nj3a6LlFguMEPqdpmTBT8p86n48/IXfTdt5MW1RJIMSFa6iyM464S0XYMKvhW\r\n9UU9N2w4bAOpGg47VISbHIoNbLD005yy3/Elh625Axzv066W1uX49OCvx4HR\r\n0AFdlA9cp9q9l9AKcnkhzlKjiFaU3NPWmbvQG9aleIZXfgmjMLz82iKL8Npz\r\nwktV6GbUzxGzGkwkH9feegNEdFUH29YcORtHA+81r5bBTbQDTTh7HJxvmn20\r\nQmJpWPXLb4VvH7xFWnfbOYycbV5ddQWTDc0PEo1i85/GR3tFuR7H2bi1QHTh\r\nrGNHXqj/+WTHGhUmEubkZAbA0gmaEw8XLk5QrAt44KQqnMKlGGhFi3qemLp3\r\nCx2yFvlYbKMCeMtU+qP5PxEqlLzKa8K/Opo=\r\n=ybq1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDS0BAPY5txeXHlD3bH4a3RigX5jgA5rU4mg0cUhL1uBQIgThphyfBuqCbOCBs0N6vNOARwl4BQRl6IkwkCEUL/Y/w="}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_7.3.0_1645558344927_0.5907819284068969"},"_hasShrinkwrap":false},"7.3.1":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"7.3.1","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","debug-gtfs-matching":"debug-matching.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=16"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.1.0","gtfs-via-postgres":"^3.0.1","hafas-monitor-trips":"^6.2.0","lodash":"^4.17.20","luxon":"^2.0.2","match-gtfs-rt-to-gtfs":"^5.0.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^7.0.5","prom-client":"^14.0.0","send":"^0.17.2","serve-buffer":"^3.0.3","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^8.1.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^7.0.1","print-gtfs-rt-cli":"^2.0.0","sample-gtfs-feed":"^0.10.3","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"gitHead":"66b420a71a87c76e2aa0f413a85d49a65594bbd0","_id":"hafas-gtfs-rt-feed@7.3.1","_nodeVersion":"17.5.0","_npmVersion":"8.4.1","dist":{"integrity":"sha512-f1J7u6Kd/MzooqS/t4ZySK5flWwlJjkfcDw5nicPaO5SLy0o9uUeBrF3gpyufsE/maEgGPrGhjEWyqatlWIJwA==","shasum":"ec89eba7c904870fd6ee50d0a46f8db4b8561161","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-7.3.1.tgz","fileCount":23,"unpackedSize":78641,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiL+B6ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrdQRAAg+5KAwXz5Gpb3Q3Ua/N1lHcb1DZyfiylk2TLuNYHGElBY6BP\r\n2inFseIdEWqm1NfKJ4Mu9/5uLavUzZsX1/iZ3+RCwcMR2LDvcd8k6DF0FsMi\r\ngB1Z+sRbI1XKKrIsUJ2aTfv64jjjTysOz0I6whW5kEocgUZBpJmXl10SvVJo\r\nHUsi9gSPLW1LKp1x9TDuAxSHuSSfyEx28Nco2NYSFH3z2qD4nJmJBK6t/JYM\r\n6p/nUNrZORkXXO1/3fCmiMrOSVHRCtKRnt8SUchfar0L4T8aarc1o4lTj1Rp\r\n8tnJ0sWtXar+xwmuXoI0eCShnBnyZXXiS6A/CsK8nedffJ9OngCVvSYGUBo2\r\nVbGj2MA63xI6qkL1hijXNC+0Ug7Fm/lCIQVT/rIFekAup5fOK+MTlwN8DeXZ\r\n3MboEJ9YYaKI3XG+cHvb17oXS35AGyz40Lq/UGwvsD4E4oinuWj2GtP+6vyE\r\naDL88Y/UbsqggUdJjZVKlCgTE6vSIoq/4UC3dUYRpnRAdXcfVYr6DtLB5rjT\r\nkTfn6wCC7nnVEwU4oovjX4YHAZl+8IxUYb6bJypJKDmvXW1gPWopi3Tmvd/g\r\nlVBNOhqMPhDKqE+aeEVVWEN5WXNv22/loHSF3W102oVr5DL2RZW1Z86nvAQX\r\nEmXEwZ3zPV234gkyx1JPthTe3hRMSIo8644=\r\n=FOKT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCb5xEUQpisIErzNzTys7Orou1LQM5+7nsNN+/8uY8VuwIhAM8/Vu13v5EMe87NzUd1aYTAqcJhVwMzlrLLRi+tTshL"}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_7.3.1_1647304826175_0.7673976466773034"},"_hasShrinkwrap":false},"7.3.2":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"7.3.2","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","debug-gtfs-matching":"debug-matching.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=16"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.1.0","gtfs-via-postgres":"^3.0.1","hafas-monitor-trips":"^6.2.0","lodash":"^4.17.20","luxon":"^2.0.2","match-gtfs-rt-to-gtfs":"^5.0.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^7.0.5","prom-client":"^14.0.0","send":"^0.17.2","serve-buffer":"^3.0.3","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^8.1.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^7.0.1","print-gtfs-rt-cli":"^2.0.0","sample-gtfs-feed":"^0.10.3","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"gitHead":"ddeb1a9d58a42688887204cf0da41def63caabe4","_id":"hafas-gtfs-rt-feed@7.3.2","_nodeVersion":"17.8.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-HRo9zLfKf3/QZt9wGq/GAqtAOCsm5G2RKtKqhszEIC71BuFbDfgBxBqE8TfBJJpuu6yVROAuLdmQ8rbvxObh5A==","shasum":"58df83008356dea37534d14b335317d5393af249","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-7.3.2.tgz","fileCount":24,"unpackedSize":81528,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiQkDtACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpbEA//ZZICnxj7bYZh8RdXdrw4geUI6v0eV53OWGObNVRMi4Qwp0rj\r\nnlamlbAx/e4h4Jhf/90ndosCg5RIZrqpUTJpqcKpl6m6ak6HzjWSW1rEllGE\r\nMmS9D9jJPtMn5mTHWtK9lQgiK+ry4bg43TnHkvh13VFTDNsHFzW/ho5qrmuh\r\nv0xnB2eSsy2qeh1VKINWQG5vUzC0xHivkdzD1Y6jfNYEPg6ctDfTv2tTvkEU\r\noaz9DWWHi8NPREhH5WK6t/ju/gmEKbzJI4T4CwYQhPX/vQfl9s5gBYqKY9E8\r\nIicX4Rwdehz9W5y4tBhR6A+5y0/+7iEoigLbziqJDyQsVy7Y1p8fI5AbX9II\r\nqmpcsatGraiapAmYj2TJ3PSSdBZeanBvc3PM4CxmUc1QZztJ1SSn4SIJqR/f\r\nZmOxWjYka29O91/CdDPDSWQElf+7gP/mg/umJT+XYFNCd5yAPYlXr1SsOvU3\r\ndpzBwVhhVbHttU1zjP3gxRNxRxRZAllvnylh+Ug6PWCP/0uSRMyhOHoiImtT\r\nAOD1yj/d7yD7vpoC94wR6qrp6DOvAI8CTbgN9YZPv5GN5gtpwDY1YpGgFQxq\r\nuoagwXP+htrcjypdIn2Kvky1ypRfXSO+hd+wj0ZJH96oi95MoEi+qOhKSo50\r\nXHsTHgo0CWXdnMhgTQPcnzk+1/rJ0EgVEPw=\r\n=1eay\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAkX/3AA8jF4AGSkJkhVWU9cBqAPz0mCbbwlTY/8G8bbAiEA9J9VDwLAeZ6KSX2X7hPtVK4UXPEukcXoEFLIrbpjJ7A="}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_7.3.2_1648509165681_0.3171711651128175"},"_hasShrinkwrap":false},"7.3.3":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"7.3.3","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","debug-gtfs-matching":"debug-matching.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=16"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.1.0","gtfs-via-postgres":"^3.0.1","hafas-monitor-trips":"^6.2.0","lodash":"^4.17.20","luxon":"^2.0.2","match-gtfs-rt-to-gtfs":"^5.0.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^7.0.5","prom-client":"^14.0.0","send":"^0.17.2","serve-buffer":"^3.0.3","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^8.1.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^7.0.1","print-gtfs-rt-cli":"^2.0.0","sample-gtfs-feed":"^0.10.3","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"gitHead":"ea91024720870bf18a24d556466ce9fec0423842","_id":"hafas-gtfs-rt-feed@7.3.3","_nodeVersion":"17.8.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-OBgtLDNkUjYDK1OsfgWT92LDgxRj+7Y8/F+YAigETcrVWYYQrGOKAZk6L4x3axcjNJTIOpxwF497RUgxZN1tJQ==","shasum":"9420a8d21ab2040f1e325d5ccb19d1eaf1057801","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-7.3.3.tgz","fileCount":24,"unpackedSize":81641,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDJPjzLgpCgficX6Krzao79NOPjvghcuw+RhlUyDjL+xwIgdoqxSmKYrcEMWGS2bsP3GttCmkcDtvO++W7NrIb63bQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiTXQQACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrxjA//aZ2wvtz3oyCXE+8QpZBt0aF9anW/BOBrnRUyil7zSXWzTSNV\r\nrjdoaSh1DtABy7tk9sYh3W+eX9O1edMldiEUPOoL8nRkzWLPOrOvcdHBt0+Q\r\nt0d/qXGZUzz4tHO9vmUZaDIKvVrTps2afsTfO1fhDFL9/y8MbERBWYItBSIc\r\nSrv0imAL1AZQSqcqKO0KLHFoALZ9GD0baPTJdoo5aVQp31CqvEG1h9U0ZWjE\r\nrUt5EjY+ylgxDrV9HEDnwhlXgN+pah0tA0ssUOhNcj4WRHqmzG2qrFkV0kxd\r\nkXc/tj0xshVa7+rRae7fH6lH2BHlHxW8652I8j6eiNno4L9b/LGEqdquMA7l\r\nLCKh450GGKLfvaYM0aGDud6G6goVHicPJCELv0YK1hyOz2T1AzfZkNXFEWlf\r\nchwdJee+ZsWf96CqS9WNN9IzuaJ1djRTyCalbPdtXw3xQq7lspUYWLe6tmrq\r\nruQoH1XknsJvNiCSuf63Y03T7E0W+Ne/EnV1BF8VFQG+4qS+u77z/b7fkkCD\r\nPPXti/kQrKEsNz1HhyHcKvYoGlUX9LoozOx6P0dbjKmsvNPU0MZNYjXRZ2Np\r\nWCiQr92HW8Nm+EDNcsVghANbRwaDnO6O6z8Ifn3CXg8vTcbRvbBzQqPZiF/o\r\nEexYYKuZGOtZ2eERsou/qXf+VFpwBJ06j4c=\r\n=O/4d\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_7.3.3_1649243152626_0.20837882240410788"},"_hasShrinkwrap":false},"7.3.4":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"7.3.4","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","debug-gtfs-matching":"debug-matching.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=16"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.1.0","gtfs-via-postgres":"^3.0.1","hafas-monitor-trips":"^6.2.0","lodash":"^4.17.20","luxon":"^2.0.2","match-gtfs-rt-to-gtfs":"^5.0.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^7.0.5","prom-client":"^14.0.0","send":"^0.17.2","serve-buffer":"^3.0.3","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^8.1.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^7.0.1","print-gtfs-rt-cli":"^2.0.0","sample-gtfs-feed":"^0.10.3","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"gitHead":"fff9182e3d884c294374d3834c438d3d52677d98","_id":"hafas-gtfs-rt-feed@7.3.4","_nodeVersion":"18.4.0","_npmVersion":"8.12.1","dist":{"integrity":"sha512-4MQAZaJ+YOIwZ+ESaM89zs/IeB+LdYWY2Hdlq1FuC6iVPpWLW+FbwFBKrohyseWrXRfvuVWY+Y/sGHjvHQ9TRw==","shasum":"b0e2e530943a55d938bc0338e894cdd2db6918c2","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-7.3.4.tgz","fileCount":24,"unpackedSize":81643,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDohBKWc5pgvvbBFeeLcYPIyE+sWrl4SRTzA9FauibbRQIhALbbgl7l8OnqYYMaQbP110sOMbVRO2hZak9D80YDToYN"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJixgxFACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqgZA/8Dk4zjk8WpilooHen/gGOUUkm2v/RhYVuyFwZmsh9drJ5TtMJ\r\nm4JgCU+XLLtazPVSbQxr3fVud2y0Qv2Wp2B4w3rtb9Pv9RsYeae5F2QCNybH\r\naNNQWAwrFIEWtzFxwVTMKUDqG7AxF/tyQvutlFSzz6jOVH2gWrpwDc2q4ezF\r\nlLRgCsXDJy/WzTyoD1pnuI5BRMLZ+WN4f/5oWSc1Srsc2MqAvaiAd81SCarm\r\nt5fJhs5TXHduLt0gE08d7NFAJpUfKn0yRm/wa1462IVY/tgdj/ixUCLHIyUp\r\nc3SdQ02Fgq1TrW3UNKL9qKK6wx6mdh2zCM/x+eiN71u2mv8GEBmUoxL4s40R\r\nXjvQ+E9zvW4Wpq1bpGcXHO8LK8JocIB1r2cxgoQI9i/hgvxLNZn/Lc9JtApR\r\nw3rR/U0i1UIV9mmhsGmPYUtoY/+0GlK7gYoqgoEHFArr3+5IlrMsk+e7WiHO\r\nqjNWUsuP3/H8BShNM/1r4vSQDJ0XydnZfXLQtoW68UisNx8Q/DOCYyhvtPHb\r\n6gfiy3nbNLFnNzGST4lJHrS5hD1IFTtZ/PueujCOCLlGAU5K6LAtUaWY7Jf4\r\nPhQLA1sixYHV9xlozbHu3HLaJhY5Y9hdzouoWhiH+Fn084LlGTEHpwXmq64i\r\ncWgBPKnaK9hPgnDmTt9FuDVzzr7pJGAsplU=\r\n=gx4x\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_7.3.4_1657146437552_0.9758764641111344"},"_hasShrinkwrap":false},"8.0.0":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"8.0.0","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","debug-gtfs-matching":"debug-matching.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=16"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.1.0","gtfs-via-postgres":"^3.0.1","hafas-monitor-trips":"^6.2.0","lodash":"^4.17.20","luxon":"^2.0.2","match-gtfs-rt-to-gtfs":"^6.2.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^7.0.5","prom-client":"^14.0.0","send":"^0.17.2","serve-buffer":"^3.0.3","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^8.1.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^7.0.1","print-gtfs-rt-cli":"^2.0.0","sample-gtfs-feed":"^0.10.3","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"gitHead":"64a57524914e04c029ff3c3dd1fb2c56351cda16","_id":"hafas-gtfs-rt-feed@8.0.0","_nodeVersion":"18.4.0","_npmVersion":"8.12.1","dist":{"integrity":"sha512-mSI6Q/K6ANamxBBF/zCsB38bSNp3P2uwkkw9Yt16/Wm1DcBBbggVYWLL8ckptTh26KXxjh7tVqdxkBeznDtlcA==","shasum":"a985f2296ef0a7904804db813b6c77a714992c1b","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-8.0.0.tgz","fileCount":24,"unpackedSize":82262,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAem9VyEhvpYMgg80muVZWabw4kRomZR5D1fYDKo6ZT4AiB3MuKD7bVZzJePuDDFoM2H3a4C6qsxX3doJShjUwk+Xg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJixg2lACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq7QA/8DNaJcs1iqFa2vYC7gVZEBRwgumg1ePX9pAgsSsT86eg1knJ0\r\nCuVYaVjOW/CxHcNlczizy3HBsTTvEeU+bBHAL1r2gNbpRGpi6ZJltJNWbnpb\r\nnxqKsQPfZe0sVeKd+0YTZvPM4m6aHBf5Cvz0n2yhS2K5p9gFDMGa8YLlnaRq\r\nbOhVwBkwurOPXoYEkpOZEXrLWIlko+XYPDmJIlYi8LMBB9PYqK70MFEqUl7G\r\nNTBXCTd6RlLhO9FLYZbeSVxol5fhSDMPWmQL8t24g+30ggtCYPBhBdura8Lx\r\njYfqNfAFEKClm0eXiRqCnLYiX5s2lgzVOi8Sa55DzFvwFAUVDd2dUPlFN/Fb\r\n64TB8Mu9K+LxeVISkQzgWOsLniSsBZAjuxhShc7otsFM2gmVOfTX+IKvJCgf\r\nTdQdOXQHkXcFd5OcT5zEKnrQ1at+cybvgwt2Pb7tALaoRD3CHMi+PwU5ym+H\r\nqlH6iPMQz213sT7WCXUROgOJRJXrMUdBxEeArvUZE1/6S94WtgfrkFWB1QT1\r\nOzZRAnF17vMgq7A+Idzx+DBuKUmJyvspC0IeDAh0+n08DGpLHjva9JpOFvcQ\r\nsmX/X6IsR7++i8ZLJI8CSYIwv4fqpdKCe0i1uJVokkYjAM+QWAKCqX0CWwn+\r\naRalOhDbjeLHveMuJa6Wu+/bFI7+ZYbirbo=\r\n=wXhV\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_8.0.0_1657146789535_0.9466488069180294"},"_hasShrinkwrap":false},"8.1.0":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"8.1.0","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","debug-gtfs-matching":"debug-matching.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=16"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.1.0","gtfs-via-postgres":"^3.0.1","hafas-monitor-trips":"^6.2.0","lodash":"^4.17.20","luxon":"^2.0.2","match-gtfs-rt-to-gtfs":"^6.2.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^7.0.5","prom-client":"^14.0.0","send":"^0.17.2","serve-buffer":"^3.0.3","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^8.1.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^7.0.1","print-gtfs-rt-cli":"^2.0.0","sample-gtfs-feed":"^0.10.3","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"gitHead":"67fc23ed0e7ed024518114ddd72d937f329d665c","_id":"hafas-gtfs-rt-feed@8.1.0","_nodeVersion":"18.4.0","_npmVersion":"8.12.1","dist":{"integrity":"sha512-6mGyd1482OXTuHaQEvDy7uW9J2PQejMBrYBj9F6K2OTBO5NM7kBMXBx3koKvmBliSwjbqZLAxh8fVu4nEd0jMQ==","shasum":"8386539c484d5e09065d5e8c9e5727a31a4b537e","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-8.1.0.tgz","fileCount":24,"unpackedSize":83549,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEcx6uFrm36Hmsqv5PiVCq3FOx0vZlYsZgnB40mQe6SEAiEAsONqk6v2tsqgLjz/9AFRwMxvU/qqFrI7TP4c016+clM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi0WrtACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmohuQ//TfGyVMCCjySHvCaDkVIelvhak0NMJPkseYzXXM2Ek1EyhH/v\r\nvILz0F/FATi1OlOXCRJmyiBqgh5ID9JzNRi3QlpuHhSVsFgEZ5YU4WaDZoAR\r\ni9KsD3KOGkaSkMK4+NV45ZqVCj/k4cxNXLsgiksryV1SrIxLGx5eNEaChDnP\r\nsBPU93sEJl6rbQ2pdfQ5cRph3FeWK9H/SpLJNBK8+/SHmJmLE2C/VTy91kmS\r\nDMHBAjWhcESHE8QwnhKzo1XgIi33w+fHym93gWAce5KTtnkOI+uS2W/BNfZD\r\nGrms4qdINsMuMIh/i7Db8LT9ItnJ6MjWgMJxzvTyYwnjzQbOyYBZm2I+TrUg\r\nlpQM63NRkb0CdMz6srYbUugvjcYCIHEENH/uIS7VX2PVpdVpc6XpUfOI8/SB\r\nIn1EwWvJWfiwYMR+Tf5Z2r2J0fsNzBu7AP0LY1UgvIDpJCcW5n4f8o+lv7OW\r\nMVy7Hmwq1CnUq4QfYMg1P5vohOiDex1CDQLmQNApf3/8QMBBUXzZfEMi5DJs\r\nbkSiB77bXYjLB6+Rph5fXWryZMKwi9ICZ0kt4J+C5Aq9KqbEtPXLYKiRdLLP\r\nz3ltUlCXcjyLd7DeTbaBvDIdxoZZieR+k4c5yKLTOAP2kI+3pqPpP3dG3U2B\r\n3O6yaTqmItezmXL9bsOTO0TO6GH4p3J2zxM=\r\n=wJQi\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_8.1.0_1657891565379_0.34849889022113434"},"_hasShrinkwrap":false},"8.1.1":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"8.1.1","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","debug-gtfs-matching":"debug-matching.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=16"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.1.0","gtfs-via-postgres":"^3.0.1","hafas-monitor-trips":"^6.2.0","lodash":"^4.17.20","luxon":"^2.0.2","match-gtfs-rt-to-gtfs":"^6.3.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^7.0.5","prom-client":"^14.0.0","send":"^0.17.2","serve-buffer":"^3.0.3","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^8.1.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^7.0.1","print-gtfs-rt-cli":"^2.0.0","sample-gtfs-feed":"^0.10.3","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"gitHead":"94c96a63c69abf421cf630be56793cfbb025245a","_id":"hafas-gtfs-rt-feed@8.1.1","_nodeVersion":"18.4.0","_npmVersion":"8.12.1","dist":{"integrity":"sha512-uHhk/lg22+3jCwngIB7eTZeLHJYk4HHmUNozMECaZD12sQr6cOkBVuWU8DXMJFCIVnyghTnKF6Oy0OZpCzG0+A==","shasum":"a9f01ac72283bcf2779c5e2329b125b7a1327c4b","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-8.1.1.tgz","fileCount":24,"unpackedSize":83549,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGFNTRbs/3BRR47NN/LyREsEFZ3xM3Livz602Jz6DbrKAiBF6/klMmgTyY1B4kWspNhX7mIcyO1a2fwm2c995ZeyBw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi0YaaACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqSWhAAo6VON7tRJfXhEVBZCCvJciaxX06xhlWwC+jVFM9iAQXOUles\r\nsOGbWVVcQGOxFs3iyISX3ayqXRLWdCDGlsGUYjSUf0+HWddsKR75oXbwdW9S\r\nB2i0IEKLRrkLMFDGScXuiuXrAUkUKLn8CYvEGUjS4R6ts4CHKckH5e/zCPQr\r\npK4o+bC4whm4JM+jAG0d/bGoqJyuasJuxu+mUTnwAhhu9iX4uM/oRvnx/1Ez\r\ncdGAJgVFIZroHea69RwjOpOtsaXS0mpMo2qSMuCF29SHRRQwYGuRpZdMBRDK\r\n7Qf8QUOlQ197SmgacGYhCwW35BNdQdNyRWZ1V/h80upap1Wk+3WhUki61Srt\r\nRQFMB9HvGvGkQMU2ChAnx9U82yoR5QoZKCrYLUKVOkngwORwH3GYOJJpvOZv\r\n4bNjb1GNGO9H48rIiiiW5TlAflgohsRCMs4zSJVKvr/580yzOq4cp3pXt23e\r\nskHuKLCGpNs8rFHDU2MzmvsdSFlVRcXW4NMZ5I5Gg2ZK+xaoaeIRLlbZaTkZ\r\n/8EswAejcFlH5oVuIUp+OxkBbI0cCw4SJTrveg5n0Z0h+1zKYEmEzkBci1Sy\r\niQ0hk0FBqIaIOlaEihKBQGnFqSk5x6Rcvyb14BeiLaxvagIREOelGKMC6UUD\r\nhrBTiMWj4PdxbPZ50JrgEetOTjj7iOFPG8c=\r\n=otTZ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_8.1.1_1657898650228_0.1184019355360173"},"_hasShrinkwrap":false},"8.2.0":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"8.2.0","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","debug-gtfs-matching":"debug-matching.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"License Zero","url":"https://licensezero.com/offers/20e3ea67-5f73-4aa8-943d-079aefdc109b"},{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=16.17"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.1.0","gtfs-via-postgres":"^3.0.1","hafas-monitor-trips":"^6.2.0","lodash":"^4.17.20","luxon":"^2.0.2","match-gtfs-rt-to-gtfs":"^6.3.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^7.0.5","prom-client":"^14.0.0","send":"^0.17.2","serve-buffer":"^3.0.3","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^8.1.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^7.0.1","print-gtfs-rt-cli":"^2.0.0","sample-gtfs-feed":"^0.10.3","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint && npm test"},"gitHead":"324688123bc58c380fc872db0b03871c5cb9ed94","_id":"hafas-gtfs-rt-feed@8.2.0","_nodeVersion":"18.8.0","_npmVersion":"8.18.0","dist":{"integrity":"sha512-beV+RS2SLEdhl6N/bvPyd/cHnfzBAA8XqziJZFQ76c5zcJm78K6XLqguVmhCx+IaE7A1XcsHwZZ3KRPuSR5e9A==","shasum":"314dd48a2ecfb1122047f01781dbc2d5a9201bd7","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-8.2.0.tgz","fileCount":24,"unpackedSize":85189,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC1Q6oypwTTSeZSpqsptPYRIiwcDk9zrDLjGFptIGgV3AiEA4hA4iSOu0JIUJADxv04rh7KUVCEQe0f92bwIeUFvujg="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjINVLACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo09Q/9HO390Co+eJP2dNj67umiQRZV1AVK/LCKr+GckRMyKR/rbR9C\r\nMeKS26oFooGy+g2M91WhdyixDDC5nrIlUQ+lvt+OiiqrJA7IhT3xP6TxFvyk\r\nv+ss2hoQqLR1VHNH28w2vv4tpJ45FdEJlXOpXeb8F9iSky0yY9MO3/xDYAJs\r\nK0b+38OL2Y/Ldf+HEdgo2XwHSgGPXxlOPyagRU8VgTq8inVywGgnn0J+sHyH\r\nLJO1e4g+VuJdJk47AdQln6dZIjLkA9UEOA6QMnl8gw4ZvM/oFJ+fAvzyKycy\r\nfknRttJe2aYQx8PgASISIVk8QnoClVSu9Y9Md8DdfYt4csv+SsA5EvB2jwfF\r\n+8ZzLxEZmj3EY12oAt/9hqOqLmkVsC4nEqwZ14zf+vcowaaWehHLRn7Rc1ap\r\nsycZQTGizg6qhgaRel7VQzsjzwvcbyMM/6q2gIvDExdO53aH+u71KEOrijFW\r\nIVcCpNNUEQnU1nIFbmPzRmby8iJcAAcz3NkYPO6JAG4fU7tub4/BYBv0N5DX\r\nZKnRHDcJAUs3TunjBYW4VmPc+kh9BPU5aiKl83QRrwd5oq1Pl0+yyoIKNVff\r\nXiugklKPVqpdU4Y/ViOeNc2P3MC1gE6vQijS0WXM2u/UXbgjP/ABeSxuYsCm\r\nMDqdfut9sT/L3+U6+FYqhSBPGtK/KMmkSOY=\r\n=1f25\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_8.2.0_1663096139194_0.6661433965043195"},"_hasShrinkwrap":false},"8.2.1":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"8.2.1","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","debug-gtfs-matching":"debug-matching.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=16.17"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.1.0","gtfs-via-postgres":"^3.0.1","hafas-monitor-trips":"^6.2.0","lodash":"^4.17.20","luxon":"^3.3.0","match-gtfs-rt-to-gtfs":"^6.3.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^8.11.0","prom-client":"^14.0.0","send":"^0.18.0","serve-buffer":"^3.0.3","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^8.1.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^10.0.0","print-gtfs-rt-cli":"^3.1.0","sample-gtfs-feed":"^0.11.2","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint && npm test"},"gitHead":"4cd27b892077f65cf596f18a42ecf9d67f8359ec","_id":"hafas-gtfs-rt-feed@8.2.1","_nodeVersion":"19.4.0","_npmVersion":"9.2.0","dist":{"integrity":"sha512-VsYBaVstt4Wfpm88YszjR3iUTIxIAewtPjDdR9aFjkVc9wlamhkXB+Z/bSCDDIa5NrZhgl5ZzKeTIxrzAu+95Q==","shasum":"5ab0d3c60cc96a9d20b1e7d776e5ba22fd07ac26","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-8.2.1.tgz","fileCount":24,"unpackedSize":86537,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDgxXzHIrEYsyQcT5HB8+28NtMh7c01cXRJLkGduKUkTQIgblj6ODiICmG6tWNxDuaTPp/ThLXD2vyekgvHbzVvfmA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkEfn7ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqkBg//Zw3mKGymOqscCx4B/Mtmofj4HlBlVcR9woUJDK3cWGo85pOk\r\nSUygFgoBfrtN6DtIv24yk8bRqXDLeg+8503dhLmyQuv2JwrYSOXdTopTMjOb\r\ndBTMXqt32bS5y045OLWOn1PqbXtBqiyfERsqVaRIWcoYXsL30Jkn+PuZrXs+\r\npac6bC3ekus2tkn8ygtykayym8+nJdwibMQ/osKcGfOT1GvLtcF9h1jvzCDO\r\n4AFvGNBemWG3I2p1nonhhC9kUv3YtKT0q93Ev3JqnMtpHGI3KJIziZpkXHOL\r\nEPZxNLFdnKDpMwDiql3zw5zaIcv9Vg/c4Y84WR/uTG6aj3B/zOX4yjPs1ohC\r\nfgubBAMMDZhi8ZA6fw3BUpi8w8BvIBtz+OS7cbE1OvWKNZqyiGFxA39CVtLa\r\n9Yd5XNF0CmATbHsEGFFAxmg0Cdq92+hBwYD4TEObJUTxkv/fSw1gmMWpvqFm\r\nhpykqh6iVN/2mqyf7i9QRb171Pm111FKIrnbQhVZZlpMbRROmb/BlqNEnRrh\r\n6jhJDVvnP1kpV/zRIRCYJqBuyiJk1Qf4kC+7eaNXoskU8DNTo6gu49gEzAbg\r\ntcN7gc0xMSJc+2ZQ9OymulsuODOb2mIppz8PjuadCirqfAZ5bVm2zHJclrMe\r\nzBC6hi/yGaucHn8y5GHI8u0mWoSAYUUJY8E=\r\n=IIBH\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_8.2.1_1678899706900_0.42399382323311463"},"_hasShrinkwrap":false},"8.2.2":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"8.2.2","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","debug-gtfs-matching":"debug-matching.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=16.17"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.1.0","gtfs-via-postgres":"^4.5.1","hafas-monitor-trips":"^6.2.0","lodash":"^4.17.20","luxon":"^3.3.0","match-gtfs-rt-to-gtfs":"^6.3.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^8.11.0","prom-client":"^14.0.0","send":"^0.18.0","serve-buffer":"^3.0.3","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^8.1.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^10.0.0","print-gtfs-rt-cli":"^3.1.0","sample-gtfs-feed":"^0.11.2","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"gitHead":"6c37c81f768d2aa25aae20c3000992f14f4e6f81","_id":"hafas-gtfs-rt-feed@8.2.2","_nodeVersion":"19.4.0","_npmVersion":"9.2.0","dist":{"integrity":"sha512-v5hc2NSDtLiv7vSuswsmK4gsegYEudns5yxKoyQ6fzVUlEWwvk/leAB+DVHSMjVbZCs9i8yG4H67GvP6a4Q1QQ==","shasum":"7492f5b815959cb849a951c5d0b07c28e1769c5b","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-8.2.2.tgz","fileCount":24,"unpackedSize":86320,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFJxApsPMlz0Cb8ZcaMF9qicA3ArmgKUGzufC1T+Ak1XAiAR2zsbbaLx6EEg7WU2b9fMaeNQsNUF9/PVH/9kvr9nIg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkEjBKACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq9TQ//e0ydEi10VgrrerpORJLIRdP1bJOtzJq+atHxzavsYiB0LmUf\r\n1xqaXyr05CJtjnt/5cHqwK64yS1jGs4cUVpOecD1KqttS6JRU7P62vcUGN57\r\nx+w0aL7ALeYSDNhudVqwN56qeeX8aMDOPXXOwlzRaksigJ6BBGhGkcFyJOsS\r\n6njMl8eFovNatfXg36KFHXfXfjubfZoIqeC1C4j8UbmpLBmzHsp4aGnjGyiw\r\nSS2W1JfX6rVjurJ5Rl58i69doiAxBUifnEI+kcAW+qUfpx/ORphllo4JYuYF\r\nvZHY6e887XaDgkNayAL9ifJHYaOmRXKxbFYNZRtqEIdagCTsdPY615oUS8eg\r\nRx8Dor5p3v7hxCyktibdDeIOxBwQIp7kV5acjeLdGsPT5uNhDwflYqKFECRo\r\n5OC9NGEsnCMYjSXoaF8E3NXIXTZP8ApNrPMbQWQHPJ5g301Kd/x957MbSdFQ\r\nP3fXNEWUkqdGpZwUMHG4R7maLmW8/5UW7CMHUwiShdWJFfzreMYNH0ncYDRj\r\nYlpaLet+7DspLlUfdIr3D7LQvQw+zTKLOlT0q4ysPBxQtGsnNd1Mx4UA4Q5S\r\nOJ+4jsZfQRZ65ZgGIuWVXuELeDbhGeJvvVu8rzlelIdNTZL9NpnLO5TtzwLd\r\nWTdsrI4LI/NTFv4eqbDADWZbvF5D3xG8/TQ=\r\n=AViI\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_8.2.2_1678913610576_0.8506562075248956"},"_hasShrinkwrap":false},"8.2.3":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"8.2.3","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","debug-gtfs-matching":"debug-matching.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=16.17"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.1.0","gtfs-via-postgres":"^4.5.1","hafas-monitor-trips":"^6.2.0","lodash":"^4.17.20","luxon":"^3.3.0","match-gtfs-rt-to-gtfs":"^6.3.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^8.11.0","prom-client":"^14.0.0","send":"^0.18.0","serve-buffer":"^3.0.3","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^8.1.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^10.0.0","print-gtfs-rt-cli":"^3.1.0","sample-gtfs-feed":"^0.11.2","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint && npm test"},"gitHead":"670de2896c5697f87c6de5364efddb115b34bff7","_id":"hafas-gtfs-rt-feed@8.2.3","_nodeVersion":"19.4.0","_npmVersion":"9.2.0","dist":{"integrity":"sha512-6RWn/dLgFXyPzg02MO8X1zBrwKeIr15i28dCwt00WUvfe4sM+ZwFlYdULQsfa3wn7+P2Df1yDo02uIGP9bV4tQ==","shasum":"4323c227bc984798cadf44284cd3546563cae0be","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-8.2.3.tgz","fileCount":24,"unpackedSize":87122,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC576RQgS2eAv9SYrPaWzTLkXAdRdsndKySU7J74EGKTwIgEyjiD99T3+Ws5CGKVeXNPEeVUa8CddkMQ9OvD33D/Hw="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkElOJACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmohKA/+NF66cX6ucaYqL80zt7pDBdNvHIcLjPd84UPNqgvyJSaNlrx3\r\nHVuV7umafesaX1UBPFFc0tOcOTiTi3eVNvsY9MNgXbrpOk9e4VLJSjByxubE\r\nOHxV3qnK1ajnzLQeIzHsnb9LcJqXx52/kH42PkwjuCQC3i3zsCimvMecizCE\r\nNoG2vHK+NFVfUmu7nhrwp6DdEslJK3dk5H2EEhKzzC3mrA/7utZOpx771RHK\r\ne6QaQ2ZQPfZPi/snPY1XiSgiF0LMCn1CGr7ID3aCJKGHbtYaruXKUbjYvRfW\r\nOPfizYUp9XlqK4fv3h2ITS0cwsFa4BtnbsXoQ7hkRLlmvysToMw4C9gx5yV+\r\nuhh9NsXZW0HZgQNlLvFyg4YoZETs+wk+J2I0vjz6tg6VP5sigK8nNKfuU95C\r\nTjHntRf/oRWNv8eyLza0B7arEKISJKhtQX704aDPogeH/JVkvXR3x9GP5CiD\r\n+kx/L8wvoxzPRSvWkj17FAzoCnAchLs8mqrJoIIDE8Mn+sXGiEJwVzKUpOU7\r\n06upss396fbuKKiJKKLAysGX40VBRQWKlWDi6bu0O3GoOWev4WAAwoGyRExv\r\n7EgzP1ZvRHfrzA7kGDpbUgkZcO2Q8sbA3njVrSjmB3wM4aaVdsMfp7gJe3wQ\r\nk639vWMdYYPvbA1ZXe7jghl4lZwx8GagwyQ=\r\n=TyB2\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_8.2.3_1678922633406_0.2519978738820434"},"_hasShrinkwrap":false},"8.2.4":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"8.2.4","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","debug-gtfs-matching":"debug-matching.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=16.17"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.1.0","gtfs-via-postgres":"^4.5.1","hafas-monitor-trips":"^6.2.0","lodash":"^4.17.20","luxon":"^3.3.0","match-gtfs-rt-to-gtfs":"^6.3.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^8.11.0","prom-client":"^14.0.0","send":"^0.18.0","serve-buffer":"^3.0.3","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^8.1.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^10.0.0","print-gtfs-rt-cli":"^3.1.0","sample-gtfs-feed":"^0.11.2","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"_id":"hafas-gtfs-rt-feed@8.2.4","gitHead":"d7f9e22ba4e3bc9587646103d357ef336abfb976","_nodeVersion":"21.5.0","_npmVersion":"10.2.4","dist":{"integrity":"sha512-gX3KW5kJ+ToNfMvd7MsDkTL0gdwUHV/BQldhQHv+dYCjjL+ZuUMzjKcJjozECPLsxN5omhLA4gmN4kcKiugLLg==","shasum":"b993677e7b96c86e56aa9510c42ce9d75c393fb5","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-8.2.4.tgz","fileCount":24,"unpackedSize":87355,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCPswh5x5BwCHZ4qYXaHTT2oDUFT4vWTEgJjsUA1SaDbAIgLmrL2LGMkhs6kXDPj6oRfcdmqldMJQQmtDTQeOv7Gs8="}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_8.2.4_1704635645871_0.7419573501801298"},"_hasShrinkwrap":false},"8.2.5":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"8.2.5","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","debug-gtfs-matching":"debug-matching.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=16.17"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.1.0","gtfs-via-postgres":"^4.5.1","hafas-monitor-trips":"^6.2.0","lodash":"^4.17.20","luxon":"^3.3.0","match-gtfs-rt-to-gtfs":"^6.3.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^8.11.0","prom-client":"^15.1.0","send":"^0.18.0","serve-buffer":"^3.0.3","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^8.1.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^10.0.0","print-gtfs-rt-cli":"^3.1.0","sample-gtfs-feed":"^0.11.2","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint && npm test"},"_id":"hafas-gtfs-rt-feed@8.2.5","gitHead":"147c1b993ffb40e8552640c684d11c7210802b27","_nodeVersion":"21.5.0","_npmVersion":"10.2.4","dist":{"integrity":"sha512-ajLVW3i5CdQBgA2ks5rL5PCsvPNYqkVNblF+owSEHkqWlcQcd4axqi9oFeA4983xjcD0DLYiCDw1Tt5BZvGF9A==","shasum":"812fa04d7dfcbadd79e50de71a567dafb30268bc","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-8.2.5.tgz","fileCount":24,"unpackedSize":87917,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFXTos0M0/RkxCCuH9wf5DLQh+tY3c1VlTfRVXiWxLpwAiEA5knyueELfJg+7tX6p2oh7gcykgjg9j29UjQa4Y6OLmY="}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_8.2.5_1704880889756_0.26303115222072715"},"_hasShrinkwrap":false},"8.2.6":{"name":"hafas-gtfs-rt-feed","description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","version":"8.2.6","main":"index.js","bin":{"monitor-hafas":"monitor.js","match-with-gtfs":"match.js","debug-gtfs-matching":"debug-matching.js","serve-as-gtfs-rt":"serve.js","gtfs-to-sql":"gtfs-to-sql","build-gtfs-match-index":"build-gtfs-match-index"},"keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"author":{"name":"Jannis R","email":"mail@jannisr.de"},"homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","funding":[{"type":"github","url":"https://github.com/sponsors/derhuerst"},{"type":"patreon","url":"https://patreon.com/derhuerst"}],"engines":{"node":">=16.17"},"dependencies":{"@derhuerst/round-robin-scheduler":"^1.0.4","cors":"^2.8.5","debug":"^4.1.1","etag":"^1.8.1","gtfs-rt-bindings":"^4.0.1","gtfs-rt-differential-to-full-dataset":"^2.1.0","gtfs-via-postgres":"^4.5.1","hafas-monitor-trips":"^6.2.0","lodash":"^4.17.20","luxon":"^3.3.0","match-gtfs-rt-to-gtfs":"^6.3.0","mri":"^1.1.6","node-nats-streaming":"^0.3.2","normalize-vbb-station-name-for-search":"^1.0.0","p-limit":"^3.0.2","pino":"^8.11.0","prom-client":"^15.1.0","send":"^0.18.0","serve-buffer":"^3.0.3","ttl-buffer":"^1.0.0"},"peerDependencies":{"hafas-client":"^5.13.0"},"devDependencies":{"eslint":"^8.1.0","hafas-client":"*","nats-streaming-cli":"^1.0.2","ndjson":"^2.0.0","pino-pretty":"^10.0.0","print-gtfs-rt-cli":"^3.1.0","sample-gtfs-feed":"^0.11.2","slugg":"^1.2.1"},"scripts":{"lint":"eslint .","test":"./test/index.sh","prepublishOnly":"npm run lint"},"_id":"hafas-gtfs-rt-feed@8.2.6","gitHead":"36a54167a7d8d7296a0beef76122cc6457ef79fb","_nodeVersion":"21.5.0","_npmVersion":"10.2.4","dist":{"integrity":"sha512-r/nDzbroRUjOHH4Zdqin2tKNM7UlfcF0qZqrpGSU+K5UujOgWepafOsm+8h9JZNT4+apYcZtZJQjAJFNYzI8bg==","shasum":"1a9bbe1ea3f14ddda181491129bb7bbd49c5816b","tarball":"https://registry.npmjs.org/hafas-gtfs-rt-feed/-/hafas-gtfs-rt-feed-8.2.6.tgz","fileCount":24,"unpackedSize":88306,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCa5sQE5mgiWOo+Iu9N59bNbKcrQb0q7mwjJjvjNoRFHAIhAISlPbvFgbetFvy72xuCYSzjZSwdlGb9Ud01oK3LRepi"}]},"_npmUser":{"name":"derhuerst","email":"mail@jannisr.de"},"directories":{},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hafas-gtfs-rt-feed_8.2.6_1707854451007_0.49442714522816544"},"_hasShrinkwrap":false}},"time":{"created":"2019-06-14T13:16:06.849Z","0.1.0":"2019-06-14T13:16:06.965Z","modified":"2024-02-13T20:00:51.406Z","0.1.1":"2019-07-19T20:56:29.823Z","0.2.0":"2019-07-19T21:57:13.180Z","1.0.0":"2020-03-14T18:30:13.762Z","1.0.1":"2020-04-25T21:00:47.939Z","2.0.0":"2020-06-04T14:01:17.312Z","3.0.0":"2020-10-24T12:29:13.855Z","3.1.0":"2020-12-13T13:27:52.997Z","3.2.0":"2020-12-13T20:48:57.443Z","3.3.0":"2020-12-26T14:46:15.409Z","3.4.0":"2021-01-01T19:12:41.511Z","4.0.0-alpha.1":"2021-01-06T20:44:32.915Z","4.0.0-alpha.3":"2021-01-12T18:37:15.379Z","4.0.0-alpha.4":"2021-01-12T18:52:15.823Z","4.0.0-alpha.5":"2021-01-20T18:41:01.079Z","4.0.0-alpha.6":"2021-01-22T23:52:05.955Z","4.0.0-alpha.7":"2021-01-24T19:07:12.064Z","4.0.0":"2021-01-26T15:01:39.681Z","4.0.1":"2021-02-07T00:55:40.278Z","4.0.2":"2021-02-20T18:57:21.153Z","4.1.0":"2021-02-25T11:21:27.111Z","4.2.0":"2021-02-28T00:25:39.030Z","4.3.0":"2021-08-30T15:42:50.047Z","5.0.0":"2021-09-20T19:22:22.793Z","5.0.1":"2021-09-27T18:49:57.897Z","5.1.0":"2021-10-10T22:41:54.525Z","5.2.0":"2021-10-11T13:40:10.358Z","5.3.0":"2021-10-11T16:06:06.455Z","5.4.0":"2021-10-21T08:59:05.554Z","6.0.0-alpha.1":"2021-11-05T17:44:38.236Z","5.5.0":"2021-11-18T17:20:26.928Z","6.0.0":"2021-11-18T19:03:35.899Z","6.1.0":"2021-12-26T22:45:18.053Z","6.2.0":"2021-12-30T16:18:25.066Z","7.0.0-alpha.1":"2022-01-13T20:14:45.514Z","7.0.0":"2022-01-15T14:05:12.719Z","7.0.1":"2022-01-17T13:29:05.026Z","7.1.0":"2022-01-18T13:43:09.142Z","7.2.0":"2022-02-17T18:16:53.357Z","7.3.0":"2022-02-22T19:32:25.042Z","7.3.1":"2022-03-15T00:40:26.417Z","7.3.2":"2022-03-28T23:12:45.857Z","7.3.3":"2022-04-06T11:05:52.820Z","7.3.4":"2022-07-06T22:27:17.738Z","8.0.0":"2022-07-06T22:33:09.677Z","8.1.0":"2022-07-15T13:26:05.623Z","8.1.1":"2022-07-15T15:24:10.455Z","8.2.0":"2022-09-13T19:08:59.387Z","8.2.1":"2023-03-15T17:01:47.146Z","8.2.2":"2023-03-15T20:53:30.844Z","8.2.3":"2023-03-15T23:23:53.564Z","8.2.4":"2024-01-07T13:54:06.057Z","8.2.5":"2024-01-10T10:01:29.907Z","8.2.6":"2024-02-13T20:00:51.215Z"},"maintainers":[{"name":"derhuerst","email":"mail@jannisr.de"}],"description":"Generate a GTFS Realtime feed by monitoring a HAFAS endpoint.","homepage":"https://github.com/derhuerst/hafas-gtfs-rt-feed","keywords":["public transport","transit","gtfs realtime","gtfs-rt","feed","hafas","hafas-client"],"repository":{"type":"git","url":"git+https://github.com/derhuerst/hafas-gtfs-rt-feed.git"},"author":{"name":"Jannis R","email":"mail@jannisr.de"},"bugs":{"url":"https://github.com/derhuerst/hafas-gtfs-rt-feed/issues"},"license":"(Apache-2.0 AND Prosperity-3.0.0)","readme":"# hafas-gtfs-rt-feed\n\n**Generate a [GTFS Realtime (GTFS-RT)](https://gtfs.org/realtime/) feed by polling a [HAFAS endpoint](https://github.com/public-transport/hafas-client#background)** and matching the data against a [GTFS Static/Schedule](https://gtfs.org/schedule/) dataset.\n\n[![npm version](https://img.shields.io/npm/v/hafas-gtfs-rt-feed.svg)](https://www.npmjs.com/package/hafas-gtfs-rt-feed)\n[![build status](https://img.shields.io/github/actions/workflow/status/derhuerst/hafas-gtfs-rt-feed/test.yml?branch=master)](https://github.com/derhuerst/hafas-gtfs-rt-feed/actions)\n[![Prosperity/Apache license](https://img.shields.io/static/v1?label=license&message=Prosperity%2FApache&color=0997E8)](#license)\n[![support me via GitHub Sponsors](https://img.shields.io/badge/support%20me-donate-fa7664.svg)](https://github.com/sponsors/derhuerst)\n[![chat with me on Twitter](https://img.shields.io/badge/chat%20with%20me-on%20Twitter-1da1f2.svg)](https://twitter.com/derhuerst)\n\n\n## Architecture\n\n`hafas-gtfs-rt-feed` consists of 3 components, connected to each other via [NATS Streaming](https://docs.nats.io/nats-streaming-concepts/intro) channels:\n\n1. `monitor-hafas`: Given a [`hafas-client` instance](https://github.com/public-transport/hafas-client), it uses [`hafas-monitor-trips`](https://github.com/derhuerst/hafas-monitor-trips) to poll live data about all vehicles in the configured geographic area.\n2. `match-with-gtfs`: Uses [`match-gtfs-rt-to-gtfs`](https://github.com/derhuerst/match-gtfs-rt-to-gtfs) to match this data against [static GTFS](https://gtfs.org/schedule/) data imported into a database.\n3. `serve-as-gtfs-rt`: Uses [`gtfs-rt-differential-to-full-dataset`](https://github.com/derhuerst/gtfs-rt-differential-to-full-dataset) to aggregate the matched data into a single [GTFS-RT](https://gtfs.org/realtime/) feed, and serves the feed via HTTP.\n\n`monitor-hafas` sends data to `match-with-gtfs` via two NATS Streaming channels `trips` & `movements`; `match-with-gtfs` sends data to `serve-as-gtfs-rt` via two channels `matched-trips` & `matched-movements`.\n\n```mermaid\nflowchart TB\n  subgraph external[ ]\n    hafas(HAFAS API):::external\n    db(GTFS Static/Schedule in PostgreSQL):::external\n    consumers(consumers):::external\n    classDef external fill:#ffd9c2,stroke:#ff8e62\n  end\n  style external fill:none,stroke:none\n  subgraph hafas-gtfs-rt-feed\n      monitor-hafas(monitor-hafas)\n      match-with-gtfs(match-with-gtfs)\n      serve-as-gtfs-rt(serve-as-gtfs-rt)\n  end\n  style hafas-gtfs-rt-feed fill:none,stroke:#9370db\n    subgraph nats[NATS Streaming]\n        trips[trips channel]:::channel\n        movements[movements channel]:::channel\n        matched-trips[matched-trips channel]:::channel\n        matched-movements[matched-movements channel]:::channel\n    classDef channel fill:#ffffde,stroke:#aaaa33\n    end\n  style nats fill:none\n\n    hafas-- realtime data -->monitor-hafas\n    db-- static data -->match-with-gtfs\n    serve-as-gtfs-rt-- GTFS-RT -->consumers\n\n    monitor-hafas.->trips.->match-with-gtfs\n    monitor-hafas.->movements.->match-with-gtfs\n    match-with-gtfs.->matched-trips.->serve-as-gtfs-rt\n    match-with-gtfs.->matched-movements.->serve-as-gtfs-rt\n```\n\n\n## Getting Started\n\nSome preparations are necessary for `hafas-gtfs-rt-feed` to work. Let's get started!\n\nRun `npm init` inside a new directory to initialize an empty [npm](https://docs.npmjs.com/cli/v8/commands/npm)-based project.\n\n```sh\nmkdir my-hafas-based-gtfs-rt-feed\ncd my-hafas-based-gtfs-rt-feed\nnpm init\n```\n\n### set up NATS Streaming\n\n[Install and run the NATS Streaming Server](https://docs.nats.io/nats-streaming-server/run) as documented.\n\n*Note:* If you run Nats Streaming on a different host or port (e.g. via Docker Compose), pass a custom `NATS_STREAMING_URL` environment variable into all `hafas-gtfs-rt-feed` components.\n\n### set up PostgreSQL\n\nMake sure you have **[PostgreSQL](https://www.postgresql.org) >=14** installed and running ([`match-gtfs-rt-to-gtfs`](https://github.com/derhuerst/match-gtfs-rt-to-gtfs), a dependency of this project, needs it). There are guides for many operating systems and environments available on the internet.\n\n*Note:* If you run PostgreSQL on a different host or port, export the appropriate [`PG*` environment variables](https://www.postgresql.org/docs/14/libpq-envars.html). The commands explain mentioned below will use them.\n\n### install `hafas-gtfs-rt-feed`\n\nUse the [npm CLI](https://docs.npmjs.com/getting-started/configuring-your-local-environment):\n\n```shell\nnpm install hafas-gtfs-rt-feed\n# added 153 packages in 12s\n```\n\n### configure a `hafas-client` instance\n\n`hafas-gtfs-rt-feed` is agnostic to the HAFAS API it pulls data from: To fetch data, `monitor-hafas` just uses the `hafas-client` you instantiate in a file, which queries one out of many available HAFAS API endpoints.\n\nSet up [`hafas-client` as documented](https://github.com/public-transport/hafas-client/blob/5.27.0/readme.md#usage). A very basic example using the [Deutsche Bahn (DB) endpoint](https://github.com/public-transport/hafas-client/blob/5/p/db/readme.md) looks as follows:\n\n```js\n// db-hafas-client.js\nconst createHafasClient = require('hafas-client')\nconst dbProfile = require('hafas-client/p/db')\n\n// please pick something meaningful, e.g. the URL of your GitHub repo\nconst userAgent = 'my-awesome-program'\n\n// create hafas-client configured to use Deutsche Bahn's HAFAS API\nconst hafasClient = createHafasClient(dbProfile, userAgent)\n\nmodule.exports = hafasClient\n```\n\n### build the GTFS matching database\n\n`match-with-gtfs` – `hafas-gtfs-rt-feed`'s 2nd processing step – needs a pre-populated matching database in order to match data fetched from HAFAS against the [GTFS Static/Schedule](https://gtfs.org/schedule/) data; It uses [`gtfs-via-postgres`](https://npmjs.com/package/gtfs-via-postgres) and [`match-gtfs-rt-to-gtfs`](https://npmjs.com/package/match-gtfs-rt-to-gtfs) underneath to do this matching.\n\nFirst, we're going to use [`gtfs-via-postgres`](https://npmjs.com/package/gtfs-via-postgres)'s `gtfs-to-sql` command-line tool to import our GTFS data into PostgreSQL. \n\n*Note:* Make sure you have an up-to-date [static GTFS](https://gtfs.org/schedule/) dataset, unzipped into individual `.txt` files.\n\n> ![TIP]\n> The [`sponge` command](https://linux.die.net/man/1/sponge) is from the [`moreutils` package](https://repology.org/project/moreutils/information).\n\n```sh\n# create a PostgreSQL database `gtfs`\npsql -c 'create database gtfs'\n# configure all subsequent commands to use it\nexport PGDATABASE=gtfs\n# import all .txt files\nnode_modules/.bin/gtfs-to-sql -d -u path/to/gtfs/files/*.txt \\\n    sponge | psql -b -v 'ON_ERROR_STOP=1'\n```\n\nYou database `gtfs` should contain the static GTFS data in a basic form now.\n\n---\n\n[`match-gtfs-rt-to-gtfs`](https://npmjs.com/package/match-gtfs-rt-to-gtfs) works by matching HAFAS stops & lines against GTFS stops & lines, using their IDs and *their names*. Usually, HAFAS & GTFS stop/line names don't have the same format (e.g. `Berlin Hbf` & `S+U Berlin Hauptbahnhof`), so they need to be normalized.\n\nYou'll have to implement this normalization logic. A simplified (but *very naive*) normalization logic would look like this:\n\n```js\n// hafas-config.js\nmodule.exports = {\n\tendpointName: 'some-hafas-api',\n\tnormalizeStopName: name => name.toLowerCase().replace(/\\s+/g, ' ').trim(),\n\tnormalizeLineName: name => name.toLowerCase().replace(/\\s+/g, ' ').trim(),\n}\n```\n\n```js\n// gtfs-config.js\nmodule.exports = {\n\tendpointName: 'some-gtfs-feed',\n\tnormalizeStopName: name => name.toLowerCase().replace(/\\s+St\\.$/, ''),\n\tnormalizeLineName: name => name.toLowerCase(),\n}\n```\n\n`match-gtfs-rt-to-gtfs` needs some special matching indices in the database to work. Now that we have implemented the names normalization logic, we're going to pass it to `match-gtfs-rt-to-gtfs`'s `build-gtfs-match-index` command-line tool:\n\n```sh\n# add matching indices to the `gtfs` database\nnode_modules/.bin/build-gtfs-match-index path/to/hafas-config.js path/to/gtfs-config.js \\\n    sponge | psql -b -v 'ON_ERROR_STOP=1'\n```\n\n*Note:* `hafas-gtfs-rt-feed` is data- & region-agnostic, so it depends on your HAFAS-endpoint-specific name normalization logic to match as many HAFAS trips/vehicles as possible against the GTFS data. Ideally, the stop/line names are normalized so well that HAFAS data can *always* be matched to the (static) GTFS data. This is how GTFS-RT feeds are intended to be consumed: *along* a (static) GTFS dataset with 100% *matching IDs*. If the name normalization logic *doesn't* handle all cases, the GTFS-RT feed will contain `TripUpdate`s & `VehiclePosition`s whose `route_id` or `trip_id` doesn't occur in the GTFS dataset.\n\n### run it\n\nNow that we've set everything up, let's run all `hafas-gtfs-rt-feed` components to check if they are working!\n\nAll three components need to be run in parallel, so just open three terminals to run them. Remember to set the `NATS_STREAMING_URL` & `PG*` environment variables (see above) in all three of them, if necessary.\n\nThey log [pino-formatted](https://getpino.io/#/?id=usage) log messages to `stdout`, so for local development, we use [`pino-pretty`](https://www.npmjs.com/package/pino-pretty) to make them more readable.\n\n```shell\n# specify the bounding box to be monitored (required)\nexport BBOX='{\"north\": 1.1, \"west\": 22.2, \"south\": 3.3, \"east\": 33.3}'\n# start monitor-hafas\nnode_modules/.bin/monitor-hafas db-hafas-client.js | npx pino-pretty\n# todo: sample logs\n```\n\n```shell\nnode_modules/.bin/match-with-gtfs | npx pino-pretty\n# todo: sample logs\n```\n\n```shell\nnode_modules/.bin/serve-as-gtfs-rt | npx pino-pretty\n```\n\n### inspect the feed\n\nYour GTFS-RT feed should now be served at `http://localhost:3000/`, and within a few moments, it should contain data! 👏\n\nYou can verify this using many available GTFS-RT tools; Here are two of them to quickly inspect the feed:\n\n- [`print-gtfs-rt-cli`](https://github.com/derhuerst/print-gtfs-rt-cli) is a command-line tool, use it with `curl`: `curl 'http://localhost:3000/' -sf | print-gtfs-rt`.\n- [`gtfs-rt-inspector`](https://public-transport.github.io/gtfs-rt-inspector/?feedUrl=http%3A%2F%2Flocalhost%3A3000%2F%0A) is a web app that can inspect any [CORS](https://enable-cors.org)-enabled GTFS-RT feed; Paste `http://localhost:3000/` into the url field to inspect yours.\n\nAfter `monitor.js` has fetched some data from HAFAS, and after `match.js` has matched it against the GTFS (or failed or timed out doing so), you should see [`TripUpdate`s](https://gtfs.org/realtime/reference/#message-tripupdate) & [`VehiclePosition`s](https://gtfs.org/realtime/reference/#message-vehicleposition).\n\n\n## Usage\n\n### metrics\n\nAll three components (`monitor-hafas`, `match-with-gtfs`, `serve-as-gtfs-rt`) expose [Prometheus](https://prometheus.io)-compatible metrics via HTTP. You can fetch and process them using e.g. Prometheus, [VictoriaMetrics](https://victoriametrics.com) or the [Grafana Agent](https://grafana.com/docs/grafana-cloud/agent/).\n\nAs an example, we're going to inspect `monitor-hafas`'s metrics. Enable them by running it with an `METRICS_SERVER_PORT=9323` environment variable and query its metrics via HTTP:\n\n```shell\ncurl 'http://localhost:9323/metrics'\n```\n\n```\n# HELP nats_streaming_sent_total nr. of messages published to NATS streaming\n# TYPE nats_streaming_sent_total counter\nnats_streaming_sent_total{channel=\"movements\"} 1673\nnats_streaming_sent_total{channel=\"trips\"} 1162\n\n# HELP hafas_reqs_total nr. of HAFAS requests\n# TYPE hafas_reqs_total counter\nhafas_reqs_total{call=\"radar\"} 12\nhafas_reqs_total{call=\"trip\"} 1165\n\n# HELP hafas_response_time_seconds HAFAS response time\n# TYPE hafas_response_time_seconds summary\nhafas_response_time_seconds{quantile=\"0.05\",call=\"radar\"} 1.0396666666666665\nhafas_response_time_seconds{quantile=\"0.5\",call=\"radar\"} 3.8535000000000004\nhafas_response_time_seconds{quantile=\"0.95\",call=\"radar\"} 6.833\nhafas_response_time_seconds_sum{call=\"radar\"} 338.22600000000006\nhafas_response_time_seconds_count{call=\"radar\"} 90\nhafas_response_time_seconds{quantile=\"0.05\",call=\"trip\"} 2.4385\n# …\n\n# HELP tiles_fetched_total nr. of tiles fetched from HAFAS\n# TYPE tiles_fetched_total counter\ntiles_fetched_total 2\n\n# HELP movements_fetched_total nr. of movements fetched from HAFAS\n# TYPE movements_fetched_total counter\nmovements_fetched_total 362\n\n# HELP fetch_all_movements_total how often all movements have been fetched\n# TYPE fetch_all_movements_total counter\nfetch_all_movements_total 1\n\n# HELP fetch_all_movements_duration_seconds time that fetching all movements currently takes\n# TYPE fetch_all_movements_duration_seconds gauge\nfetch_all_movements_duration_seconds 2.4\n```\n\n### health check\n\n`serve-as-gtfs-rt` exposes a [health check](https://microservices.io/patterns/observability/health-check-api.html) that checks if there are any recent entities in the feed.\n\n```shell\n# healthy\ncurl 'http://localhost:3000/health' -I\n# HTTP/1.1 200 OK\n# …\n\n# not healthy\ncurl 'http://localhost:3000/health' -I\n# HTTP/1.1 503 Service Unavailable\n# …\n```\n\n### on-demand mode\n\nOptionally, you can run your GTFS-RT feed in a demand-responsive mode, where it will only fetch data from HAFAS as long someone requests the GTFS-RT feed, which effectively reduces the long-term nr. of requests to HAFAS.\n\nTo understand how this works, remember that\n\n- movements fetched from HAFAS are formatted as GTFS-RT `VehiclePosition`s.\n- trips fetched from HAFAS are formatted as GTFS-RT `TripUpdate`s.\n- the whole `monitor-hafas`, `match-with-gtfs` & `serve-as-gtfs-rt` setup works like a streaming pipeline.\n\nThe on-demand mode works like this:\n\n- `monitor-hafas` is either just fetching movements (if you configured it to fetch *only trips* on demand) or completely idle (if you configured it to fetch *both movements & trips* on demand) by default.\n- `monitor-hafas` also subscribes to a `demand` NATS Streaming channel, which serves as a communication channel for `serve-as-gtfs-rt` to signal demand.\n- When the GTFS-RT feed is requested via HTTP,\n\t1. `serve-as-gtfs-rt` serves the current feed (which contains either `VehiclePositions`s only, or no entities whatsoever, depending on the on-demand configuration).\n\t2. `serve-as-gtfs-rt` signals demand via the `demand` channel.\n\t3. Upon receiving a demand signal, `monitor-hafas` will start fetching trips – or both movements & trips, depending on the on-demand configuration.\n\nThis means that, after a first request(s) for the GTFS-RT feed signalling demand, it will take a bit of time until all data is served with subsequent GTFS-RT feed requests; As long as there is constant for the feed, the on-demand mode will behave as if it isn't turned on.\n\nTell `serve-as-gtfs-rt` to signal demand via the `--signal-demand` option. You can then configure `monitor-hafas`'s exact behaviour using the following options:\n\n```\n--movements-fetch-mode <mode>\n    Control when movements are fetched from HAFAS.\n    \"on-demand\":\n        Only fetch movements from HAFAS when the `serve-as-gtfs-rt` component\n        has signalled demand. Trips won't be fetched continuously anymore.\n    \"continuously\" (default):\n        Always fetch movements.\n--movements-demand-duration <milliseconds>\n    With `--movements-fetch-mode \"on-demand\"`, when the `serve-as-gtfs-rt` component\n    has signalled demand, for how long shall movements be fetched?\n    Default: movements fetching interval (60s by default) * 5\n--trips-fetch-mode <mode>\n    Control when trips are fetched from HAFAS.\n    \"never\":\n        Never fetch a movement's respective trip.\n    \"on-demand\":\n        Only fetch movements' respective trips from HAFAS when the `serve-as-gtfs-rt`\n        component has signalled demand.\n    \"continuously\" (default):\n        Always fetch each movement's respective trip.\n--trips-demand-duration <milliseconds>\n    With `--trips-fetch-mode \"on-demand\"`, when the `serve-as-gtfs-rt` component\n    has signalled demand, for how long shall trips be fetched?\n    Default: movements fetching interval (60s by default) * 2\n```\n\n### controlling the number of requests to HAFAS\n\nCurrently, there is no mechanism to influence the total rate of requests to HAFAS *directly*, no prioritisation between the \"find trips in a bounding box\" (`hafas-client`'s `radar()`) and \"refresh a trip\" (`hafas-client`'s `trip()`) requests, and no logic to efficiently use requests up to a certain configured limit.\n\nHowever, there are some dials to influence the amount requests of both types:\n\n- By defining a smaller or larger bounding box via the `BBOX` environment variable, you can control the total number of monitored trips, and thus the rate of requests.\n- By setting `FETCH_TILES_INTERVAL`, you can choose how often the bounding box (or the vehicles within, rather) shall be refreshed, and subsequently how often each trip will be fetched if you have configured that. Note that if a refresh takes longer to than the configured interval, another refresh will follow right after, but the total rate of `radar()` requests to HAFAS will be lower.\n- You can throttle the total number of requests to HAFAS by [throttling `hafas-client`](https://github.com/public-transport/hafas-client/blob/5/throttle.js), but depending on the rate you configure, this might cause the refresh of all monitored trips (as well as finding new trips to monitor) to take longer than configured using `FETCH_TRIPS_INTERVAL`, so consider it as a secondary tool.\n\n### exposing feed metadata\n\nIf you pass metadata about the GTFS-Static feed used, `serve-as-gtfs-rt` will expose it via HTTP:\n\n```shell\nserve-as-gtfs-rt \\\n\t--feed-info path/to/gtfs/files/feed_info.txt \\\n\t--feed-url https://data.ndovloket.nl/flixbus/flixbus-eu.zip\n\ncurl 'http://localhost:3000/feed_info.csv'\n# feed_publisher_name,feed_publisher_url,feed_lang,feed_start_date,feed_end_date,feed_version\n# openOV,http://openov.nl,en,20210108,20210221,20210108\n\ncurl 'http://localhost:3000/feed_info.csv' -I\n# HTTP/1.1 302 Found\n# location: https://data.ndovloket.nl/flixbus/flixbus-eu.zip\n```\n\n\n## Related projects\n\n- [`hafas-gtfs-rt-server-example`](https://github.com/derhuerst/hafas-gtfs-rt-server-example) – Using [`hafas-client`](https://github.com/public-transport/hafas-client), [`hafas-monitor-trips`](https://github.com/derhuerst/hafas-monitor-trips) & [`hafas-gtfs-rt-feed`](https://github.com/derhuerst/hafas-gtfs-rt-feed) as a GTFS-RT server.\n- [`print-gtfs-rt-cli`](https://github.com/derhuerst/print-gtfs-rt-cli) – Read a [GTFS Realtime (GTFS-RT)](https://gtfs.org/realtime/) feed from `stdin`, print human-readable or as JSON.\n- [`gtfs-rt-inspector`](https://github.com/public-transport/gtfs-rt-inspector) – Web app to inspect & analyze any [CORS](https://enable-cors.org)-enabled [GTFS Realtime (GTFS-RT)](https://gtfs.org/realtime/) feed.\n- [`match-gtfs-rt-to-gtfs`](https://github.com/derhuerst/match-gtfs-rt-to-gtfs) – Match realtime transit data (e.g. from [GTFS Realtime](https://gtfs.org/reference/realtime/v2/)) with [GTFS Static](https://gtfs.org/reference/static) data, even if they don't share an ID.\n- [`gtfs-rt-differential-to-full-dataset`](https://github.com/derhuerst/gtfs-rt-differential-to-full-dataset) – Transform a continuous [GTFS Realtime](https://gtfs.org/realtime/) stream of [`DIFFERENTIAL` incrementality](https://gtfs.org/realtime/reference/#enum-incrementality) data into a [`FULL_DATASET`](https://gtfs.org/realtime/reference/#enum-incrementality) dump.\n- [`transloc-to-gtfs-real-time`](https://github.com/jonathonwpowell/transloc-to-gtfs-real-time) – Transform Transloc Real Time API to the GTFS RealTime Format\n\nThere are [several projects making use of `hafas-gtfs-rt-server`](https://github.com/derhuerst/hafas-gtfs-rt-feed/network/dependents?package_id=UGFja2FnZS00MzY3NzU1NjU%3D).\n\n\n## License\n\nThis project is dual-licensed: **My contributions are licensed under the [*Prosperity Public License*](https://prosperitylicense.com), [contributions of other people](https://github.com/derhuerst/hafas-gtfs-rt-feed/graphs/contributors) are licensed as [Apache 2.0](https://apache.org/licenses/LICENSE-2.0)**.\n\n> This license allows you to use and share this software for noncommercial purposes for free and to try this software for commercial purposes for thirty days.\n\n> Personal use for research, experiment, and testing for the benefit of public knowledge, personal study, private entertainment, hobby projects, amateur pursuits, or religious observance, without any anticipated commercial application, doesn’t count as use for a commercial purpose.\n\n[Get in touch with me](https://jannisr.de/) to buy a commercial license or read more about [why I sell private licenses for my projects](https://gist.github.com/derhuerst/0ef31ee82b6300d2cafd03d10dd522f7).\n\n\n## Contributing\n\nBy contributing, you agree to release your modifications under the [Apache 2.0 license](LICENSE-APACHE).\n","readmeFilename":"readme.md"}