connectbase-client 3.5.0 → 3.5.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 +18 -0
- package/dist/cli.js +13 -8
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,24 @@
|
|
|
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
|
+
## [3.5.1] - 2026-05-01
|
|
7
|
+
|
|
8
|
+
### Fixed — `connectbase tunnel --label` endpoint 자동 등록 401
|
|
9
|
+
|
|
10
|
+
`--label` 옵션 사용 시 호출되는 `POST /v1/apps/:appID/endpoints/cli` 가 모든 요청에서
|
|
11
|
+
401 ("유효하지 않은 토큰입니다") 으로 떨어져 endpoint binding 이 한 번도 등록되지
|
|
12
|
+
않던 문제를 수정했습니다. 결과적으로 `cb.endpoint.call("label", ...)` 가 항상
|
|
13
|
+
`endpoint not found` (404) 로 실패했습니다.
|
|
14
|
+
|
|
15
|
+
- CLI 가 `Authorization: Bearer cb_sk_*` 로 호출하던 것을 서버 dual-auth 미들웨어가
|
|
16
|
+
요구하는 **`X-Public-Key: cb_sk_*`** 헤더로 변경.
|
|
17
|
+
- `void registerEndpointBinding(...)` 의 fire-and-forget 호출을 `await` 로 변경 —
|
|
18
|
+
성공/실패 메시지가 "Ctrl+C 로 종료" 안내 앞에 출력됨.
|
|
19
|
+
- 등록 실패 / 네트워크 오류는 stdout 이 아닌 **stderr** (빨간색 ✗) 로 출력 —
|
|
20
|
+
파이프/리다이렉트 환경에서도 사용자가 실패를 인지할 수 있도록.
|
|
21
|
+
|
|
22
|
+
회귀 영향 범위: `--label` 사용자만 해당 (기본 `connectbase tunnel <port>` 는 영향 없음).
|
|
23
|
+
|
|
6
24
|
## [3.5.0] - 2026-04-30
|
|
7
25
|
|
|
8
26
|
### Added — Knowledge Base 사용자별 격리
|
package/dist/cli.js
CHANGED
|
@@ -1571,7 +1571,7 @@ async function registerEndpointBinding(baseUrl, appId, secretKey, tunnelUrl, lab
|
|
|
1571
1571
|
const host = u.hostname;
|
|
1572
1572
|
const tunnelId = host.replace(/\.tunnel\.connectbase\.world$/, "");
|
|
1573
1573
|
if (!tunnelId || tunnelId === host) {
|
|
1574
|
-
|
|
1574
|
+
error(`tunnel_id \uCD94\uCD9C \uC2E4\uD328 (${tunnelUrl}) \u2014 endpoint "${label}" \uC790\uB3D9 \uB4F1\uB85D skip`);
|
|
1575
1575
|
return;
|
|
1576
1576
|
}
|
|
1577
1577
|
const apiBase = baseUrl.replace(/\/+$/, "");
|
|
@@ -1579,7 +1579,7 @@ async function registerEndpointBinding(baseUrl, appId, secretKey, tunnelUrl, lab
|
|
|
1579
1579
|
method: "POST",
|
|
1580
1580
|
headers: {
|
|
1581
1581
|
"Content-Type": "application/json",
|
|
1582
|
-
"
|
|
1582
|
+
"X-Public-Key": secretKey
|
|
1583
1583
|
},
|
|
1584
1584
|
body: JSON.stringify({
|
|
1585
1585
|
label,
|
|
@@ -1591,13 +1591,16 @@ async function registerEndpointBinding(baseUrl, appId, secretKey, tunnelUrl, lab
|
|
|
1591
1591
|
success(`Endpoint "${label}" \uC790\uB3D9 \uB4F1\uB85D \uC644\uB8CC`);
|
|
1592
1592
|
log(`${colors.green}\u2192${colors.reset} SDK: ${colors.cyan}cb.endpoint.call("${label}", { path: "/...", method: "POST", body: ... })${colors.reset}`);
|
|
1593
1593
|
} else if (res.status === 409) {
|
|
1594
|
-
|
|
1594
|
+
warn(`"${label}" \uB77C\uBCA8\uC774 \uC774\uBBF8 \uB4F1\uB85D\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. \uC0C8 tunnel_id \uB85C \uAC31\uC2E0\uD558\uB824\uBA74 \uCF58\uC194\uC5D0\uC11C \uC218\uB3D9 PATCH.`);
|
|
1595
1595
|
} else {
|
|
1596
1596
|
const text = await res.text().catch(() => "");
|
|
1597
|
-
|
|
1597
|
+
error(`Endpoint "${label}" \uC790\uB3D9 \uB4F1\uB85D \uC2E4\uD328 (status ${res.status}): ${text || "(\uBE48 \uC751\uB2F5)"}`);
|
|
1598
|
+
if (res.status === 401) {
|
|
1599
|
+
info("cb_sk_ Secret Key \uC778\uC9C0, \uCF58\uC194\uC5D0\uC11C \uD68C\uC218\uB418\uC9C0 \uC54A\uC558\uB294\uC9C0 \uD655\uC778\uD558\uC138\uC694.");
|
|
1600
|
+
}
|
|
1598
1601
|
}
|
|
1599
1602
|
} catch (err) {
|
|
1600
|
-
|
|
1603
|
+
error(`Endpoint "${label}" \uC790\uB3D9 \uB4F1\uB85D \uC911 \uB124\uD2B8\uC6CC\uD06C \uC624\uB958: ${err instanceof Error ? err.message : err}`);
|
|
1601
1604
|
}
|
|
1602
1605
|
}
|
|
1603
1606
|
function acquireTunnelLock2(appID, port, force) {
|
|
@@ -1736,7 +1739,9 @@ ${colors.cyan}ConnectBase Tunnel${colors.reset}`);
|
|
|
1736
1739
|
onMessage: (data) => {
|
|
1737
1740
|
try {
|
|
1738
1741
|
const msg = JSON.parse(data);
|
|
1739
|
-
handleMessage(msg, sock, port)
|
|
1742
|
+
handleMessage(msg, sock, port).catch((e) => {
|
|
1743
|
+
error(`\uBA54\uC2DC\uC9C0 \uCC98\uB9AC \uC911 \uC608\uC678: ${e instanceof Error ? e.message : e}`);
|
|
1744
|
+
});
|
|
1740
1745
|
} catch (e) {
|
|
1741
1746
|
warn(`\uBA54\uC2DC\uC9C0 \uD30C\uC2F1 \uC2E4\uD328: ${e}`);
|
|
1742
1747
|
}
|
|
@@ -1804,7 +1809,7 @@ ${colors.cyan}ConnectBase Tunnel${colors.reset}`);
|
|
|
1804
1809
|
info(`${(delay / 1e3).toFixed(0)}\uCD08 \uD6C4 \uC7AC\uC5F0\uACB0 \uC2DC\uB3C4... (${reconnectAttempts}/${maxReconnectAttempts})`);
|
|
1805
1810
|
setTimeout(connect, delay);
|
|
1806
1811
|
}
|
|
1807
|
-
function handleMessage(msg, sock, localPort) {
|
|
1812
|
+
async function handleMessage(msg, sock, localPort) {
|
|
1808
1813
|
switch (msg.type) {
|
|
1809
1814
|
case "tunnel_ready": {
|
|
1810
1815
|
const proxyToken = typeof msg.proxy_token === "string" ? msg.proxy_token : "";
|
|
@@ -1832,7 +1837,7 @@ ${colors.dim}\uC678\uBD80 \uC9C1\uC811 \uD638\uCD9C \uC2DC \uB2E4\uC74C \uD5E4\u
|
|
|
1832
1837
|
log(`${colors.dim} $ curl "${tunnelUrl}/?proxy_token=${proxyToken}"${colors.reset}`);
|
|
1833
1838
|
}
|
|
1834
1839
|
if (tunnelOpts?.label && tunnelUrl) {
|
|
1835
|
-
|
|
1840
|
+
await registerEndpointBinding(
|
|
1836
1841
|
config.baseUrl,
|
|
1837
1842
|
appId,
|
|
1838
1843
|
tunnelKey,
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "connectbase-client",
|
|
3
|
-
"version": "3.5.
|
|
3
|
+
"version": "3.5.1",
|
|
4
4
|
"description": "Connect Base JavaScript/TypeScript SDK for browser and Node.js",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
|
-
"url": "https://github.com/connectbase-world/connectbase.git",
|
|
7
|
+
"url": "git+https://github.com/connectbase-world/connectbase.git",
|
|
8
8
|
"directory": "frontend/package/public/connect-base-client"
|
|
9
9
|
},
|
|
10
10
|
"homepage": "https://github.com/connectbase-world/connectbase/tree/release/frontend/package/public/connect-base-client#readme",
|
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
"browser": "dist/connect-base.umd.js",
|
|
22
22
|
"unpkg": "dist/connect-base.umd.js",
|
|
23
23
|
"bin": {
|
|
24
|
-
"connectbase": "
|
|
25
|
-
"connectbase-client": "
|
|
24
|
+
"connectbase": "dist/cli.js",
|
|
25
|
+
"connectbase-client": "dist/cli.js"
|
|
26
26
|
},
|
|
27
27
|
"exports": {
|
|
28
28
|
".": {
|