threema.d.ts 16 KB

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