authbase
Version:
AuthBase client library
98 lines (78 loc) • 3.52 kB
JavaScript
var Emitter = require('component-emitter'),
serializer = require('form-serialize'),
registerForms = require('./registerForms');
messenger = require('./messenger');
var AuthBase = function AuthBase() {};
AuthBase.init = function init(appId, remote) {
// Set up messaging
AuthBase.messenger = messenger(appId, remote, onReady, onMessage);
// Register custom tags
registerForms(onSubmit);
function onSubmit(type) {
return function(form) {
var message = form.querySelector('.authbase-message');
message.className = 'authbase-message';
message.textContent = '';
AuthBase.messenger.send(type, serializer(form, { hash: true }), form.name);
};
}
// Handle form response
function onMessage(data) {
// Update the form with the results of the request
var form = document.forms[data.form];
if (form) {
var message = form.querySelector('.authbase-message');
message.className += (data.success ? ' success' : ' error');
message.textContent = data.message;
}
// Update user tokens
if (data.user_token) localStorage.setItem('authbase-user-token', data.user_token);
if (data.refresh_token) localStorage.setItem('authbase-refresh-token', data.refresh_token);
// Emit an event if the action was successful, unless it was a logout
if (data.success && data.type !== 'logout') {
AuthBase.emit(data.type, data.payload);
}
}
// Restore a session if one already exists when the message bus is ready
function onReady() {
var userToken = localStorage.getItem('authbase-user-token');
var refreshToken = localStorage.getItem('authbase-refresh-token');
if (userToken && refreshToken) {
AuthBase.messenger.send('restore', {
userToken: userToken,
refreshToken: refreshToken
});
}
}
};
AuthBase.isLoggedIn = function() {
return !!localStorage.getItem('authbase-user-token') &&
!!localStorage.getItem('authbase-refresh-token');
};
// Logout the user
AuthBase.logout = function() {
var finalize = function() {
localStorage.removeItem('authbase-user-token');
localStorage.removeItem('authbase-refresh-token');
AuthBase.offLogout(finalize);
};
// Send the logout event to the server, but instead of waiting
// for a response, immediately emit the logout event handler.
AuthBase.onLogout(finalize);
AuthBase.messenger.send('logout');
AuthBase.emit('logout');
};
// Event Handlers
AuthBase.onChangeEmail = function(callback) { AuthBase.on('change-email', callback); };
AuthBase.offChangeEmail = function(callback) { AuthBase.off('change-email', callback); };
AuthBase.onChangePassword = function(callback) { AuthBase.on('change-password', callback); };
AuthBase.offChangePassword = function(callback) { AuthBase.off('change-password', callback); };
AuthBase.onLogin = function(callback) { AuthBase.on('login', callback); };
AuthBase.offLogin = function(callback) { AuthBase.off('login', callback); };
AuthBase.onLogout = function(callback) { AuthBase.on('logout', callback); };
AuthBase.offLogout = function(callback) { AuthBase.off('logout', callback); };
AuthBase.onResetPassword = function(callback) { AuthBase.on('reset-password', callback); };
AuthBase.offResetPassword = function(callback) { AuthBase.off('reset-password', callback); };
AuthBase.onSignup = function(callback) { AuthBase.on('signup', callback); };
AuthBase.offSignup = function(callback) { AuthBase.off('signup', callback); };
module.exports = Emitter(AuthBase);