UNPKG

1.65 kBJavaScriptView Raw
1const http = require('http')
2const opn = require('opn')
3const getPort = require('get-port')
4const url = require('url')
5const oauth2Client = require('./auth')
6const { PORT = 3000 } = process.env
7const Gmail = require('./gmail')
8const db = require('./db')
9const createFetch = require('./create-fetch')
10
11async function getToken (code) {
12 const oauth = await oauth2Client()
13 return new Promise((resolve, reject) => {
14 oauth.getToken(code, (err, tokens) => {
15 if (err) { reject(err) }
16 resolve({ tokens })
17 })
18 })
19}
20
21const getProfile = accessToken => createFetch({
22 accessToken,
23 endpoint: '/gmail/v1/users/me/profile'
24})
25
26const handler = async (req, res) => {
27 const parsed = url.parse(req.url, true)
28 if (!req.url.startsWith('/callback')) return
29 const { tokens } = await getToken(parsed.query.code)
30 const profile = await getProfile(tokens.access_token)
31
32 let accounts = {
33 [profile.emailAddress]: {
34 profile,
35 tokens
36 }
37 }
38 db.set('prefs.accounts', accounts).write()
39 let gmail = new Gmail(accounts)
40 gmail.renderMain()
41 res.writeHead(200, { 'Content-Type': 'text/html' })
42 res.end('<script> window.close(); </script>')
43}
44
45const server = http.createServer(handler)
46
47const scopes = [
48 'https://mail.google.com/',
49 'https://www.googleapis.com/auth/gmail.compose',
50 'https://www.googleapis.com/auth/gmail.modify',
51 'https://www.googleapis.com/auth/gmail.send'
52]
53
54getPort({ port: PORT }).then(port => {
55 server.listen(port, async () => {
56 const auth = await oauth2Client()
57 const url = await auth.generateAuthUrl({
58 access_type: 'offline',
59 scope: scopes
60 })
61 opn(url)
62 })
63})