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 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
- log(`${colors.yellow}\u26A0 tunnel_id \uCD94\uCD9C \uC2E4\uD328 (${tunnelUrl}) \u2014 endpoint \uC790\uB3D9 \uB4F1\uB85D skip${colors.reset}`);
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
- "Authorization": `Bearer ${secretKey}`
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
- log(`${colors.yellow}\u26A0 "${label}" \uB77C\uBCA8\uC774 \uC774\uBBF8 \uB4F1\uB85D\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4.${colors.reset} \uC0C8 tunnel_id \uB85C \uAC31\uC2E0\uD558\uB824\uBA74 \uCF58\uC194\uC5D0\uC11C \uC218\uB3D9 PATCH.`);
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
- log(`${colors.yellow}\u26A0 endpoint \uB4F1\uB85D \uC2E4\uD328 (status ${res.status}): ${text}${colors.reset}`);
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
- log(`${colors.yellow}\u26A0 endpoint \uB4F1\uB85D \uC911 \uC5D0\uB7EC: ${err instanceof Error ? err.message : err}${colors.reset}`);
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
- void registerEndpointBinding(
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.0",
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": "./dist/cli.js",
25
- "connectbase-client": "./dist/cli.js"
24
+ "connectbase": "dist/cli.js",
25
+ "connectbase-client": "dist/cli.js"
26
26
  },
27
27
  "exports": {
28
28
  ".": {