Skip to content

Instantly share code, notes, and snippets.

@reggi
Created September 1, 2022 04:06
Show Gist options
  • Select an option

  • Save reggi/fd2feb838ed8497929d6802427644747 to your computer and use it in GitHub Desktop.

Select an option

Save reggi/fd2feb838ed8497929d6802427644747 to your computer and use it in GitHub Desktop.
Oak + Fresh + Dashport
/// <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