UNPKG

irctc-connect

Version:

🚂 Complete Node.js SDK for Indian Railways IRCTC - Check PNR status, train schedules, live running status, seat availability & station info. Promise-based API with TypeScript support.

186 lines (166 loc) • 6.52 kB
export async function checkTrain(rawString) { try { const sections = rawString.split("~~~~~~~~"); const errorMessages = [ "~~~~~Please try again after some time.", "~~~~~Train not found" ]; if (errorMessages.includes(sections[0])) { return { success: false, data: sections[0].replaceAll("~", "") }; } let trainData = sections[0].split("~").filter(el => el !== ""); if (trainData[1].length > 6) trainData.shift(); const routeData = sections[1].split("~").filter(el => el !== ""); const trainInfo = { train_no: trainData[1].replace("^", ""), train_name: trainData[2], from_stn_name: trainData[3], from_stn_code: trainData[4], to_stn_name: trainData[5], to_stn_code: trainData[6], from_time: trainData[11].replace(".", ":"), to_time: trainData[12].replace(".", ":"), travel_time: trainData[13].replace(".", ":") + " hrs", running_days: trainData[14], type: routeData[11], train_id: routeData[12] }; return { success: true, data: trainInfo }; } catch (err) { return { success: false, error: "Failed to parse train data" }; } } export function parseTrainRoute(string) { try { let data = string.split("~^"); let arr = data.map((item) => { let details = item.split("~").filter((el) => el !== ""); return { stnName: details[2], stnCode: details[1], arrival: details[3].replace(".", ":"), departure: details[4].replace(".", ":"), halt: details[5] ? details[5] + " min" : "0 min", distance: details[6], day: details[7], platform: !isNaN(Number(details[8])) ? details[8] : '', coordinates: !isNaN(parseFloat(details[12])) && !isNaN(parseFloat(details[13])) ? { latitude: parseFloat(details[12]), longitude: parseFloat(details[13]) } : null }; }); return { success: true, data: arr, }; } catch (err) { return { success: false, error: "Failed to parse route data", }; } } export async function getRoute(train_id) { try { const response = await fetch(`https://erail.in/data.aspx?Action=TRAINROUTE&Password=2012&Data1=${train_id}&Data2=0&Cache=true`); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const rawData = await response.text(); return parseTrainRoute(rawData); } catch (error) { return { success: false, error: "Failed to fetch route data" }; } } export async function parseTrainData(data) { try { const arr = []; const rawData = data.split("~~~~~~~~").filter((el) => el.trim() !== ""); // Filter valid data // Check for error messages if (rawData[0].includes("No direct trains found")) { return { success: false, time_stamp: Date.now(), data: "No direct trains found between the selected stations.", }; } if ( rawData[0].includes("Please try again after some time.") || rawData[0].includes("From station not found") || rawData[0].includes("To station not found") ) { return { success: false, time_stamp: Date.now(), data: rawData[0].replace(/~/g, ""), }; } // Parse each train's details for (let i = 0; i < rawData.length; i++) { const trainData = rawData[i].split("~^"); const nextData = rawData[i + 1] || ""; // Ensure next data exists or use an empty string const trainData2 = nextData.split("~^"); if (trainData.length === 2) { const details = trainData[1].split("~").filter((el) => el.trim() !== ""); const details2 = trainData2[0] ? trainData2[0].split("~").filter((el) => el.trim() !== "") : []; // Handle empty trainData2 safely if (details.length >= 14) { arr.push({ train_no: details[0], train_name: details[1], source_stn_name: details[2], source_stn_code: details[3], dstn_stn_name: details[4], dstn_stn_code: details[5], from_stn_name: details[6], from_stn_code: details[7], to_stn_name: details[8], to_stn_code: details[9], from_time: details[10].replace(".", ":"), to_time: details[11].replace(".", ":"), travel_time: details[12].replace(".", ":") + " hrs", running_days: details[13], distance: details2[18] || "N/A", // Use "N/A" if distance is unavailable halts: details2[7] - details2[4] - 1 }); } } } arr.sort((a, b) => { const timeA = a.from_time.split(":").map(Number); const timeB = b.from_time.split(":").map(Number); const minutesA = timeA[0] * 60 + timeA[1]; const minutesB = timeB[0] * 60 + timeB[1]; return minutesA - minutesB; }); return { success: true, time_stamp: Date.now(), data: arr, }; } catch (err) { console.error("Parsing error:", err); return { success: false, time_stamp: Date.now(), data: "An error occurred while processing train data.", }; } }