Node JS Examples: Difference between revisions
Created new Node.js examples page |
EvelynSnow (talk | contribs) stomp-client is no longer recommended for NWR feeds, and individual subscriptions are no longer necessary, remove |
||
(7 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
== node.js == | == node.js (Stompit) == | ||
Using stompit library from https://github.com/gdaws/node-stomp | |||
<pre> | <pre> | ||
var stompit = require("stompit"); | |||
var | var async = require("async"); | ||
var | // Connect options with standard headers | ||
var connectOptions = { | |||
"host": "publicdatafeeds.networkrail.co.uk", | |||
"port": 61618, | |||
"connectHeaders": { | |||
"heart-beat": "15000,15000",// hear-beat of 15 seconds | |||
"client-id": "", // request a durable subscription - set this to the login name you use to subscribe | |||
"host": "/", | |||
"login": "", // your username | |||
"passcode": "" // your password | |||
} | |||
}; | |||
client.connect(function( | // Reconnect management for stompit client | ||
console.log( | var reconnectOptions = { | ||
client.subscribe( | "initialReconnectDelay": 10, // milliseconds delay of the first reconnect | ||
console.log( | "maxReconnectDelay": 30000, // maximum milliseconds delay of any reconnect | ||
"useExponentialBackOff": true, // exponential increase in reconnect delay | |||
"maxReconnects": 30, // maximum number of failed reconnects consecutively | |||
"randomize": false // randomly choose a server to use when reconnecting | |||
// (there are no other servers at this time) | |||
}; | |||
var connectionManager = new stompit.ConnectFailover([connectOptions], reconnectOptions); | |||
connectionManager.connect(function (error, client, reconnect) { | |||
if (error) { | |||
console.log("Terminal error, gave up reconnecting"); | |||
return; | |||
} | |||
client.on("error", function (error) { | |||
console.log("Connection lost. Reconnecting..."); | |||
reconnect(); | |||
}); | |||
var headers = { | |||
"destination": "/topic/TRAIN_MVT_ALL_TOC", // subscribe for a destination to which messages are sent | |||
"activemq.subscriptionName": "somename-train_mvt", // request a durable subscription - set this to an unique string for each feed | |||
"ack": "client-individual" // the client will send ACK frames individually for each message processed | |||
}; | |||
client.subscribe(headers, function (error, message) { | |||
if (error) { | |||
console.log("Subscription failed:", error.message); | |||
return; | |||
} | |||
message.readString("utf-8", function (error, body) { | |||
if (error) { | |||
console.log("Failed to read a message", error); | |||
return; | |||
} | |||
if (body) { | |||
var data; | |||
try { | |||
data = JSON.parse(body); | |||
} catch (e) { | |||
console.log("Failed to parse JSON", e); | |||
return; | |||
} | |||
async.each(data, | |||
function(item, next) { | |||
// Look for Train Activation messages (msg_type 0001) | |||
if (item.header && item.header.msg_type == "0001") { | |||
console.log( | |||
"Train", | |||
item.body.train_id, | |||
"activated at stanox", | |||
item.body.tp_origin_stanox ? item.body.tp_origin_stanox : item.body.sched_origin_stanox | |||
); | |||
} | |||
next(); | |||
} | |||
); | |||
} | |||
client.ack(message); // Send ACK frame to server | |||
}); | |||
}); | }); | ||
}); | }); | ||
</pre> | </pre> | ||
{{Navtable-DataFeeds}} | |||
[[Category:Network Rail Data Feeds]] | [[Category:Network Rail Data Feeds]] | ||
[[Category:Example Code]] |
Latest revision as of 14:30, 9 January 2025
node.js (Stompit)
Using stompit library from https://github.com/gdaws/node-stomp
var stompit = require("stompit"); var async = require("async"); // Connect options with standard headers var connectOptions = { "host": "publicdatafeeds.networkrail.co.uk", "port": 61618, "connectHeaders": { "heart-beat": "15000,15000",// hear-beat of 15 seconds "client-id": "", // request a durable subscription - set this to the login name you use to subscribe "host": "/", "login": "", // your username "passcode": "" // your password } }; // Reconnect management for stompit client var reconnectOptions = { "initialReconnectDelay": 10, // milliseconds delay of the first reconnect "maxReconnectDelay": 30000, // maximum milliseconds delay of any reconnect "useExponentialBackOff": true, // exponential increase in reconnect delay "maxReconnects": 30, // maximum number of failed reconnects consecutively "randomize": false // randomly choose a server to use when reconnecting // (there are no other servers at this time) }; var connectionManager = new stompit.ConnectFailover([connectOptions], reconnectOptions); connectionManager.connect(function (error, client, reconnect) { if (error) { console.log("Terminal error, gave up reconnecting"); return; } client.on("error", function (error) { console.log("Connection lost. Reconnecting..."); reconnect(); }); var headers = { "destination": "/topic/TRAIN_MVT_ALL_TOC", // subscribe for a destination to which messages are sent "activemq.subscriptionName": "somename-train_mvt", // request a durable subscription - set this to an unique string for each feed "ack": "client-individual" // the client will send ACK frames individually for each message processed }; client.subscribe(headers, function (error, message) { if (error) { console.log("Subscription failed:", error.message); return; } message.readString("utf-8", function (error, body) { if (error) { console.log("Failed to read a message", error); return; } if (body) { var data; try { data = JSON.parse(body); } catch (e) { console.log("Failed to parse JSON", e); return; } async.each(data, function(item, next) { // Look for Train Activation messages (msg_type 0001) if (item.header && item.header.msg_type == "0001") { console.log( "Train", item.body.train_id, "activated at stanox", item.body.tp_origin_stanox ? item.body.tp_origin_stanox : item.body.sched_origin_stanox ); } next(); } ); } client.ack(message); // Send ACK frame to server }); }); });
Network Rail Open Data Feeds | |
---|---|
Data Feeds | About the Feeds • Account States • Durable Subscriptions • Example Code ( PHP / C# / Java / Ruby / Node.js) • STOMP Client Libraries • Advanced Uses • FAQ • Release Notes |
RTPPM | RTPPM Feed |
Train Movements | Train Movements Feed • Train Activation • Train Cancellation • Train Movement • Train Reinstatement • Change of Origin • Change of Identity • Change of Location • TSPEED Field • Planned Cancellations • Cancellation Codes |
TD | TD Feed • C-Class Messages • S-Class Messages • Train Describers • TD Berths |
VSTP | VSTP Feed |
TSR | TSR Feed • Route Codes |
SCHEDULE | SCHEDULE Feed • TIPLOC Records • Schedule and Location Records • Association Records • CIF Codes • How Scheduling Works • Allowances |
Reference Data | Reference Data Feed • TOC Codes • CIF Codes • Delay Attribution Codes • Identifying Locations (STANOX, TIPLOC, NLC and 3-Alpha Codes) • STANOX Geographical Areas • Train Planning data (BPLAN) |