connectbase-client 3.42.0 → 3.43.0

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,18 @@
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.43.0] - 2026-07-02
7
+
8
+ ### Added — `--dev` 배포도 대용량 바이너리 지원
9
+
10
+ dev 배포(`connectbase deploy --dev`)는 DB 를 거치지 않고 파일을 dev Object Storage 경로에 직접
11
+ 올리므로 6 MiB(TiDB 엔트리) 한도가 애초에 없다. 3.41.0~3.42.0 은 dev 에서도 fail-fast 로 대용량을
12
+ 막았는데(과도한 제한), 이를 풀고 prod 와 동일하게 처리한다.
13
+
14
+ - 대용량 **바이너리**는 presign(`dev:true`)으로 dev 서빙 경로(`{id}/dev{path}`)에 직접 업로드하고 바디에서 제외(효율).
15
+ - 대응 core-server 가 없으면(구버전) 오프로드 없이 전량 base64 바디로 전송 — dev 는 DB 한도가 없어 안전.
16
+ - dev 는 이제 대용량 파일에 대해 fail-fast 하지 않는다.
17
+
6
18
  ## [3.42.0] - 2026-07-02
7
19
 
8
20
  ### Added — 웹 배포 대용량 바이너리 Object Storage 직접 업로드 (플랫폼 이슈 019f221b)
package/dist/cli.js CHANGED
@@ -349,8 +349,8 @@ function validateFileSizes(files) {
349
349
  warn("\uC62C\uB9AC\uACE0 URL \uB85C \uCC38\uC870\uD558\uC138\uC694. \uD30C\uC77C \uC2A4\uD1A0\uB9AC\uC9C0\uB294 \uD30C\uC77C\uB2F9 \uACE0\uC815 \uC0C1\uD55C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.");
350
350
  process.exit(1);
351
351
  }
352
- async function requestDeployPresign(baseStorageUrl, headers, files, timeoutMs) {
353
- const body = JSON.stringify({ files });
352
+ async function requestDeployPresign(baseStorageUrl, headers, files, timeoutMs, dev = false) {
353
+ const body = JSON.stringify(dev ? { files, dev: true } : { files });
354
354
  const res = await makeRequest(`${baseStorageUrl}/deploy/presign`, "POST", headers, body, { timeoutMs });
355
355
  if (res.status === 404) return null;
356
356
  if (res.status < 200 || res.status >= 300) {
@@ -466,6 +466,50 @@ async function offloadLargeBinaries(baseStorageUrl, headers, diff, _envLabel, ti
466
466
  f.content = "";
467
467
  }
468
468
  }
469
+ async function offloadDevLargeBinaries(baseStorageUrl, headers, files, timeoutMs) {
470
+ const large = files.filter((f) => f.isBinary && Buffer.byteLength(f.content, "utf8") > WEB_FILE_MAX_STORED_BYTES);
471
+ if (large.length === 0) return files;
472
+ const presignFiles = large.map((f) => ({
473
+ path: f.path,
474
+ size: Buffer.from(f.content, "base64").length,
475
+ mime_type: guessMimeType(f.path)
476
+ }));
477
+ let presigned;
478
+ try {
479
+ presigned = await requestDeployPresign(baseStorageUrl, headers, presignFiles, timeoutMs, true);
480
+ } catch (err) {
481
+ error(`dev \uB300\uC6A9\uB7C9 \uD30C\uC77C \uC5C5\uB85C\uB4DC \uC900\uBE44 \uC2E4\uD328: ${err instanceof Error ? err.message : err}`);
482
+ process.exit(1);
483
+ }
484
+ if (presigned === null) {
485
+ info("\uC11C\uBC84\uAC00 \uB300\uC6A9\uB7C9 \uC9C1\uC811 \uC5C5\uB85C\uB4DC\uB97C \uBBF8\uC9C0\uC6D0 \u2014 dev \uB294 \uC804\uB7C9 \uC5C5\uB85C\uB4DC\uB85C \uC9C4\uD589\uD569\uB2C8\uB2E4.");
486
+ return files;
487
+ }
488
+ if (!presigned.every((p) => p.object_key.includes("/dev/"))) {
489
+ info("\uC11C\uBC84\uAC00 dev \uC9C1\uC811 \uC5C5\uB85C\uB4DC\uB97C \uBBF8\uC9C0\uC6D0(\uC751\uB2F5 \uD0A4\uAC00 dev \uACBD\uB85C \uC544\uB2D8) \u2014 dev \uB294 \uC804\uB7C9 \uC5C5\uB85C\uB4DC\uB85C \uC9C4\uD589\uD569\uB2C8\uB2E4.");
490
+ return files;
491
+ }
492
+ const urlByPath = new Map(presigned.map((p) => [p.path, p.upload_url]));
493
+ info(`\uB300\uC6A9\uB7C9 \uBC14\uC774\uB108\uB9AC ${large.length}\uAC1C\uB97C dev Object Storage \uB85C \uC9C1\uC811 \uC5C5\uB85C\uB4DC\uD569\uB2C8\uB2E4...`);
494
+ const offloaded = /* @__PURE__ */ new Set();
495
+ for (const f of large) {
496
+ const uploadUrl = urlByPath.get(f.path);
497
+ if (!uploadUrl) {
498
+ error(`presign \uC751\uB2F5\uC5D0 \uC5C5\uB85C\uB4DC URL \uC774 \uC5C6\uC2B5\uB2C8\uB2E4: ${f.path}`);
499
+ process.exit(1);
500
+ }
501
+ const bytes = Buffer.from(f.content, "base64");
502
+ try {
503
+ await putToPresignedUrl(uploadUrl, bytes, guessMimeType(f.path), timeoutMs);
504
+ } catch (err) {
505
+ error(`dev \uC5C5\uB85C\uB4DC \uC2E4\uD328 (${f.path}): ${err instanceof Error ? err.message : err}`);
506
+ process.exit(1);
507
+ }
508
+ success(`\uC9C1\uC811 \uC5C5\uB85C\uB4DC(dev): ${f.path} (${formatSize(bytes.length)})`);
509
+ offloaded.add(f.path);
510
+ }
511
+ return files.filter((f) => !offloaded.has(f.path));
512
+ }
469
513
  var DEFAULT_REQUEST_TIMEOUT_MS = 6e4;
470
514
  async function makeRequest(url, method, headers, body, reqOpts = {}) {
471
515
  return new Promise((resolve2, reject) => {
@@ -572,8 +616,8 @@ async function deploy(directory, config, isDev = false, deployOpts = {}) {
572
616
  const timeoutMs = computeDeployTimeout(totalSize, deployOpts.timeoutMs);
573
617
  log(`${colors.dim}\uD0C0\uC784\uC544\uC6C3: ${Math.round(timeoutMs / 1e3)}\uCD08${colors.reset}`);
574
618
  if (isDev) {
575
- validateFileSizes(files);
576
- await fullDeploy(baseStorageUrl, headers, files, envLabel, "deploy/dev", timeoutMs);
619
+ const toSend = await offloadDevLargeBinaries(baseStorageUrl, headers, files, timeoutMs);
620
+ await fullDeploy(baseStorageUrl, headers, toSend, envLabel, "deploy/dev", timeoutMs);
577
621
  return;
578
622
  }
579
623
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "connectbase-client",
3
- "version": "3.42.0",
3
+ "version": "3.43.0",
4
4
  "description": "Connect Base JavaScript/TypeScript SDK for browser and Node.js",
5
5
  "repository": {
6
6
  "type": "git",