threema.d.ts 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615
  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. declare const angular: ng.IAngularStatic;
  18. declare namespace threema {
  19. interface Avatar {
  20. // Low resolution avatar path
  21. low?: string;
  22. // High resolution avatar path
  23. high?: string;
  24. }
  25. interface AvatarRegistry {
  26. contact: Avatar;
  27. group: Avatar;
  28. distributionList: Avatar;
  29. }
  30. /**
  31. * Messages that are sent through the secure data channel as encrypted msgpack bytes.
  32. */
  33. interface WireMessage {
  34. type: string;
  35. subType: string;
  36. args?: any;
  37. data?: any;
  38. }
  39. type MessageType = 'text' | 'image' | 'video' | 'audio' | 'location' | 'contact' |
  40. 'status' | 'ballot' | 'file' | 'voipStatus' | 'unknown';
  41. type MessageState = 'delivered' | 'read' | 'send-failed' | 'sent' | 'user-ack' |
  42. 'user-dec' | 'pending' | 'sending';
  43. const enum InitializationStep {
  44. ClientInfo = 'client info',
  45. Conversations = 'conversations',
  46. Receivers = 'receivers',
  47. }
  48. interface InitializationStepRoutine {
  49. requiredSteps: InitializationStep[];
  50. callback: any;
  51. }
  52. interface Thumbnail {
  53. img?: string;
  54. preview: string;
  55. width: number;
  56. height: number;
  57. }
  58. /**
  59. * A Threema chat message.
  60. */
  61. interface Message {
  62. type: MessageType;
  63. id: string;
  64. body: string;
  65. thumbnail?: Thumbnail;
  66. date?: number;
  67. sortKey: number;
  68. partnerId: string;
  69. isOutbox: boolean;
  70. isStatus: boolean;
  71. caption?: string;
  72. statusType?: 'text' | 'firstUnreadMessage';
  73. unread?: boolean;
  74. state?: MessageState;
  75. quote?: Quote;
  76. file?: FileInfo;
  77. video?: VideoInfo;
  78. audio?: AudioInfo;
  79. voip?: VoipStatusInfo;
  80. location?: LocationInfo;
  81. // only for temporary Messages
  82. temporaryId?: string;
  83. errorMessage?: string;
  84. }
  85. interface FileInfo {
  86. description: string;
  87. name: string;
  88. size: number;
  89. type: string;
  90. inApp: boolean;
  91. }
  92. interface VideoInfo {
  93. duration: number;
  94. size: number;
  95. }
  96. interface AudioInfo {
  97. duration: number;
  98. }
  99. interface VoipStatusInfo {
  100. status: number;
  101. }
  102. interface LocationInfo {
  103. lat: number;
  104. lon: number;
  105. accuracy: number;
  106. address: string;
  107. poi: string;
  108. }
  109. /**
  110. * All possible receiver types.
  111. */
  112. type ReceiverType = 'me' | 'contact' | 'group' | 'distributionList';
  113. /**
  114. * Access Object for receivers
  115. */
  116. interface ReceiverAccess {
  117. canDelete?: boolean;
  118. }
  119. interface ContactReceiverAccess extends ReceiverAccess {
  120. canChangeAvatar: boolean;
  121. canChangeFirstName: boolean;
  122. canChangeLastName: boolean;
  123. }
  124. interface GroupReceiverAccess extends ReceiverAccess {
  125. canChangeAvatar: boolean;
  126. canChangeName: boolean;
  127. canChangeMembers?: boolean;
  128. canLeave?: boolean;
  129. canSync?: boolean;
  130. }
  131. interface DistributionListReceiverAccess extends ReceiverAccess {
  132. canChangeMembers?: boolean;
  133. }
  134. const enum IdentityType {
  135. Regular = 0,
  136. Work,
  137. }
  138. /**
  139. * The base class for a receiver. Only type and id.
  140. */
  141. interface BaseReceiver {
  142. id: string;
  143. type: ReceiverType;
  144. }
  145. /**
  146. * A generic receiver.
  147. *
  148. * Note that the id is not unique for all receivers, only for all receivers
  149. * of a certain type. The primary key for a receiver is the tuple (type, id).
  150. */
  151. interface Receiver extends BaseReceiver {
  152. // The display name
  153. displayName: string;
  154. // The color used for the avatar
  155. color: string;
  156. // The avatar, may be set if already fetched
  157. avatar?: Avatar;
  158. // Permissions towards this receiver
  159. access: ReceiverAccess;
  160. // Whether the chat with this receiver is locked.
  161. locked?: boolean;
  162. // Whether the chat with this receiver is visible.
  163. visible?: boolean;
  164. }
  165. /**
  166. * A contact.
  167. */
  168. interface ContactReceiver extends Receiver {
  169. // Flag indicating whether this is the own profile or another contact
  170. type: 'contact' | 'me';
  171. // Public nickname, if set
  172. publicNickname?: string;
  173. // First name, if set
  174. firstName?: string;
  175. // Last name, if set
  176. lastName?: string;
  177. // Verification level integer (1-3)
  178. verificationLevel?: number;
  179. // Feature level (0-3)
  180. featureLevel: number | null;
  181. // The identity state
  182. state: 'ACTIVE' | 'INACTIVE';
  183. // The Threema public key
  184. publicKey: ArrayBuffer;
  185. // System confact information
  186. systemContact?: SystemContact;
  187. // Permissions towards this contact
  188. access: ContactReceiverAccess;
  189. // Whether this is a contact from the same Threema Work package.
  190. // Only relevant for Threema Work users.
  191. isWork?: boolean;
  192. // Whether this contact is blocked
  193. isBlocked?: boolean;
  194. // The identity type.
  195. // 0 - Regular Threema user.
  196. // 1 - Threema Work user.
  197. identityType?: IdentityType;
  198. }
  199. /**
  200. * Own contact.
  201. */
  202. interface MeReceiver extends ContactReceiver {
  203. type: 'me';
  204. }
  205. /**
  206. * A group.
  207. */
  208. interface GroupReceiver extends Receiver {
  209. type: 'group';
  210. disabled: boolean;
  211. members: string[];
  212. administrator: string;
  213. access: GroupReceiverAccess;
  214. createdAt?: string;
  215. }
  216. /**
  217. * A distribution list.
  218. */
  219. interface DistributionListReceiver extends Receiver {
  220. type: 'distributionList';
  221. members: string[];
  222. access: DistributionListReceiverAccess;
  223. }
  224. interface SystemContact {
  225. emails?: SystemContactEmail[];
  226. phoneNumbers?: SystemContactPhone[];
  227. }
  228. interface SystemContactEmail {
  229. label: string;
  230. address: string;
  231. }
  232. interface SystemContactPhone {
  233. label: string;
  234. number: string;
  235. }
  236. /**
  237. * A conversation.
  238. */
  239. interface Conversation {
  240. type: ReceiverType;
  241. id: string;
  242. position: number;
  243. messageCount: number;
  244. unreadCount: number;
  245. latestMessage: Message;
  246. receiver?: Receiver;
  247. avatar?: ArrayBuffer;
  248. isMuted?: boolean;
  249. isStarred?: boolean;
  250. }
  251. /**
  252. * Connection state in the welcome dialog.
  253. *
  254. * States:
  255. *
  256. * - new: Initial state
  257. * - connecting: Connecting to signaling server
  258. * - push: When trying to reconnect, waiting for push notification to arrive
  259. * - manual_start: When trying to reconnect, waiting for manual session start
  260. * - already_connected: When the user is already connected in another tab or window
  261. * - waiting: Waiting for new-responder message from signaling server
  262. * - peer_handshake: Doing SaltyRTC handshake with the peer
  263. * - loading: Loading initial data
  264. * - done: Initial loading is finished
  265. * - closed: Connection is closed
  266. *
  267. */
  268. type ConnectionBuildupState = 'new' | 'connecting' | 'push' | 'manual_start' | 'already_connected'
  269. | 'waiting' | 'peer_handshake' | 'loading' | 'done' | 'closed';
  270. interface ConnectionBuildupStateChange {
  271. state: ConnectionBuildupState;
  272. prevState: ConnectionBuildupState;
  273. }
  274. /**
  275. * Connection state of the WebRTC peer connection.
  276. */
  277. type RTCConnectionState = 'new' | 'connecting' | 'connected' | 'disconnected';
  278. /**
  279. * Connection state of the WebRTC peer connection.
  280. */
  281. type GlobalConnectionState = 'ok' | 'warning' | 'error';
  282. /**
  283. * Type of message to be sent to a receiver.
  284. */
  285. type MessageContentType = 'text' | 'file';
  286. interface MessageData {
  287. // optional quote object
  288. quote?: Quote;
  289. }
  290. /**
  291. * Payload for a file message.
  292. */
  293. interface FileMessageData extends MessageData {
  294. // File name
  295. name: string;
  296. // File MIME type
  297. fileType: string;
  298. // Size in bytes
  299. size: number;
  300. // File bytes
  301. data: ArrayBuffer;
  302. // Caption string
  303. caption?: string;
  304. // Send as file message
  305. sendAsFile?: boolean;
  306. }
  307. /**
  308. * Payload for a text message.
  309. */
  310. interface TextMessageData extends MessageData {
  311. // Text to be sent
  312. text: string;
  313. }
  314. /**
  315. * The $stateParams format used for the welcome controller.
  316. */
  317. interface WelcomeStateParams extends ng.ui.IStateParamsService {
  318. initParams: null | {keyStore: saltyrtc.KeyStore, peerTrustedKey: Uint8Array};
  319. }
  320. interface CreateReceiverStateParams extends ng.ui.IStateParamsService {
  321. type: ReceiverType;
  322. initParams: null | {identity: string | null};
  323. }
  324. interface ConversationStateParams extends ng.ui.IStateParamsService {
  325. type: ReceiverType;
  326. id: string;
  327. initParams: null | {text: string | null};
  328. }
  329. interface Quote {
  330. identity: string;
  331. text: string;
  332. }
  333. interface Identity {
  334. identity: string;
  335. publicNickname: string;
  336. publicKey: ArrayBuffer;
  337. fingerprint: string;
  338. }
  339. interface TrustedKeyStoreData {
  340. ownPublicKey: Uint8Array;
  341. ownSecretKey: Uint8Array;
  342. peerPublicKey: Uint8Array;
  343. pushToken: string | null;
  344. }
  345. interface BrowserInfo {
  346. chrome: boolean;
  347. firefox: boolean;
  348. msie: boolean;
  349. opera: boolean;
  350. safari: boolean;
  351. version: string;
  352. textInfo: string;
  353. }
  354. interface PromiseCallbacks {
  355. resolve: (arg: any) => void;
  356. reject: (arg: any) => void;
  357. }
  358. interface PromiseRequestResult<T> {
  359. success: boolean;
  360. error?: string;
  361. data?: T;
  362. }
  363. interface ControllerModel {
  364. subject: string;
  365. isLoading: boolean;
  366. save(): any;
  367. clean(ev: any): any;
  368. isValid(): boolean;
  369. canView(): boolean;
  370. canEdit(): boolean;
  371. canClean(): boolean;
  372. getMode(): number;
  373. setOnRemoved(callback: any): void;
  374. onChangeMembers(identities: string[]): void;
  375. getMembers(): string[];
  376. }
  377. interface Alert {
  378. source: string;
  379. type: string;
  380. message: string;
  381. }
  382. interface ReceiverListener {
  383. onRemoved(receiver: Receiver);
  384. }
  385. interface Config {
  386. SELF_HOSTED: boolean;
  387. PREV_PROTOCOL_LAST_VERSION: string | null;
  388. SALTYRTC_PORT: number;
  389. SALTYRTC_SERVER_KEY: string | null;
  390. SALTYRTC_HOST: string | null;
  391. SALTYRTC_HOST_PREFIX: string | null;
  392. SALTYRTC_HOST_SUFFIX: string | null;
  393. ICE_SERVERS: RTCIceServer[];
  394. PUSH_URL: string;
  395. DEBUG: boolean;
  396. MSG_DEBUGGING: boolean;
  397. MSGPACK_DEBUGGING: boolean;
  398. ICE_DEBUGGING: boolean;
  399. }
  400. interface InitialConversationData {
  401. draft: string;
  402. initialText: string;
  403. }
  404. interface BrowserMinVersions {
  405. FF: number;
  406. CHROME: number;
  407. OPERA: number;
  408. }
  409. interface BatteryStatus {
  410. percent: number;
  411. isCharging: boolean;
  412. }
  413. interface MyAccount {
  414. identity: string;
  415. publicKey: ArrayBuffer;
  416. publicNickname: string;
  417. fingerprint?: string;
  418. }
  419. interface ClientInfo {
  420. device: string;
  421. isWork: boolean;
  422. myPushToken?: string;
  423. maxGroupSize?: number;
  424. myAccount: MyAccount;
  425. }
  426. interface Mention {
  427. identity: string;
  428. query: string;
  429. isAll: boolean;
  430. }
  431. interface WordResult {
  432. // The trimmed word
  433. word: string;
  434. // The length of the untrimmed word
  435. realLength: number;
  436. }
  437. const enum ChosenTask {
  438. None = 'none',
  439. WebRTC = 'webrtc',
  440. RelayedData = 'relayed-data',
  441. }
  442. namespace Container {
  443. interface ReceiverData {
  444. me: MeReceiver;
  445. contacts: ContactReceiver[];
  446. groups: GroupReceiver[];
  447. distributionLists: DistributionListReceiver[];
  448. }
  449. interface Converter {
  450. unicodeToEmoji(message);
  451. addReceiverToConversation(receivers: Receivers);
  452. }
  453. interface Filters {
  454. hasData(receivers);
  455. hasContact(contacts);
  456. isValidMessage(contacts);
  457. }
  458. interface Receivers {
  459. me: MeReceiver;
  460. contacts: Map<string, ContactReceiver>;
  461. groups: Map<string, GroupReceiver>;
  462. distributionLists: Map<string, DistributionListReceiver>;
  463. get(receiverType: ReceiverType): Receiver | Map<string, Receiver>;
  464. getData(receiver: BaseReceiver): Receiver | null;
  465. set(data: ReceiverData): void;
  466. setMe(data: MeReceiver): void;
  467. setContacts(data: ContactReceiver[]): void;
  468. setGroups(data: GroupReceiver[]): void;
  469. setDistributionLists(data: DistributionListReceiver[]): void;
  470. extend(receiverType: ReceiverType, data: Receiver): Receiver;
  471. extendDistributionList(data: DistributionListReceiver): DistributionListReceiver;
  472. extendGroup(data: GroupReceiver): GroupReceiver;
  473. extendMe(data: MeReceiver): MeReceiver;
  474. extendContact(data: ContactReceiver): ContactReceiver;
  475. }
  476. interface Conversations {
  477. get(): Conversation[];
  478. set(data: Conversation[]): void;
  479. find(pattern: Conversation | Receiver): Conversation | null;
  480. add(conversation: Conversation): void;
  481. updateOrAdd(conversation: Conversation): void;
  482. remove(conversation: Conversation): void;
  483. setFilter(filter: (data: Conversation[]) => Conversation[]): void;
  484. setConverter(converter: (data: Conversation) => Conversation): void;
  485. }
  486. interface Messages {
  487. converter: (data: Message) => Message;
  488. getList(receiver: Receiver): Message[];
  489. clear($scope: ng.IScope): void;
  490. clearReceiverMessages(receiver: Receiver): number;
  491. contains(receiver: Receiver): boolean;
  492. hasMore(receiver: Receiver): boolean;
  493. setMore(receiver: Receiver, more: boolean): void;
  494. getReferenceMsgId(receiver: Receiver): string;
  495. isRequested(receiver: Receiver): boolean;
  496. setRequested(receiver: Receiver): void;
  497. clearRequested(receiver): void;
  498. addNewer(receiver: Receiver, messages: Message[]): void;
  499. addOlder(receiver: Receiver, messages: Message[]): void;
  500. update(receiver: Receiver, message: Message): boolean;
  501. setThumbnail(receiver: Receiver, messageId: string, thumbnailImage: string): boolean;
  502. remove(receiver: Receiver, messageId: string): boolean;
  503. removeTemporary(receiver: Receiver, temporaryMessageId: string): boolean;
  504. bindTemporaryToMessageId(receiver: Receiver, temporaryId: string, messageId: string): boolean;
  505. notify(receiver: Receiver, $scope: ng.IScope): void;
  506. register(receiver: Receiver, $scope: ng.IScope, callback: any): Message[];
  507. updateFirstUnreadMessage(receiver: Receiver);
  508. }
  509. interface Typing {
  510. setTyping(receiver: ContactReceiver): void;
  511. unsetTyping(receiver: ContactReceiver): void;
  512. isTyping(receiver: ContactReceiver): boolean;
  513. }
  514. interface Drafts {
  515. setQuote(receiver: Receiver, quote: Quote): void;
  516. removeQuote(receiver: Receiver): void;
  517. getQuote(receiver: Receiver): Quote;
  518. setText(receiver: Receiver, draftMessage: string): void;
  519. removeText(receiver: Receiver): void;
  520. getText(receiver: Receiver): string;
  521. }
  522. interface Factory {
  523. Converter: Container.Converter;
  524. Filters: Container.Filters;
  525. createReceivers: () => Receivers;
  526. createConversations: () => Conversations;
  527. createMessages: () => Messages;
  528. createTyping: () => Typing;
  529. createDrafts: () => Drafts;
  530. }
  531. }
  532. }