UNPKG

node-iplocate

Version:

Find geolocation data from IP addresses (e.g. city, country, timezone) using the IPLocate.io API

1 lines 9.87 kB
{"version":3,"sources":["../../src/errors.ts","../../src/utils.ts","../../src/client.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/** Base class for all IPLocate API errors */\nexport class IPLocateError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'IPLocateError';\n }\n}\n\n/** Error thrown when an invalid IP address is provided */\nexport class InvalidIPError extends IPLocateError {\n constructor(ip: string) {\n super(`Invalid IP address: ${ip}`);\n this.name = 'InvalidIPError';\n }\n}\n\n/** Error thrown when API authentication fails */\nexport class AuthenticationError extends IPLocateError {\n constructor(message = 'Invalid API key') {\n super(message);\n this.name = 'AuthenticationError';\n }\n}\n\n/** Error thrown when IP address is not found */\nexport class NotFoundError extends IPLocateError {\n constructor(message = 'IP address not found') {\n super(message);\n this.name = 'NotFoundError';\n }\n}\n\n/** Error thrown when rate limit is exceeded */\nexport class RateLimitError extends IPLocateError {\n constructor(message = 'Rate limit exceeded. Upgrade your plan at https://iplocate.io/account') {\n super(message);\n this.name = 'RateLimitError';\n }\n}\n\n/** Error thrown for general API errors */\nexport class APIError extends IPLocateError {\n public readonly statusCode: number;\n\n constructor(message: string, statusCode: number) {\n super(message);\n this.name = 'APIError';\n this.statusCode = statusCode;\n }\n}\n","/**\n * Creates a URL-safe path component from an IP address\n * @param ip The IP address to encode\n * @returns URL-encoded IP address\n */\nexport function encodeIP(ip: string): string {\n return encodeURIComponent(ip);\n}\n","import {\n APIError,\n AuthenticationError,\n IPLocateError,\n InvalidIPError,\n NotFoundError,\n RateLimitError,\n} from './errors.js';\nimport type { APIErrorResponse, IPLocateOptions, LookupResponse } from './types.js';\nimport { encodeIP } from './utils.js';\nimport { isValidIp } from 'ip-utils';\n\nconst DEFAULT_BASE_URL = 'https://iplocate.io/api';\nconst DEFAULT_TIMEOUT = 5000;\n\n/**\n * IPLocate API client for geolocation and threat intelligence data\n */\nexport default class IPLocate {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly httpClientOptions: RequestInit;\n\n /**\n * Create a new IPLocate client\n * @param apiKey Your IPLocate API key\n * @param options Configuration options\n */\n constructor(apiKey: string, options: IPLocateOptions = {}) {\n if (!apiKey || typeof apiKey !== 'string') {\n throw new IPLocateError('API key is required');\n }\n\n this.apiKey = apiKey;\n this.baseUrl = options.baseUrl?.replace(/\\/$/, '') || DEFAULT_BASE_URL;\n this.timeout = options.timeout || DEFAULT_TIMEOUT;\n this.httpClientOptions = options.httpClientOptions || {};\n }\n\n /**\n * Look up geolocation and threat intelligence data for an IP address\n * @param ip The IP address to look up\n * @returns Promise resolving to lookup response\n */\n async lookup(ip: string): Promise<LookupResponse> {\n if (!isValidIp(ip)) {\n throw new InvalidIPError(ip);\n }\n const endpoint = `${this.baseUrl}/lookup/${encodeIP(ip)}`;\n return this.makeRequest(endpoint);\n }\n\n /**\n * Look up geolocation and threat intelligence data for the client's current IP address\n * @returns Promise resolving to lookup response\n */\n async lookupSelf(): Promise<LookupResponse> {\n const endpoint = `${this.baseUrl}/lookup/`;\n return this.makeRequest(endpoint);\n }\n\n /**\n * Make HTTP request to the IPLocate API\n * @param endpoint The API endpoint URL\n * @returns Promise resolving to lookup response\n */\n private async makeRequest(endpoint: string): Promise<LookupResponse> {\n const url = new URL(endpoint);\n url.searchParams.set('apikey', this.apiKey);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url.toString(), {\n method: 'GET',\n ...this.httpClientOptions,\n headers: {\n 'Accept': 'application/json',\n 'User-Agent': 'node-iplocate/2.0.1',\n ...this.httpClientOptions.headers,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // Handle different HTTP status codes\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n const data = await response.json() as LookupResponse;\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof IPLocateError) {\n throw error;\n }\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new IPLocateError(`Request timeout after ${this.timeout}ms`);\n }\n throw new IPLocateError(`Request failed: ${error.message}`);\n }\n\n throw new IPLocateError('Unknown error occurred');\n }\n }\n\n /**\n * Handle error responses from the API\n * @param response The fetch response object\n */\n private async handleErrorResponse(response: Response): Promise<never> {\n let errorMessage = `HTTP ${response.status}: ${response.statusText}`;\n\n try {\n const errorData = await response.json() as APIErrorResponse;\n if (errorData.error) {\n errorMessage = errorData.error;\n }\n } catch {\n // Ignore JSON parsing errors, use default message\n }\n\n switch (response.status) {\n case 400:\n throw new InvalidIPError(errorMessage);\n case 403:\n throw new AuthenticationError(errorMessage);\n case 404:\n throw new NotFoundError(errorMessage);\n case 429:\n throw new RateLimitError(errorMessage);\n default:\n throw new APIError(errorMessage, response.status);\n }\n }\n}\n"]}