/** * Rajvidya Astro API — thin JavaScript SDK (ESM, Node 18+ and browser fetch). * * Usage example: * import { RajvidyaClient, RajvidyaError } from './rajvidya.js'; * * const client = new RajvidyaClient('rv_prod_ABC_xyzxyzxyz'); * * // GET endpoint with parameters * try { * const kundli = await client.kundli('chart-123', 'en'); * console.log(`Credits charged: ${kundli.creditsCharged}`); * console.log(`Moon sign: ${kundli.data.moon_sign}`); * } catch (e) { * if (e instanceof RajvidyaError) { * console.error(`API error: ${e.message}`); * } * } * * // POST endpoint * const chart = await client.createChart({ * name: 'John Doe', * birth_date: '1990-05-15', * birth_time: '14:30:00', * birth_place: 'New York, USA', * latitude: 40.7128, * longitude: -74.0060, * }); * console.log(`Created chart: ${chart.data.id}`); */ export class RajvidyaError extends Error { constructor(statusCode, code, message) { super(`${code}: ${message}`); this.statusCode = statusCode; this.code = code; this.message = message; } } export class ApiResponse { constructor(statusCode, data, headers) { this.statusCode = statusCode; this.data = data; this.headers = headers; this.creditsCharged = headers.get?.('x-credits-charged'); this.creditsRemaining = headers.get?.('x-credits-remaining'); this.quotaResetAt = headers.get?.('x-quota-reset-at'); } } export class RajvidyaClient { constructor(apiKey, baseUrl = 'https://rajvidya.com') { this.apiKey = apiKey; this.baseUrl = baseUrl.replace(/\/$/, ''); } async _request(method, path, params = null, jsonBody = null) { let url = `${this.baseUrl}${path}`; if (params) { const query = Object.entries(params) .filter(([, v]) => v != null) .map(([k, v]) => `${k}=${encodeURIComponent(v)}`) .join('&'); if (query) url = `${url}?${query}`; } const headers = { 'X-API-Key': this.apiKey, 'User-Agent': 'rajvidya-javascript-sdk/1.0', }; const options = { method, headers }; if (jsonBody) { options.body = JSON.stringify(jsonBody); headers['Content-Type'] = 'application/json'; } let response; try { response = await fetch(url, options); } catch (e) { throw new RajvidyaError(0, 'network_error', `Network error: ${e.message}`); } let responseData; try { responseData = await response.json(); } catch { throw new RajvidyaError(response.status, 'parse_error', 'Failed to parse response'); } if (!response.ok) { const errorObj = responseData.error || {}; const code = errorObj.code || 'http_error'; const message = errorObj.message || response.statusText; throw new RajvidyaError(response.status, code, message); } return new ApiResponse(response.status, responseData, response.headers); } // Chart management createChart(data) { return this._request('POST', '/api/v1/charts/', null, data); } readChart(chartId) { return this._request('GET', '/api/v1/charts/', { chart_id: chartId }); } updateChart(chartId, updates) { return this._request('POST', '/api/v1/charts/', null, { chart_id: chartId, ...updates }); } // Kundli & birth chart kundli(chartId, lang = 'en') { return this._request('GET', '/api/v1/kundli/', { chart_id: chartId, lang }); } // Dasha dasha(chartId, lang = 'en') { return this._request('GET', '/api/v1/dasha/', { chart_id: chartId, lang }); } // Doshas doshas(chartId, lang = 'en') { return this._request('GET', '/api/v1/doshas/', { chart_id: chartId, lang }); } // Horoscope rashifal(chartId, lang = 'en') { return this._request('GET', '/api/v1/rashifal/', { chart_id: chartId, lang }); } todayHoroscope(chartId, lang = 'en') { return this._request('GET', '/api/v1/today/', { chart_id: chartId, lang }); } // Transits & live sky liveSky(latitude, longitude, lang = 'en') { return this._request('GET', '/api/v1/live-sky/', { latitude, longitude, lang }); } gochar(chartId, lang = 'en') { return this._request('GET', '/api/v1/gochar/', { chart_id: chartId, lang }); } // Panchang panchang(latitude, longitude, lang = 'en') { return this._request('GET', '/api/v1/panchang/', { latitude, longitude, lang }); } festivals(latitude, longitude, lang = 'en') { return this._request('GET', '/api/v1/festivals/', { latitude, longitude, lang }); } choghadiya(latitude, longitude, lang = 'en') { return this._request('GET', '/api/v1/choghadiya/', { latitude, longitude, lang }); } // Muhurta muhurtaMarriage(brideChartId, groomChartId, lang = 'en') { return this._request('GET', '/api/v1/muhurta/marriage/', { bride_chart_id: brideChartId, groom_chart_id: groomChartId, lang, }); } // Compatibility compatibility(chart1Id, chart2Id, lang = 'en') { return this._request('GET', '/api/v1/compatibility/', { chart1_id: chart1Id, chart2_id: chart2Id, lang, }); } matchingReport(brideChartId, groomChartId, lang = 'en') { return this._request('GET', '/api/v1/reports/matching/', { bride_chart_id: brideChartId, groom_chart_id: groomChartId, lang, }); } // Numerology numerologyDashboard(name, lang = 'en') { return this._request('GET', '/api/v1/numerology/dashboard/', { name, lang }); } numerologyPro(name, lang = 'en') { return this._request('GET', '/api/v1/numerology/pro/', { name, lang }); } babyNames(birthChartId, lang = 'en') { return this._request('GET', '/api/v1/baby-names/', { birth_chart_id: birthChartId, lang }); } // Biorhythm biorhythm(birthDate, lang = 'en') { return this._request('GET', '/api/v1/biorhythm/', { birth_date: birthDate, lang }); } // Remedies remediesPrescription(chartId, lang = 'en') { return this._request('GET', '/api/v1/remedies/prescription/', { chart_id: chartId, lang }); } // Vastu vastuAnalyze(floorPlanBase64, buildingType, orientationDegrees, lang = 'en') { return this._request('POST', '/api/v1/vastu/analyze/', null, { floor_plan_base64: floorPlanBase64, building_type: buildingType, orientation_degrees: orientationDegrees, lang, }); } vastuSurroundings(latitude, longitude, lang = 'en') { return this._request('GET', '/api/v1/vastu/surroundings/', { latitude, longitude, lang }); } vastuCatalog(lang = 'en') { return this._request('GET', '/api/v1/vastu/catalog/', { lang }); } }