blob: 1a32f4bd3171502638cd5a5cc34b02cd21177d64 [file] [log] [blame]
Adrien Béraud6ecaa402021-04-06 17:37:25 -04001/*
2 * Copyright (c) 2017-2021 Savoir-faire Linux Inc.
3 *
4 * Author: Adrien Béraud <adrien.beraud@savoirfairelinux.com>
5 * Author: Asad Salman <me@asad.co>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 */
Adrien Béraude74741b2021-04-19 13:22:54 -040020"use strict"
Adrien Béraud947e8792021-04-15 18:32:44 -040021
Adrien Béraude74741b2021-04-19 13:22:54 -040022import Account from './model/Account.js'
23import Conversation from './model/Conversation.js'
simonc7d52452022-09-23 02:09:42 -040024import {createRequire} from 'module';
25import path from "path";
26
Adrien Béraude74741b2021-04-19 13:22:54 -040027const require = createRequire(import.meta.url);
Adrien Béraud6ecaa402021-04-06 17:37:25 -040028
Adrien Béraud6ecaa402021-04-06 17:37:25 -040029class JamiDaemon {
Adrien Béraud4e287b92021-04-24 16:15:56 -040030 constructor(onMessage) {
Adrien Béraud6ecaa402021-04-06 17:37:25 -040031 this.accounts = []
Adrien Béraud88a52442021-04-26 12:11:41 -040032 this.lookups = []
33 this.tempAccounts = []
simonc7d52452022-09-23 02:09:42 -040034 this.dring = require(path.join(process.cwd(), "jamid.node"))
Adrien Béraud6ecaa402021-04-06 17:37:25 -040035 this.dring.init({
Adrien Béraudc25be582021-05-06 12:38:15 -040036 AccountsChanged: () => {
Adrien Béraud6ecaa402021-04-06 17:37:25 -040037 console.log("AccountsChanged")
38 const newAccounts = []
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040039 JamiDaemon.vectToJs(this.dring.getAccountList()).forEach(accountId => {
Adrien Béraud88a52442021-04-26 12:11:41 -040040 for (const account of this.accounts) {
41 if (account.getId() === accountId) {
Adrien Béraud6ecaa402021-04-06 17:37:25 -040042 newAccounts.push(account)
43 return
44 }
45 }
46 newAccounts.push(new Account(accountId,
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040047 JamiDaemon.mapToJs(this.dring.getAccountDetails(accountId)),
48 JamiDaemon.mapToJs(this.dring.getVolatileAccountDetails(accountId))
Adrien Béraud0cb76c92021-04-07 19:59:08 -040049 ))
Adrien Béraud6ecaa402021-04-06 17:37:25 -040050 })
51 this.accounts = newAccounts
52 },
Adrien Béraudc25be582021-05-06 12:38:15 -040053 AccountDetailsChanged: (accountId, details) => {
Adrien Béraud6ecaa402021-04-06 17:37:25 -040054 console.log(`AccountDetailsChanged ${accountId}`)
55 const account = this.getAccount(accountId)
56 if (!account) {
57 console.log(`Unknown account ${accountId}`)
58 return
59 }
60 account.details = details
61 },
Adrien Béraudc25be582021-05-06 12:38:15 -040062 VolatileDetailsChanged: (accountId, details) => {
Adrien Béraud6ecaa402021-04-06 17:37:25 -040063 console.log(`VolatileDetailsChanged ${accountId}`)
64 const account = this.getAccount(accountId)
65 if (!account) {
66 console.log(`Unknown account ${accountId}`)
67 return
68 }
69 account.volatileDetails = details
70 },
Adrien Béraudc25be582021-05-06 12:38:15 -040071 IncomingAccountMessage: (accountId, from, message) => {
Adrien Béraud6ecaa402021-04-06 17:37:25 -040072 console.log(`Received message: ${accountId} ${from} ${message["text/plain"]}`)
73/*
74 if (parser.validate(message["text/plain"]) === true) {
Adrien Béraude74741b2021-04-19 13:22:54 -040075 console.log(message["text/plain"])
Adrien Béraud6ecaa402021-04-06 17:37:25 -040076 } else {
77
Adrien Béraude74741b2021-04-19 13:22:54 -040078 user = connectedUsers[accountId]
Adrien Béraud6ecaa402021-04-06 17:37:25 -040079 console.log(user.socketId)
Adrien Béraude74741b2021-04-19 13:22:54 -040080 io.to(user.socketId).emit('receivedMessage', message["text/plain"])
81 //io.emit('receivedMessage', message["text/plain"])
Adrien Béraud6ecaa402021-04-06 17:37:25 -040082 }*/
83 },
Adrien Béraudc25be582021-05-06 12:38:15 -040084 RegistrationStateChanged: (accountId, state, code, detail) => {
Adrien Béraud6ecaa402021-04-06 17:37:25 -040085 console.log("RegistrationStateChanged: " + accountId + " " + state + " " + code + " " + detail)
Adrien Béraud88a52442021-04-26 12:11:41 -040086 const account = this.getAccount(accountId)
87 if (account) {
88 account.registrationState = state
89 } else {
90 console.log(`Unknown account ${accountId}`)
91 }
92 const ctx = this.tempAccounts[accountId]
93 if (ctx) {
94 if (state === "REGISTERED") {
95 account.details = JamiDaemon.mapToJs(this.dring.getAccountDetails(accountId))
96 ctx.resolve(accountId)
97 delete this.tempAccounts[accountId]
98 } else if (state === "ERROR_AUTH") {
99 this.dring.removeAccount(accountId)
100 ctx.reject(state)
101 delete this.tempAccounts[accountId]
102 }
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400103 }
104 },
Adrien Béraudc25be582021-05-06 12:38:15 -0400105 RegisteredNameFound: (accountId, state, address, name) => {
Adrien Béraud0cb76c92021-04-07 19:59:08 -0400106 console.log(`RegisteredNameFound: ${accountId} ${state} ${address} ${name}`)
Adrien Béraud88a52442021-04-26 12:11:41 -0400107 let lookups
108 if (accountId) {
109 const account = this.getAccount(accountId)
110 if (!account) {
111 console.log(`Unknown account ${accountId}`)
112 return
113 }
114 if (state == 0) {
115 const contact = account.getContactFromCache(address)
116 if (!contact.isRegisteredNameResolved())
117 contact.setRegisteredName(name)
118 }
119 lookups = account.lookups
120 } else {
121 lookups = this.lookups
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400122 }
Adrien Béraud88a52442021-04-26 12:11:41 -0400123 let index = lookups.length - 1
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400124 while (index >= 0) {
Adrien Béraud88a52442021-04-26 12:11:41 -0400125 const lookup = lookups[index]
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400126 if ((lookup.address && lookup.address === address) || (lookup.name && lookup.name === name)) {
127 lookup.resolve({address, name, state})
Adrien Béraud88a52442021-04-26 12:11:41 -0400128 lookups.splice(index, 1)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400129 }
Adrien Béraude74741b2021-04-19 13:22:54 -0400130 index -= 1
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400131 }
Adrien Béraud0cb76c92021-04-07 19:59:08 -0400132 },
Adrien Béraudc25be582021-05-06 12:38:15 -0400133 NameRegistrationEnded: (accountId, state, name) => {
Adrien Béraud0561d3c2021-05-02 11:23:54 -0400134 console.log(`NameRegistrationEnded: ${accountId} ${state} ${name}`)
135 const account = this.getAccount(accountId)
136 if (account) {
137 if (state === 0)
138 account.volatileDetails['Account.registeredName'] = name
139 if (account.registeringName) {
140 account.registeringName.resolve(state)
141 delete account.registeringName
142 }
143 } else {
144 console.log(`Unknown account ${accountId}`)
145 }
146 },
Adrien Béraudc25be582021-05-06 12:38:15 -0400147 // Conversations
148 ConversationReady: (accountId, conversationId) => {
Adrien Béraud0cb76c92021-04-07 19:59:08 -0400149 console.log(`conversationReady: ${accountId} ${conversationId}`)
150 const account = this.getAccount(accountId)
151 if (!account) {
152 console.log(`Unknown account ${accountId}`)
153 return
154 }
155 let conversation = account.getConversation(conversationId)
156 if (!conversation) {
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400157 const members = JamiDaemon.vectMapToJs(this.dring.getConversationMembers(accountId, conversationId))
158 members.forEach(member => member.contact = account.getContactFromCache(member.uri))
159 conversation = new Conversation(conversationId, accountId, members)
Adrien Béraud0cb76c92021-04-07 19:59:08 -0400160 account.addConversation(conversation)
161 }
162 },
Adrien Béraudc25be582021-05-06 12:38:15 -0400163 ConversationRemoved: (accountId, conversationId) => {
Adrien Béraud0cb76c92021-04-07 19:59:08 -0400164 console.log(`conversationRemoved: ${accountId} ${conversationId}`)
165 const account = this.getAccount(accountId)
166 if (!account) {
167 console.log(`Unknown account ${accountId}`)
168 return
169 }
170 account.removeConversation(conversationId)
171 },
Adrien Béraudc25be582021-05-06 12:38:15 -0400172 ConversationLoaded: (id, accountId, conversationId, messages) => {
Adrien Béraud0cb76c92021-04-07 19:59:08 -0400173 console.log(`conversationLoaded: ${accountId} ${conversationId}`)
Adrien Béraud0cb76c92021-04-07 19:59:08 -0400174 const account = this.getAccount(accountId)
175 if (!account) {
176 console.log(`Unknown account ${accountId}`)
177 return
178 }
179 const conversation = account.getConversation(conversationId)
Adrien Béraud5e9e19b2021-04-22 01:38:53 -0400180 if (conversation) {
Adrien Béraud86986032021-04-25 12:04:53 -0400181 //conversation.addLoadedMessages(messages)
Adrien Béraud4e287b92021-04-24 16:15:56 -0400182 const request = conversation.requests[id]
183 if (request) {
184 request.resolve(messages)
185 }
Adrien Béraud5e9e19b2021-04-22 01:38:53 -0400186 }
187 },
Adrien Béraudc25be582021-05-06 12:38:15 -0400188 MessageReceived: (accountId, conversationId, message) => {
Adrien Béraud5e9e19b2021-04-22 01:38:53 -0400189 console.log(`messageReceived: ${accountId} ${conversationId}`)
190 console.log(message)
191 const account = this.getAccount(accountId)
192 if (!account) {
193 console.log(`Unknown account ${accountId}`)
194 return
195 }
196 const conversation = account.getConversation(conversationId)
197 if (conversation) {
Adrien Béraud0cb76c92021-04-07 19:59:08 -0400198 conversation.addMessage(message)
Adrien Béraud4e287b92021-04-24 16:15:56 -0400199 if (onMessage)
200 onMessage(account, conversation, message)
Adrien Béraud0cb76c92021-04-07 19:59:08 -0400201 }
202 },
Adrien Béraudc25be582021-05-06 12:38:15 -0400203 ConversationRequestReceived: (accountId, conversationId, request) => {
Adrien Béraud0cb76c92021-04-07 19:59:08 -0400204 console.log(`conversationRequestReceived: ${accountId} ${conversationId}`)
205 const account = this.getAccount(accountId)
206 if (!account) {
207 console.log(`Unknown account ${accountId}`)
208 return
209 }
210 },
Adrien Béraudc25be582021-05-06 12:38:15 -0400211 ConversationMemberEvent: (accountId, conversationId, member, event) => {
Adrien Béraud0cb76c92021-04-07 19:59:08 -0400212 console.log(`conversationMemberEvent: ${accountId} ${conversationId}`)
213 const account = this.getAccount(accountId)
214 if (!account) {
215 console.log(`Unknown account ${accountId}`)
216 return
217 }
218 },
Adrien Béraudc25be582021-05-06 12:38:15 -0400219 OnConversationError: (accountId, conversationId, code, what) => {
Adrien Béraud0cb76c92021-04-07 19:59:08 -0400220 console.log(`onConversationError: ${accountId} ${conversationId}`)
221 const account = this.getAccount(accountId)
222 if (!account) {
223 console.log(`Unknown account ${accountId}`)
224 return
225 }
Adrien Béraudc25be582021-05-06 12:38:15 -0400226 },
227 // Calls
Adrien Béraud9d038472022-09-18 15:00:36 -0400228 CallStateChanged: (callId, state, code) => {
229 console.log(`CallStateChanged: ${callId} ${state} ${code}`)
Adrien Béraudc25be582021-05-06 12:38:15 -0400230 },
231 IncomingCall: (accountId, callId, peerUri) => {
232 console.log(`IncomingCall: ${accountId} ${callId} ${peerUri}`)
233 },
234 ConferenceCreated: (confId) => {
235 console.log(`ConferenceCreated: ${confId}`)
236 },
237 ConferenceChanged: (confId, state) => {
238 console.log(`ConferenceChanged: ${confId}`)
239
240 },
241 ConferenceRemoved: (confId) => {
242 console.log(`ConferenceRemoved: ${confId}`)
243
244 },
Adrien Béraud9d038472022-09-18 15:00:36 -0400245 OnConferenceInfosUpdated: (confId, info) => {
Adrien Béraudc25be582021-05-06 12:38:15 -0400246 console.log(`onConferenceInfosUpdated: ${confId}`)
247
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400248 }
249 })
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400250
251 JamiDaemon.vectToJs(this.dring.getAccountList()).forEach(accountId => {
252 const account = new Account(accountId,
253 JamiDaemon.mapToJs(this.dring.getAccountDetails(accountId)),
254 JamiDaemon.mapToJs(this.dring.getVolatileAccountDetails(accountId))
255 )
ervinanoh99655642022-09-01 15:11:31 -0400256
257 account.contacts = JamiDaemon.vectMapToJs(
258 this.dring.getContacts(accountId)
259 );
260
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400261 JamiDaemon.vectToJs(this.dring.getConversations(accountId)).forEach(conversationId => {
262 const members = JamiDaemon.vectMapToJs(this.dring.getConversationMembers(accountId, conversationId))
ervinanohb81c3912022-09-08 04:13:24 -0400263 console.log("\n\nXMEMBERS: ", members)
Adrien Béraud150b4782021-04-21 19:40:59 -0400264 members.forEach(member => {
265 member.contact = account.getContactFromCache(member.uri)
266 if (!member.contact.isRegisteredNameResolved()) {
267 if (!member.uri) return
ervinanohb81c3912022-09-08 04:13:24 -0400268 console.log(`lookupAddress ${accountId} ${member.uri}`, member)
Adrien Béraud150b4782021-04-21 19:40:59 -0400269 member.contact.setRegisteredName(new Promise((resolve, reject) =>
270 account.lookups.push({address: member.uri, resolve, reject})
271 ).then(result => {
272 if (result.state == 0)
273 return result.name
274 else if (result.state == 1)
275 return undefined
276 else
277 return null
278 }))
279 this.dring.lookupAddress(accountId, "", member.uri)
280 }
281 })
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400282 const conversation = new Conversation(conversationId, accountId, members)
ervinanohb81c3912022-09-08 04:13:24 -0400283 conversation.setInfos(JamiDaemon.mapToJs(this.dring.conversationInfos(accountId, conversationId)))
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400284 account.addConversation(conversation)
285 })
ervinanohf1758a42022-09-14 14:52:51 -0400286 account.setDevices(
287 );
288
289 this.accounts.push(account);
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400290 })
291 }
292
Adrien Béraud88a52442021-04-26 12:11:41 -0400293 addAccount(accountConfig) {
294 const params = this.accountDetailsToNative(accountConfig)
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400295 params.set("Account.type", "RING")
Adrien Béraud88a52442021-04-26 12:11:41 -0400296 return new Promise((resolve, reject) => {
297 const accountId = this.dring.addAccount(params)
298 this.tempAccounts[accountId] = { resolve, reject }
299 })
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400300 }
ervinanohf1758a42022-09-14 14:52:51 -0400301
302 getDevices(accountId){
303 return JamiDaemon.mapToJs(this.dring.getKnownRingDevices(accountId));
304 }
305
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400306 getAccount(accountId) {
307 for (let i = 0; i < this.accounts.length; i++) {
308 const account = this.accounts[i]
309 if (account.getId() === accountId)
310 return account
311 }
312 return undefined
313 }
314 getAccountList() {
315 return this.accounts
316 }
Adrien Béraud0561d3c2021-05-02 11:23:54 -0400317 registerName(accountId, password, name) {
318 return new Promise((resolve, reject) => {
319 if (!name)
320 return reject(new Error("Invalid name"))
321 const account = this.getAccount(accountId)
322 if (!account)
323 return reject(new Error("Can't find account"))
324 if (account.registeringName)
325 return reject(new Error("Username already being registered"))
326 if (this.dring.registerName(accountId, password, name)) {
327 account.registeringName = { name, resolve, reject }
328 }
329 })
330 }
331
Adrien Béraudabba2e52021-04-24 21:39:56 -0400332 getConversation(accountId, conversationId) {
333 const account = this.getAccount(accountId)
334 if (account)
335 return account.getConversation(conversationId)
336 return null
337 }
ervinanoh8e918042022-09-06 10:30:59 -0400338 getAccountDetails(accountId) {
339 return JamiDaemon.mapToJs(this.dring.getAccountDetails(accountId))
340 }
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400341 setAccountDetails(accountId, details) {
Adrien Béraud86986032021-04-25 12:04:53 -0400342 this.dring.setAccountDetails(accountId, this.mapToNative(details))
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400343 }
344 getAudioOutputDeviceList() {
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400345 return JamiDaemon.vectToJs(this.dring.getAudioOutputDeviceList())
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400346 }
347 getVolume(deviceName) {
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400348 return this.dring.getVolume(deviceName)
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400349 }
350 setVolume(deviceName, volume) {
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400351 return this.dring.setVolume(deviceName, volume)
352 }
353
354 lookupName(accountId, name) {
355 const p = new Promise((resolve, reject) => {
Adrien Béraud88a52442021-04-26 12:11:41 -0400356 if (accountId) {
357 const account = this.getAccount(accountId)
358 if (!account) {
359 reject(new Error("Can't find account"))
360 } else {
361 account.lookups.push({ name, resolve, reject })
362 }
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400363 } else {
Adrien Béraud88a52442021-04-26 12:11:41 -0400364 this.lookups.push({ name, resolve, reject })
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400365 }
366 })
Adrien Béraud88a52442021-04-26 12:11:41 -0400367 this.dring.lookupName(accountId || '', '', name)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400368 return p
369 }
370
371 lookupAddress(accountId, address) {
372 console.log(`lookupAddress ${accountId} ${address}`)
373 const p = new Promise((resolve, reject) => {
Adrien Béraud88a52442021-04-26 12:11:41 -0400374 if (accountId) {
375 const account = this.getAccount(accountId)
376 if (!account) {
377 reject(new Error("Can't find account"))
378 } else {
379 account.lookups.push({ address, resolve, reject })
380 }
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400381 } else {
Adrien Béraud88a52442021-04-26 12:11:41 -0400382 this.lookups.push({ address, resolve, reject })
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400383 }
384 })
Adrien Béraud88a52442021-04-26 12:11:41 -0400385 this.dring.lookupAddress(accountId || '', '', address)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400386 return p
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400387 }
388
389 stop() {
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400390 this.dring.fini()
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400391 }
392
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400393 addContact(accountId, contactId) {
394 this.dring.addContact(accountId, contactId)
395 const details = JamiDaemon.mapToJs(this.dring.getContactDetails(accountId, contactId))
396 if (details.conversationId) {
397 const account = this.getAccount(accountId)
398 if (account) {
399 let conversation = account.getConversation(details.conversationId)
400 if (!conversation) {
401 const members = JamiDaemon.vectMapToJs(this.dring.getConversationMembers(accountId, details.conversationId))
402 members.forEach(member => member.contact = account.getContactFromCache(member.uri))
403 conversation = new Conversation(details.conversationId, accountId, members)
404 account.addConversation(conversation)
405 }
406 }
407 }
408 return details
409 }
410
ervinanoh99655642022-09-01 15:11:31 -0400411 removeContact(accountId, contactId){
412 //bool ban false
413 this.dring.removeContact(accountId, contactId, false);
414 }
415
416 blockContact(accountId, contactId){
417 //bool ban true
418 this.dring.removeContact(accountId, contactId, true);
419 }
420
421 getContactDetails(accountId, contactId){
422 return JamiDaemon.mapToJs(this.dring.getContactDetails(accountId, contactId))
423 }
424
Adrien Béraud150b4782021-04-21 19:40:59 -0400425 getDefaultModerators(accountId) {
426 const account = this.getAccount(accountId)
427 if (!account) {
428 console.log(`Unknown account ${accountId}`)
429 return {}
430 }
431 return JamiDaemon.vectToJs(this.dring.getDefaultModerators(accountId))
Adrien Béraud4e287b92021-04-24 16:15:56 -0400432 .map(contactId => account.getContactFromCache(contactId))
Adrien Béraud150b4782021-04-21 19:40:59 -0400433 }
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400434
Adrien Béraud4e287b92021-04-24 16:15:56 -0400435 addDefaultModerator(accountId, uri) {
436 this.dring.setDefaultModerator(accountId, uri, true)
437 }
Adrien Béraud150b4782021-04-21 19:40:59 -0400438
Adrien Béraud4e287b92021-04-24 16:15:56 -0400439 removeDefaultModerator(accountId, uri) {
440 this.dring.setDefaultModerator(accountId, uri, false)
Adrien Béraud150b4782021-04-21 19:40:59 -0400441 }
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400442
Adrien Béraud5e9e19b2021-04-22 01:38:53 -0400443 sendMessage(accountId, conversationId, message) {
444 this.dring.sendMessage(accountId, conversationId, message, "")
445 }
446
Adrien Béraud4e287b92021-04-24 16:15:56 -0400447 loadMessages(accountId, conversationId, fromMessage) {
448 const account = this.getAccount(accountId)
449 if (!account)
450 throw new Error('Unknown account')
451 const conversation = account.getConversation(conversationId)
452 if (!conversation)
453 throw new Error(`Unknown conversation ${conversationId}`)
454
455 return new Promise((resolve, reject) => {
456 if (!conversation.requests)
457 conversation.requests = {}
458 const requestId = this.dring.loadConversationMessages(accountId, conversationId, fromMessage || "", 32)
459 conversation.requests[requestId] = {resolve, reject}
460 })
461 }
462
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400463 boolToStr(bool) {
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400464 return bool ? "true" : "false"
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400465 }
466
467 accountDetailsToNative(account) {
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400468 const params = new this.dring.StringMap()
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400469 if (account.managerUri)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400470 params.set("Account.managerUri", account.managerUri)
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400471 if (account.managerUsername)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400472 params.set("Account.managerUsername", account.managerUsername)
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400473 if (account.archivePassword) {
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400474 params.set("Account.archivePassword", account.archivePassword)
Adrien Béraud88a52442021-04-26 12:11:41 -0400475 }/* else {
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400476 console.log("archivePassword required")
Adrien Béraude74741b2021-04-19 13:22:54 -0400477 return
Adrien Béraud88a52442021-04-26 12:11:41 -0400478 }*/
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400479 if (account.alias)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400480 params.set("Account.alias", account.alias)
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400481 if (account.displayName)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400482 params.set("Account.displayName", account.displayName)
Adrien Béraud88a52442021-04-26 12:11:41 -0400483 if (account.enable !== undefined)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400484 params.set("Account.enable", this.boolToStr(account.enable))
Adrien Béraud88a52442021-04-26 12:11:41 -0400485 if (account.autoAnswer !== undefined)
486 params.set("Account.autoAnswer", this.boolToStr(account.autoAnswer))
487 if (account.autoAnswer !== undefined)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400488 params.set("Account.autoAnswer", this.boolToStr(account.autoAnswer))
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400489 if (account.ringtonePath)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400490 params.set("Account.ringtonePath", account.ringtonePath)
Adrien Béraud88a52442021-04-26 12:11:41 -0400491 if (account.ringtoneEnabled !== undefined)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400492 params.set("Account.ringtoneEnabled", this.boolToStr(account.ringtoneEnabled))
Adrien Béraud88a52442021-04-26 12:11:41 -0400493 if (account.videoEnabled !== undefined)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400494 params.set("Account.videoEnabled", this.boolToStr(account.videoEnabled))
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400495 if (account.useragent) {
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400496 params.set("Account.useragent", account.useragent)
497 params.set("Account.hasCustomUserAgent", "TRUE")
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400498 } else {
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400499 params.set("Account.hasCustomUserAgent", "FALSE")
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400500 }
501 if (account.audioPortMin)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400502 params.set("Account.audioPortMin", account.audioPortMin)
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400503 if (account.audioPortMax)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400504 params.set("Account.audioPortMax", account.audioPortMax)
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400505 if (account.videoPortMin)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400506 params.set("Account.videoPortMin", account.videoPortMin)
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400507 if (account.videoPortMax)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400508 params.set("Account.videoPortMax", account.videoPortMax)
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400509 if (account.localInterface)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400510 params.set("Account.localInterface", account.localInterface)
Adrien Béraud88a52442021-04-26 12:11:41 -0400511 if (account.publishedSameAsLocal !== undefined)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400512 params.set("Account.publishedSameAsLocal", this.boolToStr(account.publishedSameAsLocal))
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400513 if (account.localPort)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400514 params.set("Account.localPort", account.localPort)
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400515 if (account.publishedPort)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400516 params.set("Account.publishedPort", account.publishedPort)
Adrien Béraud88a52442021-04-26 12:11:41 -0400517 if (account.rendezVous !== undefined)
518 params.set("Account.rendezVous", this.boolToStr(account.rendezVous))
519 if (account.upnpEnabled !== undefined)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400520 params.set("Account.upnpEnabled", this.boolToStr(account.upnpEnabled))
521 return params
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400522 }
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400523 static vectToJs(vect) {
524 const len = vect.size()
525 const outputArr = new Array(len)
526 for (let i = 0; i < len; i++)
527 outputArr[i] = vect.get(i)
528 return outputArr
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400529 }
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400530 static mapToJs(m) {
531 const outputObj = {}
532 JamiDaemon.vectToJs(m.keys())
533 .forEach(k => outputObj[k] = m.get(k))
534 return outputObj
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400535 }
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400536 static vectMapToJs(vectMap) {
537 const len = vectMap.size()
538 const outputArr = new Array(len)
539 for (let i = 0; i < len; i++)
540 outputArr[i] = JamiDaemon.mapToJs(vectMap.get(i))
541 return outputArr
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400542 }
543
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400544 mapToNative(map){
545 const ret = new this.dring.StringMap()
Adrien Béraud86986032021-04-25 12:04:53 -0400546 for (const [key, value] of Object.entries(map))
547 ret.set(key, value)
Adrien Béraude74741b2021-04-19 13:22:54 -0400548 return ret
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400549 }
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400550}
551
Adrien Béraude74741b2021-04-19 13:22:54 -0400552export default JamiDaemon