IonoFlux Node.js SDK
IonoFlux API의 공식 JavaScript·TypeScript 클라이언트입니다. Node.js 서버·CLI·워커에서 우주기상, TEC/MUF 지도, HF 전파 예측, 실측 수신 보고를 조회하세요. 런타임 의존성은 없습니다.
npm install ionoflux1. Server 키 만들기
계정 페이지에서 로그인한 뒤 Server API 키를 만드세요. 이 SDK는 Node.js 전용입니다. 키는 백엔드에만 보관하고 브라우저·React 클라이언트 번들, HTML, 로그, 소스 저장소에 넣지 마세요.
Server 키 발급에는 서비스 URL이 필요합니다. 기존 서비스 정책에 맞는 URL을 사용하세요. SDK는 키를 발급하거나 이 요구를 우회하지 않습니다.
export IONOFLUX_API_KEY='your-server-key'2. 빠른 시작
import { Client } from 'ionoflux';
const client = new Client();
try {
const current = await client.spaceWeather.current();
console.log(current.data);
console.log(current.rateLimit.remaining);
} finally {
client.close();
}new Client()는 IONOFLUX_API_KEY에서 키를 읽고 apiKey 옵션이 이를 우선합니다. ESM 예제는 .mjs 파일이나 type: module 패키지에서 실행하세요. 시각은 유효한 Date 또는 Z/시간대 오프셋이 있는 ISO 문자열을 받아 UTC로 보냅니다. sources()와 data.status()는 키 없이 호출하며 설정된 키도 보내지 않습니다.
import { Client, RateLimitError } from 'ionoflux';
const client = new Client({ timeoutMs: 10000, maxRetries: 1 });
try {
const series = await client.solar.flux({
start: '2026-10-01T00:00:00Z',
end: '2026-10-02T00:00:00Z',
interval: '1h', limit: 100,
});
console.log(series.data.unit, series.data.attribution);
} catch (error) {
if (error instanceof RateLimitError) {
console.log(error.retryAfter, error.rateLimit.resetSeconds);
} else {
throw error;
}
} finally {
client.close();
}CommonJS도 지원합니다. 아래 require로 불러온 뒤 async 함수 안에서 동일한 Promise 메서드를 호출하세요. TypeScript 타입 선언도 포함되어 있습니다.
const { Client } = require('ionoflux');지원 호출
모든 Promise는 data(원본 JSON 필드), rawBody(바이트), statusCode, 안전한 headers, rateLimit을 가진 APIResponse를 반환합니다. 입력 옵션은 camelCase, 반환 JSON 필드 이름은 원래 형식입니다. 시계열은 start, end, interval, limit 옵션을 공통으로 씁니다.
client.spaceWeather.current() | 현재 지표와 데이터 신선도 |
client.solar.flux(...) | 태양 플럭스 지수(SFI) |
client.solar.sunspots(...) | 흑점 수(출처 swpc 또는 silso) |
client.solar.xray(...) | 태양 X선 플럭스(long 또는 short 대역) |
client.solar.wind(...) | 태양풍 속도·밀도·Bt·Bz |
client.geomagnetic.kp(...) | Kp 지수(출처 swpc 또는 gfz, 예보 포함 선택) |
client.geomagnetic.ap(...) | Ap 지수 |
client.statistics(metric, ...) | 기간별 지표 요약 통계 |
client.alerts.list(...) | 우주기상 경보(since, category, limit) |
client.alerts.scales() | NOAA R/S/G 등급과 전망 |
client.sources() | 공개 제공 기관 목록과 수집 신선도(키 불필요) |
client.data.status(dataset?) | 데이터셋 공개 현황(키 불필요) |
전리층·전파 예측·실측 수신 보고
0.1.3부터 지원하며 모두 Server 키가 필요합니다. 위치는 "lat,lon", Maidenhead 로케이터 또는 지명을 받습니다. 범위를 벗어난 인자는 요청 전에 RangeError를 발생시킵니다.
client.ionosphere.tec(...) | 총전자량(TEC) 지도 또는 한 지점 값(JSON·GeoJSON) |
client.ionosphere.muf(...) | 모델 기반 MUF·foF2 또는 이오노존데 관측소 실측 MUF |
client.ionosphere.stations(...) | 이오노존데 관측소와 최신 관측값 |
client.propagation.path({ from, to, frequency, ... }) | HF 교신 가능성·신뢰도·추천 주파수 |
client.propagation.forecast({ from, to, ... }) | 최대 72시간 시간별 경로 예보 |
client.propagation.conditions({ location, ... }) | 밴드별 OPEN/MARGINAL/CLOSED 상태(지역 또는 전 지구) |
client.observations.live(...) | 최근 몇 분간 수신된 경로(밴드·모드·출처·영역) |
client.observations.paths({ from, to, ... }) | 두 지역 사이 양방향 수신 보고 |
client.observations.bands({ location, ... }) | 지금 실제로 쓰이는 밴드(전 세계 또는 특정 지역) |
client.observations.callsign(callsign, ...) | 호출부호를 들은 국 또는 그 국이 들은 국 |
import { Client } from 'ionoflux';
const client = new Client();
try {
const muf = await client.ionosphere.muf({ lat: 37.57, lon: 126.98 });
console.log(muf.data.muf_mhz, muf.data.attribution);
const path = await client.propagation.path({
from: 'Seoul, South Korea', to: 'FN20', frequency: 14.074, mode: 'ft8',
});
console.log(path.data.prediction, path.data.model);
const heard = await client.observations.paths({
from: 'PM37', to: 'PM95', hours: 1, band: '20m',
});
console.log(heard.data.a_to_b);
} finally {
client.close();
}모델 TEC/MUF와 모든 전파 예측 결과는 NOAA GloTEC 지도 기반 모델 출력이고, 이오노존데 MUF와 관측소는 실측값입니다. 수신 보고는 그 순간의 한 방향 전파를 증명하지만, 보고가 없다고 밴드가 닫혔다는 뜻은 아닙니다. 각 응답의 attribution을 유지하세요. WSPRnet 데이터는 상업적으로 이용할 수 없습니다.
지원 범위와 제약
현재 Node.js 22+ 전용이며 브라우저/React 클라이언트, 지도 렌더링, 대량·과거 수신 보고 다운로드는 제공하지 않습니다. 다른 작업은 REST API를 이용하세요. SDK는 HTTPS만 사용하고 리다이렉트를 따르지 않습니다.
timeoutMs 기본값은 각 시도 전체(본문 수신 포함) 10000ms입니다. maxRetries는 기본 1회/최대 3회이며 일부 일시 네트워크 장애와 HTTP 502/503/504에만 적용됩니다. Retry-After 또는 잔여 한도 0이면 HTTP 재시도를 하지 않고, 429는 자동 재시도하지 않습니다. 재시도도 한도를 사용할 수 있습니다. close()는 진행 중 요청을 취소하지만 Node.js 공유 fetch 연결 풀은 종료하지 않습니다.
자세히: API 옵션과 제약 · 변경 기록 · 한국어 README
라이선스와 약관
SDK 코드는 PolyForm Noncommercial License 1.0.0를 따릅니다. 개인·취미 사용과 라이선스가 명시한 교육·연구 등 기관 사용을 포함한 비상업적 사용을 허용합니다. 그 범위를 벗어난 상업적 사용에는 별도 서면 라이선스가 필요하며, OSI 오픈소스 라이선스가 아닙니다.
SDK를 재배포할 때는 라이선스 조항과 NOTICE의 Required Notice를 유지하세요:
Required Notice: IonoFlux (https://ionoflux.runvia.app)SDK 라이선스는 코드에만 적용됩니다. API 이용, API 결과의 출처 표기, 원 제공 기관의 데이터 라이선스는 별개이므로 각 응답의 source와 attribution을 유지해 주세요.