UNPKG

15.1 kBTypeScriptView Raw
1interface IteratorResult<T> {
2 done: boolean;
3 value: T;
4}
5interface AsyncIterator<T> {
6 next(): Promise<IteratorResult<T>>;
7}
8
9interface AVUser {
10 getSessionToken(): string;
11}
12
13interface SignatureResult {
14 signature: string;
15 timestamp: number;
16 nonce: string;
17}
18type SignatureFactoryResult = Promise<SignatureResult> | SignatureResult;
19
20export class Realtime extends EventEmitter<ConnectionEvent> {
21 constructor(options: {
22 appId: string;
23 appKey: string;
24 region?: string;
25 pushOfflineMessages?: boolean;
26 noBinary?: boolean;
27 ssl?: boolean;
28 server?: string | { RTMRouter: string; api: string };
29 RTMServers?: string | string[];
30 plugins?: Array<Plugin>;
31 });
32 createIMClient(
33 client: string | AVUser,
34 options?: {
35 signatureFactory?: (clientId: string) => SignatureFactoryResult;
36 conversationSignatureFactory?: (
37 clientId: string,
38 conversationId: string,
39 targetIds: string[],
40 action: string
41 ) => SignatureFactoryResult;
42 blacklistSignatureFactory?: (
43 clientId: string,
44 conversationId: string,
45 targetIds: string[],
46 action: string
47 ) => SignatureFactoryResult;
48 tag?: string;
49 isReconnect?: boolean;
50 },
51 tag?: string
52 ): Promise<IMClient>;
53 static defineConversationProperty(
54 prop: string,
55 descriptor?: Object
56 ): typeof Conversation;
57 register(messageClass: AVMessage[]): void;
58 retry(): number;
59}
60
61declare class IMClient extends EventEmitter<ClientEvent | SharedEvent> {
62 id: string;
63 close(): Promise<void>;
64 createConversation(options: {
65 members?: string[];
66 name?: string;
67 transient?: boolean;
68 unique?: boolean;
69 [key: string]: any;
70 }): Promise<ConversationBase>;
71 createChatRoom(options: {
72 name?: string;
73 [key: string]: any;
74 }): Promise<ChatRoom>;
75 createTemporaryConversation(options: {
76 members?: string[];
77 ttl?: number;
78 }): Promise<TemporaryConversation>;
79 getConversation(id: string, noCache?: boolean): Promise<ConversationBase>;
80 getQuery(): ConversationQuery<PresistentConversation>;
81 getServiceConversationQuery(): ConversationQuery<ServiceConversation>;
82 getChatRoomQuery(): ConversationQuery<ChatRoom>;
83 markAllAsRead(
84 conversations: ConversationBase[]
85 ): Promise<Array<ConversationBase>>;
86 ping(clientIds: string[]): Promise<Array<string>>;
87 parseMessage(json: Object): Promise<AVMessage>;
88 parseConversation(json: Object): Promise<ConversationBase>;
89
90 on<K extends keyof ClientEvent>(
91 event: K,
92 listener: (payload?: ClientEvent[K]) => any,
93 ...context: EventContext<K>
94 ): this;
95 on<K extends keyof SharedEvent>(
96 event: K,
97 listener: (
98 payload?: SharedEvent[K],
99 conversaion?: ConversationBase,
100 ...context: EventContext<K>
101 ) => any
102 ): this;
103 once<K extends keyof ClientEvent>(
104 event: K,
105 listener: (payload?: ClientEvent[K], ...context: EventContext<K>) => any
106 ): this;
107 once<K extends keyof SharedEvent>(
108 event: K,
109 listener: (
110 payload?: SharedEvent[K],
111 conversaion?: ConversationBase,
112 ...context: EventContext<K>
113 ) => any
114 ): this;
115 on(evt: string, listener: Function): this;
116 once(evt: string, listener: Function): this;
117}
118
119declare class ConversationQuery<T extends ConversationBase> {
120 addAscending(key: string): this;
121 addDescending(key: string): this;
122 ascending(key: string): this;
123 compact(enabled?: boolean): this;
124 containedIn(key: string, values: any): this;
125 contains(key: string, subString: string): this;
126 containsAll(key: string, values: any): this;
127 containsMembers(peerIds: string[]): this;
128 descending(key: string): this;
129 doesNotExist(key: string): this;
130 endsWith(key: string, suffix: string): this;
131 equalTo(key: string, value: any): this;
132 exists(key: string): this;
133 find(): Promise<T[]>;
134 greaterThan(key: string, value: any): this;
135 greaterThanOrEqualTo(key: string, value: any): this;
136 lessThan(key: string, value: any): this;
137 lessThanOrEqualTo(key: string, value: any): this;
138 limit(limit: number): this;
139 matches(key: string, regex: string): this;
140 notContainsIn(key: string, values: any): this;
141 notEqualTo(key: string, value: any): this;
142 sizeEqualTo(key: string, length: number): this;
143 skip(skip: number): this;
144 startsWith(key: string, prefix: string): this;
145 withLastMessagesRefreshed(enabled?: boolean): this;
146 withMembers(peerIds: string[], includeSelf: boolean): this;
147}
148/**
149 * 对话
150 */
151declare class ConversationBase extends EventEmitter<ConversationEvent> {
152 id: string;
153 lastMessage?: Message;
154 lastMessageAt?: Date;
155 lastDeliveredAt?: Date;
156 lastReadAt?: Date;
157 unreadMessagesCount: Number;
158 members: string[];
159 readonly unreadMessagesMentioned: Boolean;
160 [key: string]: any;
161 // constructor();
162 createMessagesIterator(option: {
163 limit?: number;
164 beforeTime?: Date;
165 beforeMessageId?: string;
166 }): AsyncIterator<Array<Message>>;
167 read(): Promise<this>;
168 fetchReceiptTimestamps(): Promise<this>;
169 queryMessages(options: {
170 beforeTime?: Date;
171 beforeMessageId?: string;
172 afterTime?: Date;
173 afterMessageId?: string;
174 limit?: number;
175 type?: number;
176 }): Promise<Array<Message>>;
177 queryMessages(options: {
178 startTime?: Date;
179 startMessageId?: string;
180 startClosed?: boolean;
181 endTime?: Date;
182 endMessageId?: string;
183 endClosed?: boolean;
184 limit?: number;
185 type?: number;
186 direction?: MessageQueryDirection;
187 }): Promise<Array<Message>>;
188 send<T extends Message>(
189 message: T,
190 options?: {
191 pushData?: Object;
192 priority?: MessagePriority;
193 receipt?: boolean;
194 transient?: boolean;
195 will?: boolean;
196 }
197 ): Promise<T>;
198 update<T extends Message>(message: MessagePointer, newMessage: T): Promise<T>;
199 recall(message: MessagePointer): Promise<RecalledMessage>;
200 count(): Promise<number>;
201 toJSON(): Object;
202 toFullJSON(): Object;
203}
204
205interface OperationFailureError extends Error {
206 clientIds: string[];
207 code?: number;
208 detail?: string;
209}
210
211interface PartiallySuccess {
212 successfulClientIds: string[];
213 failures: OperationFailureError[];
214}
215
216interface PagedQueryParams {
217 limit?: number;
218 next?: string;
219}
220
221interface PagedResults<T> {
222 results: T[];
223 next: string;
224}
225
226declare class PresistentConversation extends ConversationBase {
227 name: string;
228 creator: string;
229 createdAt: Date;
230 updatedAt: Date;
231 muted: boolean;
232 mutedMembers?: string[];
233 system: boolean;
234 transient: boolean;
235 get(key: string): any;
236 set(key: string, value: any): this;
237 save(): Promise<this>;
238 fetch(): Promise<this>;
239 mute(): Promise<this>;
240 unmute(): Promise<this>;
241 add(members: string[]): Promise<PartiallySuccess>;
242 join(): Promise<this>;
243 quit(): Promise<this>;
244 remove(clientIds: string[]): Promise<PartiallySuccess>;
245 muteMembers(clientIds: string[]): Promise<PartiallySuccess>;
246 unmuteMembers(clientIds: string[]): Promise<PartiallySuccess>;
247 queryMutedMembers(options?: PagedQueryParams): Promise<PagedResults<string>>;
248 blockMembers(clientIds: string[]): Promise<PartiallySuccess>;
249 unblockMembers(clientIds: string[]): Promise<PartiallySuccess>;
250 queryBlockedMembers(
251 options?: PagedQueryParams
252 ): Promise<PagedResults<string>>;
253}
254
255export class Conversation extends PresistentConversation {
256 getAllMemberInfo(options: {
257 noCache?: boolean;
258 }): Promise<ConversationMemberInfo[]>;
259 getMemberInfo(memberId: string): Promise<ConversationMemberInfo>;
260 updateMemberRole(
261 memberId: string,
262 role: ConversationMemberRole
263 ): Promise<this>;
264}
265export class ChatRoom extends PresistentConversation {}
266export class ServiceConversation extends PresistentConversation {
267 subscribe(): Promise<this>;
268 unsubscribe(): Promise<this>;
269}
270
271export class TemporaryConversation extends ConversationBase {
272 expiredAt: Date;
273 expired: Boolean;
274}
275
276export enum ConversationMemberRole {
277 OWNER,
278 MANAGER,
279 MEMBER,
280}
281
282declare class ConversationMemberInfo {
283 readonly conversationId: string;
284 readonly memberId: string;
285 readonly role: ConversationMemberRole;
286 readonly isOwner: boolean;
287 toJSON(): Object;
288}
289
290type MessagePointer = Message | { id: string; timestamp: Date | number };
291
292type Payload = Object | String | ArrayBuffer;
293
294export interface AVMessage {
295 getPayload(): Payload;
296}
297
298export class Message implements AVMessage {
299 constructor(content: any);
300 cid: string;
301 deliveredAt?: Date;
302 updatedAt: Date;
303 from: string;
304 id: string;
305 status: MessageStatus;
306 timestamp: Date;
307 readonly mentioned: Boolean;
308 mentionList: string[];
309 mentionedAll: Boolean;
310 static parse(json: Object, message: Message): Message;
311 static validate(): boolean;
312 getPayload(): Payload;
313 toJSON(): Object;
314 toFullJSON(): Object;
315 setMentionList(mentionList: string[]): this;
316 getMentionList(): string[];
317 mentionAll(): this;
318}
319
320// 二进制消息
321export class BinaryMessage extends Message {
322 constructor(buffer: ArrayBuffer);
323 buffer: ArrayBuffer;
324}
325
326// 富媒体消息
327export class TypedMessage extends Message {
328 static TYPE: number;
329 attributes: Object;
330 text: string;
331 readonly summary: string;
332 type: number;
333 getAttributes(): Object;
334 getText(): string;
335 setAttributes(attributes: Object): this;
336}
337
338// 内置文本消息类
339export class TextMessage extends TypedMessage {
340 constructor(text?: string);
341}
342
343export class RecalledMessage extends TypedMessage {}
344
345declare class EventEmitter<T> {
346 on<K extends keyof T>(
347 event: K,
348 listener: (payload?: T[K]) => any,
349 ...context: EventContext<K>
350 ): this;
351 on(evt: string, listener: Function): this;
352 once<K extends keyof T>(
353 event: K,
354 listener: (payload?: T[K]) => any,
355 ...context: EventContext<K>
356 ): this;
357 once(evt: string, listener: Function): this;
358 off<K extends keyof T>(evt: T | string, listener?: Function): this;
359 emit<K extends keyof T>(evt: T | string, ...args: any[]): boolean;
360}
361
362interface Middleware<T> {
363 (target: T): T;
364}
365interface Decorator<T> {
366 (target: T): void;
367}
368
369export interface Plugin {
370 name?: string;
371 beforeMessageParse?: Middleware<AVMessage>;
372 afterMessageParse?: Middleware<AVMessage>;
373 beforeMessageDispatch?: (message: AVMessage) => boolean;
374 messageClasses?: AVMessage[];
375 onConversationCreate?: Decorator<ConversationBase>;
376 onIMClientCreate?: Decorator<IMClient>;
377 onRealtimeCreate?: Decorator<Realtime>;
378}
379
380export enum MessagePriority {
381 LOW,
382 NORMAL,
383 HIGH,
384}
385
386export enum MessageStatus {
387 NONE,
388 SENDING,
389 SENT,
390 DELIVERED,
391 FAILED,
392}
393
394export enum MessageQueryDirection {
395 NEW_TO_OLD,
396 OLD_TO_NEW,
397}
398
399export enum ErrorCode {
400 CLOSE_NORMAL,
401 CLOSE_ABNORMAL,
402 APP_NOT_AVAILABLE,
403 SIGNATURE_FAILED,
404 INVALID_LOGIN,
405 SESSION_REQUIRED,
406 READ_TIMEOUT,
407 LOGIN_TIMEOUT,
408 FRAME_TOO_LONG,
409 INVALID_ORIGIN,
410 SESSION_CONFLICT,
411 SESSION_TOKEN_EXPIRED,
412 APP_QUOTA_EXCEEDED,
413 MESSAGE_SENT_QUOTA_EXCEEDED,
414 INTERNAL_ERROR,
415 CONVERSATION_API_FAILED,
416 CONVERSATION_SIGNATURE_FAILED,
417 CONVERSATION_NOT_FOUND,
418 CONVERSATION_FULL,
419 CONVERSATION_REJECTED_BY_APP,
420 CONVERSATION_UPDATE_FAILED,
421 CONVERSATION_READ_ONLY,
422 CONVERSATION_NOT_ALLOWED,
423 CONVERSATION_UPDATE_REJECTED,
424 CONVERSATION_QUERY_FAILED,
425 CONVERSATION_LOG_FAILED,
426 CONVERSATION_LOG_REJECTED,
427 SYSTEM_CONVERSATION_REQUIRED,
428 NORMAL_CONVERSATION_REQUIRED,
429 CONVERSATION_BLACKLISTED,
430 TRANSIENT_CONVERSATION_REQUIRED,
431 CONVERSATION_MEMBERSHIP_REQUIRED,
432 CONVERSATION_API_QUOTA_EXCEEDED,
433 TEMPORARY_CONVERSATION_EXPIRED,
434 INVALID_MESSAGING_TARGET,
435 MESSAGE_REJECTED_BY_APP,
436 MESSAGE_OWNERSHIP_REQUIRED,
437 MESSAGE_NOT_FOUND,
438 MESSAGE_UPDATE_REJECTED_BY_APP,
439 MESSAGE_EDIT_DISABLED,
440 MESSAGE_RECALL_DISABLED,
441
442 OWNER_PROMOTION_NOT_ALLOWED,
443}
444
445export enum Event {
446 DISCONNECT = 'disconnect',
447 RECONNECT = 'reconnect',
448 RETRY = 'retry',
449 SCHEDULE = 'schedule',
450 OFFLINE = 'offline',
451 ONLINE = 'online',
452
453 RECONNECT_ERROR = 'reconnecterror',
454 UNREAD_MESSAGES_COUNT_UPDATE = 'unreadmessagescountupdate',
455 CLOSE = 'close',
456 CONFLICT = 'conflict',
457 CONVERSATION_INFO_UPDATED = 'conversationinfoupdated',
458 UNHANDLED_MESSAGE = 'unhandledmessage',
459
460 INVITED = 'invited',
461 KICKED = 'kicked',
462 MEMBERS_JOINED = 'membersjoined',
463 MEMBERS_LEFT = 'membersleft',
464 MEMBER_INFO_UPDATED = 'memberinfoupdated',
465 BLOCKED = 'blocked',
466 UNBLOCKED = 'unblocked',
467 MEMBERS_BLOCKED = 'membersblocked',
468 MEMBERS_UNBLOCKED = 'membersunblocked',
469 MUTED = 'muted',
470 UNMUTED = 'unmuted',
471 MEMBERS_MUTED = 'membersmuted',
472 MEMBERS_UNMUTED = 'membersunmuted',
473 MESSAGE = 'message',
474
475 LAST_DELIVERED_AT_UPDATE = 'lastdeliveredatupdate',
476 LAST_READ_AT_UPDATE = 'lastreadatupdate',
477 MESSAGE_RECALL = 'messagerecall',
478 MESSAGE_UPDATE = 'messageupdate',
479 INFO_UPDATED = 'infoupdated',
480}
481
482declare interface ConnectionEvent {
483 [Event.DISCONNECT]: void;
484 [Event.RECONNECT]: void;
485 // Tuples in rest parameters is not supported until TS 3.0
486 // [Event.SCHEDULE]: [number, number];
487 [Event.RETRY]: number;
488 [Event.OFFLINE]: void;
489 [Event.ONLINE]: void;
490}
491
492declare interface SharedEvent {
493 [Event.INVITED]: { invitedBy: string };
494 [Event.KICKED]: { kickedBy: string };
495 [Event.MEMBERS_JOINED]: { members: string[]; invitedBy: string };
496 [Event.MEMBERS_LEFT]: { members: string[]; kickedBy: string };
497 [Event.MEMBER_INFO_UPDATED]: {
498 member: string;
499 memberInfo: ConversationMemberInfo;
500 updatedBy: string;
501 };
502 [Event.BLOCKED]: { blockedBy: string };
503 [Event.UNBLOCKED]: { unblockedBy: string };
504 [Event.MEMBERS_BLOCKED]: { blockedBy: string; members: string[] };
505 [Event.MEMBERS_UNBLOCKED]: { unblockedBy: string; members: string[] };
506 [Event.MUTED]: { mutedBy: string };
507 [Event.UNMUTED]: { unmutedBy: string };
508 [Event.MEMBERS_MUTED]: { mutedBy: string; members: string[] };
509 [Event.MEMBERS_UNMUTED]: { unmutedBy: string; members: string[] };
510 [Event.MESSAGE]: Message;
511 [Event.MESSAGE_RECALL]: Message;
512 [Event.MESSAGE_UPDATE]: Message;
513}
514
515declare interface ClientEvent extends ConnectionEvent {
516 [Event.RECONNECT_ERROR]: Error;
517 [Event.UNREAD_MESSAGES_COUNT_UPDATE]: ConversationBase[];
518 [Event.CLOSE]: { code: number; reason: string };
519 [Event.CONFLICT]: { reason: string };
520 [Event.CONVERSATION_INFO_UPDATED]: {
521 attributes: { [key: string]: any };
522 updatedBy: string;
523 };
524 [Event.UNHANDLED_MESSAGE]: any;
525}
526
527declare interface ConversationEvent extends SharedEvent {
528 [Event.LAST_DELIVERED_AT_UPDATE]: void;
529 [Event.LAST_READ_AT_UPDATE]: void;
530 [Event.INFO_UPDATED]: {
531 attributes: { [key: string]: any };
532 updatedBy: string;
533 };
534}
535
536declare interface OptionalContext {
537 [Event.MESSAGE_RECALL]: [PatchReason];
538 [Event.MESSAGE_UPDATE]: [PatchReason];
539}
540
541declare type EventContext<K> = K extends keyof OptionalContext
542 ? OptionalContext[K]
543 : [];
544
545declare interface PatchReason {
546 code: number;
547 detail?: string;
548}
549
550export function messageType(type: number): Function;
551export function messageField(fields: string[]): Function;
552
553interface Debug {
554 enable(): void;
555 enable(namespaces: string): void;
556 disable(): string;
557}
558export var debug: Debug;
559
560export as namespace AV;