1 | const http = require('http')
|
2 | const opn = require('opn')
|
3 | const getPort = require('get-port')
|
4 | const url = require('url')
|
5 | const oauth2Client = require('./auth')
|
6 | const { PORT = 3000 } = process.env
|
7 | const Gmail = require('./gmail')
|
8 | const db = require('./db')
|
9 | const createFetch = require('./create-fetch')
|
10 |
|
11 | async 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 |
|
21 | const getProfile = accessToken => createFetch({
|
22 | accessToken,
|
23 | endpoint: '/gmail/v1/users/me/profile'
|
24 | })
|
25 |
|
26 | const 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 |
|
45 | const server = http.createServer(handler)
|
46 |
|
47 | const 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 |
|
54 | getPort({ 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 | })
|