connectbase-client 1.9.1 → 1.10.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/dist/index.mjs CHANGED
@@ -4436,11 +4436,13 @@ var OAuthAPI = class {
4436
4436
  reject(new Error(event.data.error));
4437
4437
  return;
4438
4438
  }
4439
+ const rawEmail = event.data.email;
4439
4440
  const result = {
4440
4441
  member_id: event.data.member_id,
4441
4442
  access_token: event.data.access_token,
4442
4443
  refresh_token: event.data.refresh_token,
4443
- is_new_member: event.data.is_new_member === "true" || event.data.is_new_member === true
4444
+ is_new_member: event.data.is_new_member === "true" || event.data.is_new_member === true,
4445
+ ...typeof rawEmail === "string" && rawEmail.length > 0 ? { email: rawEmail } : {}
4444
4446
  };
4445
4447
  this.http.setTokens(result.access_token, result.refresh_token);
4446
4448
  resolve(result);
@@ -4508,11 +4510,13 @@ var OAuthAPI = class {
4508
4510
  if (!accessToken || !refreshToken || !memberId) {
4509
4511
  return null;
4510
4512
  }
4513
+ const emailParam = params.get("email");
4511
4514
  const result = {
4512
4515
  access_token: accessToken,
4513
4516
  refresh_token: refreshToken,
4514
4517
  member_id: memberId,
4515
4518
  is_new_member: params.get("is_new_member") === "true",
4519
+ ...emailParam ? { email: emailParam } : {},
4516
4520
  state: params.get("state") || void 0
4517
4521
  };
4518
4522
  if (window.opener) {
@@ -4550,6 +4554,7 @@ var OAuthAPI = class {
4550
4554
  refresh_token: resp.refresh_token,
4551
4555
  member_id: resp.member_id,
4552
4556
  is_new_member: resp.is_new_member,
4557
+ ...resp.email ? { email: resp.email } : {},
4553
4558
  state: params.get("state") || void 0
4554
4559
  };
4555
4560
  if (window.opener) {
@@ -5226,6 +5231,53 @@ var PushAPI = class {
5226
5231
  const prefix = this.getPublicPrefix();
5227
5232
  await this.http.delete(`${prefix}/push/devices/${encodeURIComponent(deviceToken)}`);
5228
5233
  }
5234
+ // ============ Server-side Send (Functions / cb_sk_ 전용) ============
5235
+ /**
5236
+ * 회원 ID 목록으로 푸시 발송 — Functions / cb_sk_ 인증 환경 전용.
5237
+ *
5238
+ * 백엔드 라우트 `POST /v1/apps/:appID/push/send` 는 콘솔 JWT 또는 User Secret Key
5239
+ * (`cb_sk_`) 만 받는다. 브라우저 SDK 의 Public Key(`cb_pk_`) 인스턴스에서는 호출
5240
+ * 자체가 차단되며, 권한 누설을 막기 위해 명확한 에러를 던진다.
5241
+ *
5242
+ * @param appId 발송 대상 앱 ID (cb_sk_ 환경은 user 단위 권한이므로 명시 전달).
5243
+ * @param memberIds 받는 회원 ID 배열 (UUID).
5244
+ * @param payload 푸시 내용/옵션.
5245
+ *
5246
+ * @example
5247
+ * ```ts
5248
+ * // ConnectBase Function (Node.js, secrets.CB_SECRET_KEY 주입)
5249
+ * const result = await cb.push.sendToMembers(APP_ID, [memberId], {
5250
+ * title: '새 알림',
5251
+ * body: '확인해보세요',
5252
+ * data: { route: '/notifications' },
5253
+ * })
5254
+ * console.log(result.message_id, result.sent_count)
5255
+ * ```
5256
+ */
5257
+ async sendToMembers(appId, memberIds, payload) {
5258
+ if (this.http.hasPublicKey()) {
5259
+ throw new Error(
5260
+ "cb.push.sendToMembers() \uB294 User Secret Key(cb_sk_) \uB610\uB294 \uCF58\uC194 JWT \uC778\uC99D\uC774 \uD544\uC694\uD569\uB2C8\uB2E4. Public Key(cb_pk_) SDK \uC778\uC2A4\uD134\uC2A4\uB85C\uB294 \uD638\uCD9C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 Functions \uD658\uACBD\uC5D0\uC11C \uC0AC\uC6A9\uD558\uC138\uC694."
5261
+ );
5262
+ }
5263
+ if (memberIds.length === 0) {
5264
+ throw new Error("cb.push.sendToMembers(): memberIds \uAC00 \uBE44\uC5B4\uC788\uC2B5\uB2C8\uB2E4.");
5265
+ }
5266
+ const body = {
5267
+ target_type: "members",
5268
+ target_member_ids: memberIds,
5269
+ title: payload.title,
5270
+ body: payload.body,
5271
+ ...payload.imageUrl !== void 0 ? { image_url: payload.imageUrl } : {},
5272
+ ...payload.data !== void 0 ? { data: payload.data } : {},
5273
+ ...payload.platforms !== void 0 ? { platforms: payload.platforms } : {},
5274
+ ...payload.ttlSeconds !== void 0 ? { ttl: payload.ttlSeconds } : {},
5275
+ ...payload.priority !== void 0 ? { priority: payload.priority } : {},
5276
+ ...payload.clickAction !== void 0 ? { click_action: payload.clickAction } : {},
5277
+ ...payload.scheduledAt !== void 0 ? { scheduled_at: payload.scheduledAt } : {}
5278
+ };
5279
+ return this.http.post(`/v1/apps/${appId}/push/send`, body);
5280
+ }
5229
5281
  // ============ Helper Methods ============
5230
5282
  /**
5231
5283
  * 브라우저 고유 ID 생성 (localStorage에 저장)
@@ -8135,6 +8187,15 @@ var SessionManager = class {
8135
8187
  return generateId();
8136
8188
  }
8137
8189
  };
8190
+ function buildAnalyticsQuery(options) {
8191
+ if (!options) return "";
8192
+ const params = new URLSearchParams();
8193
+ if (options.start_date !== void 0) params.set("start_date", String(options.start_date));
8194
+ if (options.end_date !== void 0) params.set("end_date", String(options.end_date));
8195
+ if (options.limit !== void 0) params.set("limit", String(options.limit));
8196
+ const qs = params.toString();
8197
+ return qs ? `?${qs}` : "";
8198
+ }
8138
8199
  function parseUTM() {
8139
8200
  if (typeof window === "undefined") return {};
8140
8201
  try {
@@ -8403,6 +8464,60 @@ var AnalyticsAPI = class {
8403
8464
  async flush() {
8404
8465
  await this.flushQueue();
8405
8466
  }
8467
+ /**
8468
+ * 인기 페이지 조회 (콘솔 JWT 또는 User Secret Key `cb_sk_` 인증 필요).
8469
+ *
8470
+ * 브라우저 환경에서 Public Key(`cb_pk_`) 만 가진 SDK 인스턴스로는 호출이 차단된다.
8471
+ * Functions / 어드민 앱 등 cb_sk_ 환경에서 사용하라.
8472
+ *
8473
+ * @param storageWebId 조회할 웹스토리지 ID. 미지정 시 `init()` 에 전달된 ID 사용.
8474
+ * @param options 기간/limit 옵션
8475
+ * @example
8476
+ * ```ts
8477
+ * const { pages } = await cb.analytics.getPopularPages('019d8...', { limit: 20 })
8478
+ * ```
8479
+ */
8480
+ async getPopularPages(storageWebId, options) {
8481
+ const id = this.requireServerSideStorageId(storageWebId, "getPopularPages");
8482
+ const qs = buildAnalyticsQuery(options);
8483
+ return this.http.get(`/v1/storages/web/${id}/popular-pages${qs}`);
8484
+ }
8485
+ /**
8486
+ * 페이지 전환 플로우(Sankey) 조회 — JWT/cb_sk_ 인증 필요.
8487
+ */
8488
+ async getNavigationFlow(storageWebId, options) {
8489
+ const id = this.requireServerSideStorageId(storageWebId, "getNavigationFlow");
8490
+ const qs = buildAnalyticsQuery(options);
8491
+ return this.http.get(`/v1/storages/web/${id}/navigation/flow${qs}`);
8492
+ }
8493
+ /**
8494
+ * 방문자 목록 조회 — JWT/cb_sk_ 인증 필요.
8495
+ */
8496
+ async getVisitors(storageWebId, options) {
8497
+ const id = this.requireServerSideStorageId(storageWebId, "getVisitors");
8498
+ const params = new URLSearchParams();
8499
+ if (options?.limit !== void 0) params.set("limit", String(options.limit));
8500
+ if (options?.offset !== void 0) params.set("offset", String(options.offset));
8501
+ if (options?.sort_by) params.set("sort_by", options.sort_by);
8502
+ const qs = params.toString() ? `?${params.toString()}` : "";
8503
+ return this.http.get(`/v1/storages/web/${id}/visitors${qs}`);
8504
+ }
8505
+ /**
8506
+ * 조회 메서드 공통 가드 — Public Key 인증 SDK 인스턴스에서는 명확한 에러를 던진다.
8507
+ * 백엔드 라우트는 cb_pk_ 를 거부하므로 호출 자체를 막는 것이 디버깅에 유리.
8508
+ */
8509
+ requireServerSideStorageId(storageWebId, methodName) {
8510
+ if (this.http.hasPublicKey()) {
8511
+ throw new Error(
8512
+ `cb.analytics.${methodName}() \uB294 \uCF58\uC194 JWT \uB610\uB294 User Secret Key(cb_sk_) \uC778\uC99D\uC774 \uD544\uC694\uD569\uB2C8\uB2E4. \uBE0C\uB77C\uC6B0\uC800 SDK \uC758 Public Key(cb_pk_) \uB85C\uB294 \uD638\uCD9C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 Functions \uD658\uACBD\uC5D0\uC11C \uC0AC\uC6A9\uD558\uC138\uC694.`
8513
+ );
8514
+ }
8515
+ const id = storageWebId ?? this.storageWebId;
8516
+ if (!id) {
8517
+ throw new Error(`cb.analytics.${methodName}() \uD638\uCD9C \uC2DC storageWebId \uAC00 \uD544\uC694\uD569\uB2C8\uB2E4 (init \uB610\uB294 \uC778\uC790\uB85C \uC804\uB2EC).`);
8518
+ }
8519
+ return id;
8520
+ }
8406
8521
  /**
8407
8522
  * 세션 매니저 접근 (고급 사용자용).
8408
8523
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "connectbase-client",
3
- "version": "1.9.1",
3
+ "version": "1.10.0",
4
4
  "description": "Connect Base JavaScript/TypeScript SDK for browser and Node.js",
5
5
  "repository": {
6
6
  "type": "git",