53 lines
2 KiB
TypeScript
53 lines
2 KiB
TypeScript
import { NextFetchEvent, NextRequest, NextResponse } from 'next/server'
|
|
|
|
const PUBLIC_FILE = /.(.*)$/
|
|
|
|
export function middleware(req: NextRequest, event: NextFetchEvent) {
|
|
const pathname = req.nextUrl.pathname
|
|
const signedIn = req.cookies['drift-token']
|
|
const getURL = (pageName: string) => new URL(`/${pageName}`, req.url).href
|
|
const isPageRequest =
|
|
!PUBLIC_FILE.test(req.nextUrl.pathname) &&
|
|
!req.nextUrl.pathname.startsWith('/api') &&
|
|
// header added when next/link pre-fetches a route
|
|
!req.headers.get('x-middleware-preflight')
|
|
|
|
if (!req.headers.get('x-middleware-preflight') && pathname === '/signout') {
|
|
// If you're signed in we remove the cookie and redirect to the home page
|
|
// If you're not signed in we redirect to the home page
|
|
if (signedIn) {
|
|
const resp = NextResponse.redirect(getURL(''));
|
|
resp.clearCookie('drift-token');
|
|
resp.clearCookie('drift-userid');
|
|
const signoutPromise = new Promise((resolve) => {
|
|
fetch(`${process.env.API_URL}/auth/signout`, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
'Authorization': `Bearer ${signedIn}`,
|
|
'x-secret-key': process.env.SECRET_KEY || '',
|
|
},
|
|
})
|
|
.then(() => {
|
|
resolve(true)
|
|
})
|
|
})
|
|
event.waitUntil(signoutPromise)
|
|
|
|
return resp
|
|
}
|
|
} else if (isPageRequest) {
|
|
if (signedIn) {
|
|
if (pathname === '/' || pathname === '/signin' || pathname === '/signup') {
|
|
return NextResponse.redirect(getURL('new'))
|
|
}
|
|
} else if (!signedIn) {
|
|
if (pathname === '/new') {
|
|
return NextResponse.redirect(getURL('signin'))
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
return NextResponse.next()
|
|
}
|