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 +38 -0
- package/README.md +3 -3
- package/dist/cli.js +16 -4
- package/dist/index.d.mts +14 -4
- package/dist/index.d.ts +14 -4
- package/package.json +1 -1
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 {
|
|
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 {
|
|
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 {
|
|
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:
|
|
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;
|
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
|
-
/** 조회된 문서 배열
|
|
527
|
-
|
|
528
|
-
/** 총 매칭 문서 수
|
|
529
|
-
|
|
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
|
-
/** 조회된 문서 배열
|
|
527
|
-
|
|
528
|
-
/** 총 매칭 문서 수
|
|
529
|
-
|
|
536
|
+
/** 조회된 문서 배열 */
|
|
537
|
+
data: DataItem[];
|
|
538
|
+
/** 총 매칭 문서 수 */
|
|
539
|
+
total_count: number;
|
|
530
540
|
}
|
|
531
541
|
interface QueryOptions {
|
|
532
542
|
limit?: number;
|