{"version":3,"file":"index.cjs","sources":["../src/interfaces/crawl.interface.ts","../src/lib/utils.ts","../src/lib/concurrency.ts","../src/lib/axios.ts","../src/lib/get-list-item.ts","../src/lib/get-detail-item.ts","../src/index.ts"],"sourcesContent":["// import type { IGetDetailResult } from \"./get-detail.interface\";\n\nexport enum ERarity{\n    N = 'N',\n    R = 'R',\n    SR = 'SR',\n    SSR = 'SSR'\n\n}\nexport interface ICrawlOptions{\n    fromPage?: number;\n    maxPage?: number;\n    minPrice?: number;\n    maxPrice?: number;\n    baseLevel?: number;\n    minPower?:number;\n    rarity?: ERarity; \n    sleep?: number;\n  }\n\n  export type CrawlerCallback = (foundedItem: any[]) => void\n\n  export interface IInfoList {\n    total: number;\n    pageSize: number;\n    currentPage: number;\n    more: boolean;\n  }\n","import { ERarity } from \"../interfaces/crawl.interface\"\n\nexport const getRarity = (rarity: ERarity | undefined): number => {\n    switch (rarity) {\n        case ERarity.N:\n            return 13\n        case ERarity.R:\n            return 23\n        case ERarity.SR:\n            return 24\n        case ERarity.SSR:\n            return 25\n        default:\n            return 13\n    }\n}\n\nexport const waitFor = (timeout: number) => new Promise((resolve) => {\n    setTimeout(() => {\n        resolve(true)\n    }, timeout);\n});\n\n\n\nexport const convertArrayToObject = (array: any[], key: any) => {\n    const initialValue = {};\n    return array.reduce((obj, item) => {\n        return {\n            ...obj,\n            [item[key]]: item.value,\n        };\n    }, initialValue);\n};\n\n","import type { AxiosInstance } from \"axios\";\n\nexport const ConcurrencyManager = (axios: AxiosInstance, MAX_CONCURRENT = 10) => {\n    if (MAX_CONCURRENT < 1)\n      throw \"Concurrency Manager Error: minimun concurrent requests is 1\";\n    let instance = {\n      queue: [] as any[],\n      running: [],\n      shiftInitial: () => {\n        setTimeout(() => {\n          if (instance.running.length < MAX_CONCURRENT) {\n            instance.shift();\n          }\n        }, 0);\n      },\n      push: (reqHandler: any) => {\n        instance.queue.push(reqHandler);\n        instance.shiftInitial();\n      },\n      shift: () => {\n        if (instance.queue.length) {\n          const queued = instance.queue.shift();\n          queued.resolver(queued.request);\n          instance.running.push(queued as never);\n        }\n      },\n      // Use as interceptor. Queue outgoing requests\n      requestHandler: (req: any) => {\n        return new Promise(resolve => {\n          instance.push({ request: req, resolver: resolve });\n        });\n      },\n      // Use as interceptor. Execute queued request upon receiving a response\n      responseHandler: (res: any) => {\n        instance.running.shift();\n        instance.shift();\n        return res;\n      },\n      responseErrorHandler: (res: any) => {\n        return Promise.reject(instance.responseHandler(res));\n      },\n      interceptors: {\n        request: null,\n        response: null\n      },\n      detach: () => {\n        axios.interceptors.request.eject(instance.interceptors.request as any);\n        axios.interceptors.response.eject(instance.interceptors.response as any);\n      }\n    };\n    // queue concurrent requests\n    instance.interceptors.request = axios.interceptors.request.use(\n      instance.requestHandler\n    ) as any;\n    instance.interceptors.response = axios.interceptors.response.use(\n      instance.responseHandler,\n      instance.responseErrorHandler,\n    ) as any;\n    return instance;\n  };","import axios, { AxiosInstance } from 'axios';\nimport axiosRetry from 'axios-retry';\nimport { ConcurrencyManager } from './concurrency'\n\nconst instance = axios.create({\n    baseURL: 'https://proxy.hermesmarketcap.com/'\n}) as AxiosInstance;\n\nConcurrencyManager(instance, 5);\naxiosRetry(instance, {\n    retries: 3, retryDelay: (retryCount) => {\n        return retryCount * 500;\n    }\n});\n\nexport default instance","import qs from \"qs\"\nimport type { IGetListParams, IGetListResult } from \"../interfaces/get-list.interface\"\nimport axios from \"./axios\"\n\nconst getListItem = async (params: IGetListParams): Promise<IGetListResult> => {\n\n    const { data } = await axios.get('/nft-sales?' + qs.stringify(params))\n\n    const count = data.list?.length || 0\n\n    const result = {\n        has_next: count == params.pageSize,\n        count: count,\n        total: data.total || 0,\n        data: data.list || []\n    }\n\n    return result\n}\n\nexport default getListItem","import type { IGetDetailResult } from \"../interfaces/get-detail.interface\"\nimport axios from \"./axios\"\n\n\nconst getDetailItem = async (id: number): Promise<IGetDetailResult | undefined> => {\n\n    const { data } = await axios.get('/nft-sales/'+id)\n    \n    if(data.code != 200) return undefined\n  \n    return data.data \n  }\n\nexport default getDetailItem","import { Event } from 'typescript.events';\n\nimport type { ICrawlOptions, IInfoList } from './interfaces/crawl.interface';\nimport type { IFound, IGetDetailResult } from './interfaces/get-detail.interface';\nimport { ERarity } from './interfaces/crawl.interface';\nimport { convertArrayToObject, getRarity, waitFor } from './lib/utils';\n\nimport getListItem from './lib/get-list-item';\nimport getDetailItem from './lib/get-detail-item';\n\nclass MetamonCrawler extends Event {\n  options: any;\n  currentPage: any;\n  more: boolean;\n  isPause: boolean;\n  constructor(options: ICrawlOptions) {\n    const defaultOptions = {\n      maxPage: 0,\n      fromPage: 1,\n      minPrice: 0,\n      maxPrice: 999999999,\n      baseLevel: 10,\n      minPower: 315,\n      rarity: ERarity.N,\n      sleep: 5,\n    };\n    const finalOptions = {\n      ...defaultOptions,\n      ...options,\n    };\n\n    super();\n    this.isPause = false;\n    this.more = true;\n    this.options = finalOptions;\n    this.currentPage = finalOptions.fromPage;\n  }\n\n  public async start() {\n    this.isPause = false;\n    this.emit('status', 'Started');\n    do {\n      const params = {\n        pageNo: this.currentPage,\n        pageSize: 20,\n        sortBy: 'created_at',\n        order: 'desc',\n        category: getRarity(this.options.rarity),\n      };\n\n      const listItem = await getListItem(params);\n\n      this.more =\n        (this.currentPage + 1 <= this.options.maxPage ||\n          this.options.maxPage == 0) &&\n        listItem.has_next;\n\n      const initInfo: IInfoList = {\n        total: listItem.total,\n        pageSize: 20,\n        currentPage: this.currentPage,\n        more: this.more,\n      };\n\n      this.emit('init', initInfo);\n\n      const filteredItems = listItem.data.filter((item) => {\n        const totalPrice = item.fixed_price * item.count;\n        return (\n          totalPrice <= this.options.maxPrice &&\n          totalPrice >= this.options.minPrice\n        );\n      });\n\n      const items = (await Promise.allSettled(\n        await filteredItems.map((item) => getDetailItem(item.id)),\n      )) as any;\n\n      const fulfilledItems = items\n        .filter((item: any) => item.status === 'fulfilled')\n        .map((item: any) => item.value);\n\n      fulfilledItems.forEach((item: IGetDetailResult) => {\n        const properties = convertArrayToObject(item.properties, 'key');\n\n        if ((properties.Score >= this.options.minPower) && (properties.Level >= this.options.baseLevel)) {\n         \n          const itemEmit: IFound = {\n            ...item,\n            properties\n          }\n\n          this.emit('found', itemEmit);\n        }\n      });\n\n      this.currentPage = this.currentPage + 1;\n      if(!this.more){\n        this.emit('status', 'Done');\n      }\n      await waitFor(this.options.sleep * 1000);\n    } while (this.more && this.isPause == false);\n  }\n\n  public pause() {\n    this.emit('status', 'Paused');\n    this.isPause = true;\n  }\n\n  public stop() {\n    this.emit('status', 'Stopped');\n    this.isPause = true;\n    this.currentPage = this.options.fromPage;\n    this.more = true;\n  }\n}\n\n// const crawler = new MetamonCrawler({\n//   minPower: 325,\n//   sleep: 0\n//  })\n\n//  crawler.start()\n//  crawler.on('init', console.log)\n//  crawler.on('found', console.log)\n\nexport default MetamonCrawler;\nexport * from './interfaces/crawl.interface';\nexport * from './interfaces/get-detail.interface';\nexport * from './lib/utils';\nexport * from './lib/get-list-item';\nexport * from './lib/get-detail-item';\n"],"names":["ERarity","axios","axiosRetry","qs","Event"],"mappings":"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"}