connectbase-client 5.12.5 → 5.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,59 @@
3
3
  본 SDK 의 모든 주요 변경사항을 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/) 형식으로 기록합니다.
4
4
  버전은 [Semantic Versioning](https://semver.org/lang/ko/) 을 따릅니다.
5
5
 
6
+ ## [5.13.0] - 2026-08-13
7
+
8
+ ### Added — 패키징 앱 네이티브 브릿지: OAuth 인앱 브라우저 로그인 + 데스크톱 창 제어/CPU/클립보드 `has` 노출
9
+
10
+ React Native 셸(`App.tsx.tmpl`)은 `window.NativeBridge.oauth`(네이티브 인앱 브라우저 세션 OAuth,
11
+ `WebBrowser.openAuthSessionAsync` 기반)를 이미 구현하고 있었지만 SDK 가 전혀 노출하지 않아
12
+ 완전히 죽은 기능이었습니다. `cb.native.oauth.signIn(authUrl, callbackScheme?)` /
13
+ `cb.native.oauth.getCallbackScheme()` 로 신규 노출했습니다 (모바일 전용, 웹/데스크톱은 null).
14
+
15
+ Electron 프리로드(`preload.js.tmpl`)도 창 크기/위치 제어(`setSize`/`getSize`/`setPosition`/
16
+ `getPosition`/`center`/`setAlwaysOnTop`/`isFullScreen`), `system.getCPU`, `clipboard.has` 를
17
+ 이미 구현하고 있었는데 `NativeAPI` 편의 래퍼가 없어 `cb.native.bridge.*` 원시 접근으로만 쓸 수
18
+ 있었습니다. `cb.native.window.*`/`cb.native.system.getCPU()`/`cb.native.clipboard.has()` 로
19
+ 정식 노출했습니다.
20
+
21
+ ### Fixed — 패키징 앱에서 취소/실패가 "정상적인 빈 값"이 아니라 처리되지 않은 예외로 튀던 문제
22
+
23
+ React Native 브릿지는 실패(취소 포함) 시 프라미스를 reject 하고, Electron 브릿지는 항상
24
+ `{success: false, error}` 로 resolve 합니다. `camera.takePicture`/`pickImage`,
25
+ `push.getToken`/`scheduleLocal`/`setBadgeCount`, `shell.openExternal`(모바일),
26
+ `admob.showInterstitial`/`showRewarded`, `filesystem.readFile`/`saveFile`,
27
+ `notification.requestPermission`, `secureStore.setItem`/`getItem`/`deleteItem`(Expo
28
+ SecureStore 는 값이 2048바이트를 넘으면 실제로 throw 함), `biometric.isAvailable`/
29
+ `authenticate` 이 이 비대칭을 그대로 흘려보내, RN 패키징 앱에서는
30
+ "사용자가 사진 촬영을 취소함"·"광고가 로드되지 않음" 같은 정상적인 경우에도 `try/catch`
31
+ 없는 호출부가 처리되지 않은 예외로 죽었습니다(문서화된 반환 타입은 `null`/`false` 인데 실제로는
32
+ throw). 각 메서드에서 브릿지 호출을 감싸 두 플랫폼 모두 문서화된 반환 계약대로 동작하도록
33
+ 정규화했습니다.
34
+
35
+ ## [5.12.6] - 2026-08-09
36
+
37
+ ### Fixed — `VoiceChannel` 타입에 실재하지 않는 `webrtc_room_id` 필드가 있어 `cb.webrtc.connect()` 체이닝이 항상 실패하던 문제
38
+
39
+ 문서와 SDK 타입이 `cb.game.joinVoiceChannel()`의 응답에 `id`/`name`/`type`/`members`/
40
+ `webrtc_room_id` 등의 필드가 있는 것처럼 기술하고 있었지만, game-server의 실제 라이브
41
+ 핸들러(Push-To-Talk 기반 `Handler.JoinRoom`)는 `{ room_id, player_id, status }` 만
42
+ 반환합니다. 예전에 이 필드들을 채워주던 `VoiceChatManager`/`CreateWebRTCRoom` 코드는
43
+ 실제로는 어떤 라우트에도 연결돼 있지 않은 죽은 코드였습니다.
44
+
45
+ 문서를 그대로 따라 `cb.webrtc.connect({ roomId: voiceChannel.webrtc_room_id, ... })`처럼
46
+ 체이닝하면 `webrtc_room_id`가 항상 `undefined`라 시그널링 `join` 메시지의 `room_id`가
47
+ 누락되고, 서버가 매번 `"room_id is required"`로 거부해 음성/화상 연결이 끝까지 완료되지
48
+ 못했습니다.
49
+
50
+ `VoiceChannel` 타입을 실제 서버 응답(`{ room_id, player_id, status }`)에 맞게 수정했습니다.
51
+ 근본적으로, game-server의 음성 채널(Push-To-Talk)과 `cb.webrtc.connect()`(webrtc-server
52
+ SDP/ICE 시그널링)는 애초에 서로 무관한 별개 기능입니다 — 실시간 음성 채널 오디오는
53
+ `cb.webrtc.connect()`가 아니라 전용 WebSocket(`GET /v1/game/:appID/voice/ws?player_id=&
54
+ room_id=`)으로 전송됩니다. 문서(`14-sdk-game.md`, `docs/game-server/QUICKSTART.md`)도
55
+ 이 경계를 명확히 하도록 갱신했습니다.
56
+
57
+ 플랫폼 이슈 `019fe5bb` 제보.
58
+
6
59
  ## [5.12.5] - 2026-08-09
7
60
 
8
61
  ### Fixed — `cb.webrtc`의 REST 메서드 4개가 전부 core 서버로 가서 404였던 문제