diff --git a/src/puppet-web/event.js b/src/puppet-web/event.js index c4787e3f56745f2a5f4b682dd339e294550203f8..6d418e28b3bd3994a5a932585746d8c9b75e0178 100644 --- a/src/puppet-web/event.js +++ b/src/puppet-web/event.js @@ -336,52 +336,56 @@ function onServerLogout(data) { function onServerMessage(data) { let m = new Message(data) - /** - * Fire Events if match message type & content - */ - switch (m.type()) { // data.MsgType - - case Message.Type.VERIFYMSG: - Firer.fireFriendRequest.call(this, m) - break - - case Message.Type.SYS: - if (m.room()) { - Firer.fireRoomJoin.call(this, m) - Firer.fireRoomLeave.call(this, m) - } else { - Firer.fireFriendConfirm.call(this, m) - } - break - } - - /** - * Check Type for special Message - * reload if needed - */ - switch (m.type()) { - case Message.Type.IMAGE: - // log.verbose('PuppetWebEvent', 'onServerMessage() IMAGE message') - m = new MediaMessage(data) - break - } + co.call(this, function* () { + yield m.ready() - // To Be Deleted: set self... - if (this.userId) { - m.set('self', this.userId) - } else { - log.warn('PuppetWebEvent', 'onServerMessage() without this.userId') - } + /** + * Fire Events if match message type & content + */ + switch (m.type()) { // data.MsgType + + case Message.Type.VERIFYMSG: + Firer.fireFriendRequest.call(this, m) + break + + case Message.Type.SYS: + if (m.room()) { + Firer.fireRoomJoin.call(this, m) + Firer.fireRoomLeave.call(this, m) + } else { + Firer.fireFriendConfirm.call(this, m) + } + break + } - m.ready() // TODO: EventEmitter2 for video/audio/app/sys.... - .then(_ => this.emit('message', m)) - .catch(e => { - log.error('PuppetWebEvent', 'onServerMessage() message ready exception: %s', e) - // console.log(e) /** - * FIXME: add retry here... - * setTimeout(onServerMessage.bind(this, data, ++attempt), 1000) + * Check Type for special Message + * reload if needed */ + switch (m.type()) { + case Message.Type.IMAGE: + // log.verbose('PuppetWebEvent', 'onServerMessage() IMAGE message') + m = new MediaMessage(data) + break + } + + // To Be Deleted: set self... + if (this.userId) { + m.set('self', this.userId) + } else { + log.warn('PuppetWebEvent', 'onServerMessage() without this.userId') + } + + m.ready() // TODO: EventEmitter2 for video/audio/app/sys.... + .then(_ => this.emit('message', m)) + .catch(e => { + log.error('PuppetWebEvent', 'onServerMessage() message ready exception: %s', e) + // console.log(e) + /** + * FIXME: add retry here... + * setTimeout(onServerMessage.bind(this, data, ++attempt), 1000) + */ + }) }) } diff --git a/src/puppet-web/firer.js b/src/puppet-web/firer.js index 4407bf37acd9baae59b98055032da279e644413a..395cc25906f19fe8687121018a954f8d15a5011a 100644 --- a/src/puppet-web/firer.js +++ b/src/puppet-web/firer.js @@ -115,19 +115,27 @@ function fireRoomJoin(m) { let inviterContact, inviteeContact - if (inviter === "You've") { - inviterContact = Contact.load(this.userId) - } else { - inviterContact = room.member(inviter) - } - - inviteeContact = room.member(invitee) - - if (!inviterContact || !inviteeContact) { - log.error('PuppetWebEvent', 'inivter or invitee not found for %s, %s', inviter, invitee) - return - } - room.emit('join', inviteeContact, inviterContact) + co.call(this, function* () { + yield room.refresh() + + yield new Promise(resolve => { + setTimeout(_ => resolve(), 1000) + }) + + if (inviter === "You've") { + inviterContact = Contact.load(this.userId) + } else { + inviterContact = room.member(inviter) + } + + inviteeContact = room.member(invitee) + + if (!inviterContact || !inviteeContact) { + log.error('PuppetWebEvent', 'inivter or invitee not found for %s, %s', inviter.name(), invitee.name()) + return + } + room.emit('join', inviteeContact, inviterContact) + }) } function checkRoomLeave(content) { @@ -151,6 +159,7 @@ function fireRoomLeave(m) { } const room = m.room() + leaverContact = room.member(leaver) if (!leaverContact) { @@ -158,6 +167,7 @@ function fireRoomLeave(m) { return } room.emit('leave', leaverContact) + room.refresh() } module.exports = PuppetWebFirer diff --git a/src/room.js b/src/room.js index 5e415cd7110bfc2f8011628f2bd0fa31055ea8d7..d0153115284618d4841bd3b7d90930df9278a08c 100644 --- a/src/room.js +++ b/src/room.js @@ -214,12 +214,18 @@ class Room extends EventEmitter{ } member(name) { + log.verbose('Room', 'member(%s)', name) + if (!this.obj.memberList) { + log.warn('Room', 'member() not ready') return null } const nickMap = this.obj.nickMap const idList = Object.keys(nickMap) .filter(k => nickMap[k] === name) + + log.silly('Room', 'member() check nickMap: %s', JSON.stringify(nickMap)) + if (idList.length) { return Contact.load(idList[0]) } else {