autobahn-react
Version:
Do realtime without headaches with Autobahn and React.
143 lines (116 loc) • 4.14 kB
JavaScript
"use strict";
var _Promise = require("babel-runtime/core-js/promise")["default"];
var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"];
Object.defineProperty(exports, "__esModule", {
value: true
});
var _autobahn = require("autobahn");
var _autobahn2 = _interopRequireDefault(_autobahn);
var Connection = {
_url: null,
_realm: null,
_unreachableHandlers: [],
_lostHandlers: [],
_errorHandlers: [],
_readyHandlers: [],
_currentConnection: null,
connect: function connect() {
var _this = this;
var promise = new _Promise(function (resolve, reject) {
_this._currentConnection.onopen = (function (session, details) {
for (var i = 0; i < this._readyHandlers.length; i++) {
this._readyHandlers[i]([session, details]);
}
resolve([session, details]);
}).bind(_this);
_this._currentConnection.onclose = function (reason, details) {
if (reason === "unreachable") {
console.log("Server unreachable", details);
reject(details);
for (var i = 0; i < _this._unreachableHandlers.length; i++) {
_this._unreachableHandlers[i](details);
}
} else if (reason === "lost") {
console.log("Connection lost", details);
for (var i = 0; i < _this._lostHandlers.length; i++) {
_this._lostHandlers[i](details);
}
} else {
console.log("Connection closed", reason, details);
for (var i = 0; i < _this._errorHandlers.length; i++) {
_this._errorHandlers[i]([reason, details]);
}
}
};
_this._currentConnection.open();
});
return promise;
},
onUnreachable: function onUnreachable(callback) {
this._unreachableHandlers.push(callback);
return this;
},
onLost: function onLost(callback) {
this._lostHandlers.push(callback);
return this;
},
onReady: function onReady(callback) {
this._readyHandlers.push(callback);
return this;
},
onError: function onError(callback) {
this._errorHandlers.push(callback);
return this;
},
makeConnection: function makeConnection(params) {
if (this._currentConnection && this._currentConnection.isOpen) {
this._currentConnection.close();
}
this._currentConnection = new _autobahn2["default"].Connection(params);
},
initialize: function initialize(url, realm) {
this._url = url;
this._realm = realm;
this.makeConnection({ url: url, realm: realm });
},
reconnectAnonymously: function reconnectAnonymously() {
this.makeConnection({ url: this._url, realm: this._realm });
return this.connect();
},
reconnectWithToken: function reconnectWithToken(authid, token) {
function onchallenge(session, method, extra) {
if (method !== "ticket") {
throw new Error("Unknown authentication method: " + method + " ?!");
}
return token;
}
this.makeConnection({ url: this._url, realm: this._realm, authmethods: ["ticket"], authid: authid, onchallenge: onchallenge });
return this.connect();
},
reconnectWithAuth: function reconnectWithAuth(authid, secret) {
function onchallenge(session, method, extra) {
if (method !== "wampcra") {
throw new Error("Unknown authentication method: " + method + " ?!");
}
if ("salt" in extra) {
_autobahn2["default"].auth_cra.derive_key(secret, extra.salt);
}
return _autobahn2["default"].auth_cra.sign(secret, extra.challenge);
}
this.makeConnection({ url: this._url, realm: this._realm, authmethods: ["wampcra"], authid: authid, onchallenge: onchallenge });
return this.connect();
}
};
Object.defineProperty(Connection, "currentConnection", {
enumerable: true,
writeable: false,
get: function get() {
if (Connection._currentConnection && Connection._currentConnection.isOpen) {
return Connection._currentConnection;
} else {
throw new Error("Autobahn isn't initialized yet!");
}
}
});
exports["default"] = Connection;
module.exports = exports["default"];