util.ts 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. /* eslint-disable no-console */
  2. import type { JsonUpdate } from "../src/index.js";
  3. // Helper function to render all feeds in place
  4. export function renderFeeds(
  5. feedData: Map<
  6. string,
  7. {
  8. priceFeedId: number;
  9. price: number;
  10. confidence: number | undefined;
  11. exponent: number;
  12. lastUpdate: Date;
  13. }
  14. >,
  15. symbolsMap: Map<number, string>,
  16. ) {
  17. // Clear screen and move cursor to top
  18. process.stdout.write("\u001B[2J\u001B[H");
  19. if (feedData.size === 0) {
  20. console.log("Waiting for price feed data...\n");
  21. return;
  22. }
  23. console.log("🔴 Live Lazer Price Feeds\n");
  24. console.log("━".repeat(80));
  25. // Sort feeds by ID for consistent display order
  26. const sortedFeeds = [...feedData.values()].sort((a, b) => {
  27. const aId = String(a.priceFeedId);
  28. const bId = String(b.priceFeedId);
  29. return aId.localeCompare(bId);
  30. });
  31. for (const [index, feed] of sortedFeeds.entries()) {
  32. const readablePrice = feed.price * Math.pow(10, feed.exponent);
  33. const readableConfidence =
  34. feed.confidence === undefined
  35. ? undefined
  36. : feed.confidence * Math.pow(10, feed.exponent);
  37. const timeAgo = Math.round(Date.now() - feed.lastUpdate.getTime());
  38. const symbolName = symbolsMap.get(Number(feed.priceFeedId));
  39. const displayName = symbolName
  40. ? `Feed ID: ${feed.priceFeedId.toString()} (${symbolName})`
  41. : `Feed ID: ${feed.priceFeedId.toString()}`;
  42. console.log(`\u001B[36m${(index + 1).toString()}. ${displayName}\u001B[0m`);
  43. console.log(
  44. ` 💰 Price: \u001B[32m$${readablePrice.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 8 })}\u001B[0m`,
  45. );
  46. if (readableConfidence !== undefined) {
  47. console.log(
  48. ` 📊 Confidence: \u001B[33m±$${readableConfidence.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 8 })}\u001B[0m`,
  49. );
  50. }
  51. console.log(
  52. ` ⏰ Updated: \u001B[90m${timeAgo.toString()}ms ago\u001B[0m`,
  53. );
  54. console.log("");
  55. }
  56. console.log("━".repeat(80));
  57. console.log(
  58. `\u001B[90mLast refresh: ${new Date().toLocaleTimeString()}\u001B[0m`,
  59. );
  60. }
  61. // Helper function to update price feed data and refresh display
  62. export function refreshFeedDisplay(
  63. response: JsonUpdate,
  64. feedData: Map<
  65. string,
  66. {
  67. priceFeedId: number;
  68. price: number;
  69. confidence: number | undefined;
  70. exponent: number;
  71. lastUpdate: Date;
  72. }
  73. >,
  74. symbolsMap: Map<number, string>,
  75. ) {
  76. if (response.parsed?.priceFeeds) {
  77. for (const feed of response.parsed.priceFeeds) {
  78. if (feed.price && feed.exponent !== undefined) {
  79. const readableConfidence = feed.confidence
  80. ? Number(feed.confidence)
  81. : undefined;
  82. feedData.set(feed.priceFeedId.toString(), {
  83. priceFeedId: feed.priceFeedId,
  84. price: Number(feed.price),
  85. confidence: readableConfidence,
  86. exponent: feed.exponent,
  87. lastUpdate: new Date(),
  88. });
  89. }
  90. }
  91. renderFeeds(feedData, symbolsMap);
  92. }
  93. }
  94. // Helper function to calculate human-friendly price values
  95. export function displayParsedPrices(response: JsonUpdate) {
  96. if (response.parsed?.priceFeeds) {
  97. for (const [index, feed] of response.parsed.priceFeeds.entries()) {
  98. if (feed.price && feed.exponent !== undefined) {
  99. const readablePrice = Number(feed.price) * Math.pow(10, feed.exponent);
  100. const readableConfidence = feed.confidence
  101. ? Number(feed.confidence) * Math.pow(10, feed.exponent)
  102. : undefined;
  103. console.log(`Feed ${(index + 1).toString()}:`);
  104. console.log(
  105. `\tPrice: $${readablePrice.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 8 })}`,
  106. );
  107. if (readableConfidence !== undefined) {
  108. console.log(
  109. `\tConfidence: ±$${readableConfidence.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 8 })}`,
  110. );
  111. }
  112. }
  113. }
  114. }
  115. }