connectbase-client 1.3.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 CHANGED
@@ -3,6 +3,44 @@
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
+
20
+ ## [1.4.0] - 2026-04-18
21
+
22
+ `FetchDataResponse` 타입을 실제 서버 wire 포맷에 맞추는 타입 정정.
23
+
24
+ ### Fixed
25
+
26
+ - **`FetchDataResponse` 필드명을 서버 응답에 맞춤**: `datas` → `data`, `total_size` → `total_count`.
27
+ - data-server 는 `/v1/public/tables/:tableID/data` (GET) 및 `/v1/public/tables/:tableID/data/query` (POST) 에서 실제로 `{ data: [...], total_count: N }` 를 반환합니다 (`internal_data_controller.go:598-604`, `845-848`). 따라서 이전 타입 정의(`datas` / `total_size`)를 기대한 구조분해는 런타임에 `undefined` 를 받고 있었습니다.
28
+ - `0.16.0` 에서 한 번 바로잡았다가 `0.16.1` 에서 "서버 wire 가 여전히 `datas`" 라는 잘못된 관찰로 롤백됐던 이슈를 다시 수정합니다. 서버 핸들러 (`gin.H{"data": ..., "total_count": ...}`) 를 직접 확인해 타입을 확정했습니다.
29
+
30
+ ### Breaking (types only, runtime unchanged)
31
+
32
+ - `FetchDataResponse` 의 필드명이 TypeScript 레벨에서 변경됩니다. 런타임 동작(실제 네트워크 응답)은 동일합니다. 기존에 타입 경고를 무시하고 `result.data` / `result.total_count` 로 접근하던 코드는 **수정 없이 바로 동작**합니다. 반대로 타입 정의를 믿고 `result.datas` / `result.total_size` 로 접근하던 코드는 원래부터 런타임에 `undefined` 를 받고 있었으므로, 이번 기회에 `result.data` / `result.total_count` 로 고쳐주세요.
33
+
34
+ ### Migration
35
+
36
+ ```ts
37
+ // Before (타입은 OK 였지만 런타임 undefined)
38
+ const { datas, total_size } = await cb.database.getData(tableId)
39
+
40
+ // After (v1.4.0+)
41
+ const { data, total_count } = await cb.database.getData(tableId)
42
+ ```
43
+
6
44
  ## [1.3.0] - 2026-04-18
7
45
 
8
46
  파티 초대 수락/거절 SDK 메서드 추가. 기존 `acceptInvite` 는 로비 전용(`/lobbies/invites/...`) 이라 파티 초대에는 사용할 수 없었는데, 1.2.0 까지는 사용자가 직접 `fetch()` 로 백엔드의 `/v1/game/:appID/invites/:inviteID/accept` 를 호출해야 했음. 1.3.0 부터 SDK 에 전용 메서드 제공.
package/README.md CHANGED
@@ -439,19 +439,19 @@ await cb.auth.signOut()
439
439
 
440
440
  ```typescript
441
441
  // Query data
442
- const { datas, total_size } = await cb.database.getData('table-id', {
442
+ const { data, total_count } = await cb.database.getData('table-id', {
443
443
  where: { status: 'active' },
444
444
  limit: 10
445
445
  })
446
446
 
447
447
  // Query with field selection (Projection) - improves response speed
448
- const { datas } = await cb.database.getData('table-id', {
448
+ const { data } = await cb.database.getData('table-id', {
449
449
  select: ['id', 'name', 'thumbnail'], // Only return these fields
450
450
  limit: 20
451
451
  })
452
452
 
453
453
  // Exclude specific fields (e.g., large HTML/CSS content)
454
- const { datas } = await cb.database.getData('table-id', {
454
+ const { data } = await cb.database.getData('table-id', {
455
455
  exclude: ['html_content', 'css_content'],
456
456
  limit: 20
457
457
  })
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: ${colors.cyan}${msg.url}${colors.reset}`);
1667
- log(`${colors.green}\u2192${colors.reset} \uB85C\uCEEC: ${colors.cyan}http://localhost:${localPort}${colors.reset}`);
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: timeout=${colors.cyan}${msg.timeout}s${colors.reset}, max-body=${colors.cyan}${msg.max_body}MB${colors.reset}`);
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;
package/dist/index.d.mts CHANGED
@@ -522,11 +522,21 @@ interface CreateDataRequest {
522
522
  interface UpdateDataRequest {
523
523
  data: Record<string, unknown>;
524
524
  }
525
+ /**
526
+ * 테이블 데이터 조회 응답.
527
+ *
528
+ * 서버(data-server `internal_data_controller.go` 의 `FetchDataByTableGET`,
529
+ * `QueryDataByTable`) 가 반환하는 JSON 과 1:1 매핑합니다.
530
+ *
531
+ * 참고: `1.3.0` 이전 버전(`0.16.1` 기준)에서는 `datas` / `total_size` 로
532
+ * 선언돼 있었으나, 실제 서버 wire 포맷은 `data` / `total_count` 이므로 런타임에
533
+ * 속성 접근이 `undefined` 를 반환하는 결함이 있었습니다. `1.4.0` 에서 바로잡습니다.
534
+ */
525
535
  interface FetchDataResponse {
526
- /** 조회된 문서 배열 (서버는 `datas` 키로 반환합니다) */
527
- datas: DataItem[];
528
- /** 총 매칭 문서 수 (서버는 `total_size` 키로 반환합니다) */
529
- total_size: number;
536
+ /** 조회된 문서 배열 */
537
+ data: DataItem[];
538
+ /** 총 매칭 문서 수 */
539
+ total_count: number;
530
540
  }
531
541
  interface QueryOptions {
532
542
  limit?: number;
package/dist/index.d.ts CHANGED
@@ -522,11 +522,21 @@ interface CreateDataRequest {
522
522
  interface UpdateDataRequest {
523
523
  data: Record<string, unknown>;
524
524
  }
525
+ /**
526
+ * 테이블 데이터 조회 응답.
527
+ *
528
+ * 서버(data-server `internal_data_controller.go` 의 `FetchDataByTableGET`,
529
+ * `QueryDataByTable`) 가 반환하는 JSON 과 1:1 매핑합니다.
530
+ *
531
+ * 참고: `1.3.0` 이전 버전(`0.16.1` 기준)에서는 `datas` / `total_size` 로
532
+ * 선언돼 있었으나, 실제 서버 wire 포맷은 `data` / `total_count` 이므로 런타임에
533
+ * 속성 접근이 `undefined` 를 반환하는 결함이 있었습니다. `1.4.0` 에서 바로잡습니다.
534
+ */
525
535
  interface FetchDataResponse {
526
- /** 조회된 문서 배열 (서버는 `datas` 키로 반환합니다) */
527
- datas: DataItem[];
528
- /** 총 매칭 문서 수 (서버는 `total_size` 키로 반환합니다) */
529
- total_size: number;
536
+ /** 조회된 문서 배열 */
537
+ data: DataItem[];
538
+ /** 총 매칭 문서 수 */
539
+ total_count: number;
530
540
  }
531
541
  interface QueryOptions {
532
542
  limit?: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "connectbase-client",
3
- "version": "1.3.0",
3
+ "version": "1.4.1",
4
4
  "description": "Connect Base JavaScript/TypeScript SDK for browser and Node.js",
5
5
  "repository": {
6
6
  "type": "git",