realtime.d.ts 16 KB

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