diff --git a/src/handlers/auth.js b/src/handlers/auth.js index 1ab5d046..72844d00 100644 --- a/src/handlers/auth.js +++ b/src/handlers/auth.js @@ -7,7 +7,12 @@ import {setup} from './setup'; import {register} from './register'; import AppRouterClient from '../routerClients/AppRouterClient'; import PagesRouterClient from '../routerClients/PagesRouterClient'; +import {NextRequest} from 'next/server'; +import RouterClient from '../routerClients/RouterClient'; +/** + * @type {Record Promise>} + */ const routeMap = { create_org: createOrg, register, @@ -17,6 +22,11 @@ const routeMap = { kinde_callback: callback }; +/** + * + * @param {string} endpoint + * @returns + */ const getRoute = (endpoint) => { return routeMap[endpoint]; }; @@ -27,21 +37,29 @@ const getRoute = (endpoint) => { export default (request, endpoint) => { // For backwards compatibility in app router if (typeof request == 'object' && typeof endpoint == 'string') { + // @ts-ignore return appRouterHandler(request, {params: {kindeAuth: endpoint}}); } /** * - * @param {Request} [req] - * @param {Response} [res] - * @returns {Response} + * @param {import('next').NextApiRequest | Request} req + * @param {import('next').NextApiResponse | Response} res */ return async function handler(req, res) { return isAppRouter(req) - ? appRouterHandler(req, res) - : pagesRouterHandler(req, res); + ? // @ts-ignore + appRouterHandler(req, res) + : // @ts-ignore + pagesRouterHandler(req, res); }; }; +/** + * + * @param {NextRequest} req + * @param {{params: {kindeAuth: string}}} res + * @returns + */ const appRouterHandler = async (req, res) => { const {params} = res; let endpoint = params.kindeAuth; @@ -49,17 +67,28 @@ const appRouterHandler = async (req, res) => { const route = getRoute(endpoint); return route - ? await route(new AppRouterClient(req, res)) + ? // @ts-ignore + await route(new AppRouterClient(req, res)) : new Response('This page could not be found.', {status: 404}); }; +/** + * + * @param {import('next').NextApiRequest} req + * @param {import('next').NextApiResponse} res + * @returns + */ const pagesRouterHandler = async (req, res) => { let { query: {kindeAuth: endpoint} } = req; endpoint = Array.isArray(endpoint) ? endpoint[0] : endpoint; + if (!endpoint) { + throw Error('Please check your Kinde setup'); + } const route = getRoute(endpoint); return route - ? await route(new PagesRouterClient(req, res)) + ? // @ts-ignore + await route(new PagesRouterClient(req, res)) : res.status(404).end(); }; diff --git a/src/routerClients/AppRouterClient.js b/src/routerClients/AppRouterClient.js index f557a811..db6f8cb0 100644 --- a/src/routerClients/AppRouterClient.js +++ b/src/routerClients/AppRouterClient.js @@ -1,12 +1,20 @@ import {createKindeServerClient} from '@kinde-oss/kinde-typescript-sdk'; import {cookies} from 'next/headers'; import {redirect} from 'next/navigation'; -import {NextResponse} from 'next/server'; +import {NextRequest} from 'next/server'; import {config} from '../config/index'; import {appRouterSessionManager} from '../session/sessionManager'; +import RouterClient from './RouterClient'; -export default class AppRouterClient { +// @ts-ignore +export default class AppRouterClient extends RouterClient { + /** + * + * @param {NextRequest} req + * @param {*} res + */ constructor(req, res) { + super(); this.kindeClient = createKindeServerClient( config.grantType, config.clientOptions @@ -17,22 +25,42 @@ export default class AppRouterClient { this.searchParams = req.nextUrl.searchParams; } + /** + * + * @param {string} url + * @returns + */ redirect(url) { return redirect(url); } + /** + * + * @returns {URL} + */ getUrl() { return this.url; } + /** + * + * @param {object} data + * @param {{status: number}} status + * @returns + */ json(data, status) { - return NextResponse.json(data, status); + return Response.json(data, status); } error() { - return NextResponse.error; + return Response.error; } + /** + * + * @param {string} key + * @returns + */ getSearchParam(key) { return this.req.nextUrl.searchParams.get(key); } diff --git a/src/routerClients/PagesRouterClient.js b/src/routerClients/PagesRouterClient.js index b10e2d1c..f9c64e78 100644 --- a/src/routerClients/PagesRouterClient.js +++ b/src/routerClients/PagesRouterClient.js @@ -1,13 +1,22 @@ import {createKindeServerClient} from '@kinde-oss/kinde-typescript-sdk'; import {config} from '../config/index'; import {sessionManager} from '../session/sessionManager'; +import RouterClient from './RouterClient'; -export default class PagesRouterClient { +// @ts-ignore +export default class PagesRouterClient extends RouterClient { + /** + * + * @param {import('next').NextApiRequest} req + * @param {import('next').NextApiResponse} res + */ constructor(req, res) { + super(); this.kindeClient = createKindeServerClient( config.grantType, config.clientOptions ); + // @ts-ignore this.url = new URL(config.redirectURL + req.url); this.res = res; this.req = req; @@ -15,18 +24,33 @@ export default class PagesRouterClient { this.sessionManager = sessionManager(req, res); } + /** + * + * @param {string} url + * @returns + */ redirect(url) { - return this.res.redirect(url.href ? url.href : url); + return this.res.redirect(url); } getUrl() { return this.url; } - - json(data, status = 200) { - return this.res.status(status).json(data); + /** + * + * @param {object} data + * @param {{status: number}} status + * @returns + */ + json(data, status) { + return this.res.status(status.status).json(data); } + /** + * + * @param {string} key + * @returns {string | null} + */ getSearchParam(key) { return this.url.searchParams.get(key); } diff --git a/src/routerClients/RouterClient.js b/src/routerClients/RouterClient.js index 26d80957..5a7a9bf0 100644 --- a/src/routerClients/RouterClient.js +++ b/src/routerClients/RouterClient.js @@ -1,15 +1,41 @@ -export default class AppRouterClient { +import {GrantType} from '@kinde-oss/kinde-typescript-sdk'; +import {NextResponse} from 'next/server'; + +export default class RouterClient { constructor() { - if (this.constructor == AppRouterClient) { + if (this.constructor == RouterClient) { throw new Error("Abstract classes can't be instantiated."); } + /** @type {import('../../types').KindeClient} */ + this.kindeClient; + /** @type {URL} */ + this.url; + /** @type {import('@kinde-oss/kinde-typescript-sdk').SessionManager} */ + this.sessionManager; + /** @type {import('next').NextApiResponse | *} */ + this.res; + /** @type {import('next').NextApiRequest | NextResponse | *} */ + this.req; + /** @type {URLSearchParams} */ + this.searchParams; } - redirect() { + /** + * + * @param {string} url + * @returns + */ + redirect(url) { throw new Error("Method 'redirect()' must be implemented."); } - json() { + /** + * + * @param {object} data + * @param {{status: number}} [status] + * @returns + */ + json(data, status) { throw new Error("Method 'json()' must be implemented."); } @@ -17,7 +43,20 @@ export default class AppRouterClient { throw new Error("Method 'error()' must be implemented."); } - getSearchParam() { + /** + * + * @returns {URL} + */ + getUrl() { + throw new Error("Method 'getUrl()' must be implemented."); + } + + /** + * + * @param {string} key + * @returns {string | null} + */ + getSearchParam(key) { throw new Error("Method 'getSearchParam()' must be implemented."); } }