signalr-client
Version:
signalR client for node.js
259 lines (195 loc) • 9.41 kB
Markdown
By: [Matthew Whited](mailto:matt@whited.us?subject=signalr-client) (c) 2018-2020
_____________________________________
This is a signalR client for node.js. The Intent of this project is to allow a node service
to communicate with a signalR hub over websockets.
This project does not require jQuery but it also only support websockets. Fallback to other
communication options such as long polling are not supported.
[](https://github.com/mwwhited/signalr-client-nodejs)
_____________________________________
_see signalR-sample.js for more examples_
var signalR = require('signalr-client');
var client = new signalR.client(
//signalR service URL
"http://localhost:8080/signalR",
// array of hubs to be supported in the connection
['TestHub']
//, 10 /* Reconnection Timeout is optional and defaulted to 10 seconds */
//, false /* doNotStart is option and defaulted to false. If set to true
client will not start until .start() is called */
);
client.on(
// Hub Name (case insensitive)
'TestHub',
// Method Name (case insensitive)
'AddMessage',
// Callback function with parameters matching call from hub
function(name, message) {
console.log("revc => " + name + ": " + message);
});
//If you bind directly to the hub handlers as show here any previous
// handlers for that hub will be removed!
// hub name must be all lower case.
client.handlers.testhub = {
// method name must be all lower case
// function signature should match call from hub
addmessage: function(name, message) {
console.log("revc => " + name + ": " + message);
}
};
client.invoke(
'TestHub', // Hub Name (case insensitive)
'Send', // Method Name (case insensitive)
'client', 'invoked from client' //additional parameters to match signature
);
var hub = client.hub('TestHub'); // Hub Name (case insensitive)
hub.invoke(
'Send', // Method Name (case insensitive)
'hub', 'invoked from hub' //additional parameters to match called signature
);
client.call(
'TestHub', // Hub Name (case insensitive)
'Send', // Method Name (case insensitive)
'client', 'invoked from client' //additional parameters to match signature
)
.done(function (err, result) {
if (!err) {
console.log("call returned: ", result);
}
});
var hub = client.hub('TestHub'); // Hub Name (case insensitive)
hub.call(
'Send', // Method Name (case insensitive)
'hub', 'invoked from hub' //additional parameters to match called signature
)
.done(function (err, result) {
if (!err) {
console.log("call returned: ", result);
}
});
client.headers['X-MyTest-Header'] = 'Hello World!';
client.queryString.mVar1 = 'Hello World!';
**Only support HTTP connections as this time**
client.proxy.host = "127.0.0.1";
client.proxy.port = "8888";
*These are all found under client.serviceHandlers*
bound: void function(){}
connectFailed: void function(error){}
connected: void function(connection){}
connectionLost: void function(error){}
disconnected: void function(){}
onerror: void function(error){}
messageReceived: bool function(message){ return true /* if handled */}
bindingError: function(error) {}
onUnauthorized: function(res) {}
reconnected: void function(connection){}
reconnecting: function(retry) { return false; } */
client.serviceHandlers.connected = function(connection) {
/* connection: this is the connection raised from websocket */
}
client.serviceHandlers.messageReceived = function(message) {
/* message: this is the raw message received on the websocket */
return true/false; //if true the client handler for the hub will not be raised.
//if false the client handler will be raised.
}
client.serviceHandlers.onUnauthorized = function (res) {
//Do your Login Request
var location = res.headers.location;
var result = http.get(location, function (loginResult) {
//Copy "set-cookie" to "client.header.cookie" for future requests
client.headers.cookie = loginResult.headers['set-cookie'];
});
}
client.serviceHandlers.reconnecting = function (retryData) {
/* retryData: { inital: true (first retry)/false (following retries),
count: retry count } */
return true; // Abort retry
return false; // Retry
}
_____________________________________
* v0.0.1: Initial Release
* v0.0.2: No functional code changes
* Update ignore list to exclude project build files
* Cleaned up README.md and added code samples
* Updated signalR-sample.js to match samples
* v0.0.3: No functional code changes
* Updated README.md and signalR-sample.js to correct minor spelling mistakes
* v0.0.4: Corrected messageid for payloads sent to server/hub
* messageid should increment for each message in the connection instead
* reset messageid on connection
* v0.0.5: Added support for retrying connection after the client loses contact with hub
* v0.0.6: Fixed reported issue of connection being refused when the client is created before the hub is online.
* Added client.serviceHandlers.bindingError handler.
* if client is in "unbound" or "bindingError" state it will trying to renegotiate binding on next client.invoke or client.hub[]
* changed client.state to return {code:
* v0.0.7: Added support for connections over HTTPS (Thanks Anthony DiPierro)
* v0.0.8: Added support for headers by request (Thanks Vincent Miceli)
* Added support for headers on "negotiate" and "connect" for signalR
* Added a new onUnauthorized handler to support 401/302 on failed negotiate
* Added the ability to forward requests over an HTTP Proxy
* Added the ability to extend the connect queryString
* Added the ability to optionally prevent the client from connecting automatically on creation.
* Removed the thrown exception when errors are unhandled.
* v0.0.9: Added a mergeable setter syntax to handlers, serviceHandlers, headers, proxy and queryString.
* Settings values on headers and queryString to undefined will remove their values from being transferred.
* v0.0.10: Fixes for reported bugs (Thanks Vincent Miceli)
* Connection state was always reported as reconnected
* doNotStart setting for client was ignored.
* v0.0.11: Initialization and even order has slightly changed.
* If client is created with 'doNotStart' set to true binding will not occur until after client.start() is called
* The 'bound' event will be raised before the system tries to start the connection
* Fixed the retry timeout to properly calculate seconds.
* Fixed retry and connection failed
* v0.0.12: Added more detail to the "Protocol Error"
* The "Protocol Error" refers to when the system can not detect the web-sockets connection.
* Changed the default error handler to output more details
* Added the negotiated URL object to the raised error for "Protocol Error"
* v0.0.13: Added MIT License and released project on GitHub
* No functional changes
* [Code on GitHub](https://github.com/mwwhited/signalr-client-nodejs)
* v0.0.14: Added HTTPS scheme support
* Thanks to Guilherme Ferreira
* v0.0.15: Update to signalR Client Protocol 1.5
* Thanks to Guilherme Ferreira
* v0.0.16: Fixed lastMessageId issues
* Thanks to Sergey Buturlakin
* v0.0.17: Fixed negotiation error handing
* Thanks to Patrick Hampson
* v0.0.18: Updated Websockets version and error handler binding fixed
* Thanks https://github.com/jd4ever
* Thanks Adrian Soluch https://github.com/n0mad01
* v0.0.19: Exposed getter for connection
* Thanks Lukas Weber
* v0.0.20: Updated with various pull requests.
* Thanks [Themis Papameletiou(https://github.com/themicp/) for adding the .off(..)
* Thanks [Dennis Pan](https://github.com/DennisPan) for updating the version of websockets
* Thanks [arnoldpistorius](https://github.com/arnoldpistorius) for adding support for the url schema to be https
*
_____________________________________
## Known Issues
* client.Proxy settings currently only work for HTTP and not HTTPS
_____________________________________
_Donations for this project are graciously accepted by paypal <matt@whited.us>