/* global chrome */ /* global firebase */ const firebaseConfig = { apiKey: 'AIzaSyCJLuYpzXLDRmu2ttzFuSGmYcpFxqToWFU', authDomain: 'watch-party-crx.firebaseapp.com', databaseURL: 'https://watch-party-crx.firebaseio.com', projectId: 'watch-party-crx', storageBucket: 'watch-party-crx.appspot.com', messagingSenderId: '712242707190', appId: '1:712242707190:web:65fa7f772e30da364b0ad7', measurementId: 'G-EZS4PEVG4T', }; firebase.initializeApp(firebaseConfig); firebase.auth().setPersistence(firebase.auth.Auth.Persistence.LOCAL); const isAuthed = () => true && firebase.auth().currentUser; const doAuth = () => firebase.auth().signInAnonymously(); const fetcher = async (request, sendResponse) => { if (!isAuthed()) await doAuth(); const { url, method } = request; delete request.type; delete request.url; delete request.method; const idToken = await firebase.auth().currentUser.getIdToken(); let resStatus = {}; fetch(url, { method, headers: { Authorization: `Token ${idToken}:${firebase.auth().currentUser.uid}`, 'Access-Control-Allow-Origin': '*', }, ...request, }) .then((res) => { resStatus = { status: res.status, statusText: res.statusText, }; return res.json(); }) .then((res) => sendResponse({ ...res, ...resStatus })) .catch((err) => sendResponse({ ...err, status: 503, statusText: "Couldn't talk to server" })); }; const sendAuth = async (sendResponse) => { if (!isAuthed()) await doAuth(); sendResponse(firebase.auth().currentUser); }; chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { const { type } = request; switch (type) { case 'API_CALL': fetcher(request, sendResponse); break; case 'GET_AUTH': sendAuth(sendResponse); break; default: console.warn('Unknown message type: <', type, '>'); break; } return true; }); chrome.runtime.onConnect.addListener((port) => { port.onDisconnect.addListener(() => { port.roomListener && port.roomListener(); port.userListener && port.userListener(); port.messageListener && port.messageListener(); }); port.onMessage.addListener((request) => { const { type, roomId } = request; if (type === 'INIT') { port.roomListener = firebase .firestore() .collection('rooms') .doc(roomId) .onSnapshot( (snap) => { if (snap) { port.postMessage(snap.data()); } }, (err) => { port.postMessage({ isError: true, ...err }); } ); port.userListener = firebase .firestore() .collection('rooms') .doc(roomId) .collection('users') .onSnapshot( (snap) => { if (snap) { const isAdmin = snap.docs .filter((user) => user.id === firebase.auth().currentUser.uid)[0] .data().admin; port.postMessage({ admin: isAdmin }); } }, (err) => { port.postMessage({ isError: true, ...err }); } ); port.messageListener = firebase .firestore() .collection('rooms') .doc(roomId) .collection('messages') .orderBy('time') .onSnapshot( (snap) => { if (snap) { let messages = snap.docs.map((v) => ({ ...v.data(), id: v.id })); port.postMessage({ messages, }); } }, (err) => { port.postMessage({ isError: true, ...err }); } ); } }); });