polymarketClient.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import axios from "axios";
  2. import { HttpsProxyAgent } from "https-proxy-agent";
  3. import WebSocketClient from "./webSocketClient.js";
  4. import polymarketSdk from "./polymarketSdk.js";
  5. export const createClobClient = polymarketSdk.createClobClient;
  6. export const getSoccerSports = polymarketSdk.getSoccerSports;
  7. export const getEvents = polymarketSdk.getEvents;
  8. export const getOrderBook = polymarketSdk.getOrderBook;
  9. export const getMultipleOrderBooks = polymarketSdk.getMultipleOrderBooks;
  10. export const getBalanceAllowance = polymarketSdk.getBalanceAllowance;
  11. export const transferWallet = polymarketSdk.transferWallet;
  12. export const createLimitOrder = polymarketSdk.createLimitOrder;
  13. export const getOrder = polymarketSdk.getOrder;
  14. export const getOpenOrders = polymarketSdk.getOpenOrders;
  15. const axiosDefaultOptions = {
  16. baseURL: "",
  17. url: "",
  18. method: "GET",
  19. headers: {},
  20. params: {},
  21. data: {},
  22. timeout: 10000,
  23. };
  24. /**
  25. * 请求平台数据
  26. * @param {*} options
  27. * @returns {Promise}
  28. */
  29. export const platformRequest = async (options) => {
  30. const { url } = options;
  31. if (!url) {
  32. throw new Error("url is required");
  33. }
  34. const internalToken = process.env.PPAI_INTERNAL_API_TOKEN;
  35. const mergedOptions = {
  36. ...axiosDefaultOptions,
  37. ...options,
  38. baseURL: "http://127.0.0.1:9020",
  39. headers: {
  40. ...axiosDefaultOptions.headers,
  41. ...options.headers,
  42. ...(internalToken ? { Authorization: `Bearer ${internalToken}` } : {}),
  43. },
  44. httpAgent: null,
  45. httpsAgent: null,
  46. proxy: false,
  47. };
  48. return axios(mergedOptions).then(res => res.data);
  49. }
  50. /**
  51. * 请求平台 POST 数据
  52. * @param {string} url
  53. * @param {Object} data
  54. * @returns {Promise}
  55. */
  56. export const platformPost = async (url, data) => {
  57. return platformRequest({
  58. url,
  59. method: "POST",
  60. headers: {
  61. "Content-Type": "application/json",
  62. },
  63. data,
  64. });
  65. }
  66. /**
  67. * 请求平台 GET 数据
  68. * @param {string} url
  69. * @param {Object} params
  70. * @returns {Promise}
  71. */
  72. export const platformGet = async (url, params) => {
  73. return platformRequest({ url, method: "GET", params });
  74. }
  75. /**
  76. * 市场 WebSocket 客户端
  77. */
  78. export class MarketWsClient extends WebSocketClient {
  79. #assetIds = [];
  80. constructor() {
  81. let agent;
  82. const proxy = process.env.NODE_HTTP_PROXY;
  83. if (proxy) {
  84. agent = new HttpsProxyAgent(proxy);
  85. }
  86. super("wss://ws-subscriptions-clob.polymarket.com/ws/market", { agent });
  87. }
  88. subscribeToTokensIds(assetIds) {
  89. this.#assetIds = [...new Set([...this.#assetIds, ...assetIds])];
  90. if (this.wsClient?.readyState === 1) {
  91. this.send({
  92. operation: "subscribe",
  93. assets_ids: assetIds,
  94. });
  95. }
  96. }
  97. unsubscribeToTokensIds(assetIds) {
  98. const assetIdsSet = new Set(assetIds);
  99. this.#assetIds = this.#assetIds.filter(id => !assetIdsSet.has(id));
  100. if (this.wsClient?.readyState === 1) {
  101. this.send({
  102. operation: "unsubscribe",
  103. assets_ids: assetIds,
  104. });
  105. }
  106. }
  107. }