You are viewing a plain text version of this content. The canonical link for it is here.
Posted to proton@qpid.apache.org by Ernest Allen <ea...@redhat.com> on 2014/09/04 22:43:10 UTC

Javascript bindings: calling subscribe(address) from within a browser

I'm getting an error when trying to receive messages from within a browser. The same code runs fine when run from the command line using "node".

The error message is:
Module.MessengerError {name: "MessengerError", message: "listen: Not supported", constructor: function, toString: function}
 
The error happens when calling messenger.subscribe(address);

Is it the case that subscribing is actually not supported from within a browser, or am I possibly doing something wrong?

I basically just took the code from recv.js and put it in a HTML page.

Here is the code:
<!DOCTYPE html> <!-- HTML5 doctype -->
<html>
<head>
	<title>Simple Proton Messenger Send Example</title>
	<meta http-equiv="content-type" content="text/html;charset=utf-8" />

<script type="text/javascript" src="../../../node_modules/qpid-proton/lib/proton.js"></script>

<script type="text/javascript">

var address = "amqp://~0.0.0.0";
var message = new proton.Message();
var messenger = new proton.Messenger();

var pumpData = function() {
    while (messenger.incoming()) {
        var t = messenger.get(message);

        console.log("Address: " + message.getAddress());
        console.log("Subject: " + message.getSubject());

        // body is the body as a native JavaScript Object, useful for most real cases.
        //console.log("Content: " + message.body);

        // data is the body as a proton.Data Object, used in this case because
        // format() returns exactly the same representation as recv.c
        console.log("Content: " + message.data.format());

        messenger.accept(t);
    }
};

console.log("address = '" + address + "'");
messenger.setIncomingWindow(1024);

messenger.on('error', function(error) {console.log(error);});
messenger.on('work', pumpData);
messenger.start();

messenger.subscribe(address);
messenger.recv(); // Receive as many messages as messenger can buffer.


</script>

</head>

<body>
</body>

</html>


Regards,
-Ernie


Re: Javascript bindings: calling subscribe(address) from within a browser

Posted by Ernest Allen <ea...@redhat.com>.
Hi Fraser,

Thanks for the explanation. That certainly makes sense. 
Regards,
-Ernie


----- Original Message -----
From: "Fraser Adams" <fr...@blueyonder.co.uk>
To: proton@qpid.apache.org
Sent: Thursday, September 4, 2014 6:55:40 PM
Subject: Re: Javascript bindings: calling subscribe(address) from within a browser

Hi Ernie,
Quick response as I'm just going to bed.

Subscribing is fine from a browser so if say you are connecting to a 
broker you can happily do a receive with an address like say localhost 
or whatever, but a browser can't really act as a "server"  - you are 
clearly trying to get your browser to do a socket listen (using the 
address of the form amqp://~0.0.0.0 )

That's just a typical browser security limitation I'm afraid and 
something in browser WebSockets don't support.

It's not a defect, just a limitation.

Now technically it's something that just might be possible with WebRTC, 
as it happens emscripten supports a WebRTC transport too, but I've not 
tried it myself (on my TODO list) but the bottom line is yeah you're 
mileage is going to be limited by the art of what's actually possible in 
a browser, but as I've mentioned previously the Java Broker supports 
WebSocket natively, I've supplied a fairly trivially simple node.js 
based WebSocket<->TCP Socket proxy and also you can fairly easily stand 
up a node based proton intermediary so not having browser peer to 
browser peer is probably not a huge issue (though proving AMQP over 
WebRTC would be pretty cool and as I say it *should* work I've just not 
got round to trying it).

HTH
Frase


On 04/09/14 21:43, Ernest Allen wrote:
> I'm getting an error when trying to receive messages from within a browser. The same code runs fine when run from the command line using "node".
>
> The error message is:
> Module.MessengerError {name: "MessengerError", message: "listen: Not supported", constructor: function, toString: function}
>   
> The error happens when calling messenger.subscribe(address);
>
> Is it the case that subscribing is actually not supported from within a browser, or am I possibly doing something wrong?
>
> I basically just took the code from recv.js and put it in a HTML page.
>
> Here is the code:
> <!DOCTYPE html> <!-- HTML5 doctype -->
> <html>
> <head>
> 	<title>Simple Proton Messenger Send Example</title>
> 	<meta http-equiv="content-type" content="text/html;charset=utf-8" />
>
> <script type="text/javascript" src="../../../node_modules/qpid-proton/lib/proton.js"></script>
>
> <script type="text/javascript">
>
> var address = "amqp://~0.0.0.0";
> var message = new proton.Message();
> var messenger = new proton.Messenger();
>
> var pumpData = function() {
>      while (messenger.incoming()) {
>          var t = messenger.get(message);
>
>          console.log("Address: " + message.getAddress());
>          console.log("Subject: " + message.getSubject());
>
>          // body is the body as a native JavaScript Object, useful for most real cases.
>          //console.log("Content: " + message.body);
>
>          // data is the body as a proton.Data Object, used in this case because
>          // format() returns exactly the same representation as recv.c
>          console.log("Content: " + message.data.format());
>
>          messenger.accept(t);
>      }
> };
>
> console.log("address = '" + address + "'");
> messenger.setIncomingWindow(1024);
>
> messenger.on('error', function(error) {console.log(error);});
> messenger.on('work', pumpData);
> messenger.start();
>
> messenger.subscribe(address);
> messenger.recv(); // Receive as many messages as messenger can buffer.
>
>
> </script>
>
> </head>
>
> <body>
> </body>
>
> </html>
>
>
> Regards,
> -Ernie
>


Re: Javascript bindings: calling subscribe(address) from within a browser

Posted by Fraser Adams <fr...@blueyonder.co.uk>.
Hi Ernie,
Quick response as I'm just going to bed.

Subscribing is fine from a browser so if say you are connecting to a 
broker you can happily do a receive with an address like say localhost 
or whatever, but a browser can't really act as a "server"  - you are 
clearly trying to get your browser to do a socket listen (using the 
address of the form amqp://~0.0.0.0 )

That's just a typical browser security limitation I'm afraid and 
something in browser WebSockets don't support.

It's not a defect, just a limitation.

Now technically it's something that just might be possible with WebRTC, 
as it happens emscripten supports a WebRTC transport too, but I've not 
tried it myself (on my TODO list) but the bottom line is yeah you're 
mileage is going to be limited by the art of what's actually possible in 
a browser, but as I've mentioned previously the Java Broker supports 
WebSocket natively, I've supplied a fairly trivially simple node.js 
based WebSocket<->TCP Socket proxy and also you can fairly easily stand 
up a node based proton intermediary so not having browser peer to 
browser peer is probably not a huge issue (though proving AMQP over 
WebRTC would be pretty cool and as I say it *should* work I've just not 
got round to trying it).

HTH
Frase


On 04/09/14 21:43, Ernest Allen wrote:
> I'm getting an error when trying to receive messages from within a browser. The same code runs fine when run from the command line using "node".
>
> The error message is:
> Module.MessengerError {name: "MessengerError", message: "listen: Not supported", constructor: function, toString: function}
>   
> The error happens when calling messenger.subscribe(address);
>
> Is it the case that subscribing is actually not supported from within a browser, or am I possibly doing something wrong?
>
> I basically just took the code from recv.js and put it in a HTML page.
>
> Here is the code:
> <!DOCTYPE html> <!-- HTML5 doctype -->
> <html>
> <head>
> 	<title>Simple Proton Messenger Send Example</title>
> 	<meta http-equiv="content-type" content="text/html;charset=utf-8" />
>
> <script type="text/javascript" src="../../../node_modules/qpid-proton/lib/proton.js"></script>
>
> <script type="text/javascript">
>
> var address = "amqp://~0.0.0.0";
> var message = new proton.Message();
> var messenger = new proton.Messenger();
>
> var pumpData = function() {
>      while (messenger.incoming()) {
>          var t = messenger.get(message);
>
>          console.log("Address: " + message.getAddress());
>          console.log("Subject: " + message.getSubject());
>
>          // body is the body as a native JavaScript Object, useful for most real cases.
>          //console.log("Content: " + message.body);
>
>          // data is the body as a proton.Data Object, used in this case because
>          // format() returns exactly the same representation as recv.c
>          console.log("Content: " + message.data.format());
>
>          messenger.accept(t);
>      }
> };
>
> console.log("address = '" + address + "'");
> messenger.setIncomingWindow(1024);
>
> messenger.on('error', function(error) {console.log(error);});
> messenger.on('work', pumpData);
> messenger.start();
>
> messenger.subscribe(address);
> messenger.recv(); // Receive as many messages as messenger can buffer.
>
>
> </script>
>
> </head>
>
> <body>
> </body>
>
> </html>
>
>
> Regards,
> -Ernie
>