eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
1 lines • 8.06 kB
JavaScript
var e=class extends Error{constructor(e){super(e),this.name=`SlackWebhookError`}},t=class extends e{constructor(e){super(e),this.name=`SlackWebhookVerificationError`}},n=class extends e{constructor(e){super(e),this.name=`SlackWebhookParseError`}};function r(e,t){if(!e)return;if(typeof Headers<`u`&&e instanceof Headers)return e.get(t)??void 0;let n=t.toLowerCase();if(d(e)){for(let[t,r]of e)if(t.toLowerCase()===n)return r;return}for(let[t,r]of Object.entries(e))if(t.toLowerCase()===n)return f(r)}function i(e){let t=r(e,`x-slack-retry-num`);if(!t)return;let n=Number(t);if(Number.isFinite(n))return{num:n,reason:r(e,`x-slack-retry-reason`)}}function a(e,t){return t.includes(`application/x-www-form-urlencoded`)?!0:t.includes(`application/json`)?!1:!e.trimStart().startsWith(`{`)&&e.includes(`=`)}function o(e){try{return JSON.parse(e)}catch{throw new n(`Slack webhook body is invalid JSON`)}}function s(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function c(e){return s(e)?e:void 0}function l(e){return typeof e==`string`?e:``}function u(e){return l(e)||void 0}function d(e){return typeof e[Symbol.iterator]==`function`}function f(e){if(typeof e==`string`)return e;if(Array.isArray(e))return e[0]}function p(e,t={}){let n=t.headers,s=t.contentType??r(n,`content-type`)??``,c=i(n);return a(e,s)?m(e,c):h(o(e),c)}function m(e,t){let n=new URLSearchParams(e),r=n.get(`payload`);return r===null?n.has(`command`)?v(n,t):{kind:`unsupported`,raw:Object.fromEntries(n),retry:t,type:`form`}:g(o(r),t)}function h(e,t){if(!s(e))return{kind:`unsupported`,raw:e,retry:t,type:`unknown`};if(e.type===`url_verification`&&typeof e.challenge==`string`)return{challenge:e.challenge,kind:`url_verification`,raw:e,retry:t};if(e.type!==`event_callback`||!s(e.event))return{kind:`unsupported`,raw:e,retry:t,type:typeof e.type==`string`?e.type:`unknown`};let n=e.event;return n.type===`app_mention`?_(`app_mention`,e,n,t):n.type===`message`&&n.channel_type===`im`?_(`direct_message`,e,n,t):{kind:`unsupported`,raw:e,retry:t,type:typeof n.type==`string`?n.type:`event_callback`}}function g(e,t){if(!s(e))return{kind:`unsupported`,raw:e,retry:t,type:`interaction`};switch(e.type){case`block_actions`:return y(e,t);case`block_suggestion`:return x(e,t);case`view_submission`:return S(e,t);case`view_closed`:return C(e,t);default:return{kind:`unsupported`,raw:e,retry:t,type:typeof e.type==`string`?e.type:`interaction`}}}function _(e,t,n,r){let i=l(n.channel),a=l(n.ts),o=l(n.thread_ts)||a,s=u(n.team_id)||u(t.team_id),c=u(t.enterprise_id)||u(t.context_enterprise_id),d=i?{channelId:i,enterpriseId:c,teamId:s,threadTs:o}:{channelId:``,enterpriseId:c,teamId:s,threadTs:o},f={apiAppId:u(t.api_app_id),channelId:i,continuation:d,enterpriseId:c,eventId:u(t.event_id),eventTime:typeof t.event_time==`number`?t.event_time:void 0,files:w(n.files),eventType:n.type,isExtSharedChannel:typeof t.is_ext_shared_channel==`boolean`?t.is_ext_shared_channel:void 0,raw:n,retry:r,teamId:s,text:l(n.text),threadTs:o,ts:a,userId:u(n.user)};return e===`app_mention`?{...f,eventType:`app_mention`,kind:e}:{...f,botId:u(n.bot_id),eventType:`message`,kind:e,subtype:u(n.subtype)}}function v(e,t){let n=e.get(`enterprise_id`)||void 0,r=e.get(`team_id`)||void 0;return{channelId:e.get(`channel_id`)??``,channelName:e.get(`channel_name`)||void 0,command:e.get(`command`)??``,enterpriseId:n,isEnterpriseInstall:e.get(`is_enterprise_install`)===`true`,kind:`slash_command`,raw:Object.fromEntries(e),responseUrl:e.get(`response_url`)||void 0,retry:t,teamId:r,text:e.get(`text`)??``,triggerId:e.get(`trigger_id`)||void 0,userId:e.get(`user_id`)??``,userName:e.get(`user_name`)||void 0}}function y(e,t){let n=c(e.channel),r=c(e.container),i=c(e.message),a=E(e.user),o=c(e.team),s=c(e.enterprise),l=u(n?.id)||u(r?.channel_id),d=u(i?.ts)||u(r?.message_ts),f=u(i?.thread_ts)||u(r?.thread_ts)||d,p=u(o?.id)||a.teamId,m=u(s?.id)||u(o?.enterprise_id),h=l&&f?{channelId:l,enterpriseId:m,teamId:p,threadTs:f}:void 0,g=Array.isArray(i?.blocks)?i.blocks:void 0,_=D(g);return{actions:Array.isArray(e.actions)?e.actions.map(e=>b(e,a)):[],channelId:l,continuation:h,enterpriseId:m,isEnterpriseInstall:typeof e.is_enterprise_install==`boolean`?e.is_enterprise_install:void 0,kind:`block_actions`,messageBlocks:g,messagePromptBlock:_,messagePromptText:O(_),messageTs:d,raw:e,responseUrl:u(e.response_url),retry:t,teamId:p,threadTs:f,triggerId:u(e.trigger_id),user:a,userId:a.id,userName:a.username||a.name}}function b(e,t){let n=s(e)?e:{},r=c(n.selected_option),i=c(n.text),a=c(r?.text);return{actionId:l(n.action_id),blockId:u(n.block_id),label:u(a?.text)||u(i?.text),raw:n,selectedOptionLabel:u(a?.text),selectedOptionValue:u(r?.value),type:l(n.type),user:t,value:u(n.value)}}function x(e,t){let n=c(e.channel),r=c(e.team),i=c(e.enterprise),a=c(e.user);return{actionId:l(e.action_id),blockId:l(e.block_id),channelId:u(n?.id),enterpriseId:u(i?.id)||u(r?.enterprise_id),kind:`block_suggestion`,raw:e,retry:t,teamId:u(r?.id),userId:l(a?.id),value:l(e.value)}}function S(e,t){let n=c(e.team),r=c(e.enterprise),i=E(e.user),a=c(e.view)??{};return{callbackId:u(a.callback_id),enterpriseId:u(r?.id)||u(n?.enterprise_id),kind:`view_submission`,privateMetadata:u(a.private_metadata),raw:e,responseUrls:Array.isArray(a.response_urls)?a.response_urls:void 0,retry:t,teamId:u(n?.id),user:i,userId:i.id,values:k(a),view:a}}function C(e,t){let n=c(e.team),r=c(e.enterprise),i=E(e.user);return{enterpriseId:u(r?.id)||u(n?.enterprise_id),kind:`view_closed`,raw:e,retry:t,teamId:u(n?.id),user:i,userId:i.id,view:c(e.view)??{}}}function w(e){return Array.isArray(e)?e.map(e=>s(e)?e:void 0).filter(e=>e!==void 0).map(e=>{let t=u(e.mimetype);return{downloadUrl:u(e.url_private_download),filetype:u(e.filetype),id:l(e.id),mimeType:t,name:u(e.name),raw:e,size:typeof e.size==`number`?e.size:void 0,title:u(e.title),type:T(t),url:u(e.url_private)}}):[]}function T(e){return e?.startsWith(`image/`)?`image`:e?.startsWith(`video/`)?`video`:e?.startsWith(`audio/`)?`audio`:`file`}function E(e){let t=c(e)??{};return{id:l(t.id),name:u(t.name),teamId:u(t.team_id),username:u(t.username)}}function D(e){return e?.find(e=>{let t=c(e);return t?.type===`section`&&c(t.text)})}function O(e){return u(c(c(e)?.text)?.text)}function k(e){let t=c(c(e.state)?.values);if(!t)return[];let n=[];for(let[e,r]of Object.entries(t)){let t=c(r);if(t)for(let[r,i]of Object.entries(t)){let t=c(i);if(!t)continue;let a=c(t.selected_option),o=c(a?.text);n.push({actionId:r,blockId:e,raw:t,selectedOptionLabel:u(o?.text),selectedOptionValue:u(a?.value),type:u(t.type),value:u(t.value)})}}return n}var A=/^[\da-f]+$/i;async function j(e,t){return p(await M(e,t),{contentType:t.contentType,headers:e.headers})}async function M(e,n){let r=await e.text();if(n.webhookVerifier){let i=await n.webhookVerifier(e,r);if(!i)throw new t(`Slack webhook verifier rejected the request`);return typeof i==`string`?i:r}return await N(r,e.headers,n),r}async function N(e,n,i){let a=i.signingSecret;if(!a)throw new t(`Slack signing secret is required`);let o=r(n,`x-slack-request-timestamp`),s=r(n,`x-slack-signature`);if(!(o&&s))throw new t(`Slack signature headers are required`);let c=Number(o);if(!Number.isFinite(c))throw new t(`Slack timestamp is invalid`);let l=Math.floor((i.now?.()??Date.now())/1e3),u=i.maxSkewSeconds??300;if(Math.abs(l-c)>u)throw new t(`Slack timestamp is too old`);if(!await P(e,a,o,s))throw new t(`Slack signature is invalid`)}async function P(e,n,r,i){let a=globalThis.crypto;if(!a?.subtle)throw new t(`Web Crypto is not available`);let o=new TextEncoder,s=await a.subtle.importKey(`raw`,o.encode(n),{hash:`SHA-256`,name:`HMAC`},!1,[`verify`]);return a.subtle.verify(`HMAC`,s,F(i),o.encode(`v0:${r}:${e}`))}function F(e){if(!e.startsWith(`v0=`))throw new t(`Slack signature is invalid`);let n=e.slice(3);if(n.length%2!=0||!A.test(n))throw new t(`Slack signature is invalid`);let r=new ArrayBuffer(n.length/2),i=new Uint8Array(r);for(let e=0;e<i.length;e++)i[e]=Number.parseInt(n.slice(e*2,e*2+2),16);return r}export{j as a,p as i,n,M as o,t as r,N as s,e as t};