From 6b950bdd068de3eee266d375505fd0cbf9aee249 Mon Sep 17 00:00:00 2001 From: "moxey.eth" Date: Fri, 9 Feb 2024 13:16:21 +1100 Subject: [PATCH] feat: typed routes; search param refactor --- biome.json | 1 + bun.lockb | Bin 194208 -> 194576 bytes src/index.tsx | 69 ++++++++++++++++++++++++++--------------------- src/package.json | 3 ++- src/preview.tsx | 2 +- src/types.ts | 5 ++-- 6 files changed, 46 insertions(+), 34 deletions(-) diff --git a/biome.json b/biome.json index 386d247b..7fd9d543 100644 --- a/biome.json +++ b/biome.json @@ -22,6 +22,7 @@ "rules": { "recommended": true, "complexity": { + "noBannedTypes": "off", "noUselessFragments": "off" }, "suspicious": { diff --git a/bun.lockb b/bun.lockb index 88d3a329d1684e06f7a66eddd4601f9d68a0ff06..aa450a8d119610f5307016e556ff08836d9d0cae 100755 GIT binary patch delta 35754 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 delta 35429 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 extends Hono { + frame

( + path: P, handler: ( - context: FrameContext, + context: FrameContext

, previousContext?: PreviousFrameContext | undefined, ) => FrameHandlerReturnType | Promise, ) { // Frame Route (implements GET & POST). this.use(path, async (c) => { const query = c.req.query() - const previousContext = - query.previousContext && query.previousContext !== 'undefined' - ? deserializeJson(query.previousContext) - : undefined + const previousContext = query.previousContext + ? deserializeJson(query.previousContext) + : undefined const context = await getFrameContext(c, previousContext) const { intents } = await handler(context, previousContext) @@ -60,31 +67,30 @@ export class Farc extends Hono { intents: parsedIntents, }) + const ogSearch = new URLSearchParams() + if (query.previousContext) + ogSearch.set('previousContext', query.previousContext) + if (serializedContext) ogSearch.set('context', serializedContext) + + const postSearch = new URLSearchParams() + if (serializedPreviousContext) + postSearch.set('previousContext', serializedPreviousContext) + return c.render( {parsedIntents} @@ -104,11 +110,13 @@ export class Farc extends Hono { this.get(`${toBaseUrl(path)}/image`, async (c) => { const query = c.req.query() const parsedContext = deserializeJson(query.context) - const parsedPreviousContext = - query.previousContext && query.previousContext !== 'undefined' - ? deserializeJson(query.previousContext) - : undefined - const { image } = await handler(parsedContext, parsedPreviousContext) + const parsedPreviousContext = query.previousContext + ? deserializeJson(query.previousContext) + : undefined + const { image } = await handler( + { ...parsedContext, request: c.req }, + parsedPreviousContext, + ) return new ImageResponse(image) }) @@ -401,6 +409,7 @@ async function getFrameContext( buttonIndex, buttonValue, inputText, + request: req, status, trustedData, untrustedData, @@ -450,13 +459,13 @@ function toBaseUrl(path_: string) { return path } -function deserializeJson(data = '{}'): returnType { +function deserializeJson(data = ''): returnType { if (data === 'undefined') return {} as returnType - return JSON.parse(decodeURIComponent(data)) + return JSON.parse(decompressFromEncodedURIComponent(data)) } function serializeJson(data: unknown = {}) { - return encodeURIComponent(JSON.stringify(data)) + return compressToEncodedURIComponent(JSON.stringify(data)) } export function htmlToMetaTags(html: string, selector: string) { diff --git a/src/package.json b/src/package.json index cf3c41de..73e946da 100644 --- a/src/package.json +++ b/src/package.json @@ -16,6 +16,7 @@ "@farcaster/core": "^0.13.7", "@noble/curves": "^1.3.0", "happy-dom": "^13.3.8", - "hono-og": "~0.0.2" + "hono-og": "~0.0.2", + "lz-string": "^1.5.0" } } diff --git a/src/preview.tsx b/src/preview.tsx index 2a489c32..5429bba8 100644 --- a/src/preview.tsx +++ b/src/preview.tsx @@ -63,7 +63,7 @@ function Frame(props: FrameProps) { return (

diff --git a/src/types.ts b/src/types.ts index e8838c91..65f34a81 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,12 +1,13 @@ // TODO: TSDoc -import { type Context } from 'hono' +import { type Context, type Env } from 'hono' import { type JSXNode } from 'hono/jsx' -export type FrameContext = { +export type FrameContext

= { buttonIndex?: number buttonValue?: string inputText?: string + request: Context['req'] /** * Status of the frame in the frame lifecycle. * - `initial` - The frame has not yet been interacted with.