Skip to content

Commit f020bc7

Browse files
committed
add promises to sendMsg, receiveMsg and endOtr (fix #80)
1 parent 25bfc26 commit f020bc7

File tree

1 file changed

+42
-9
lines changed

1 file changed

+42
-9
lines changed

lib/otr.js

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,8 @@
560560
}
561561

562562
OTR.prototype.sendMsg = function (msg, meta) {
563+
var promise = (typeof Promise === 'function') ? new Promise(function(){}) : undefined;
564+
563565
if ( this.REQUIRE_ENCRYPTION ||
564566
this.msgstate !== CONST.MSGSTATE_PLAINTEXT
565567
) {
@@ -572,7 +574,7 @@
572574
if (this.REQUIRE_ENCRYPTION) {
573575
this.storedMgs.push({msg: msg, meta: meta})
574576
this.sendQueryMsg()
575-
return
577+
return promise
576578
}
577579
if (this.SEND_WHITESPACE_TAG && !this.receivedPlaintext) {
578580
msg += CONST.WHITESPACE_TAG // 16 byte tag
@@ -583,45 +585,53 @@
583585
case CONST.MSGSTATE_FINISHED:
584586
this.storedMgs.push({msg: msg, meta: meta})
585587
this.notify('Message cannot be sent at this time.', 'warn')
586-
return
588+
return promise
587589
case CONST.MSGSTATE_ENCRYPTED:
588590
msg = this.prepareMsg(msg)
589591
break
590592
default:
591593
throw new Error('Unknown message state.')
592594
}
593595

594-
if (msg) this.io(msg, meta)
596+
if (msg) {
597+
this.io(msg, meta)
598+
599+
if (typeof Promise !== 'undefined' && typeof Promise.resolve === 'function')
600+
return Promise.resolve(msg)
601+
}
602+
603+
return promise
595604
}
596605

597606
OTR.prototype.receiveMsg = function (msg, meta) {
607+
var promise = (typeof Promise === 'function') ? new Promise(function(){}) : undefined;
598608

599609
// parse type
600610
msg = Parse.parseMsg(this, msg)
601611

602-
if (!msg) return
612+
if (!msg) return promise
603613

604614
switch (msg.cls) {
605615
case 'error':
606616
this.notify(msg.msg)
607-
return
617+
return promise
608618
case 'ake':
609619
if ( msg.version === CONST.OTR_VERSION_3 &&
610620
this.checkInstanceTags(msg.instance_tags)
611621
) {
612622
this.notify(
613623
'Received a message intended for a different session.', 'warn')
614-
return // ignore
624+
return promise // ignore
615625
}
616626
this.ake.handleAKE(msg)
617-
return
627+
return promise
618628
case 'data':
619629
if ( msg.version === CONST.OTR_VERSION_3 &&
620630
this.checkInstanceTags(msg.instance_tags)
621631
) {
622632
this.notify(
623633
'Received a message intended for a different session.', 'warn')
624-
return // ignore
634+
return promise // ignore
625635
}
626636
msg.msg = this.handleDataMsg(msg)
627637
msg.encrypted = true
@@ -645,7 +655,14 @@
645655
this.doAKE(msg)
646656
}
647657

648-
if (msg.msg) this.trigger('ui', [msg.msg, !!msg.encrypted, meta])
658+
if (msg.msg) {
659+
this.trigger('ui', [msg.msg, !!msg.encrypted, meta])
660+
661+
if (typeof Promise !== 'undefined' && typeof Promise.resolve === 'function')
662+
return Promise.resolve([msg.msg, !!msg.encrypted])
663+
}
664+
665+
return promise;
649666
}
650667

651668
OTR.prototype.checkInstanceTags = function (it) {
@@ -718,6 +735,20 @@
718735
}
719736

720737
OTR.prototype.endOtr = function (cb) {
738+
var promise
739+
740+
if (typeof Promise === 'function') {
741+
promise = new Promise(function(resolve) {
742+
var original_cb = cb
743+
744+
cb = function() {
745+
if (typeof original_cb === 'function')
746+
original_cb()
747+
resolve()
748+
}
749+
})
750+
}
751+
721752
if (this.msgstate === CONST.MSGSTATE_ENCRYPTED) {
722753
if (typeof cb === 'function')
723754
cb = new OTRCB(cb)
@@ -732,6 +763,8 @@
732763
this.msgstate = CONST.MSGSTATE_PLAINTEXT
733764
this.receivedPlaintext = false
734765
this.trigger('status', [CONST.STATUS_END_OTR])
766+
767+
if (promise) return promise
735768
}
736769

737770
// attach methods

0 commit comments

Comments
 (0)