Created
September 1, 2022 04:06
-
-
Save reggi/fd2feb838ed8497929d6802427644747 to your computer and use it in GitHub Desktop.
Oak + Fresh + Dashport
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /// <reference no-default-lib="true" /> | |
| /// <reference lib="dom" /> | |
| /// <reference lib="dom.asynciterable" /> | |
| /// <reference lib="deno.ns" /> | |
| /// <reference lib="deno.unstable" /> | |
| import { serve, ConnInfo } from "https://deno.land/std@0.150.0/http/server.ts"; | |
| import { InnerRenderFunction, RenderContext, ServerContext } from "$fresh/server.ts"; | |
| import manifest from "./fresh.gen.ts"; | |
| import { config, setup } from "@twind"; | |
| import { virtualSheet } from "twind/sheets"; | |
| import { DashportOak } from 'https://deno.land/x/dashport@v1.2.1/mod.ts'; | |
| import { Application, Router } from "https://deno.land/x/oak/mod.ts"; | |
| import GitHubStrategy from 'https://deno.land/x/dashport_github/mod.ts' | |
| export const ghStrat = new GitHubStrategy({ | |
| client_id: Deno.env.get('GH_CLIENT_ID'), | |
| client_secret: Deno.env.get('GH_CLIENT_SECRET'), | |
| redirect_uri: 'http://localhost:8000/privatepage', | |
| }) | |
| export const ghSerializer = async (userInfo: any) => { | |
| const serializedId = Math.floor(Math.random() * 1000000000); | |
| userInfo.id = serializedId; | |
| console.log({userInfo}) | |
| try { | |
| await Promise.all([]); | |
| return serializedId; | |
| } catch(err) { | |
| return err; | |
| // or return new Error(err); | |
| } | |
| }; | |
| export const ghDeserializer = async (serializedId: (string | number)) => { | |
| console.log({serializedId}) | |
| try { | |
| const userInfo = await Promise.resolve({ id: 1234}) | |
| return userInfo; | |
| } catch(err) { | |
| return err; | |
| // or return new Error(err); | |
| } | |
| }; | |
| const app = new Application(); | |
| const dashport = new DashportOak(app); | |
| const router = new Router(); | |
| router.get('/privatepage', | |
| dashport.authenticate(ghStrat, ghSerializer, ghDeserializer), | |
| (ctx: any, next: any) => { | |
| ctx.response.body = 'This is a private page!'; | |
| } | |
| ) | |
| app.use(router.routes()); | |
| const sheet = virtualSheet(); | |
| sheet.reset(); | |
| setup({ ...config, sheet }); | |
| function render(ctx: RenderContext, render: InnerRenderFunction) { | |
| const snapshot = ctx.state.get("twind") as unknown[] | null; | |
| sheet.reset(snapshot || undefined); | |
| render(); | |
| ctx.styles.splice(0, ctx.styles.length, ...(sheet).target); | |
| const newSnapshot = sheet.reset(); | |
| ctx.state.set("twind", newSnapshot); | |
| } | |
| serve(async (req: Request, options: ConnInfo) => { | |
| const oakRes = await app.handle(req); | |
| if (oakRes) return oakRes; | |
| const ctx = await ServerContext | |
| .fromManifest(manifest, { render }); | |
| return ctx.handler()(req, options) | |
| }); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment