UNPKG

@omneedia/client-js

Version:

Isomorphic Javascript client for Omneedia

333 lines 13.4 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const util_1 = require("./util"); const core_1 = require("@capacitor/core"); const browser_1 = require("@capacitor/browser"); class OmneediaAuth { constructor(ref, options) { this.tokenListener = null; this.session = this.getSession; this.options = options; this.ref = ref; this.tokenListener = setInterval(() => __awaiter(this, void 0, void 0, function* () { if ((0, util_1.isBrowser)()) { /** look storage */ let session = yield this.session().getUser(); if (!session) return; let refresh = localStorage.getItem('omneedia.auth.refresh_token'); if (!refresh) { localStorage.removeItem('omneedia.auth.token'); localStorage.removeItem('omneedia.auth.refresh_token'); return (location.href = `#new_token=${refresh}`); } let date = new Date(session.exp * 1000); if (date < new Date()) { let token = yield this.getNewToken(refresh); if (token === false) { localStorage.removeItem('omneedia.auth.token'); localStorage.removeItem('omneedia.auth.refresh_token'); return (location.href = `#new_token=${refresh}`); } localStorage.setItem('omneedia.auth.token', token); return (location.href = `#new_token=${refresh}`); } } else { let session = yield this.session().getUser(); if (!session) return; } }), 1000); } getNewToken(refresh_token) { return __awaiter(this, void 0, void 0, function* () { let { data } = yield this.ref.request.post(this.ref.PREFIX.AUTH + '/token?grant_type=refresh_token', { refresh_token: refresh_token, }); var response; if (data.err) response = false; else { response = data.access_token; } return response; }); } _setUserData(data) { this.options.cookies.setAll([ { name: 'omneedia.auth.token', value: data.access_token, lifetime: 60 * 3600 * 8, domain: '', path: '/', sameSite: 'lax', }, ]); } signInWithPassword(props) { return __awaiter(this, void 0, void 0, function* () { let { data } = yield this.ref.request.post(this.ref.PREFIX.AUTH + '/token?grant_type=password', { props, }); if ((0, util_1.isBrowser)()) { if (data.err) url = [`#error=${data.err}`]; else { var url = []; for (var el in data) url.push(`${el}=${data[el]}`); } location.href = '#' + url.join('&'); } else { if (data.err) return { data: { user: null, session: null }, error: { message: data.err } }; this._setUserData(data); return this.getUser(data.access_token); } }); } signUp(props) { return __awaiter(this, void 0, void 0, function* () { let { data } = yield this.ref.request.post(this.ref.PREFIX.AUTH + '/signup', { props, }); if (data.err) url = [`#error=${data.err}`]; else { var url = []; for (var el in data) url.push(`${el}=${data[el]}`); } if (data.waiting) url = [`#waiting`]; location.href = '#' + url.join('&'); }); } signInWithProvider(props) { var _a; return __awaiter(this, void 0, void 0, function* () { // generateId :: Integer -> String const generateId = (len) => { const dec2hex = (dec) => { return dec.toString(16).padStart(2, '0'); }; var arr = new Uint8Array((len || 40) / 2); window.crypto.getRandomValues(arr); return Array.from(arr, dec2hex).join(''); }; if ((_a = props.config) === null || _a === void 0 ? void 0 : _a.callback) { return (location.href = `${this.ref.URI}${this.ref.PREFIX.AUTH}/authorize?provider=${props.provider}&callback=${props.config.callback}`); } const platform = yield core_1.Capacitor.getPlatform(); const getSession = (uid) => __awaiter(this, void 0, void 0, function* () { let { data } = yield this.ref.request.post(this.ref.PREFIX.AUTH + '/session', { sid: uid, }); if ((0, util_1.isBrowser)()) { if (data === null || data === void 0 ? void 0 : data.uri) { location.hash = data.uri; browser_1.Browser.close(); } else setTimeout(() => { console.log('x'); getSession(uid); }, 1000); } if (platform === 'ios' || platform === 'android') { const uid = generateId(); getSession(uid); browser_1.Browser.open({ url: `${this.ref.URI}${this.ref.PREFIX.AUTH}/authorize?provider=${props.provider}&sid=${uid}`, }); } else { var win = window.open(`${this.ref.URI}${this.ref.PREFIX.AUTH}/authorize?provider=${props.provider}`, '_blank'); window.addEventListener('message', (event) => { return (location.hash = event.data); }, false); } }); //return true return false; }); } updateUser(props) { return __awaiter(this, void 0, void 0, function* () { const urlParams = new URLSearchParams(window.location.search); const token = urlParams.get('token'); if (token) props.token = token; let { data } = yield this.ref.request.put(this.ref.PREFIX.AUTH + '/user', props); return data; }); } onAuthStateChange(fn) { if ((0, util_1.isBrowser)()) { var HashChange = () => { if (location.href.indexOf('access_token') > -1) { var params = (0, util_1.getHashParams)(); window.location.hash = ''; localStorage.setItem('omneedia.auth.token', params.access_token); localStorage.setItem('omneedia.auth.refresh_token', params.refresh_token); return fn('SIGNED_IN', params); } if (location.href.indexOf('#waiting') > -1) { window.location.hash = ''; return fn('WAITING_FOR_CONFIRMATION', {}); } if (location.href.indexOf('#logout') > -1) { localStorage.removeItem('omneedia.auth.token'); localStorage.removeItem('omneedia.auth.refresh_token'); window.location.hash = ''; return fn('SIGNED_OUT', {}); } if (location.href.indexOf('#error') > -1) { var token = decodeURIComponent(location.href).split('#error=')[1]; fn('ERROR', token); window.location.hash = ''; return false; } if (location.href.indexOf('#new_token') > -1) { var token = decodeURIComponent(location.href).split('#new_token=')[1]; fn('REFRESH_TOKEN', localStorage.getItem('omneedia.auth.token')); window.location.hash = ''; return false; } if (localStorage.getItem('omneedia.auth.token')) { fn('AUTHENTICATED', localStorage.getItem('omneedia.auth.token')); } }; window.addEventListener('hashchange', HashChange); window.addEventListener('load', HashChange); HashChange(); } else { // cookie based auth } } resetPasswordForEmail(props) { return __awaiter(this, void 0, void 0, function* () { let { data } = yield this.ref.request.post(this.ref.PREFIX.AUTH + '/recover', props); if (data.err) url = [`error=${data.err}`]; else { var url = []; for (var el in data) url.push(`${el}=${data[el]}`); } if (data.waiting) url = [`waiting`]; location.href = '#' + url.join('&'); }); } signInWithEmail(props) { return __awaiter(this, void 0, void 0, function* () { let { data } = yield this.ref.request.post(this.ref.PREFIX.AUTH + '/magiclink', props); if (data.err) url = [`error=${data.err}`]; else { var url = []; for (var el in data) url.push(`${el}=${data[el]}`); } if (data.waiting) url = [`waiting`]; location.href = '#' + url.join('&'); }); } getSession() { var session = false; if ((0, util_1.isBrowser)()) { if (localStorage.getItem('omneedia.auth.token')) { let token = localStorage.getItem('omneedia.auth.token'); session = (0, util_1.parseJwt)(token); } } else { // use cookie } return { getUser: () => { return session; }, }; } getUser(token) { return __awaiter(this, void 0, void 0, function* () { if (token) { if ((0, util_1.isBrowser)()) { try { token = (0, util_1.urlBase64Decode)(token); return token; } catch (e) { return null; } } else { return { data: { user: (0, util_1.urlBase64Decode)(token), session: token }, error: null }; } } let { data } = yield this.ref.request.get(this.ref.PREFIX.AUTH + '/user'); if (data === false) { if ((0, util_1.isBrowser)()) { localStorage.removeItem('omneedia.auth.token'); localStorage.removeItem('omneedia.auth.refresh_token'); } else { // use cookie this.options.cookies.deleteAll(); } } if ((0, util_1.isBrowser)()) return data; else return { data: { user: data }, error: null }; }); } isAuthenticated() { if ((0, util_1.isBrowser)()) { if (window.localStorage.getItem('omneedia.auth.token')) return true; else return false; } } signOut() { return __awaiter(this, void 0, void 0, function* () { if ((0, util_1.isBrowser)()) { yield this.ref.request.get(this.ref.PREFIX.AUTH + '/signout'); location.hash = '#logout'; return; } else { yield this.ref.request.get(this.ref.PREFIX.AUTH + '/signout'); this.options.cookies.setAll([ { name: 'omneedia.auth.token', value: '', lifetime: 0, domain: '', path: '/', sameSite: 'lax', }, ]); } }); } } exports.default = OmneediaAuth; //# sourceMappingURL=auth.js.map