threema.d.ts 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690
  1. /**
  2. * This file is part of Threema Web.
  3. *
  4. * Threema Web is free software: you can redistribute it and/or modify it
  5. * under the terms of the GNU Affero General Public License as published by
  6. * the Free Software Foundation, either version 3 of the License, or (at
  7. * your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful, but
  10. * WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
  12. * General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU Affero General Public License
  15. * along with Threema Web. If not, see <http://www.gnu.org/licenses/>.
  16. */
  17. // Types used for the Threema Webclient.
  18. declare const angular: ng.IAngularStatic;
  19. declare namespace threema {
  20. interface Avatar {
  21. // Low resolution avatar path
  22. low?: string;
  23. // High resolution avatar path
  24. high?: string;
  25. }
  26. interface AvatarRegistry {
  27. contact: Avatar;
  28. group: Avatar;
  29. distributionList: Avatar;
  30. }
  31. /**
  32. * Messages that are sent through the secure data channel as encrypted msgpack bytes.
  33. */
  34. interface WireMessage {
  35. type: string;
  36. subType: string;
  37. args?: any;
  38. data?: any;
  39. }
  40. type WireMessageCallback = (message: WireMessage, result: any) => boolean;
  41. type MessageType = 'text' | 'image' | 'video' | 'audio' | 'location' | 'status' | 'ballot' | 'file';
  42. type MessageState = 'delivered' | 'read' | 'send-failed' | 'sent' | 'user-ack' | 'user-dec' | 'pending' | 'sending';
  43. type InitializationStep = 'client info' | 'conversations' | 'receivers';
  44. interface InitializationStepRoutine {
  45. requiredSteps: InitializationStep[];
  46. callback: any;
  47. }
  48. interface Thumbnail {
  49. img?: string;
  50. preview: string;
  51. width: number;
  52. height: number;
  53. }
  54. /**
  55. * A Threema chat message.
  56. */
  57. interface Message {
  58. type: MessageType;
  59. id: number;
  60. body: string;
  61. thumbnail?: Thumbnail;
  62. date: string;
  63. partnerId: string;
  64. isOutbox: boolean;
  65. isStatus: boolean;
  66. caption?: string;
  67. statusType?: 'text' | 'firstUnreadMessage';
  68. unread?: boolean;
  69. state?: MessageState;
  70. quote?: Quote;
  71. file?: FileInfo;
  72. video?: VideoInfo;
  73. audio?: AudioInfo;
  74. location?: LocationInfo;
  75. // only for temporary Messages
  76. temporaryId?: string;
  77. errorMessage?: string;
  78. }
  79. interface FileInfo {
  80. description: string;
  81. name: string;
  82. size: number;
  83. type: string;
  84. inApp: boolean;
  85. }
  86. interface VideoInfo {
  87. duration: number;
  88. size: number;
  89. }
  90. interface AudioInfo {
  91. duration: number;
  92. }
  93. interface LocationInfo {
  94. lat: number;
  95. lon: number;
  96. accuracy: number;
  97. address: string;
  98. poi: string;
  99. }
  100. /**
  101. * All possible receiver types.
  102. */
  103. type ReceiverType = 'me' | 'contact' | 'group' | 'distributionList';
  104. /**
  105. * Access Object for receivers
  106. */
  107. interface ReceiverAccess {
  108. canDelete?: boolean;
  109. }
  110. interface ContactReceiverAccess extends ReceiverAccess {
  111. canChangeAvatar: boolean;
  112. canChangeFirstName: boolean;
  113. canChangeLastName: boolean;
  114. }
  115. interface GroupReceiverAccess extends ReceiverAccess {
  116. canChangeAvatar: boolean;
  117. canChangeName: boolean;
  118. canChangeMembers?: boolean;
  119. canLeave?: boolean;
  120. canSync?: boolean;
  121. }
  122. interface DistributionListReceiverAccess extends ReceiverAccess {
  123. canChangeMembers?: boolean;
  124. }
  125. /**
  126. * A generic receiver.
  127. *
  128. * Note that the id is not unique for all receivers, only for all receivers
  129. * of a certain type. The primary key for a receiver is the tuple (type, id).
  130. */
  131. interface Receiver {
  132. type?: ReceiverType;
  133. id: string;
  134. displayName: string;
  135. color: string;
  136. avatar?: Avatar; // May be set if already fetched
  137. access: ReceiverAccess;
  138. locked?: boolean;
  139. visible?: boolean;
  140. }
  141. /**
  142. * A contact.
  143. */
  144. interface ContactReceiver extends Receiver {
  145. type?: 'contact' | 'me';
  146. publicNickname?: string;
  147. firstName?: string;
  148. lastName?: string;
  149. verificationLevel?: number;
  150. state: string;
  151. featureLevel: number | null;
  152. publicKey: ArrayBuffer;
  153. systemContact?: SystemContact;
  154. access: ContactReceiverAccess;
  155. }
  156. /**
  157. * Own contact.
  158. */
  159. interface MeReceiver extends ContactReceiver {
  160. type?: 'me';
  161. }
  162. /**
  163. * A group.
  164. */
  165. interface GroupReceiver extends Receiver {
  166. type?: 'group';
  167. disabled: boolean;
  168. members: string[];
  169. administrator: string;
  170. access: GroupReceiverAccess;
  171. }
  172. /**
  173. * A distribution list.
  174. */
  175. interface DistributionListReceiver extends Receiver {
  176. type?: 'distributionList';
  177. members: string[];
  178. access: DistributionListReceiverAccess;
  179. }
  180. interface SystemContact {
  181. emails?: SystemContactEmail[];
  182. phoneNumbers?: SystemContactPhone[];
  183. }
  184. interface SystemContactEmail {
  185. label: string;
  186. address: string;
  187. }
  188. interface SystemContactPhone {
  189. label: string;
  190. number: string;
  191. }
  192. /**
  193. * A conversation.
  194. */
  195. interface Conversation {
  196. type: ReceiverType;
  197. id: string;
  198. position: number;
  199. messageCount: number;
  200. unreadCount: number;
  201. latestMessage: Message;
  202. receiver?: Receiver;
  203. avatar?: ArrayBuffer;
  204. }
  205. /**
  206. * Connection state in the welcome dialog.
  207. *
  208. * States:
  209. *
  210. * - new: Initial state
  211. * - connecting: Connecting to signaling server
  212. * - push: When trying to reconnect, waiting for push notification to arrive
  213. * - manual_start: When trying to reconnect, waiting for manual session start
  214. * - waiting: Waiting for new-responder message from signaling server
  215. * - peer_handshake: Doing SaltyRTC handshake with the peer
  216. * - loading: Loading initial data
  217. * - done: Initial loading is finished
  218. * - closed: Connection is closed
  219. *
  220. */
  221. type ConnectionBuildupState = 'new' | 'connecting' | 'push' | 'manual_start' | 'waiting'
  222. | 'peer_handshake' | 'loading' | 'done' | 'closed';
  223. /**
  224. * Connection state of the WebRTC peer connection.
  225. */
  226. type RTCConnectionState = 'new' | 'connecting' | 'connected' | 'disconnected';
  227. /**
  228. * Connection state of the WebRTC peer connection.
  229. */
  230. type GlobalConnectionState = 'ok' | 'warning' | 'error';
  231. /**
  232. * Type of message to be sent to a receiver.
  233. */
  234. type MessageContentType = 'text' | 'file';
  235. /**
  236. * Possible message types sent to the receiver.
  237. */
  238. type MessageDataType = 'text' | 'file';
  239. interface MessageData {
  240. // optional quote object
  241. quote?: Quote;
  242. }
  243. /**
  244. * Payload for a file message.
  245. */
  246. interface FileMessageData extends MessageData {
  247. // File name
  248. name: string;
  249. // File MIME type
  250. fileType: string;
  251. // Size in bytes
  252. size: number;
  253. // File bytes
  254. data: ArrayBuffer;
  255. // Caption string
  256. caption?: String;
  257. // Send as file message
  258. sendAsFile?: boolean;
  259. }
  260. /**
  261. * Payload for a text message.
  262. */
  263. interface TextMessageData extends MessageData {
  264. // Text to be sent
  265. text: string;
  266. }
  267. /**
  268. * The $stateParams format used for the welcome controller.
  269. */
  270. interface WelcomeStateParams extends ng.ui.IStateParamsService {
  271. initParams: null | {keyStore: saltyrtc.KeyStore, peerTrustedKey: Uint8Array};
  272. }
  273. interface CreateReceiverStateParams extends ng.ui.IStateParamsService {
  274. type: string;
  275. initParams: null | {identity: null};
  276. }
  277. /**
  278. * State service.
  279. */
  280. interface StateService {
  281. // WebRTC states
  282. signalingConnectionState: saltyrtc.SignalingState;
  283. rtcConnectionState: RTCConnectionState;
  284. // Global connection state
  285. state: 'ok' | 'warning' | 'error';
  286. stage: 'signaling' | 'rtc';
  287. wasConnected: boolean;
  288. // Connection buildup
  289. connectionBuildupState: ConnectionBuildupState;
  290. progress: number;
  291. slowConnect: boolean;
  292. // Update states
  293. updateSignalingConnectionState(state: saltyrtc.SignalingState): void;
  294. updateRtcConnectionState(state: RTCConnectionState): void;
  295. updateConnectionBuildupState(state: ConnectionBuildupState): void;
  296. reset(): void;
  297. }
  298. /**
  299. * Notification service.
  300. */
  301. interface NotificationService {
  302. requestNotificationPermission(): void;
  303. showNotification(id: string, title: string, body: string,
  304. avatar: string | null, clickCallback: any | null): boolean;
  305. clearCache(tag: string): void;
  306. }
  307. interface MessageService {
  308. getAccess(message: Message, receiver: Receiver): MessageAccess;
  309. createTemporary(receiver: Receiver, type: string, messageData: MessageData): Message;
  310. showStatusIcon(message: Message, receiver: Receiver): boolean;
  311. getFileName(message: Message): string;
  312. }
  313. interface MessageAccess {
  314. quote: boolean;
  315. ack: boolean;
  316. dec: boolean;
  317. delete: boolean;
  318. download: boolean;
  319. copy: boolean;
  320. }
  321. interface Quote {
  322. identity: string;
  323. text: string;
  324. }
  325. interface Identity {
  326. identity: string;
  327. publicNickname: String;
  328. publicKey: ArrayBuffer;
  329. fingerprint: string;
  330. }
  331. interface TrustedKeyStoreData {
  332. ownPublicKey: Uint8Array;
  333. ownSecretKey: Uint8Array;
  334. peerPublicKey: Uint8Array;
  335. pushToken: string | null;
  336. }
  337. interface TrustedKeyStoreService {
  338. blocked: boolean;
  339. storeTrustedKey(ownPublicKey: Uint8Array, ownSecretKey: Uint8Array, peerPublicKey: Uint8Array,
  340. pushToken: string | null, password: string): void;
  341. hasTrustedKey(): boolean;
  342. retrieveTrustedKey(password: string): TrustedKeyStoreData;
  343. clearTrustedKey(): void;
  344. }
  345. interface PushService {
  346. init(pushToken: string): void;
  347. reset(): void;
  348. isAvailable(): boolean;
  349. sendPush(session: Uint8Array): Promise<boolean>;
  350. }
  351. interface BrowserInfo {
  352. chrome: boolean;
  353. firefox: boolean;
  354. msie: boolean;
  355. opera: boolean;
  356. safari: boolean;
  357. version: string;
  358. textInfo: string;
  359. }
  360. interface BrowserService {
  361. getBrowser(): BrowserInfo;
  362. isVisible(): boolean;
  363. }
  364. interface TitleService {
  365. updateUnreadCount(count: number): void;
  366. }
  367. interface FingerPrintService {
  368. generate(publicKey: ArrayBuffer): string;
  369. }
  370. interface ContactService {
  371. requiredDetails(contactReceiver: ContactReceiver): Promise<ContactReceiver>;
  372. }
  373. interface ControllerModelService {
  374. contact(receiver: ContactReceiver, mode: any): ControllerModel;
  375. group(receiver: GroupReceiver, mode: any): ControllerModel;
  376. distributionList(receiver: DistributionListReceiver, mode: any): ControllerModel;
  377. }
  378. interface QrCodeService {
  379. buildQrCodePayload(initiatorKey: Uint8Array, authToken: Uint8Array, serverKey: Uint8Array | null,
  380. host: string, port: number,
  381. persistent: boolean): string;
  382. }
  383. interface PromiseCallbacks {
  384. resolve: (arg: any) => void;
  385. reject: (arg: any) => void;
  386. }
  387. interface PromiseRequestResult<T> {
  388. success: boolean;
  389. message?: string;
  390. data?: T;
  391. }
  392. interface ControllerModel {
  393. subject: string;
  394. isLoading: boolean;
  395. save(): any;
  396. isValid(): boolean;
  397. canEdit(): boolean;
  398. getMode(): number;
  399. setOnRemoved(callback: any): void;
  400. }
  401. interface AvatarControllerModel {
  402. onChangeAvatar: (image: ArrayBuffer) => void;
  403. getAvatar(): ArrayBuffer | null;
  404. }
  405. interface Alert {
  406. source: string;
  407. type: string;
  408. message: string;
  409. }
  410. interface ReceiverListener {
  411. onRemoved(receiver: Receiver);
  412. }
  413. interface Config {
  414. SELF_HOSTED: boolean;
  415. SALTYRTC_PORT: number;
  416. SALTYRTC_SERVER_KEY: string | null;
  417. SALTYRTC_HOST: string | null;
  418. SALTYRTC_HOST_PREFIX: string | null;
  419. SALTYRTC_HOST_SUFFIX: string | null;
  420. ICE_SERVERS: RTCIceServer[];
  421. PUSH_URL: string;
  422. }
  423. interface BrowserMinVersions {
  424. FF: number;
  425. CHROME: number;
  426. OPERA: number;
  427. }
  428. interface MimeService {
  429. isImage(mimeType: string): boolean;
  430. isAudio(mimeType: string): boolean;
  431. isVideo(mimeType: string): boolean;
  432. getLabel(mimeType: string): string;
  433. getIconUrl(mimeType: string): string;
  434. }
  435. interface ReceiverService {
  436. setActive(activeReceiver: Receiver): void;
  437. getActive(): Receiver;
  438. isConversationActive(conversation: Conversation): boolean;
  439. compare(a: Conversation | Receiver, b: Conversation| Receiver): boolean;
  440. isContact(receiver: Receiver): boolean;
  441. isGroup(receiver: Receiver): boolean;
  442. isDistributionList(receiver: Receiver): boolean;
  443. isBusinessContact(receiver: Receiver): boolean;
  444. }
  445. interface SettingsService {
  446. storeUntrustedKeyValuePair(key: string, value: string): void;
  447. retrieveUntrustedKeyValuePair(key: string): string;
  448. }
  449. interface WebClientDefault {
  450. getAvatar(type: string, highResolution: boolean): string;
  451. }
  452. interface WebClientService {
  453. salty: saltyrtc.SaltyRTC;
  454. messages: Container.Messages;
  455. conversations: Container.Conversations;
  456. receivers: Container.Receivers;
  457. alerts: Alert[];
  458. defaults: WebClientDefault;
  459. receiverListener: ReceiverListener[];
  460. me: MeReceiver;
  461. contacts: Map<string, ContactReceiver>;
  462. groups: Map<string, GroupReceiver>;
  463. distributionLists: Map<string, DistributionListReceiver>;
  464. typing: Container.Typing;
  465. buildQrCodePayload(persistent: boolean): string;
  466. init(keyStore?: saltyrtc.KeyStore, peerTrustedKey?: Uint8Array, resetField?: boolean): void;
  467. start(): ng.IPromise<any>;
  468. stop(requestedByUs: boolean, deleteStoredData?: boolean, resetPush?: boolean, redirect?: boolean): void;
  469. registerInitializationStep(name: string): void;
  470. setReceiverListener(listener: ReceiverListener): void;
  471. requestClientInfo(): void;
  472. requestReceivers(): void;
  473. requestConversations(): void;
  474. requestMessages(receiver: Receiver, reloadExisting?: boolean): number;
  475. requestAvatar(receiver: Receiver, highResolution: boolean): Promise<any>;
  476. requestThumbnail(receiver: Receiver, message: Message): Promise<any>;
  477. requestBlob(msgId: number, receiver: Receiver): Promise<ArrayBuffer>;
  478. requestRead(receiver, newestMessageId: number): void;
  479. requestContactDetail(contactReceiver: ContactReceiver): Promise<any>;
  480. sendMessage(receiver, type: MessageContentType, message: MessageData): Promise<Promise<any>>;
  481. ackMessage(receiver, message: Message, acknowledged?: boolean): void;
  482. deleteMessage(receiver, message: Message): void;
  483. sendMeIsTyping(receiver, isTyping: boolean): void;
  484. sendKeyPersisted(): void;
  485. addContact(threemaId: String): Promise<ContactReceiver>;
  486. modifyContact(threemaId: String, firstName: String, lastName: String, avatar?: ArrayBuffer):
  487. Promise<ContactReceiver>;
  488. createGroup(members: String[], name: String, avatar?: ArrayBuffer): Promise<GroupReceiver>;
  489. modifyGroup(id: string, members: String[], name: String, avatar?: ArrayBuffer): Promise<GroupReceiver>;
  490. leaveGroup(group: GroupReceiver): Promise<any>;
  491. deleteGroup(group: GroupReceiver): Promise<any>;
  492. syncGroup(group: GroupReceiver): Promise<any>;
  493. createDistributionList(members: String[], name: String): Promise<DistributionListReceiver>;
  494. modifyDistributionList(id: string, members: String[], name: String): Promise<DistributionListReceiver>;
  495. deleteDistributionList(distributionList: DistributionListReceiver): Promise<any>;
  496. isTyping(receiver: ContactReceiver): boolean;
  497. getMyIdentity(): Identity;
  498. getQuote(receiver: Receiver): Quote;
  499. setQuote(receiver: Receiver, message?: Message): void;
  500. setDraft(receiver: Receiver, message: string): void;
  501. getDraft(receiver: Receiver): string;
  502. setPassword(password: string): void;
  503. clearCache(): void;
  504. getMaxTextLength(): number;
  505. }
  506. interface ControllerService {
  507. setControllerName(name: string): void;
  508. getControllerName(): string;
  509. }
  510. interface StringService {
  511. /**
  512. * create chunks of a string by counting the used bytes
  513. * @param str
  514. * @param byteLength
  515. * @param offset
  516. */
  517. byteChunk(str: string, byteLength: number, offset: number): string[];
  518. }
  519. namespace Container {
  520. interface ReceiverData {
  521. me: MeReceiver;
  522. contacts: ContactReceiver[];
  523. groups: GroupReceiver[];
  524. distributionLists: DistributionListReceiver[];
  525. }
  526. interface Converter {
  527. unicodeToEmoji(message);
  528. addReceiverToConversation(receivers: Receivers);
  529. }
  530. interface Filters {
  531. hasData(receivers);
  532. hasContact(contacts);
  533. isValidMessage(contacts);
  534. }
  535. interface Receivers {
  536. me: MeReceiver;
  537. contacts: Map<string, ContactReceiver>;
  538. groups: Map<string, GroupReceiver>;
  539. distributionLists: Map<string, DistributionListReceiver>;
  540. get(receiverType: ReceiverType): Receiver | Map<string, Receiver>;
  541. getData(receiver: Receiver): Receiver | null;
  542. set(data: ReceiverData): void;
  543. setMe(data: MeReceiver): void;
  544. setContacts(data: ContactReceiver[]): void;
  545. setGroups(data: GroupReceiver[]): void;
  546. setDistributionLists(data: DistributionListReceiver[]): void;
  547. extend(receiverType: ReceiverType, data: Receiver): Receiver;
  548. extendDistributionList(data: DistributionListReceiver): DistributionListReceiver;
  549. extendGroup(data: GroupReceiver): GroupReceiver;
  550. extendMe(data: MeReceiver): MeReceiver;
  551. extendContact(data: ContactReceiver): ContactReceiver;
  552. }
  553. interface Conversations {
  554. get(): Conversation[];
  555. set(data: Conversation[]): void;
  556. add(conversation: Conversation): void;
  557. updateOrAdd(conversation: Conversation): void;
  558. remove(conversation: Conversation): void;
  559. setFilter(filter: (data: Conversation[]) => Conversation[]): void;
  560. setConverter(converter: (data: Conversation) => Conversation): void;
  561. }
  562. interface Messages {
  563. converter: (data: Message) => Message;
  564. getList(receiver: Receiver): Message[];
  565. clear($scope: ng.IScope): void;
  566. clearReceiverMessages(receiver: Receiver): Number;
  567. contains(receiver: Receiver): boolean;
  568. hasMore(receiver: Receiver): boolean;
  569. setMore(receiver: Receiver, more: boolean): void;
  570. getReferenceMsgId(receiver: Receiver): number;
  571. isRequested(receiver: Receiver): boolean;
  572. setRequested(receiver: Receiver): void;
  573. clearRequested(receiver): void;
  574. addNewer(receiver: Receiver, messages: Message[]): void;
  575. addOlder(receiver: Receiver, messages: Message[]): void;
  576. update(receiver: Receiver, message: Message): boolean;
  577. setThumbnail(receiver: Receiver, messageId: number, thumbnailImage: string): boolean;
  578. remove(receiver: Receiver, messageId: number): boolean;
  579. removeTemporary(receiver: Receiver, temporaryMessageId: string): boolean;
  580. bindTemporaryToMessageId(receiver: Receiver, temporaryId: string, messageId: number): boolean;
  581. notify(receiver: Receiver, $scope: ng.IScope): void;
  582. register(receiver: Receiver, $scope: ng.IScope, callback: any): Message[];
  583. updateFirstUnreadMessage(receiver: Receiver);
  584. }
  585. interface Typing {
  586. setTyping(receiver: ContactReceiver): void;
  587. unsetTyping(receiver: ContactReceiver): void;
  588. isTyping(receiver: ContactReceiver): boolean;
  589. }
  590. interface Drafts {
  591. setQuote(receiver: Receiver, quote: Quote): void;
  592. removeQuote(receiver: Receiver): void;
  593. getQuote(receiver: Receiver): Quote;
  594. setText(receiver: Receiver, draftMessage: string): void;
  595. removeText(receiver: Receiver): void;
  596. getText(receiver: Receiver): string;
  597. }
  598. interface Factory {
  599. Converter: Container.Converter;
  600. Filters: Container.Filters;
  601. createReceivers: () => Receivers;
  602. createConversations: () => Conversations;
  603. createMessages: () => Messages;
  604. createTyping: () => Typing;
  605. createDrafts: () => Drafts;
  606. }
  607. }
  608. }