UNPKG

@frames.js/debugger

Version:

Debug your Frames.js applications

1 lines 9.59 kB
"use strict";exports.id=4030,exports.ids=[4030],exports.modules={74030:(e,t,r)=>{r.r(t),r.d(t,{GET:()=>w,POST:()=>v,getResponseBodySchema:()=>h});var a=r(53797),n=r(10441);r(73119);var s=r(27278),i=r(13264),o=r(34691),d=class extends Error{constructor(e,t){super("Invalid webhook response"),this.statusCode=e,this.response=t}};async function c(e,{privateKey:t,fid:r,webhookUrl:a}){let c=(0,o.ci)((0,s.$3)(t)),p=i._G.parse(e),f=await (0,n.Xx)({fid:r,payload:p,signer:{type:"app_key",appKey:c},signMessage:(0,n._w)(t)}),u=await fetch(a,{method:"POST",cache:"no-cache",headers:{"Content-Type":"application/json"},body:JSON.stringify(f.json)});if(!u.ok)throw new d(u.status,u)}var p=r(26532),f=r(72274),u=r(49974);let y=a.z.string().min(1).startsWith("0x").transform(e=>(0,p.nr)(e)),l=a.z.discriminatedUnion("action",[a.z.object({action:a.z.literal("add_frame"),privateKey:y}),a.z.object({action:a.z.literal("remove_frame"),privateKey:y}),a.z.object({action:a.z.literal("enable_notifications"),privateKey:y}),a.z.object({action:a.z.literal("disable_notifications"),privateKey:y})]),m=a.z.discriminatedUnion("type",[a.z.object({type:a.z.literal("frame_added"),notificationDetails:u.G}),a.z.object({type:a.z.literal("frame_removed")}),a.z.object({type:a.z.literal("notifications_enabled"),notificationDetails:u.G}),a.z.object({type:a.z.literal("notifications_disabled")})]);async function v(e,{params:t}){let r=l.safeParse(await e.json());if(!r.success)return Response.json(r.error.flatten(),{status:400});let a=await (0,f.c)(e.nextUrl.href),n=await a.getNamespace(t.namespaceId);if(!n)return Response.json({message:"Not found"},{status:404});switch(r.data.action){case"add_frame":{let e=await a.addFrame(n),t=crypto.randomUUID();await a.recordEvent(n.id,{type:"event",event:{event:"frame_added",notificationDetails:e},id:t});let s={event:"frame_added",notificationDetails:e};return c(s,{privateKey:r.data.privateKey,fid:n.fid,webhookUrl:n.webhookUrl}).then(()=>a.recordEvent(n.id,{type:"event_success",event:s,eventId:t,id:crypto.randomUUID()})).catch(async e=>a.recordEvent(n.id,{type:"event_failure",event:s,eventId:t,id:crypto.randomUUID(),message:e instanceof Error?e.message:String(e),response:e instanceof d?{body:await e.response.text(),headers:Object.fromEntries(e.response.headers.entries()),status:e.response.status}:void 0})),Response.json(m.parse({type:"frame_added",notificationDetails:e}),{status:201})}case"remove_frame":{await a.removeFrame(n);let e=crypto.randomUUID(),t={event:"frame_removed"};return await a.recordEvent(n.id,{type:"event",event:t,id:e}),c(t,{fid:n.fid,privateKey:r.data.privateKey,webhookUrl:n.webhookUrl}).then(()=>a.recordEvent(n.id,{type:"event_success",event:t,eventId:e,id:crypto.randomUUID()})).catch(async r=>a.recordEvent(n.id,{type:"event_failure",event:t,eventId:e,id:crypto.randomUUID(),message:r instanceof Error?r.message:String(r),response:r instanceof d?{body:await r.response.text(),headers:Object.fromEntries(r.response.headers.entries()),status:r.response.status}:void 0})),Response.json(m.parse({type:"frame_removed"}),{status:200})}case"enable_notifications":{let e=await a.enableNotifications(n),t=crypto.randomUUID();await a.recordEvent(n.id,{type:"event",event:{event:"notifications_enabled",notificationDetails:e},id:t});let s={event:"notifications_enabled",notificationDetails:e};return c(s,{fid:n.fid,privateKey:r.data.privateKey,webhookUrl:n.webhookUrl}).then(()=>a.recordEvent(n.id,{type:"event_success",event:s,eventId:t,id:crypto.randomUUID()})).catch(async e=>a.recordEvent(n.id,{type:"event_failure",event:s,eventId:t,id:crypto.randomUUID(),message:e instanceof Error?e.message:String(e),response:e instanceof d?{body:await e.response.text(),headers:Object.fromEntries(e.response.headers.entries()),status:e.response.status}:void 0})),Response.json(m.parse({type:"notifications_enabled",notificationDetails:e}),{status:201})}case"disable_notifications":{await a.disableNotifications(n);let e=crypto.randomUUID();await a.recordEvent(n.id,{type:"event",event:{event:"notifications_disabled"},id:e});let t={event:"notifications_disabled"};return c(t,{fid:n.fid,privateKey:r.data.privateKey,webhookUrl:n.webhookUrl}).then(()=>a.recordEvent(n.id,{type:"event_success",event:t,eventId:e,id:crypto.randomUUID()})).catch(async r=>a.recordEvent(n.id,{type:"event_failure",event:t,eventId:e,id:crypto.randomUUID(),message:r instanceof Error?r.message:String(r),response:r instanceof d?{body:await r.response.text(),headers:Object.fromEntries(r.response.headers.entries()),status:r.response.status}:void 0})),Response.json(m.parse({type:"notifications_disabled"}),{status:200})}default:throw r.data,Error("Unknown action")}}let h=a.z.object({fid:a.z.number(),frameAppUrl:a.z.string().url(),namespaceUrl:a.z.string().url(),webhookUrl:a.z.string().url(),frame:a.z.discriminatedUnion("status",[a.z.object({status:a.z.literal("added"),notificationDetails:u.G.nullable()}),a.z.object({status:a.z.literal("removed")})])});async function w(e,{params:t}){let r=await (0,f.c)(e.nextUrl.href),a=await r.getNamespace(t.namespaceId);return a?Response.json(h.parse(a),{status:200}):Response.json({message:"Not found"},{status:404})}},49974:(e,t,r)=>{r.d(t,{G:()=>i,M:()=>s});var a=r(13264),n=r(53797);let s=a.MV.extend({targetUrl:n.z.string().url()}),i=a.GN.extend({url:n.z.string().url()})},72274:(e,t,r)=>{r.d(t,{c:()=>a});async function a(e){let{KV_REST_API_TOKEN:t,KV_REST_API_URL:a}=process.env;return t&&a?(await r.e(4096).then(r.bind(r,14096))).getStorage(t,a,e):(await Promise.all([r.e(2725),r.e(9842)]).then(r.bind(r,79842))).getStorage(e)}},27278:(e,t,r)=>{r.d(t,{$3:()=>n.$3,T:()=>n.T,Xx:()=>n.Xx});var a=r(44382),n=r(37877);n.UG.sha512Sync||(n.UG.sha512Sync=(...e)=>(0,a.o)(n.UG.concatBytes(...e)))},10441:(e,t,r)=>{function a(e){return e.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function n(e){let t=e.length%4,r=e.replace(/-/g,"+").replace(/_/g,"/").padEnd(e.length+Math.max(0,4-t),"=");return Buffer.from(r,"base64")}r.d(t,{pH:()=>w,Xx:()=>v,_w:()=>g,T:()=>h});var s=r(73119),i=r(27278),o=r(17483),d=r(48458),c=r(73089),p=r(27581),f=r(34691),u=r(87379),y=class extends Error{},l=class extends Error{},m=class extends Error{constructor(e){super(),this.cause=e}};async function v(e){var t,r,n;let s;let i=(t=e.fid,r=e.signer,a(Buffer.from(JSON.stringify({fid:t,type:r.type,key:"custody"===r.type?r.custodyAddress:r.appKey}),"utf-8"))),d=(n=e.payload,a(Buffer.from(JSON.stringify(n),"utf-8"))),c=await e.signMessage(`${i}.${d}`);return s="app_key"===e.signer.type?a(Buffer.from((0,o.nr)(c))):a(Buffer.from(c,"utf-8")),{compact:`${i}.${d}.${s}`,json:{header:i,payload:d,signature:s}}}async function h(e,t={}){let r=function(e){try{let t=n(e),r=JSON.parse(t.toString("utf-8")),a={fid:0,type:"custody",key:"0x"};if("object"!=typeof r||null===r)throw new y;if("fid"in r&&"number"==typeof r.fid&&r.fid>0)a.fid=r.fid;else throw new y;if("type"in r&&"string"==typeof r.type&&["custody","app_key"].includes(r.type))a.type=r.type;else throw new y;if("key"in r&&"string"==typeof r.key&&r.key.startsWith("0x")&&r.key.length>2)a.key=r.key;else throw new y;return a}catch(e){if(e instanceof y)throw e;throw new y}}(e.header);if("app_key"===r.type){let a=n(e.signature),d=Buffer.from(`${e.header}.${e.payload}`),c=(0,o.nr)(r.key);if(!(0,i.T)(a,d,c))return!1;let p=t.verifyAppKey??(0,s.V)();return!!(await p(r.fid,r.key)).valid}let a=function(e){try{let t=n(e).toString("utf-8");if(!t.startsWith("0x"))throw Error("Invalid signature, must contain hex text");return t}catch(e){throw new m(e)}}(e.signature),f=(0,d.v)({chain:u.v,transport:(0,c.d)()});return!!await f.verifyMessage({address:r.key,signature:a,message:`${e.header}.${e.payload}`})&&await f.readContract({abi:(0,p.V)(["function custodyOf(uint256) public view returns (address)","function idOf(address) public view returns (uint256)"]),address:"0x00000000Fc6c5F01Fc30151999387Bb99A9f489b",functionName:"custodyOf",args:[BigInt(r.fid)]})===r.key}function w(e){try{let t=n(e),r=JSON.parse(t.toString("utf-8"));if("object"!=typeof r||null===r)throw new l;return r}catch(e){if(e instanceof l)throw e;throw new l}}function g(e){return t=>{let r=(0,i.Xx)(Buffer.from(t,"utf-8"),"string"==typeof e?(0,o.nr)(e):e);return Promise.resolve((0,f.ci)(r))}}},73119:(e,t,r)=>{r.d(t,{V:()=>i});var a=r(78822),n=r(53797),s=class extends Error{constructor(e,t){super(e),this.cause=t}};function i({apiKey:e=process.env.NEYNAR_API_KEY,hubUrl:t="https://hub-api.neynar.com"}={}){var r;if(!e)throw Error("verifyAppKeyWithNeynar requires appKey to be passed in or set as an environment variable NEYNAR_API_KEY");return r={headers:{"x-api-key":e},cache:"no-cache"},async(e,n)=>{let i=new URL("/v1/onChainSignersByFid",t);i.searchParams.append("fid",e.toString());let c=await fetch(i,r);if(200!==c.status)throw new s("Error fetching from Hub API, non-200 status code received",await c.text());let p=d.safeParse(await c.json());if(p.error)throw new s("Error parsing Hub response",p.error);let f=n.toLowerCase(),u=p.data.events.find(e=>e.signerEventBody.key.toLowerCase()===f);if(!u)return{valid:!1};let y=a.Jx(o,Buffer.from(u.signerEventBody.metadata,"base64"));if(1!==y.length)throw new s("Error decoding metadata");return{valid:!0,appFid:Number(y[0].requestFid)}}}var o=[{components:[{name:"requestFid",type:"uint256"},{name:"requestSigner",type:"address"},{name:"signature",type:"bytes"},{name:"deadline",type:"uint256"}],name:"SignedKeyRequest",type:"tuple"}],d=n.z.object({events:n.z.array(n.z.object({signerEventBody:n.z.object({key:n.z.string(),metadata:n.z.string()})}))})}};