@vibexnpm/talkx 6.1.0 → 7.0.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibexnpm/talkx",
3
- "version": "6.1.0",
3
+ "version": "7.0.0",
4
4
  "type": "module",
5
5
  "description": "TalkFlow SDK - Chat & WebRTC unified client",
6
6
  "main": "dist/talkflow-sdk.umd.js",
@@ -287,7 +287,16 @@ class TalkFlowClient extends EventEmitter {
287
287
  /**
288
288
  * 내 정보 조회.
289
289
  *
290
- * @returns {Promise<Object>} `{userId, email, name, phone, profileUrl, companyRole, orgNodeId, orgName, ...}`
290
+ * `metadata` 를 볼 수 있는 **유일한** 곳이다. 고치는 문은 {@link #updateMyProfile} 하나뿐이고
291
+ * 그쪽은 **전체 교체**라, 부분 수정하려면 여기서 먼저 읽어 병합한 뒤 통째로 보내야 한다:
292
+ *
293
+ * ```js
294
+ * const me = await client.getMyProfile();
295
+ * await client.updateMyProfile({ metadata: { ...me.metadata, statusMessage: '회의 중' } });
296
+ * ```
297
+ *
298
+ * @returns {Promise<Object>} `{userId, email, name, phone, profileUrl, companyRole,
299
+ * orgNodeId, orgName, preferredLanguage, metadata, mustChangePassword, ...}`
291
300
  */
292
301
  async getMyProfile() {
293
302
  this._checkToken();
@@ -304,10 +313,24 @@ class TalkFlowClient extends EventEmitter {
304
313
  * <p>이메일·조직·역할은 바꿀 수 없다 — 이메일은 로그인 키, 조직은 파트너가 정하고,
305
314
  * 역할은 본인이 승급할 수 없어야 한다.</p>
306
315
  *
307
- * @param {Object} profile
308
- * @param {string} [profile.name]
309
- * @param {string} [profile.phone]
310
- * @param {string} [profile.profileUrl]
316
+ * <p><b>내 정보를 고치는 유일한 메서드다.</b> {@code updateMyInfo} 와
317
+ * {@code PUT /api/v1/users/update} 는 v7.0.0 에서 걷어냈다 — 같은 칸(이름·프로필 이미지)을
318
+ * 고치는 문이 둘이라 한 화면에서 순서 없이 두 번 부르면 나중 호출이 앞을 덮었고, 어느 쪽도
319
+ * 혼자서는 부족했다(그쪽엔 {@code phone} 이, 이쪽엔 나머지 셋이 없었다).</p>
320
+ *
321
+ * <p>서버는 갱신된 프로필이 담긴 <b>새 JWT</b> 를 함께 준다. 채택하지 않으면 옛 토큰의
322
+ * name/profileUrl 클레임이 최대 7일(토큰 TTL) 동안 계속 나간다. 같은 사용자의 토큰 교체라
323
+ * {@code setToken} 은 재연결을 일으키지 않는다 — STOMP connectHeaders 만 갱신된다.</p>
324
+ *
325
+ * @param {Object} profile — 넘기지 않은 필드는 «변경 안 함»
326
+ * @param {string} [profile.name] - 이름 (max 100자)
327
+ * @param {string} [profile.phone] - 전화번호 (max 30자)
328
+ * @param {string} [profile.profileUrl] - 프로필 이미지 URL (max 500자)
329
+ * @param {Object} [profile.metadata] - 메타데이터 (**전체 교체** — 부분 수정하려면
330
+ * {@link #getMyProfile} 로 현재 값을 읽어 병합한 뒤 통째로 보내라. 서버는 병합하지 않는다)
331
+ * @param {string|null} [profile.preferredLanguage] - 기본 선호 언어 (BCP-47 / 'OFF'(원문) / null)
332
+ * @param {string} [profile.timeZone] - IANA zone id. 어시가 대화 시각을 이 기준으로 렌더한다.
333
+ * `Intl.DateTimeFormat().resolvedOptions().timeZone` 값을 그대로 보내면 된다.
311
334
  * @returns {Promise<Object>} 갱신된 내 정보 (accessToken 포함)
312
335
  */
313
336
  async updateMyProfile(profile) {
@@ -342,48 +365,13 @@ class TalkFlowClient extends EventEmitter {
342
365
  return this.apiClient.put('/api/v1/me/password', { currentPassword, newPassword });
343
366
  }
344
367
 
345
- /**
346
- * 사용자 정보 수정.
347
- *
348
- * 서버는 갱신된 프로필이 담긴 **새 JWT** 를 응답에 함께 실어 준다(`/auth` 와 같은 계약).
349
- * 이걸 채택하지 않으면 옛 토큰의 name/profileUrl 클레임이 계속 나가, 서버가 그 클레임을 읽는
350
- * 경로에서 낡은 값이 최대 7일(토큰 TTL) 동안 보인다.
351
- *
352
- * 같은 사용자의 토큰 교체라 `setToken` 은 재연결을 일으키지 않는다 — userId 가 바뀔 때만
353
- * 재초기화하고, 여기서는 STOMP connectHeaders 만 갱신된다.
354
- *
355
- * @param {Object} userData
356
- * @param {string} [userData.nickname] - 닉네임 (max 100자)
357
- * @param {string} [userData.profileImageUrl] - 프로필 이미지 URL (max 500자)
358
- * @param {Object} [userData.metadata] - 메타데이터 (전체 교체)
359
- * @param {string|null} [userData.preferredLanguage] - 기본 선호 언어 (BCP-47 / 'OFF'(원문) / null). 다국어.
360
- * @returns {Promise<Object>}
361
- */
362
- async updateMyInfo(userData) {
363
- this._checkToken();
364
- const response = await this.apiClient.put('/api/v1/users/update', userData);
365
-
366
- if (response?.data?.accessToken) {
367
- // 토큰 교체 실패로 수정 자체를 실패시키지 않는다 — 서버 반영은 이미 끝났고,
368
- // 옛 토큰도 유효(낡았을 뿐)하므로 여기서 throw 하면 호출자가 이미 적용된 수정을
369
- // 다시 시도하게 된다. authenticate() 는 토큰이 없으면 아무것도 못 하므로 계약이 다르다.
370
- try {
371
- await this.setToken(response.data.accessToken);
372
- } catch (error) {
373
- this.logger.warn('Profile updated but token refresh failed; keeping the old token', error);
374
- }
375
- }
376
-
377
- return response;
378
- }
379
-
380
368
  /**
381
369
  * 내 기본 선호 언어 설정 (전 방 공통, 다국어). 명시 변경 — 방별 오버라이드는 {@link #setMyRoomLanguage}.
382
370
  * @param {string|null} language - BCP-47 코드(예 'ko','en') / 'OFF'(원문) / null·''(미설정)
383
371
  * @returns {Promise<Object>}
384
372
  */
385
373
  async setPreferredLanguage(language) {
386
- return this.updateMyInfo({ preferredLanguage: language });
374
+ return this.updateMyProfile({ preferredLanguage: language });
387
375
  }
388
376
 
389
377
  /**
@@ -396,8 +384,9 @@ class TalkFlowClient extends EventEmitter {
396
384
  * 발생한다. 서버 {@code LanguageCode} 도 동일 규칙으로 축약하므로 어느 쪽으로 들어와도 같은 값이 된다.</p>
397
385
  *
398
386
  * <p>예전에는 {@code registerUser} 가 이 값을 자동으로 실어 보냈는데 그 경로가 사라졌다.
399
- * 지금은 호출자가 직접 감지해 {@code PUT /api/v1/users/update} 의 {@code preferredLanguage}
400
- * 로 넣어야 한다 — 넣지 않으면 사용자 기본 언어가 미설정으로 남아 자동 번역이 서버 기본값을 쓴다.</p>
387
+ * 지금은 호출자가 직접 감지해 {@link #setPreferredLanguage} (또는 {@link #updateMyProfile} 의
388
+ * {@code preferredLanguage}) 로 넣어야 한다 — 넣지 않으면 사용자 기본 언어가 미설정으로 남아
389
+ * 자동 번역이 서버 기본값을 쓴다.</p>
401
390
  * @returns {string|null}
402
391
  */
403
392
  static detectBrowserLanguage() {
@@ -474,8 +463,13 @@ class TalkFlowClient extends EventEmitter {
474
463
  /**
475
464
  * 사용자 목록 조회
476
465
  *
477
- * <p>응답 행에 {@code phone}/{@code orgNodeId}/{@code orgName} 이 포함된다 — 부서명은
478
- * 저장값이 아니라 조회 시점에 조직 마스터에서 해소한 값이다.</p>
466
+ * <p>응답 행에 {@code email}/{@code phone}/{@code orgNodeId}/{@code orgName} 이 포함된다 —
467
+ * 부서명은 저장값이 아니라 조회 시점에 조직 마스터에서 해소한 값이다.</p>
468
+ *
469
+ * <p>{@code email} 은 <b>연락용</b>이다. 로그인 키인 {@code loginEmail} 은 어떤 목록에도
470
+ * 실리지 않는다 — 둘은 다른 값이고, 퇴사 시 {@code loginEmail} 만 비워진다.</p>
471
+ *
472
+ * <p>퇴사·차단된 회원은 목록·검색 어디에도 나오지 않는다.</p>
479
473
  *
480
474
  * @param {Object} [params]
481
475
  * @param {number} [params.size=50] - 페이지 크기 (1-100)
package/types/index.d.ts CHANGED
@@ -1038,6 +1038,15 @@ export interface MyProfile {
1038
1038
  orgNodeId?: string | null;
1039
1039
  orgName?: string | null;
1040
1040
  preferredLanguage?: string | null;
1041
+ /**
1042
+ * 확장 메타데이터 — 내 값을 볼 수 있는 **유일한** 곳이다.
1043
+ *
1044
+ * 고치는 문은 `updateMyProfile({ metadata })` 하나뿐이고 **전체 교체**다 —
1045
+ * 서버는 병합하지 않는다. 부분 수정하려면 이 값을 먼저 읽어 병합한 뒤 통째로 보내라.
1046
+ */
1047
+ metadata?: Record<string, unknown> | null;
1048
+ /** IANA zone id — 어시가 대화 시각을 이 기준으로 렌더한다. 읽을 수 없으면 설정 화면이 현재 값을 못 보여준다. */
1049
+ timeZone?: string | null;
1041
1050
  projectId: string;
1042
1051
  joinedAt?: string | null;
1043
1052
  /**
@@ -2358,7 +2367,17 @@ export default class TalkFlowClient implements SdkEventEmitter<TalkFlowClientEve
2358
2367
  getMyProfile(): Promise<MyProfile>;
2359
2368
 
2360
2369
  /** 내 정보 수정 — 응답의 새 토큰을 자동 채택한다(name/profileUrl 이 토큰 claim). */
2361
- updateMyProfile(profile: { name?: string; phone?: string; profileUrl?: string }): Promise<MyProfile>;
2370
+ updateMyProfile(profile: {
2371
+ name?: string;
2372
+ phone?: string;
2373
+ profileUrl?: string;
2374
+ /** **전체 교체** — 부분 수정은 `getMyProfile()` 로 읽어 병합한 뒤 통째로 보낸다. */
2375
+ metadata?: Record<string, unknown> | null;
2376
+ /** BCP-47 코드 / 'OFF'(원문) / null */
2377
+ preferredLanguage?: string | null;
2378
+ /** IANA zone id — `Intl.DateTimeFormat().resolvedOptions().timeZone` */
2379
+ timeZone?: string;
2380
+ }): Promise<MyProfile>;
2362
2381
 
2363
2382
  /** 비밀번호 변경 — 현재 비밀번호 재확인. 토큰은 그대로 유효해 재로그인이 필요 없다. */
2364
2383
  changeMyPassword(params: { currentPassword: string; newPassword: string }): Promise<unknown>;