@erebus-sh/sdk
Version:
To install dependencies:
2 lines • 3.34 kB
JavaScript
import{MessageBodySchema,logger}from"./messageBody-DvuZs_xm.js";import{z}from"zod";import{Hono}from"hono";import{zValidator}from"@hono/zod-validator";import{handle}from"hono/vercel";const FireWebhookSchema=z.object({messageBody:z.array(MessageBodySchema),hmac:z.string()});async function generateHmac(e,c){let l=new TextEncoder,u=l.encode(c),d=l.encode(e),f=await crypto.subtle.importKey(`raw`,u,{name:`HMAC`,hash:{name:`SHA-256`}},!1,[`sign`]),p=await crypto.subtle.sign(`HMAC`,f,d);return Array.from(new Uint8Array(p)).map(e=>e.toString(16).padStart(2,`0`)).join(``)}async function verifyHmac(e,c,l){return await generateHmac(e,c)===l}function createApp(e){let l=new Hono;return l.onError((e,l)=>(logger.error(`[unhandled]`,{reqId:l.get(`reqId`),err:e instanceof Error?{name:e.name,message:e.message,stack:e.stack}:e,path:l.req.path,method:l.req.method}),l.json({error:`internal_error`,reqId:l.get(`reqId`)},500))),l.notFound(e=>e.json({error:`not_found`,path:e.req.path,reqId:e.get(`reqId`)},404)),l.use(`*`,async(l,u)=>{let d=crypto.randomUUID();if(l.set(`reqId`,d),e)if(typeof e==`function`){let c=await e(l.req.raw);l.set(`session`,c)}else l.set(`session`,e);let f=performance.now();try{await u()}finally{let e=Math.round(performance.now()-f);logger.info(`[${d}] ${l.req.method} ${l.req.path} -> ${e}ms`)}}),l.route(`/`,routes)}const routes=new Hono().get(`/api/health-not-meaningful`,e=>e.json({ok:!0,reqId:e.get(`reqId`)})).get(`/api/generate-token-test`,e=>e.get(`session`)?(logger.info(`[${e.get(`reqId`)}] Generating token`),e.json({token:`test`})):e.json({error:`session_required, the server is not initialized properly`,reqId:e.get(`reqId`)},400)).post(`/api/erebus/pubsub/grant`,zValidator(`json`,z.object({channel:z.string()})),async e=>{let l=e.get(`session`),u=e.get(`reqId`);if(logger.info(`[${u}] Generating token`),!l)return e.json({error:`session_required, the server is not initialized properly`,reqId:u},400);let d=``;try{d=await l.authorize()}catch(l){return logger.error(`[${u}] Error generating token: ${l instanceof Error?l.message:`Unknown error`}`),e.json({error:`error_generating_token`,reqId:u,message:l instanceof Error?l.message:`Unknown error`},500)}return e.json({grant_jwt:d})}).post(`/api/erebus/pubsub/fire-webhook`,zValidator(`json`,FireWebhookSchema),async e=>{let{messageBody:c,hmac:l}=e.req.valid(`json`),u=process.env.WEBHOOK_SECRET;return u?verifyHmac(JSON.stringify(c),u,l)?e.json({ok:!0}):e.json({error:`Invalid HMAC please, check the HMAC is correct`},401):e.json({error:`WEBHOOK_SECRET is not set please, set the secret key in the environment variables`},500)});async function getSessionFromRequest(e,c,l){let u=``;try{let c=await e.clone().json();typeof c.channel==`string`&&(u=c.channel)}catch{}if(e.method===`POST`&&(e.url===`/api/erebus/pubsub/fire-webhook`||e.url.endsWith(`/api/erebus/pubsub/fire-webhook`))){let c=await e.json();await l(c);return}else return await c(u,{req:e})}function createAdapter({authorize:e,fireWebhook:c}){return{fetch:async l=>{let u=await getSessionFromRequest(l,e,c);return await createApp(u).fetch(l)}}}function createRouteHandler({authorize:e,fireWebhook:c}){return{POST:async l=>{let u=await getSessionFromRequest(l,e,c),d=createApp(u);return await handle(d)(l)}}}export{createAdapter,createApp,createRouteHandler};
//# sourceMappingURL=next-D_6CQ-FW.js.map