WV 플러그인 SDK 사용¶
사용자 데이터 검색, 거래 실행, 이벤트 처리 등을 지원하기 위해 WebView 플러그인(클라이언트)는 cTrader 애플리케이션(호스트)와 신뢰할 수 있는 통신을 설정해야 합니다. WebView 플러그인 SDK는 이러한 상호 작용을 cTrader와 원활하게 지원하며, 이 가이드는 클라이언트와 호스트 간의 통신 파이프라인을 설명합니다.
SDK 설치 ¶
WebView 플러그인 SDK는 npm 패키지로 제공됩니다. SDK를 설치하려면 터미널 창에서 프로젝트 디렉토리로 이동한 후 다음 명령을 실행하세요:
npm install @spotware-web-team/sdk
클라이언트-호스트 동기화 ¶
참고
관련 프로토콜은 참조용 메시지로 제공됩니다.
메시지를 교환하기 전에 통신 채널이 설정되어야 합니다. 일반적인 작업은 다음과 같습니다:
-
통신이 시작될 때, 클라이언트와 호스트 모두 이벤트를 전송하는 alive 이벤트 교환이 발생합니다.
-
호스트는 등록 이벤트를 전송합니다 (
payloadType = 2000). 예시:window.dispatchEvent(new MessageEvent('message-from-host', { data: {"clientMsgId": "152cf2d4-bfb6-4426-a303-9243b6a0daf4", "payload": {}, "payloadType": 2000} })) -
WebView 플러그인은 확인 이벤트를 전송합니다 (
payloadType = 2001). 예시:window.dispatchEvent(new MessageEvent('message-to-host', { data: {"clientMsgId": "152cf2d4-bfb6-4426-a303-9243b6a0daf4", "payload": {}, "payloadType": 2001} })) -
각 새로운 확인 이벤트에 대해, 플러그인이 재초기화되더라도 동기화를 보장하기 위해 새로운 등록 이벤트가 전송됩니다.
참고
어느 한쪽이 해당 alive 이벤트를 수신하지 못하면, 플러그인은 마운트되지 않습니다. 루프를 방지하기 위해, 플러그인은 확인 이벤트를 한 번만 전송하고 메시지 흐름을 추적해야 합니다.
경고
여러 확인 이벤트를 전송하면 반복된 등록 이벤트가 발생하여 의도하지 않은 루프가 발생할 수 있습니다.
요청 ¶
동기화가 완료되면, 플러그인은 호스트와 내부적으로 통신하는 SDK 메서드를 호출하여 cTrader 서비스와 상호작용할 수 있습니다.
-
플러그인은 SDK 메서드를 호출합니다. 예를 들어, 사용자의 계정 정보를 요청할 수 있습니다.
-
WebView 플러그인은 요청을 전송합니다. 예시:
{ "payloadType": 2100, "payload": { "payloadType": 175, "clientMsgId": "asd1-asd1" }, "clientMsgId": "asd2-asd2" }내부적으로, 두 개의
clientMsgId필드(내부 및 외부)를 설정합니다:- 내부 필드는 페이로드 내의 특정 요청을 식별하며, cTrader가 해당 요청을 그에 해당하는 응답 및 관련 이벤트와 매칭하는 데 사용됩니다.
- 외부 필드(내부 필드와 함께 사용될 때)는 클라이언트와 호스트 간의 전체 메시지 흐름을 추적합니다.
-
호스트는 요청을 수신합니다:
window.addEventListener('message-to-host', function (event) {})
참고
모든 SDK 메서드는 요청을 보내고 응답을 받는 데 참조로 사용할 수 있으며, 서버 메시지로 제공됩니다. 요청 및 응답 내의 반복 필드에 대한 세부 정보는 모델로 제공됩니다.
응답 ¶
-
호스트는 응답을 전달합니다:
window.dispatchEvent(new MessageEvent('message-from-host', { data }))각 응답에는 요청과 연결하기 위해 원래의
clientMsgId가 포함됩니다. 응답은 다음 구조를 기반으로 합니다:payloadType: 2101 clientMsgId: "<same-id-as-request>"실시간 또는 다중 응답은 새로운 이벤트를 생성하기 위해 사용됩니다:
payloadType: 2102 clientMsgId: "<same-id-as-request>" -
클라이언트는 응답을 수신합니다:
window.addEventListener('message-from-host', function (event) {})
이벤트 및 구독 ¶
WebView 플러그인은 시세, 거래 업데이트, 실행 이벤트 등과 같은 실시간 데이터를 구독할 수 있습니다.
-
시세 데이터를 구독하기 위해 요청을 보냅니다:
{ "payloadType": 2100, // indicates a request "payload": { "payloadType": 601, "symbolId": ["EURUSD_ID"], "clientMsgId": "quote-sub-123" }, "clientMsgId": "asd2-asd2" // outer message ID } -
구독은 호스트가 주기적으로 응답을 보내도록 트리거합니다:
{ "payloadType": 2102, // indicates an event "payload": { "payloadType": 3, // mapped to QUOTE_EVENT "payload": { "ask": 85274, "bid": 85271, "depth": [], "high": 85340, "low": 84932, "sessionClose": 85133, "symbolId": 9, "tickbar": [], "timestamp": 1750162811236, "trendbar": [] }, "clientMsgId": "asd1-asd1" // inner message ID }, "clientMsgId": "asd2-asd2" // outer message ID }
딥링크 ¶
플러그인은 cTrader에게 딥링크 (내부 URL)를 열도록 요청할 수 있습니다. 이 요청을 보내면 됩니다:
payloadType: 2103
clientMsgId: "<client-msg-id>"
플러그인은 그런 다음 응답을 기다립니다:
payloadType: 2104
clientMsgId: "<same-id-as-request>"
WebView 플러그인은 아래와 같이 지원되는 딥링크를 구현할 수 있습니다:
// Open EURUSD symbol overview
const openEURUSDInfo = useCallback(() => {
const url = baseUrl ? ${baseUrl}symbols/EURUSD/info : 'symbols/EURUSD/info';
openUrl(url);
}, [baseUrl, openUrl]);
메시지 요약 ¶
아래 표는 프로토콜 메시지를 요약합니다.
| 유형 | 페이로드 유형 | 시작 | 사용 사례 |
|---|---|---|---|
| 라이프사이클/핸드셰이크 | 2000 (등록 이벤트),2001 (확인 이벤트) | 플러그인 통신을 초기화하기 위해 필요합니다. 호스트가 등록 이벤트를 보내면, 플러그인이 확인 이벤트로 응답합니다. | 채널 설정, 마운팅, 통신 준비 상태. |
| 이벤트 (단방향) | 2102 | 서버 시작. 클라이언트 요청 없이 보내는 이벤트. 호스트가 하나의 clientMsgId를 생성하며, cTrader 백엔드가 다른 하나를 포함합니다. | 시장 시세, 거래 실행 업데이트, 가격 알림. |
| 내부 탐색 요청 | 2103 (OpenInternalUrlReq), 2104 (OpenInternalUrlRes) | 플러그인 시작 요청으로 cTrader 앱 내에서 탐색합니다. 호스트가 처리하고 짝을 이루는 응답으로 확인합니다. | 심벌의 개요 열기, 심벌에 대한 주문 화면 열기. |
| 요청/응답 | 2100 (req), 2101 (res) | 플러그인에 의해 시작됨. 단일 응답 작업에 사용됨. 내부 및 외부 clientMsgId가 응답에서 재사용됨. | 계정, 심볼 또는 거래 정보 가져오기. |
| 요청/다중 이벤트 | 2100 (요청), 그 후 여러 2102 (이벤트) | 하나의 요청이 관련 이벤트 스트림을 트리거함. 이벤트는 원래의 clientMsgId (내부)를 재사용하며, 새로운 이벤트 ID는 호스트에 의해 생성됨. | 주문하기, 명령 후 업데이트 구독하기. |
| 오류 응답 | 2500 (PublicErrorRes) | 호스트 또는 cTrader가 요청 처리 실패를 보고하기 위해 사용함. 외부 및 내부 clientMsgId를 포함함. | 잘못된 페이로드, 무단 액세스, 잘못된 SDK 요청. |
오류 처리 ¶
경고
오류의 일반적인 이유에는 알려지지 않거나 등록되지 않은 플러그인, 잘못된 요청 형식 및 서버 측 유효성 검사 실패가 포함됨.
문제가 발생하면 호스트는 구조화된 오류 응답을 발행함:
payloadType: 2500
clientMsgId: <original-id>
{
"payloadType": 2500,
"clientMsgId": "<original-id>",
"error": "InvalidPayload"
}
SDK가 오류를 처리하고 플러그인 생성자에게 표시함.