@vibexnpm/talkx 3.2.1 → 4.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/dist/index.d.ts CHANGED
@@ -71,9 +71,8 @@ export const SignalTypes: {
71
71
 
72
72
  /**
73
73
  * SDK 가 런타임에 export 하는 ChatMessageType 상수.
74
- * <p><b>런타임 소스와 정확히 일치</b>: {@code src/constants.js} 에 정의된 6개 값만 포함.
75
- * {@code DOCUMENT / GALLERY} 는 SDK 상수에 없음 — 서버 응답 메시지의 {@code chatMessageType}
76
- * 필드로는 수신될 수 있으므로 {@link ChatMessageTypeValue} 는 해당 값을 포함한 union.</p>
74
+ * <p><b>{@code src/constants.js} 와 정확히 일치해야 한다</b> — 한쪽만 늘리면 소비자가 존재하는 상수를
75
+ * 못 쓰거나(누락) 없는 상수를 참조한다(초과).</p>
77
76
  */
78
77
  export const ChatMessageType: {
79
78
  readonly TEXT: 'TEXT';
@@ -81,17 +80,32 @@ export const ChatMessageType: {
81
80
  readonly FILE: 'FILE';
82
81
  readonly VIDEO: 'VIDEO';
83
82
  readonly AUDIO: 'AUDIO';
83
+ readonly DOCUMENT: 'DOCUMENT';
84
+ /** 서로 다른 카테고리의 첨부가 섞인 메시지 (예: 이미지 2 + PDF 1). */
85
+ readonly MIXED: 'MIXED';
86
+ /**
87
+ * @deprecated 복수 첨부(타입 무관)를 뜻하던 과거 값. 신규 저장에서는 생성되지 않지만 기존 데이터에 남아 있다.
88
+ * {@link ChatClient.resolveMessageCategory} 로 복원할 것.
89
+ */
90
+ readonly GALLERY: 'GALLERY';
84
91
  readonly SYSTEM: 'SYSTEM';
85
92
  };
86
93
 
87
94
  /**
88
- * 서버가 보낼 수 있는 메시지 타입 값 전체.
89
- * <p>SDK 상수 ({@link ChatMessageType}) 의 6개 값 + 서버에서만 쓰는 {@code DOCUMENT / GALLERY}.
90
- * 수신 {@link ChatMessage#chatMessageType} 비교 시 이 union 을 사용.</p>
95
+ * 서버가 보낼 수 있는 메시지 타입 값 전체 — {@link ChatMessageType} 상수와 같은 집합.
96
+ * <p>수신 {@link ChatMessage#chatMessageType} 비교 시 이 union 을 사용한다.</p>
91
97
  */
92
98
  export type ChatMessageTypeValue =
93
99
  | 'TEXT' | 'IMAGE' | 'FILE' | 'VIDEO' | 'AUDIO' | 'SYSTEM'
94
- | 'DOCUMENT' | 'GALLERY';
100
+ | 'DOCUMENT'
101
+ /** 서로 다른 카테고리의 첨부가 섞인 메시지 (예: 이미지 2 + PDF 1). 전송 1회 = 메시지 1건 계약의 신규 값. */
102
+ | 'MIXED'
103
+ /**
104
+ * @deprecated 복수 첨부(타입 무관)를 뜻하던 과거 값. 신규 저장에서는 생성되지 않지만 기존 데이터에 남아 있다.
105
+ * 동영상·문서 복수도 전부 이 값이므로 `IMAGE` 로 매핑하면 안 되고,
106
+ * {@link ChatClient.resolveMessageCategory} 로 `fileMetaDataList` 의 MIME 에서 복원해야 한다.
107
+ */
108
+ | 'GALLERY';
95
109
 
96
110
  export const ChatRoomType: {
97
111
  readonly DIRECT: 'DIRECT';
@@ -568,6 +582,17 @@ export type FileCustomMetadata = { [key: string]: JsonValue };
568
582
 
569
583
  /** 파일 메타데이터 (이미지/영상/오디오/문서). */
570
584
  export interface FileMetaData {
585
+ /**
586
+ * 첨부 식별자 — **서버 `uploadFile` 이 발급한 UUID 를 그대로 실어야 한다**.
587
+ *
588
+ * <p>서버가 이 값을 첨부 좌표(문서 추출 캐시 키)로 쓰기 때문에, 병합 저장이 켜진 서버에서는
589
+ * **UUID 형식 + 메시지 내 유일**이 필수다(위반 시 400). `uploadFile` / `sendFileMessage` 경로는
590
+ * 서버 응답을 그대로 전달하므로 신경 쓸 것이 없다.</p>
591
+ *
592
+ * <p>⚠️ **외부 스토리지에 직접 올리고 `fileInfos` 를 손으로 조립하는 연동**은 이 필드를 반드시 채워야 한다.
593
+ * 값이 없거나 UUID 가 아니면 병합 저장이 켜진 뒤 전송이 거부된다. 임의 UUID v4 를 생성해 넣으면 된다.</p>
594
+ */
595
+ fileId?: string;
571
596
  fileUrl: string;
572
597
  fileName?: string;
573
598
  fileSize?: number;
@@ -1095,11 +1120,29 @@ export interface UpdateGroupRoomData {
1095
1120
  engagementIntensity?: EngagementIntensityValue;
1096
1121
  }
1097
1122
 
1123
+ /**
1124
+ * **전송 요청**에 싣는 첨부 — {@code fileId} 가 <b>필수</b>다.
1125
+ *
1126
+ * <p>서버가 이 값을 첨부 좌표(문서 추출 캐시 키)로 쓰기 때문에, 병합 저장이 켜진 서버는 UUID 형식 +
1127
+ * 메시지 내 유일을 강제하고 위반 시 400 을 낸다. {@link ChatClient.uploadFile} 은 서버가 발급한 UUID 를
1128
+ * 담아 반환하므로 그대로 넘기면 된다.</p>
1129
+ *
1130
+ * <p>⚠️ 외부 스토리지에 직접 올리고 {@code fileInfos} 를 손으로 조립하는 연동은 {@code crypto.randomUUID()}
1131
+ * 등으로 직접 채워야 한다. 수신 메시지의 {@link FileMetaData} 는 legacy 데이터를 위해 {@code fileId} 가
1132
+ * optional 이므로, 그것을 그대로 재전송하려면 {@code fileId} 를 보강해야 한다.</p>
1133
+ */
1134
+ export type SendFileInfo = FileMetaData & { fileId: string };
1135
+
1098
1136
  export interface SendMessageData {
1099
1137
  /** @deprecated SDK 가 내부에서 UUID 를 자동 생성합니다. 지정해도 런타임에서 무시됩니다. */
1100
1138
  messageId?: string;
1101
1139
  message?: string;
1102
- fileInfos?: FileMetaData[];
1140
+ /** 첨부 — {@code fileId} 필수. {@link SendFileInfo} 참고. */
1141
+ fileInfos?: SendFileInfo[];
1142
+ /**
1143
+ * @deprecated 더 이상 전송되지 않습니다. 전송 1회 = 메시지 1건이 계약이며, 첨부는 한 메시지에 전량 실립니다.
1144
+ * 지정해도 SDK 가 무시합니다.
1145
+ */
1103
1146
  separateFiles?: boolean;
1104
1147
  replyToMessageId?: string;
1105
1148
  }
@@ -1110,13 +1153,17 @@ export interface SendMessageResult {
1110
1153
  }
1111
1154
 
1112
1155
  /**
1113
- * Optimistic prediction 검증 메타데이터 — {@link OptimisticSendMessageResult} 에 첨부.
1156
+ * Optimistic 검증 메타데이터 — {@link OptimisticSendMessageResult} 에 첨부.
1114
1157
  *
1115
- * <p>{@code predictionMatched: false} 면 서버의 파일 분류 규칙이 SDK 와 어긋난 것이며,
1116
- * 호출자는 placeholder 들을 제거하고 {@code actualMessageIds} 기준으로 재구성해야 한다.</p>
1158
+ * <p>전송 1회 = 메시지 1건이므로 `predictedMessageIds` 는 항상 `[baseMessageId]` 하나다.
1159
+ * SDK 가 서버 파일 분류 규칙을 mirror 해 여러 ID 를 예측하던 로직은 제거됐다.</p>
1160
+ *
1161
+ * <p>{@code predictionMatched: false} 면 서버가 아직 병합 저장을 켜지 않아 **한 요청이 여러 row 로
1162
+ * 저장된 것**이다(전환 기간의 정상 상태). 호출자는 placeholder 를 제거하고 `actualMessageIds` 기준으로
1163
+ * 재구성해야 한다 — 이 fallback 경로는 플래그가 켜질 때까지 실제로 발생한다.</p>
1117
1164
  */
1118
1165
  export interface OptimisticPredictionInfo {
1119
- /** SDK 가 호출 시점에 예측한 messageId 배열. */
1166
+ /** SDK 가 호출 시점에 만든 messageId 배열 — 항상 길이 1(`[baseMessageId]`). */
1120
1167
  predictedMessageIds: string[];
1121
1168
  /** 서버 응답의 실제 messageId 배열 — {@code result.messages.map(m => m.messageId)} 와 동일. */
1122
1169
  actualMessageIds: string[];
@@ -1136,29 +1183,27 @@ export interface OptimisticSendMessageResult extends SendMessageResult {
1136
1183
  * Optimistic UI 핸들 — {@code sendMessageOptimistic} / {@code sendTextMessageOptimistic} /
1137
1184
  * {@code sendReplyOptimistic} / {@code sendFileMessageOptimistic} 의 반환 타입.
1138
1185
  *
1139
- * <p>SDK 가 서버의 messageId derivation 규칙 (텍스트=base, 파일=base#N) 을 mirror 하여
1140
- * 응답 {@code messages} 배열과 1-1 매칭되는 ID 배열을 promise 시작 전 동기 반환한다.</p>
1186
+ * <p>전송 1회 = 메시지 1건이므로 {@code messageIds} 는 <b>항상 {@code [baseMessageId]} 하나</b>다.
1187
+ * 첨부 개수와 무관하며, promise 시작 전 동기 반환된다. 서버의 messageId derivation 규칙
1188
+ * (텍스트=base, 파일=base#N)을 mirror 하던 예측기는 제거됐다.</p>
1141
1189
  *
1142
- * <p><b>Drift 방어</b>: 서버 파일 분류 규칙이 변경되면 prediction 이 어긋날 수 있으며,
1143
- * 이 경우 SDK 가 warn 로그를 남기고 promise 결과의 {@code optimistic.predictionMatched: false}
1144
- * 로 알린다. 호출자는 {@code result.optimistic.actualMessageIds} 로 fallback reconcile 한다.</p>
1190
+ * <p><b>전환 기간 fallback</b>: 서버가 아직 병합 저장을 켜지 않았다면 한 요청이 여러 row 로 저장되어
1191
+ * {@code optimistic.predictionMatched} 가 {@code false} 가 된다. 오류가 아니라 정상 상태이며, SDK 가
1192
+ * warn 로그를 남긴다. 이때 호출자는 placeholder 를 제거하고
1193
+ * {@code result.optimistic.actualMessageIds} / {@code result.messages} 로 재구성해야 한다.</p>
1145
1194
  */
1146
1195
  export interface OptimisticSendMessageHandle {
1147
1196
  /** SDK 가 생성한 base messageId — 서버 멱등 키. 응답 첫 메시지가 텍스트면 이 값과 동일. */
1148
1197
  baseMessageId: string;
1149
1198
  /**
1150
- * 예측된 전체 messageId 배열 — 응답 {@code messages} 와 같은 순서/길이.
1151
- * <ul>
1152
- * <li>텍스트 단건: {@code [base]}</li>
1153
- * <li>파일 1개 (text 없음): {@code [base]}</li>
1154
- * <li>텍스트 + 파일들: {@code [base, base#0, base#1, ...]}</li>
1155
- * <li>분리 다파일 (text 없음): {@code [base#0, base#1, ...]}</li>
1156
- * </ul>
1199
+ * 전송할 messageId 배열 — 전송 1회 = 메시지 1건이므로 <b>항상 {@code [baseMessageId]} 하나</b>다.
1200
+ * <p>첨부 개수와 무관하다. 서버 저장 규칙을 mirror 해 {@code base#N} 을 계산하던 예측기는 제거됐다.</p>
1157
1201
  */
1158
1202
  messageIds: string[];
1159
1203
  /**
1160
1204
  * 실제 전송 promise — 일반 결과 + {@code optimistic} 메타데이터.
1161
- * {@code result.optimistic.predictionMatched} 가 {@code false} 면 drift fallback 필요.
1205
+ * {@code result.optimistic.predictionMatched} 가 {@code false} 면 서버가 아직 병합 저장을 켜지 않아
1206
+ * N건으로 저장한 것이다 — {@code actualMessageIds} 로 재구성한다(전환 기간의 정상 상태).
1162
1207
  */
1163
1208
  promise: Promise<OptimisticSendMessageResult>;
1164
1209
  }
@@ -1201,7 +1246,9 @@ export interface SendFileMessageProgressEvent extends UploadProgressEvent {
1201
1246
  export interface SendFileMessageOptions {
1202
1247
  /** 함께 보낼 텍스트. */
1203
1248
  message?: string;
1204
- /** 파일별 개별 메시지 분리 여부. */
1249
+ /**
1250
+ * @deprecated 더 이상 전송되지 않습니다. 전송 1회 = 메시지 1건이 계약입니다.
1251
+ */
1205
1252
  separateFiles?: boolean;
1206
1253
  /** 답글 대상 원본 메시지의 서버 messageId. */
1207
1254
  replyToMessageId?: string;
@@ -1220,8 +1267,8 @@ export interface SendFileMessageOptions {
1220
1267
  * <li>배열: index 별 파일에 매핑. 빈 슬롯 ({@code null} / {@code undefined}) 은 해당 파일에 metadata 미부여</li>
1221
1268
  * </ul>
1222
1269
  *
1223
- * <p>{@code separateFiles: false} 로 묶이는 경우에도 각 파일의 {@code metadata} 는 자신의 값을 유지하므로,
1224
- * 그룹 메시지의 {@code fileMetaDataList[i].metadata} 가 i 별로 다를 수 있다.</p>
1270
+ * <p>첨부가 한 메시지에 묶여도 각 파일의 {@code metadata} 는 자신의 값을 유지하므로,
1271
+ * {@code fileMetaDataList[i].metadata} 가 i 별로 다를 수 있다.</p>
1225
1272
  */
1226
1273
  metadata?: FileCustomMetadata | Array<FileCustomMetadata | undefined | null>;
1227
1274
  }
@@ -1591,7 +1638,7 @@ export class ChatClient implements SdkEventEmitter<ChatClientEvents> {
1591
1638
  sendReply(roomId: string, message: string, replyToMessageId: string): Promise<SendMessageResult>;
1592
1639
  sendReplyOptimistic(roomId: string, message: string, replyToMessageId: string): OptimisticSendMessageHandle;
1593
1640
 
1594
- uploadFile(roomId: string, file: File, options?: FileUploadOptions): Promise<FileMetaData>;
1641
+ uploadFile(roomId: string, file: File, options?: FileUploadOptions): Promise<SendFileInfo>;
1595
1642
  sendFileMessage(roomId: string, files: File | File[], options?: SendFileMessageOptions): Promise<SendMessageResult>;
1596
1643
  /**
1597
1644
  * 파일 메시지 Optimistic UI 버전 — 업로드 시작 전에 messageIds 를 동기 반환.
@@ -1599,6 +1646,22 @@ export class ChatClient implements SdkEventEmitter<ChatClientEvents> {
1599
1646
  */
1600
1647
  sendFileMessageOptimistic(roomId: string, files: File | File[], options?: SendFileMessageOptions): OptimisticSendMessageHandle;
1601
1648
 
1649
+ /**
1650
+ * MIME 타입 → 첨부 카테고리 (서버 분류 규칙 mirror).
1651
+ * <p>주로 {@link ChatClient.resolveMessageCategory} 가 쓰지만, 업로드 전 미리보기 분기 등에도 쓸 수 있다.</p>
1652
+ */
1653
+ classifyFileType(mimeType: string): 'IMAGE' | 'VIDEO' | 'AUDIO' | 'DOCUMENT' | 'FILE';
1654
+
1655
+ /**
1656
+ * 메시지의 **렌더 카테고리**를 해석한다 — legacy `GALLERY` 복원용.
1657
+ *
1658
+ * <p>서버는 이제 첨부가 동질이면 그 카테고리를, 혼재면 `MIXED` 를 보낸다. 그러나 이 변경 이전에 저장된
1659
+ * 메시지는 복수 첨부면 타입 무관 전부 `GALLERY` 다 — 동영상 2개도, PDF 2개도 `GALLERY` 다.
1660
+ * 따라서 **`GALLERY` 를 `IMAGE` 로 매핑하면 안 된다.** 이 메서드가 `fileMetaDataList` 의 MIME 으로
1661
+ * 실제 카테고리를 복원하므로, 렌더러는 `GALLERY` 분기를 따로 둘 필요가 없다.</p>
1662
+ */
1663
+ resolveMessageCategory(message: Pick<ChatMessage, 'chatMessageType' | 'fileMetaDataList'>): ChatMessageTypeValue;
1664
+
1602
1665
  editMessage(roomId: string, messageId: string, message: string): Promise<void>;
1603
1666
  deleteMessage(roomId: string, messageId: string, deleteType?: DeleteType): Promise<void>;
1604
1667
  /** 메시지 읽음 처리 — sync. 연결 상태 or send 결과에 따라 boolean 반환. */
@@ -1938,7 +2001,7 @@ export default class TalkFlowClient implements SdkEventEmitter<TalkFlowClientEve
1938
2001
  sendReply(roomId: string, message: string, replyToMessageId: string): Promise<SendMessageResult>;
1939
2002
  sendReplyOptimistic(roomId: string, message: string, replyToMessageId: string): OptimisticSendMessageHandle;
1940
2003
 
1941
- uploadFile(roomId: string, file: File, options?: FileUploadOptions): Promise<FileMetaData>;
2004
+ uploadFile(roomId: string, file: File, options?: FileUploadOptions): Promise<SendFileInfo>;
1942
2005
  sendFileMessage(roomId: string, files: File | File[], options?: SendFileMessageOptions): Promise<SendMessageResult>;
1943
2006
  /**
1944
2007
  * 파일 메시지 Optimistic UI 버전 — 업로드 시작 전에 messageIds 를 동기 반환.
@@ -1946,6 +2009,22 @@ export default class TalkFlowClient implements SdkEventEmitter<TalkFlowClientEve
1946
2009
  */
1947
2010
  sendFileMessageOptimistic(roomId: string, files: File | File[], options?: SendFileMessageOptions): OptimisticSendMessageHandle;
1948
2011
 
2012
+ /**
2013
+ * MIME 타입 → 첨부 카테고리 (서버 분류 규칙 mirror).
2014
+ * <p>주로 {@link ChatClient.resolveMessageCategory} 가 쓰지만, 업로드 전 미리보기 분기 등에도 쓸 수 있다.</p>
2015
+ */
2016
+ classifyFileType(mimeType: string): 'IMAGE' | 'VIDEO' | 'AUDIO' | 'DOCUMENT' | 'FILE';
2017
+
2018
+ /**
2019
+ * 메시지의 **렌더 카테고리**를 해석한다 — legacy `GALLERY` 복원용.
2020
+ *
2021
+ * <p>서버는 이제 첨부가 동질이면 그 카테고리를, 혼재면 `MIXED` 를 보낸다. 그러나 이 변경 이전에 저장된
2022
+ * 메시지는 복수 첨부면 타입 무관 전부 `GALLERY` 다 — 동영상 2개도, PDF 2개도 `GALLERY` 다.
2023
+ * 따라서 **`GALLERY` 를 `IMAGE` 로 매핑하면 안 된다.** 이 메서드가 `fileMetaDataList` 의 MIME 으로
2024
+ * 실제 카테고리를 복원하므로, 렌더러는 `GALLERY` 분기를 따로 둘 필요가 없다.</p>
2025
+ */
2026
+ resolveMessageCategory(message: Pick<ChatMessage, 'chatMessageType' | 'fileMetaDataList'>): ChatMessageTypeValue;
2027
+
1949
2028
  editMessage(roomId: string, messageId: string, message: string): Promise<void>;
1950
2029
  deleteMessage(roomId: string, messageId: string, deleteType?: DeleteType): Promise<void>;
1951
2030
  /** 메시지 읽음 처리 — sync. 연결 상태 or send 결과에 따라 boolean 반환. */