connectbase-client 1.4.0 → 1.4.1
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 +14 -0
- package/dist/cli.js +16 -4
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,20 @@
|
|
|
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
|
+
## [1.4.1] - 2026-04-18
|
|
7
|
+
|
|
8
|
+
`connectbase tunnel` CLI 가 공개 URL 호출에 필요한 **proxy token** 을 표시하지 않아, 사용자가 토큰을 알 방법이 없어 모든 요청이 `401 invalid or missing proxy token` 으로 막히던 문제 해결.
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- **`tunnel_ready` 출력에 proxy token 노출**: 터널 활성화 시 서버가 내려보낸 세션 단위 토큰을 stdout 에 표시합니다 (`cli.ts` `handleMessage`). 이전에는 `tunnel_handler.go:300-308` 가 `proxy_token` 을 보내주지만 CLI 가 무시해서 사용자가 토큰을 확인할 경로가 사실상 없었습니다.
|
|
13
|
+
- **사용 예시 안내**: 공개 URL 호출 시 사용해야 하는 헤더(`X-Proxy-Token`)와 쿼리(`?proxy_token=`) 형식을 `curl` 예시로 함께 출력합니다. 백엔드 `proxy_handler.go:231-239` 가 검증하는 입력은 이 두 가지뿐이며 `Authorization`, `Cookie`, Basic Auth 는 받지 않습니다.
|
|
14
|
+
|
|
15
|
+
### Notes
|
|
16
|
+
|
|
17
|
+
- 토큰은 터널 세션 단위로 서버가 새로 생성합니다. 세션 종료(WebSocket disconnect) 시 즉시 무효화되므로 stdout 노출에 따른 추가 위험은 거의 없습니다.
|
|
18
|
+
- 백엔드 / 콘솔 / 문서 측 변경은 없습니다 — 클라이언트 표시만 보강.
|
|
19
|
+
|
|
6
20
|
## [1.4.0] - 2026-04-18
|
|
7
21
|
|
|
8
22
|
`FetchDataResponse` 타입을 실제 서버 wire 포맷에 맞추는 타입 정정.
|
package/dist/cli.js
CHANGED
|
@@ -1661,17 +1661,29 @@ ${colors.cyan}ConnectBase Tunnel${colors.reset}`);
|
|
|
1661
1661
|
}
|
|
1662
1662
|
function handleMessage(msg, sock, localPort) {
|
|
1663
1663
|
switch (msg.type) {
|
|
1664
|
-
case "tunnel_ready":
|
|
1664
|
+
case "tunnel_ready": {
|
|
1665
|
+
const proxyToken = typeof msg.proxy_token === "string" ? msg.proxy_token : "";
|
|
1666
|
+
const tunnelUrl = typeof msg.url === "string" ? msg.url : "";
|
|
1665
1667
|
success(`\uD130\uB110 \uD65C\uC131\uD654!`);
|
|
1666
|
-
log(`${colors.green}\u2192${colors.reset} URL:
|
|
1667
|
-
log(`${colors.green}\u2192${colors.reset} \uB85C\uCEEC:
|
|
1668
|
+
log(`${colors.green}\u2192${colors.reset} URL: ${colors.cyan}${tunnelUrl}${colors.reset}`);
|
|
1669
|
+
log(`${colors.green}\u2192${colors.reset} \uB85C\uCEEC: ${colors.cyan}http://localhost:${localPort}${colors.reset}`);
|
|
1670
|
+
if (proxyToken) {
|
|
1671
|
+
log(`${colors.green}\u2192${colors.reset} \uD1A0\uD070: ${colors.yellow}${proxyToken}${colors.reset}`);
|
|
1672
|
+
}
|
|
1668
1673
|
if (msg.timeout || msg.max_body) {
|
|
1669
|
-
log(`${colors.green}\u2192${colors.reset} \uC124\uC815:
|
|
1674
|
+
log(`${colors.green}\u2192${colors.reset} \uC124\uC815: timeout=${colors.cyan}${msg.timeout}s${colors.reset}, max-body=${colors.cyan}${msg.max_body}MB${colors.reset}`);
|
|
1675
|
+
}
|
|
1676
|
+
if (proxyToken && tunnelUrl) {
|
|
1677
|
+
log(`
|
|
1678
|
+
${colors.dim}\uACF5\uAC1C URL \uD638\uCD9C \uC2DC \uB2E4\uC74C \uD5E4\uB354 \uB610\uB294 \uCFFC\uB9AC\uB85C \uD1A0\uD070\uC744 \uC804\uB2EC\uD558\uC138\uC694:${colors.reset}`);
|
|
1679
|
+
log(`${colors.dim} $ curl -H "X-Proxy-Token: ${proxyToken}" ${tunnelUrl}/${colors.reset}`);
|
|
1680
|
+
log(`${colors.dim} $ curl "${tunnelUrl}/?proxy_token=${proxyToken}"${colors.reset}`);
|
|
1670
1681
|
}
|
|
1671
1682
|
log(`
|
|
1672
1683
|
${colors.dim}Ctrl+C\uB85C \uC885\uB8CC${colors.reset}
|
|
1673
1684
|
`);
|
|
1674
1685
|
break;
|
|
1686
|
+
}
|
|
1675
1687
|
case "http_request":
|
|
1676
1688
|
forwardRequest(msg, sock, localPort);
|
|
1677
1689
|
break;
|