@corsair-dev/xquik 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +2 -2
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,SAAS,EACT,aAAa,EACb,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,cAAc,EACd,iBAAiB,EACjB,QAAQ,EAER,uBAAuB,EAIvB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var Xe=Object.defineProperty;var q=(t,o)=>{for(var s in o)Xe(t,s,{get:o[s],enumerable:!0})};var T={};q(T,{download:()=>Re,uploadFromUrl:()=>ve});import{logEventFromContext as V}from"corsair/core";import{ApiError as K,request as Se}from"corsair/http";var Ue="https://xquik.com/api/v1",Ie="2026-04-29",k=class extends Error{constructor(s,p,u){super(s,u);this.code=p;this.name="XquikAPIError",u?.cause instanceof K&&(this.body=u.cause.body,this.rateLimitLimit=u.cause.rateLimitLimit,this.rateLimitRemaining=u.cause.rateLimitRemaining,this.rateLimitReset=u.cause.rateLimitReset,this.retryAfter=u.cause.retryAfter,this.status=u.cause.status,this.statusText=u.cause.statusText)}body;rateLimitLimit;rateLimitRemaining;rateLimitReset;retryAfter;status;statusText};async function n(t,o,s={}){let{baseUrl:p=Ue,body:u,method:g="GET",query:I}=s,Ee={BASE:p,CREDENTIALS:"omit",HEADERS:{"Content-Type":"application/json","x-api-key":o,"xquik-api-contract":Ie},TOKEN:void 0,VERSION:"1.0.0",WITH_CREDENTIALS:!1},Te={body:g==="GET"?void 0:u,mediaType:"application/json; charset=utf-8",method:g,query:g==="GET"?I:void 0,url:t};try{return await Se(Ee,Te)}catch(y){throw y instanceof K?new k(y.message,y.status,{cause:y}):y instanceof Error?new k(y.message,void 0,{cause:y}):new k("Unknown Xquik API error")}}function i(t){return t.baseUrl}function v(t){return t.join(",")}function R(t){return{anyWords:t.anyWords,cashtags:t.cashtags,conversationId:t.conversationId,exactPhrase:t.exactPhrase,excludeWords:t.excludeWords,fromUser:t.fromUser,hashtags:t.hashtags,inReplyToTweetId:t.inReplyToTweetId,language:t.language,mediaType:t.mediaType,mentioning:t.mentioning,minFaves:t.minFaves,minQuotes:t.minQuotes,minReplies:t.minReplies,minRetweets:t.minRetweets,quotes:t.quotes,quotesOfTweetId:t.quotesOfTweetId,replies:t.replies,retweets:t.retweets,retweetsOfTweetId:t.retweetsOfTweetId,sinceDate:t.sinceDate,toUser:t.toUser,untilDate:t.untilDate,url:t.url,verifiedOnly:t.verifiedOnly}}var ve=async(t,o)=>{let s=await n("/x/media",t.key,{baseUrl:i(t.options),body:o,method:"POST"});return await V(t,"xquik.media.uploadFromUrl",{account:o.account},"completed"),s},Re=async(t,o)=>{let s=await n("/x/media/download",t.key,{baseUrl:i(t.options),body:o,method:"POST"});return await V(t,"xquik.media.download",{bulk:o.tweetIds!==void 0},"completed"),s};var A={};q(A,{get:()=>Pe});import{logEventFromContext as Ae}from"corsair/core";var Pe=async(t,o)=>{let s=await n("/x/trends",t.key,{baseUrl:i(t.options),query:{count:o.count,woeid:o.woeid}});return await Ae(t,"xquik.trends.get",{woeid:o.woeid??1},"completed"),s};var c={};q(c,{batch:()=>Ce,create:()=>Oe,deleteTweet:()=>De,get:()=>We,like:()=>Fe,retweet:()=>Me,search:()=>Le,unlike:()=>Ge});import{logEventFromContext as m}from"corsair/core";var Ce=async(t,o)=>{let s=await n("/x/tweets",t.key,{baseUrl:i(t.options),query:{ids:v(o.ids)}});return await m(t,"xquik.tweets.batch",{count:o.ids.length},"completed"),s},We=async(t,o)=>{let s=await n(`/x/tweets/${o.id}`,t.key,{baseUrl:i(t.options)});return await m(t,"xquik.tweets.get",{id:o.id},"completed"),s},Le=async(t,o)=>{let s=await n("/x/tweets/search",t.key,{baseUrl:i(t.options),query:{...R(o),cursor:o.cursor,limit:o.limit,q:o.q,queryType:o.queryType,sinceTime:o.sinceTime,untilTime:o.untilTime}});return await m(t,"xquik.tweets.search",{q:o.q},"completed"),s},Oe=async(t,o)=>{let s=await n("/x/tweets",t.key,{baseUrl:i(t.options),body:o,method:"POST"});return await m(t,"xquik.tweets.create",{account:o.account,pending:"status"in s&&s.status==="pending_confirmation"},"completed"),s},De=async(t,o)=>{let s=await n(`/x/tweets/${o.id}`,t.key,{baseUrl:i(t.options),body:{account:o.account},method:"DELETE"});return await m(t,"xquik.tweets.delete",{id:o.id},"completed"),s},Fe=async(t,o)=>{let s=await n(`/x/tweets/${o.id}/like`,t.key,{baseUrl:i(t.options),body:{account:o.account},method:"POST"});return await m(t,"xquik.tweets.like",{id:o.id},"completed"),s},Ge=async(t,o)=>{let s=await n(`/x/tweets/${o.id}/like`,t.key,{baseUrl:i(t.options),body:{account:o.account},method:"DELETE"});return await m(t,"xquik.tweets.unlike",{id:o.id},"completed"),s},Me=async(t,o)=>{let s=await n(`/x/tweets/${o.id}/retweet`,t.key,{baseUrl:i(t.options),body:{account:o.account},method:"POST"});return await m(t,"xquik.tweets.retweet",{id:o.id},"completed"),s};var d={};q(d,{batch:()=>Be,follow:()=>$e,followers:()=>Ne,following:()=>He,get:()=>_e,search:()=>ze,tweets:()=>je,unfollow:()=>Qe});import{logEventFromContext as h}from"corsair/core";var Be=async(t,o)=>{let s=await n("/x/users/batch",t.key,{baseUrl:i(t.options),query:{ids:v(o.ids)}});return await h(t,"xquik.users.batch",{count:o.ids.length},"completed"),s},_e=async(t,o)=>{let s=await n(`/x/users/${o.id}`,t.key,{baseUrl:i(t.options)});return await h(t,"xquik.users.get",{id:o.id},"completed"),s},ze=async(t,o)=>{let s=await n("/x/users/search",t.key,{baseUrl:i(t.options),query:{cursor:o.cursor,q:o.q}});return await h(t,"xquik.users.search",{q:o.q},"completed"),s},je=async(t,o)=>{let s=await n(`/x/users/${o.id}/tweets`,t.key,{baseUrl:i(t.options),query:{...R(o),cursor:o.cursor,includeParentTweet:o.includeParentTweet,includeReplies:o.includeReplies,pageSize:o.pageSize}});return await h(t,"xquik.users.tweets",{id:o.id},"completed"),s},Ne=async(t,o)=>{let s=await n(`/x/users/${o.id}/followers`,t.key,{baseUrl:i(t.options),query:{cursor:o.cursor,pageSize:o.pageSize}});return await h(t,"xquik.users.followers",{id:o.id},"completed"),s},He=async(t,o)=>{let s=await n(`/x/users/${o.id}/following`,t.key,{baseUrl:i(t.options),query:{cursor:o.cursor,pageSize:o.pageSize}});return await h(t,"xquik.users.following",{id:o.id},"completed"),s},$e=async(t,o)=>{let s=await n(`/x/users/${o.id}/follow`,t.key,{baseUrl:i(t.options),body:{account:o.account},method:"POST"});return await h(t,"xquik.users.follow",{id:o.id},"completed"),s},Qe=async(t,o)=>{let s=await n(`/x/users/${o.id}/follow`,t.key,{baseUrl:i(t.options),body:{account:o.account},method:"DELETE"});return await h(t,"xquik.users.unfollow",{id:o.id},"completed"),s};var w={};q(w,{create:()=>Ve,deactivate:()=>Ye,deliveries:()=>Ze,list:()=>Ke,test:()=>et,update:()=>Je});import{logEventFromContext as x}from"corsair/core";var Ke=async t=>{let o=await n("/webhooks",t.key,{baseUrl:i(t.options)});return await x(t,"xquik.webhooks.list",{count:o.webhooks.length},"completed"),o},Ve=async(t,o)=>{let s=await n("/webhooks",t.key,{baseUrl:i(t.options),body:o,method:"POST"});return await x(t,"xquik.webhooks.create",{eventTypes:o.eventTypes},"completed"),s},Je=async(t,o)=>{let{id:s,...p}=o,u=await n(`/webhooks/${s}`,t.key,{baseUrl:i(t.options),body:p,method:"PATCH"});return await x(t,"xquik.webhooks.update",{id:s},"completed"),u},Ye=async(t,o)=>{let s=await n(`/webhooks/${o.id}`,t.key,{baseUrl:i(t.options),method:"DELETE"});return await x(t,"xquik.webhooks.deactivate",{id:o.id},"completed"),s},Ze=async(t,o)=>{let s=await n(`/webhooks/${o.id}/deliveries`,t.key,{baseUrl:i(t.options)});return await x(t,"xquik.webhooks.deliveries",{id:o.id},"completed"),s},et=async(t,o)=>{let s=await n(`/webhooks/${o.id}/test`,t.key,{baseUrl:i(t.options),method:"POST"});return await x(t,"xquik.webhooks.test",{id:o.id,success:s.success},"completed"),s};var P={};q(P,{get:()=>ot});import{logEventFromContext as tt}from"corsair/core";var ot=async(t,o)=>{let s=await n(`/x/write-actions/${o.id}`,t.key,{baseUrl:i(t.options)});return await tt(t,"xquik.writeActions.get",{id:o.id},"completed"),s};import{z as e}from"zod";var ee=e.enum(["tweet.new","tweet.quote","tweet.reply","tweet.retweet"]),G=e.array(ee).min(1),J=e.string().regex(/^\d{4}-\d{2}-\d{2}$/),f=e.string(),S=e.string().min(1),M=e.string().min(1),B=e.string().min(1),st=e.enum(["gifs","images","links","media","none","videos"]),O=e.enum(["exclude","include","only"]),te=e.object({anyWords:e.string().optional(),cashtags:e.string().optional(),conversationId:e.string().optional(),exactPhrase:e.string().optional(),excludeWords:e.string().optional(),fromUser:e.string().optional(),hashtags:e.string().optional(),inReplyToTweetId:e.string().optional(),language:e.string().optional(),mediaType:st.optional(),mentioning:e.string().optional(),minFaves:e.number().int().min(0).optional(),minQuotes:e.number().int().min(0).optional(),minReplies:e.number().int().min(0).optional(),minRetweets:e.number().int().min(0).optional(),quotes:O.optional(),quotesOfTweetId:e.string().optional(),replies:O.optional(),retweets:O.optional(),retweetsOfTweetId:e.string().optional(),sinceDate:J.optional(),toUser:e.string().optional(),untilDate:J.optional(),url:e.string().optional(),verifiedOnly:e.boolean().optional()}),_=e.object({cursor:e.string().optional()}),oe=e.object({account:B}),se=e.object({mediaUrl:e.string().optional(),type:e.enum(["animated_gif","photo","video"]).optional(),url:e.string().optional()}).passthrough(),U=e.object({coverPicture:e.string().optional(),createdAt:e.string().optional(),description:e.string().optional(),followers:e.number().int().optional(),following:e.number().int().optional(),id:e.string(),location:e.string().optional(),name:e.string(),profilePicture:e.string().optional(),statusesCount:e.number().int().optional(),username:e.string(),verified:e.boolean().optional()}).passthrough(),nt=e.object({followers:e.number().int(),id:e.string(),profilePicture:e.string().optional(),username:e.string(),verified:e.boolean()}).passthrough(),z=e.object({author:U.optional(),bookmarkCount:e.number().int().optional(),conversationId:e.string().optional(),createdAt:e.string().optional(),entities:e.record(e.string(),e.unknown()).optional(),id:e.string(),inReplyToId:e.string().optional(),inReplyToUserId:e.string().optional(),inReplyToUsername:e.string().optional(),isLimitedReply:e.boolean().optional(),isNoteTweet:e.boolean().optional(),isQuoteStatus:e.boolean().optional(),isReply:e.boolean().optional(),lang:e.string().optional(),likeCount:e.number().int().optional(),media:e.array(se).optional(),quoteCount:e.number().int().optional(),replyCount:e.number().int().optional(),retweetCount:e.number().int().optional(),source:e.string().optional(),text:e.string(),type:e.string().optional(),url:e.string().optional(),viewCount:e.number().int().optional()}).passthrough(),j=e.object({bookmarkCount:e.number().int(),conversationId:e.string().optional(),createdAt:e.string().optional(),entities:e.record(e.string(),e.unknown()).optional(),id:e.string(),isNoteTweet:e.boolean().optional(),isQuoteStatus:e.boolean().optional(),isReply:e.boolean().optional(),likeCount:e.number().int(),media:e.array(se).optional(),quoteCount:e.number().int(),replyCount:e.number().int(),retweetCount:e.number().int(),source:e.string().optional(),text:e.string(),viewCount:e.number().int()}).passthrough(),D=e.object({has_next_page:e.boolean(),next_cursor:e.string().nullable().optional(),tweets:e.array(z)}),C=e.object({has_next_page:e.boolean(),next_cursor:e.string().nullable().optional(),users:e.array(U)}),it=e.object({author:nt.optional(),tweet:j}),b=e.object({success:e.literal(!0)}).passthrough(),rt=e.object({charged:e.boolean(),error:e.literal("x_write_unconfirmed"),message:e.string().optional(),retryable:e.literal(!1),status:e.literal("pending_confirmation"),writeActionId:e.string()}),at=e.union([e.object({success:e.literal(!0),tweetId:e.string()}),rt]),ut=e.object({action:e.string(),charged:e.boolean(),confirmationAttempts:e.number().int().optional(),confirmationCheckedAt:e.string().optional(),confirmationSource:e.string().nullable().optional(),confirmedAt:e.string().optional(),createdAt:e.string(),message:e.string().optional(),messageId:e.string().optional(),retryable:e.boolean(),sendDispatched:e.boolean(),sendDispatchedAt:e.string().optional(),status:e.enum(["failed","pending_confirmation","success"]),targetId:e.string().nullable().optional(),tweetId:e.string().optional(),writeActionId:e.string()}).passthrough(),pt=e.object({description:e.string().optional(),name:e.string(),query:e.string().optional(),rank:e.number().int().optional()}).passthrough(),ct=e.object({count:e.number().int(),trends:e.array(pt),woeid:e.number().int()}),dt=e.object({mediaId:e.string(),mediaUrl:e.string().url(),success:e.literal(!0)}),lt=e.object({cacheHit:e.boolean().optional(),galleryUrl:e.string().optional(),totalMedia:e.number().int().optional(),totalTweets:e.number().int().optional(),tweetId:e.string().optional()}).passthrough(),X=e.object({createdAt:f,eventTypes:G,id:e.string(),isActive:e.boolean(),url:e.string().url()}),N=e.object({attempts:e.number().int(),createdAt:f,deliveredAt:f.optional(),id:e.string(),lastError:e.string().optional(),lastStatusCode:e.number().int().optional(),status:e.string(),streamEventId:e.string()}),l=e.object({data:e.record(e.string(),e.unknown()),deliveryId:e.string().optional(),eventType:e.union([ee,e.literal("webhook.test")]),occurredAt:f.optional(),query:e.string().optional(),schemaVersion:e.string().optional(),streamEventId:e.string().optional(),timestamp:f.optional(),username:e.string().optional()}).passthrough(),wt=e.object({error:e.string().optional(),statusCode:e.number().int(),success:e.boolean()}),kt=e.object({ids:e.array(S).min(1).max(100)}),mt=e.object({id:S}),ht=te.merge(_).extend({limit:e.number().int().min(1).max(200).optional(),q:e.string().min(1),queryType:e.enum(["Latest","Top"]).optional(),sinceTime:f.optional(),untilTime:f.optional()}),yt=e.object({account:B,attachment_url:e.string().url().optional(),community_id:e.string().optional(),is_note_tweet:e.boolean().optional(),media:e.array(e.string().url()).max(4).optional(),reply_to_tweet_id:e.string().optional(),text:e.string().optional()}).refine(t=>t.text!==void 0&&t.text.length>0||t.media!==void 0&&t.media.length>0,{message:"Provide text, media, or both."}),W=oe.extend({id:S}),bt=e.object({ids:e.array(M).min(1).max(100)}),H=e.object({id:M}),ft=_.extend({q:e.string().min(1)}),ne=_.extend({pageSize:e.number().int().min(20).max(200).optional()}),gt=H.merge(ne).merge(te).extend({includeParentTweet:e.boolean().optional(),includeReplies:e.boolean().optional()}),Y=H.merge(ne),Z=oe.extend({id:M}),qt=e.object({count:e.number().int().min(1).max(50).optional(),woeid:e.number().int().optional()}),xt=e.object({account:B,url:e.string().url()}),Et=e.object({tweetId:S.optional(),tweetIds:e.array(S).max(50).optional(),tweetInput:e.string().optional(),tweetUrl:e.string().url().optional()}).refine(t=>t.tweetInput!==void 0||t.tweetId!==void 0||t.tweetUrl!==void 0||t.tweetIds!==void 0&&t.tweetIds.length>0,{message:"Provide tweetInput, tweetId, tweetUrl, or tweetIds."}),Tt=e.object({id:e.string().min(1)}),Xt=e.object({}),St=e.object({eventTypes:G,url:e.string().url()}),Ut=e.object({eventTypes:G.optional(),id:e.string().min(1),isActive:e.boolean().optional(),url:e.string().url().optional()}).refine(t=>t.eventTypes!==void 0||t.isActive!==void 0||t.url!==void 0,{message:"Provide at least one webhook field to update."}),F=e.object({id:e.string().min(1)}),r={mediaDownload:Et,mediaUploadFromUrl:xt,trendsGet:qt,tweetsBatch:kt,tweetsCreate:yt,tweetsDelete:W,tweetsGet:mt,tweetsLike:W,tweetsRetweet:W,tweetsSearch:ht,tweetsUnlike:W,usersBatch:bt,usersFollow:Z,usersFollowers:Y,usersFollowing:Y,usersGet:H,usersSearch:ft,usersTweets:gt,usersUnfollow:Z,webhooksCreate:St,webhooksDeactivate:F,webhooksDeliveries:F,webhooksList:Xt,webhooksTest:F,webhooksUpdate:Ut,writeActionsGet:Tt},a={mediaDownload:lt,mediaUploadFromUrl:dt,trendsGet:ct,tweetsBatch:D,tweetsCreate:at,tweetsDelete:b,tweetsGet:it,tweetsLike:b,tweetsRetweet:b,tweetsSearch:D,tweetsUnlike:b,usersBatch:C,usersFollow:b,usersFollowers:C,usersFollowing:C,usersGet:U,usersSearch:C,usersTweets:D,usersUnfollow:b,webhooksCreate:X.extend({secret:e.string()}),webhooksDeactivate:b,webhooksDeliveries:e.object({deliveries:e.array(N)}),webhooksList:e.object({webhooks:e.array(X)}),webhooksTest:wt,webhooksUpdate:X,writeActionsGet:ut};import{ApiError as re}from"corsair/http";function E(t){if(t instanceof re||t instanceof k)return t.status}function ie(t){if(t instanceof re||t instanceof k)return t.retryAfter}var ae={AUTH_ERROR:{match:t=>{let o=E(t),s=t.message.toLowerCase();return o===401||s.includes("unauthorized")||s.includes("invalid api key")},handler:async()=>({maxRetries:0})},PAYMENT_REQUIRED:{match:t=>{let o=E(t),s=t.message.toLowerCase();return o===402||s.includes("insufficient_credits")},handler:async()=>({maxRetries:0})},PERMISSION_ERROR:{match:t=>{let o=E(t),s=t.message.toLowerCase();return o===403||s.includes("account_needs_reauth")||s.includes("account_restricted")},handler:async()=>({maxRetries:0})},RATE_LIMIT_ERROR:{match:t=>{let o=E(t),s=t.message.toLowerCase();return o===429||s.includes("rate_limited")||s.includes("too many requests")},handler:async t=>({headersRetryAfterMs:ie(t),maxRetries:5})},SERVER_ERROR:{match:t=>{let o=E(t);return o===424||o===502||o===503},handler:async t=>({headersRetryAfterMs:ie(t),maxRetries:3})},VALIDATION_ERROR:{match:t=>{let o=E(t);return o===400||o===422},handler:async()=>({maxRetries:0})},DEFAULT:{match:()=>!0,handler:async()=>({maxRetries:0})}};var ue=z.or(j),pe=U,ce=X,de=N,le=l;var we={entities:{deliveries:de,events:le,tweets:ue,users:pe,webhooks:ce},version:"1.0.0"};import{logEventFromContext as ge}from"corsair/core";import{createHmac as It,timingSafeEqual as vt}from"crypto";var me="x-xquik-signature",Rt="x-xquik-timestamp",At="x-xquik-nonce",Pt="sha256=",Ct=300*1e3;function ke(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function he(t){if(typeof t=="string")try{let o=JSON.parse(t);return ke(o)?o:{}}catch{return{}}return ke(t)?t:{}}function L(t,o){let s=t[o]??t[o.toLowerCase()];if(Array.isArray(s))return s[0];if(typeof s=="string")return s;for(let[p,u]of Object.entries(t))if(p.toLowerCase()===o){if(Array.isArray(u))return u[0];if(typeof u=="string")return u}}function Wt(t){let o=Number.parseInt(t,10);return Number.isFinite(o)?Math.abs(Date.now()-o)<=Ct:!1}function Lt(t,o,s){return`${t}.${o}.${s}`}function Ot(t,o,s,p){let u=It("sha256",p).update(Lt(t,o,s)).digest("hex");return`${Pt}${u}`}function ye(t){return L(t.headers,me)!==void 0}function be(t){return o=>{let s=l.safeParse(he(o.body));return s.success&&s.data.eventType===t}}function fe(){return t=>{let o=l.safeParse(he(t.body));return o.success&&o.data.eventType!=="webhook.test"}}function $(t,o){if(o.trim().length===0)return{error:"Missing Xquik webhook secret",valid:!1};let s=L(t.headers,me),p=L(t.headers,Rt),u=L(t.headers,At);if(s===void 0)return{error:"Missing X-Xquik-Signature header",valid:!1};if(p===void 0)return{error:"Missing X-Xquik-Timestamp header",valid:!1};if(u===void 0)return{error:"Missing X-Xquik-Nonce header",valid:!1};if(!Wt(p))return{error:"Stale Xquik webhook timestamp",valid:!1};if(t.rawBody===void 0)return{error:"Missing raw body for signature verification",valid:!1};let g=Ot(p,u,t.rawBody,o);if(g.length!==s.length)return{error:"Invalid Xquik webhook signature",valid:!1};let I=vt(Buffer.from(g),Buffer.from(s));return I?{valid:I}:{error:"Invalid Xquik webhook signature",valid:!1}}var qe={match:fe(),handler:async(t,o)=>{let s=$(o,t.key);if(!s.valid)return{error:s.error??"Xquik webhook signature failed",statusCode:401,success:!1};let p=o.payload;return await ge(t,"xquik.webhook.monitorEvent",{eventType:p.eventType},"completed"),{data:p,success:!0}}},xe={match:be("webhook.test"),handler:async(t,o)=>{let s=$(o,t.key);if(!s.valid)return{error:s.error??"Xquik webhook signature failed",statusCode:401,success:!1};let p=o.payload;return await ge(t,"xquik.webhook.test",{eventType:p.eventType},"completed"),{data:p,success:!0}}};var Q={monitorEvent:qe,test:xe};var Dt={media:{download:T.download,uploadFromUrl:T.uploadFromUrl},trends:{get:A.get},tweets:{batch:c.batch,create:c.create,delete:c.deleteTweet,get:c.get,like:c.like,retweet:c.retweet,search:c.search,unlike:c.unlike},users:{batch:d.batch,follow:d.follow,followers:d.followers,following:d.following,get:d.get,search:d.search,tweets:d.tweets,unfollow:d.unfollow},webhooks:{create:w.create,deactivate:w.deactivate,deliveries:w.deliveries,list:w.list,test:w.test,update:w.update},writeActions:{get:P.get}},Ft={events:{monitor:Q.monitorEvent,test:Q.test}},Gt={"media.download":{input:r.mediaDownload,output:a.mediaDownload},"media.uploadFromUrl":{input:r.mediaUploadFromUrl,output:a.mediaUploadFromUrl},"trends.get":{input:r.trendsGet,output:a.trendsGet},"tweets.batch":{input:r.tweetsBatch,output:a.tweetsBatch},"tweets.create":{input:r.tweetsCreate,output:a.tweetsCreate},"tweets.delete":{input:r.tweetsDelete,output:a.tweetsDelete},"tweets.get":{input:r.tweetsGet,output:a.tweetsGet},"tweets.like":{input:r.tweetsLike,output:a.tweetsLike},"tweets.retweet":{input:r.tweetsRetweet,output:a.tweetsRetweet},"tweets.search":{input:r.tweetsSearch,output:a.tweetsSearch},"tweets.unlike":{input:r.tweetsUnlike,output:a.tweetsUnlike},"users.batch":{input:r.usersBatch,output:a.usersBatch},"users.follow":{input:r.usersFollow,output:a.usersFollow},"users.followers":{input:r.usersFollowers,output:a.usersFollowers},"users.following":{input:r.usersFollowing,output:a.usersFollowing},"users.get":{input:r.usersGet,output:a.usersGet},"users.search":{input:r.usersSearch,output:a.usersSearch},"users.tweets":{input:r.usersTweets,output:a.usersTweets},"users.unfollow":{input:r.usersUnfollow,output:a.usersUnfollow},"webhooks.create":{input:r.webhooksCreate,output:a.webhooksCreate},"webhooks.deactivate":{input:r.webhooksDeactivate,output:a.webhooksDeactivate},"webhooks.deliveries":{input:r.webhooksDeliveries,output:a.webhooksDeliveries},"webhooks.list":{input:r.webhooksList,output:a.webhooksList},"webhooks.test":{input:r.webhooksTest,output:a.webhooksTest},"webhooks.update":{input:r.webhooksUpdate,output:a.webhooksUpdate},"writeActions.get":{input:r.writeActionsGet,output:a.writeActionsGet}},Mt={"events.monitor":{description:"Handle a signed Xquik monitor event delivery",payload:l,response:l},"events.test":{description:"Handle a signed Xquik test webhook delivery",payload:l,response:l}},Bt="api_key",_t={"media.download":{description:"Download images and videos from one or more tweets",riskLevel:"read"},"media.uploadFromUrl":{description:"Upload public media URLs for use in Xquik tweet creation",riskLevel:"write"},"trends.get":{description:"Get trending X topics by WOEID region",riskLevel:"read"},"tweets.batch":{description:"Fetch up to 100 tweets by ID",riskLevel:"read"},"tweets.create":{description:"Create a tweet or reply from a connected X account",riskLevel:"write"},"tweets.delete":{description:"Delete a tweet from a connected X account",irreversible:!0,riskLevel:"destructive"},"tweets.get":{description:"Get a tweet with full text, author, metrics, and media",riskLevel:"read"},"tweets.like":{description:"Like a tweet from a connected X account",riskLevel:"write"},"tweets.retweet":{description:"Retweet a tweet from a connected X account",riskLevel:"write"},"tweets.search":{description:"Search tweets with X query operators and pagination",riskLevel:"read"},"tweets.unlike":{description:"Remove a like from a connected X account",riskLevel:"write"},"users.batch":{description:"Look up up to 100 X users by ID",riskLevel:"read"},"users.follow":{description:"Follow an X user from a connected account",riskLevel:"write"},"users.followers":{description:"List followers of an X user",riskLevel:"read"},"users.following":{description:"List accounts an X user follows",riskLevel:"read"},"users.get":{description:"Get an X user profile by username or user ID",riskLevel:"read"},"users.search":{description:"Search X users by name or username",riskLevel:"read"},"users.tweets":{description:"List recent tweets posted by an X user",riskLevel:"read"},"users.unfollow":{description:"Unfollow an X user from a connected account",riskLevel:"write"},"webhooks.create":{description:"Create an Xquik webhook endpoint subscription",riskLevel:"write"},"webhooks.deactivate":{description:"Deactivate an Xquik webhook endpoint",riskLevel:"write"},"webhooks.deliveries":{description:"List delivery attempts for an Xquik webhook endpoint",riskLevel:"read"},"webhooks.list":{description:"List configured Xquik webhook endpoints",riskLevel:"read"},"webhooks.test":{description:"Send a test delivery to an Xquik webhook endpoint",riskLevel:"write"},"webhooks.update":{description:"Update a Xquik webhook URL, event types, or active state",riskLevel:"write"},"writeActions.get":{description:"Check the status of a pending Xquik write action",riskLevel:"read"}},zt={api_key:{account:["one","webhook_signature"]}};function Go(t={}){let o={...t,authType:t.authType??Bt};return{authConfig:zt,endpointMeta:_t,endpointSchemas:Gt,endpoints:Dt,errorHandlers:{...ae,...o.errorHandlers},hooks:o.hooks,id:"xquik",keyBuilder:async(s,p)=>{if(p==="webhook"&&o.webhookSecret)return o.webhookSecret;if(p==="webhook")return await s.keys.get_webhook_signature()??"";if(p==="endpoint"&&o.key)return o.key;if(p==="endpoint"&&s.authType==="api_key")return await s.keys.get_api_key()??"";throw new Error(`[auth-missing:xquik:${s.authType}]: Xquik key is missing`)},options:o,pluginWebhookMatcher:ye,schema:we,webhookHooks:o.webhookHooks,webhookSchemas:Mt,webhooks:Ft}}export{Go as xquik,zt as xquikAuthConfig,Gt as xquikEndpointSchemas};
|
|
1
|
+
var Xe=Object.defineProperty;var q=(t,o)=>{for(var s in o)Xe(t,s,{get:o[s],enumerable:!0})};import{AuthMissingError as Dt}from"corsair/core";var T={};q(T,{download:()=>Re,uploadFromUrl:()=>ve});import{logEventFromContext as V}from"corsair/core";import{ApiError as K,request as Se}from"corsair/http";var Ue="https://xquik.com/api/v1",Ie="2026-04-29",k=class extends Error{constructor(s,p,u){super(s,u);this.code=p;this.name="XquikAPIError",u?.cause instanceof K&&(this.body=u.cause.body,this.rateLimitLimit=u.cause.rateLimitLimit,this.rateLimitRemaining=u.cause.rateLimitRemaining,this.rateLimitReset=u.cause.rateLimitReset,this.retryAfter=u.cause.retryAfter,this.status=u.cause.status,this.statusText=u.cause.statusText)}body;rateLimitLimit;rateLimitRemaining;rateLimitReset;retryAfter;status;statusText};async function n(t,o,s={}){let{baseUrl:p=Ue,body:u,method:g="GET",query:I}=s,Ee={BASE:p,CREDENTIALS:"omit",HEADERS:{"Content-Type":"application/json","x-api-key":o,"xquik-api-contract":Ie},TOKEN:void 0,VERSION:"1.0.0",WITH_CREDENTIALS:!1},Te={body:g==="GET"?void 0:u,mediaType:"application/json; charset=utf-8",method:g,query:g==="GET"?I:void 0,url:t};try{return await Se(Ee,Te)}catch(y){throw y instanceof K?new k(y.message,y.status,{cause:y}):y instanceof Error?new k(y.message,void 0,{cause:y}):new k("Unknown Xquik API error")}}function i(t){return t.baseUrl}function v(t){return t.join(",")}function R(t){return{anyWords:t.anyWords,cashtags:t.cashtags,conversationId:t.conversationId,exactPhrase:t.exactPhrase,excludeWords:t.excludeWords,fromUser:t.fromUser,hashtags:t.hashtags,inReplyToTweetId:t.inReplyToTweetId,language:t.language,mediaType:t.mediaType,mentioning:t.mentioning,minFaves:t.minFaves,minQuotes:t.minQuotes,minReplies:t.minReplies,minRetweets:t.minRetweets,quotes:t.quotes,quotesOfTweetId:t.quotesOfTweetId,replies:t.replies,retweets:t.retweets,retweetsOfTweetId:t.retweetsOfTweetId,sinceDate:t.sinceDate,toUser:t.toUser,untilDate:t.untilDate,url:t.url,verifiedOnly:t.verifiedOnly}}var ve=async(t,o)=>{let s=await n("/x/media",t.key,{baseUrl:i(t.options),body:o,method:"POST"});return await V(t,"xquik.media.uploadFromUrl",{account:o.account},"completed"),s},Re=async(t,o)=>{let s=await n("/x/media/download",t.key,{baseUrl:i(t.options),body:o,method:"POST"});return await V(t,"xquik.media.download",{bulk:o.tweetIds!==void 0},"completed"),s};var A={};q(A,{get:()=>Pe});import{logEventFromContext as Ae}from"corsair/core";var Pe=async(t,o)=>{let s=await n("/x/trends",t.key,{baseUrl:i(t.options),query:{count:o.count,woeid:o.woeid}});return await Ae(t,"xquik.trends.get",{woeid:o.woeid??1},"completed"),s};var c={};q(c,{batch:()=>Ce,create:()=>Oe,deleteTweet:()=>De,get:()=>We,like:()=>Fe,retweet:()=>Me,search:()=>Le,unlike:()=>Ge});import{logEventFromContext as m}from"corsair/core";var Ce=async(t,o)=>{let s=await n("/x/tweets",t.key,{baseUrl:i(t.options),query:{ids:v(o.ids)}});return await m(t,"xquik.tweets.batch",{count:o.ids.length},"completed"),s},We=async(t,o)=>{let s=await n(`/x/tweets/${o.id}`,t.key,{baseUrl:i(t.options)});return await m(t,"xquik.tweets.get",{id:o.id},"completed"),s},Le=async(t,o)=>{let s=await n("/x/tweets/search",t.key,{baseUrl:i(t.options),query:{...R(o),cursor:o.cursor,limit:o.limit,q:o.q,queryType:o.queryType,sinceTime:o.sinceTime,untilTime:o.untilTime}});return await m(t,"xquik.tweets.search",{q:o.q},"completed"),s},Oe=async(t,o)=>{let s=await n("/x/tweets",t.key,{baseUrl:i(t.options),body:o,method:"POST"});return await m(t,"xquik.tweets.create",{account:o.account,pending:"status"in s&&s.status==="pending_confirmation"},"completed"),s},De=async(t,o)=>{let s=await n(`/x/tweets/${o.id}`,t.key,{baseUrl:i(t.options),body:{account:o.account},method:"DELETE"});return await m(t,"xquik.tweets.delete",{id:o.id},"completed"),s},Fe=async(t,o)=>{let s=await n(`/x/tweets/${o.id}/like`,t.key,{baseUrl:i(t.options),body:{account:o.account},method:"POST"});return await m(t,"xquik.tweets.like",{id:o.id},"completed"),s},Ge=async(t,o)=>{let s=await n(`/x/tweets/${o.id}/like`,t.key,{baseUrl:i(t.options),body:{account:o.account},method:"DELETE"});return await m(t,"xquik.tweets.unlike",{id:o.id},"completed"),s},Me=async(t,o)=>{let s=await n(`/x/tweets/${o.id}/retweet`,t.key,{baseUrl:i(t.options),body:{account:o.account},method:"POST"});return await m(t,"xquik.tweets.retweet",{id:o.id},"completed"),s};var d={};q(d,{batch:()=>Be,follow:()=>$e,followers:()=>Ne,following:()=>He,get:()=>_e,search:()=>ze,tweets:()=>je,unfollow:()=>Qe});import{logEventFromContext as h}from"corsair/core";var Be=async(t,o)=>{let s=await n("/x/users/batch",t.key,{baseUrl:i(t.options),query:{ids:v(o.ids)}});return await h(t,"xquik.users.batch",{count:o.ids.length},"completed"),s},_e=async(t,o)=>{let s=await n(`/x/users/${o.id}`,t.key,{baseUrl:i(t.options)});return await h(t,"xquik.users.get",{id:o.id},"completed"),s},ze=async(t,o)=>{let s=await n("/x/users/search",t.key,{baseUrl:i(t.options),query:{cursor:o.cursor,q:o.q}});return await h(t,"xquik.users.search",{q:o.q},"completed"),s},je=async(t,o)=>{let s=await n(`/x/users/${o.id}/tweets`,t.key,{baseUrl:i(t.options),query:{...R(o),cursor:o.cursor,includeParentTweet:o.includeParentTweet,includeReplies:o.includeReplies,pageSize:o.pageSize}});return await h(t,"xquik.users.tweets",{id:o.id},"completed"),s},Ne=async(t,o)=>{let s=await n(`/x/users/${o.id}/followers`,t.key,{baseUrl:i(t.options),query:{cursor:o.cursor,pageSize:o.pageSize}});return await h(t,"xquik.users.followers",{id:o.id},"completed"),s},He=async(t,o)=>{let s=await n(`/x/users/${o.id}/following`,t.key,{baseUrl:i(t.options),query:{cursor:o.cursor,pageSize:o.pageSize}});return await h(t,"xquik.users.following",{id:o.id},"completed"),s},$e=async(t,o)=>{let s=await n(`/x/users/${o.id}/follow`,t.key,{baseUrl:i(t.options),body:{account:o.account},method:"POST"});return await h(t,"xquik.users.follow",{id:o.id},"completed"),s},Qe=async(t,o)=>{let s=await n(`/x/users/${o.id}/follow`,t.key,{baseUrl:i(t.options),body:{account:o.account},method:"DELETE"});return await h(t,"xquik.users.unfollow",{id:o.id},"completed"),s};var w={};q(w,{create:()=>Ve,deactivate:()=>Ye,deliveries:()=>Ze,list:()=>Ke,test:()=>et,update:()=>Je});import{logEventFromContext as x}from"corsair/core";var Ke=async t=>{let o=await n("/webhooks",t.key,{baseUrl:i(t.options)});return await x(t,"xquik.webhooks.list",{count:o.webhooks.length},"completed"),o},Ve=async(t,o)=>{let s=await n("/webhooks",t.key,{baseUrl:i(t.options),body:o,method:"POST"});return await x(t,"xquik.webhooks.create",{eventTypes:o.eventTypes},"completed"),s},Je=async(t,o)=>{let{id:s,...p}=o,u=await n(`/webhooks/${s}`,t.key,{baseUrl:i(t.options),body:p,method:"PATCH"});return await x(t,"xquik.webhooks.update",{id:s},"completed"),u},Ye=async(t,o)=>{let s=await n(`/webhooks/${o.id}`,t.key,{baseUrl:i(t.options),method:"DELETE"});return await x(t,"xquik.webhooks.deactivate",{id:o.id},"completed"),s},Ze=async(t,o)=>{let s=await n(`/webhooks/${o.id}/deliveries`,t.key,{baseUrl:i(t.options)});return await x(t,"xquik.webhooks.deliveries",{id:o.id},"completed"),s},et=async(t,o)=>{let s=await n(`/webhooks/${o.id}/test`,t.key,{baseUrl:i(t.options),method:"POST"});return await x(t,"xquik.webhooks.test",{id:o.id,success:s.success},"completed"),s};var P={};q(P,{get:()=>ot});import{logEventFromContext as tt}from"corsair/core";var ot=async(t,o)=>{let s=await n(`/x/write-actions/${o.id}`,t.key,{baseUrl:i(t.options)});return await tt(t,"xquik.writeActions.get",{id:o.id},"completed"),s};import{z as e}from"zod";var ee=e.enum(["tweet.new","tweet.quote","tweet.reply","tweet.retweet"]),G=e.array(ee).min(1),J=e.string().regex(/^\d{4}-\d{2}-\d{2}$/),f=e.string(),S=e.string().min(1),M=e.string().min(1),B=e.string().min(1),st=e.enum(["gifs","images","links","media","none","videos"]),O=e.enum(["exclude","include","only"]),te=e.object({anyWords:e.string().optional(),cashtags:e.string().optional(),conversationId:e.string().optional(),exactPhrase:e.string().optional(),excludeWords:e.string().optional(),fromUser:e.string().optional(),hashtags:e.string().optional(),inReplyToTweetId:e.string().optional(),language:e.string().optional(),mediaType:st.optional(),mentioning:e.string().optional(),minFaves:e.number().int().min(0).optional(),minQuotes:e.number().int().min(0).optional(),minReplies:e.number().int().min(0).optional(),minRetweets:e.number().int().min(0).optional(),quotes:O.optional(),quotesOfTweetId:e.string().optional(),replies:O.optional(),retweets:O.optional(),retweetsOfTweetId:e.string().optional(),sinceDate:J.optional(),toUser:e.string().optional(),untilDate:J.optional(),url:e.string().optional(),verifiedOnly:e.boolean().optional()}),_=e.object({cursor:e.string().optional()}),oe=e.object({account:B}),se=e.object({mediaUrl:e.string().optional(),type:e.enum(["animated_gif","photo","video"]).optional(),url:e.string().optional()}).passthrough(),U=e.object({coverPicture:e.string().optional(),createdAt:e.string().optional(),description:e.string().optional(),followers:e.number().int().optional(),following:e.number().int().optional(),id:e.string(),location:e.string().optional(),name:e.string(),profilePicture:e.string().optional(),statusesCount:e.number().int().optional(),username:e.string(),verified:e.boolean().optional()}).passthrough(),nt=e.object({followers:e.number().int(),id:e.string(),profilePicture:e.string().optional(),username:e.string(),verified:e.boolean()}).passthrough(),z=e.object({author:U.optional(),bookmarkCount:e.number().int().optional(),conversationId:e.string().optional(),createdAt:e.string().optional(),entities:e.record(e.string(),e.unknown()).optional(),id:e.string(),inReplyToId:e.string().optional(),inReplyToUserId:e.string().optional(),inReplyToUsername:e.string().optional(),isLimitedReply:e.boolean().optional(),isNoteTweet:e.boolean().optional(),isQuoteStatus:e.boolean().optional(),isReply:e.boolean().optional(),lang:e.string().optional(),likeCount:e.number().int().optional(),media:e.array(se).optional(),quoteCount:e.number().int().optional(),replyCount:e.number().int().optional(),retweetCount:e.number().int().optional(),source:e.string().optional(),text:e.string(),type:e.string().optional(),url:e.string().optional(),viewCount:e.number().int().optional()}).passthrough(),j=e.object({bookmarkCount:e.number().int(),conversationId:e.string().optional(),createdAt:e.string().optional(),entities:e.record(e.string(),e.unknown()).optional(),id:e.string(),isNoteTweet:e.boolean().optional(),isQuoteStatus:e.boolean().optional(),isReply:e.boolean().optional(),likeCount:e.number().int(),media:e.array(se).optional(),quoteCount:e.number().int(),replyCount:e.number().int(),retweetCount:e.number().int(),source:e.string().optional(),text:e.string(),viewCount:e.number().int()}).passthrough(),D=e.object({has_next_page:e.boolean(),next_cursor:e.string().nullable().optional(),tweets:e.array(z)}),C=e.object({has_next_page:e.boolean(),next_cursor:e.string().nullable().optional(),users:e.array(U)}),it=e.object({author:nt.optional(),tweet:j}),b=e.object({success:e.literal(!0)}).passthrough(),rt=e.object({charged:e.boolean(),error:e.literal("x_write_unconfirmed"),message:e.string().optional(),retryable:e.literal(!1),status:e.literal("pending_confirmation"),writeActionId:e.string()}),at=e.union([e.object({success:e.literal(!0),tweetId:e.string()}),rt]),ut=e.object({action:e.string(),charged:e.boolean(),confirmationAttempts:e.number().int().optional(),confirmationCheckedAt:e.string().optional(),confirmationSource:e.string().nullable().optional(),confirmedAt:e.string().optional(),createdAt:e.string(),message:e.string().optional(),messageId:e.string().optional(),retryable:e.boolean(),sendDispatched:e.boolean(),sendDispatchedAt:e.string().optional(),status:e.enum(["failed","pending_confirmation","success"]),targetId:e.string().nullable().optional(),tweetId:e.string().optional(),writeActionId:e.string()}).passthrough(),pt=e.object({description:e.string().optional(),name:e.string(),query:e.string().optional(),rank:e.number().int().optional()}).passthrough(),ct=e.object({count:e.number().int(),trends:e.array(pt),woeid:e.number().int()}),dt=e.object({mediaId:e.string(),mediaUrl:e.string().url(),success:e.literal(!0)}),lt=e.object({cacheHit:e.boolean().optional(),galleryUrl:e.string().optional(),totalMedia:e.number().int().optional(),totalTweets:e.number().int().optional(),tweetId:e.string().optional()}).passthrough(),X=e.object({createdAt:f,eventTypes:G,id:e.string(),isActive:e.boolean(),url:e.string().url()}),N=e.object({attempts:e.number().int(),createdAt:f,deliveredAt:f.optional(),id:e.string(),lastError:e.string().optional(),lastStatusCode:e.number().int().optional(),status:e.string(),streamEventId:e.string()}),l=e.object({data:e.record(e.string(),e.unknown()),deliveryId:e.string().optional(),eventType:e.union([ee,e.literal("webhook.test")]),occurredAt:f.optional(),query:e.string().optional(),schemaVersion:e.string().optional(),streamEventId:e.string().optional(),timestamp:f.optional(),username:e.string().optional()}).passthrough(),wt=e.object({error:e.string().optional(),statusCode:e.number().int(),success:e.boolean()}),kt=e.object({ids:e.array(S).min(1).max(100)}),mt=e.object({id:S}),ht=te.merge(_).extend({limit:e.number().int().min(1).max(200).optional(),q:e.string().min(1),queryType:e.enum(["Latest","Top"]).optional(),sinceTime:f.optional(),untilTime:f.optional()}),yt=e.object({account:B,attachment_url:e.string().url().optional(),community_id:e.string().optional(),is_note_tweet:e.boolean().optional(),media:e.array(e.string().url()).max(4).optional(),reply_to_tweet_id:e.string().optional(),text:e.string().optional()}).refine(t=>t.text!==void 0&&t.text.length>0||t.media!==void 0&&t.media.length>0,{message:"Provide text, media, or both."}),W=oe.extend({id:S}),bt=e.object({ids:e.array(M).min(1).max(100)}),H=e.object({id:M}),ft=_.extend({q:e.string().min(1)}),ne=_.extend({pageSize:e.number().int().min(20).max(200).optional()}),gt=H.merge(ne).merge(te).extend({includeParentTweet:e.boolean().optional(),includeReplies:e.boolean().optional()}),Y=H.merge(ne),Z=oe.extend({id:M}),qt=e.object({count:e.number().int().min(1).max(50).optional(),woeid:e.number().int().optional()}),xt=e.object({account:B,url:e.string().url()}),Et=e.object({tweetId:S.optional(),tweetIds:e.array(S).max(50).optional(),tweetInput:e.string().optional(),tweetUrl:e.string().url().optional()}).refine(t=>t.tweetInput!==void 0||t.tweetId!==void 0||t.tweetUrl!==void 0||t.tweetIds!==void 0&&t.tweetIds.length>0,{message:"Provide tweetInput, tweetId, tweetUrl, or tweetIds."}),Tt=e.object({id:e.string().min(1)}),Xt=e.object({}),St=e.object({eventTypes:G,url:e.string().url()}),Ut=e.object({eventTypes:G.optional(),id:e.string().min(1),isActive:e.boolean().optional(),url:e.string().url().optional()}).refine(t=>t.eventTypes!==void 0||t.isActive!==void 0||t.url!==void 0,{message:"Provide at least one webhook field to update."}),F=e.object({id:e.string().min(1)}),r={mediaDownload:Et,mediaUploadFromUrl:xt,trendsGet:qt,tweetsBatch:kt,tweetsCreate:yt,tweetsDelete:W,tweetsGet:mt,tweetsLike:W,tweetsRetweet:W,tweetsSearch:ht,tweetsUnlike:W,usersBatch:bt,usersFollow:Z,usersFollowers:Y,usersFollowing:Y,usersGet:H,usersSearch:ft,usersTweets:gt,usersUnfollow:Z,webhooksCreate:St,webhooksDeactivate:F,webhooksDeliveries:F,webhooksList:Xt,webhooksTest:F,webhooksUpdate:Ut,writeActionsGet:Tt},a={mediaDownload:lt,mediaUploadFromUrl:dt,trendsGet:ct,tweetsBatch:D,tweetsCreate:at,tweetsDelete:b,tweetsGet:it,tweetsLike:b,tweetsRetweet:b,tweetsSearch:D,tweetsUnlike:b,usersBatch:C,usersFollow:b,usersFollowers:C,usersFollowing:C,usersGet:U,usersSearch:C,usersTweets:D,usersUnfollow:b,webhooksCreate:X.extend({secret:e.string()}),webhooksDeactivate:b,webhooksDeliveries:e.object({deliveries:e.array(N)}),webhooksList:e.object({webhooks:e.array(X)}),webhooksTest:wt,webhooksUpdate:X,writeActionsGet:ut};import{ApiError as re}from"corsair/http";function E(t){if(t instanceof re||t instanceof k)return t.status}function ie(t){if(t instanceof re||t instanceof k)return t.retryAfter}var ae={AUTH_ERROR:{match:t=>{let o=E(t),s=t.message.toLowerCase();return o===401||s.includes("unauthorized")||s.includes("invalid api key")},handler:async()=>({maxRetries:0})},PAYMENT_REQUIRED:{match:t=>{let o=E(t),s=t.message.toLowerCase();return o===402||s.includes("insufficient_credits")},handler:async()=>({maxRetries:0})},PERMISSION_ERROR:{match:t=>{let o=E(t),s=t.message.toLowerCase();return o===403||s.includes("account_needs_reauth")||s.includes("account_restricted")},handler:async()=>({maxRetries:0})},RATE_LIMIT_ERROR:{match:t=>{let o=E(t),s=t.message.toLowerCase();return o===429||s.includes("rate_limited")||s.includes("too many requests")},handler:async t=>({headersRetryAfterMs:ie(t),maxRetries:5})},SERVER_ERROR:{match:t=>{let o=E(t);return o===424||o===502||o===503},handler:async t=>({headersRetryAfterMs:ie(t),maxRetries:3})},VALIDATION_ERROR:{match:t=>{let o=E(t);return o===400||o===422},handler:async()=>({maxRetries:0})},DEFAULT:{match:()=>!0,handler:async()=>({maxRetries:0})}};var ue=z.or(j),pe=U,ce=X,de=N,le=l;var we={entities:{deliveries:de,events:le,tweets:ue,users:pe,webhooks:ce},version:"1.0.0"};import{logEventFromContext as ge}from"corsair/core";import{createHmac as It,timingSafeEqual as vt}from"crypto";var me="x-xquik-signature",Rt="x-xquik-timestamp",At="x-xquik-nonce",Pt="sha256=",Ct=300*1e3;function ke(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function he(t){if(typeof t=="string")try{let o=JSON.parse(t);return ke(o)?o:{}}catch{return{}}return ke(t)?t:{}}function L(t,o){let s=t[o]??t[o.toLowerCase()];if(Array.isArray(s))return s[0];if(typeof s=="string")return s;for(let[p,u]of Object.entries(t))if(p.toLowerCase()===o){if(Array.isArray(u))return u[0];if(typeof u=="string")return u}}function Wt(t){let o=Number.parseInt(t,10);return Number.isFinite(o)?Math.abs(Date.now()-o)<=Ct:!1}function Lt(t,o,s){return`${t}.${o}.${s}`}function Ot(t,o,s,p){let u=It("sha256",p).update(Lt(t,o,s)).digest("hex");return`${Pt}${u}`}function ye(t){return L(t.headers,me)!==void 0}function be(t){return o=>{let s=l.safeParse(he(o.body));return s.success&&s.data.eventType===t}}function fe(){return t=>{let o=l.safeParse(he(t.body));return o.success&&o.data.eventType!=="webhook.test"}}function $(t,o){if(o.trim().length===0)return{error:"Missing Xquik webhook secret",valid:!1};let s=L(t.headers,me),p=L(t.headers,Rt),u=L(t.headers,At);if(s===void 0)return{error:"Missing X-Xquik-Signature header",valid:!1};if(p===void 0)return{error:"Missing X-Xquik-Timestamp header",valid:!1};if(u===void 0)return{error:"Missing X-Xquik-Nonce header",valid:!1};if(!Wt(p))return{error:"Stale Xquik webhook timestamp",valid:!1};if(t.rawBody===void 0)return{error:"Missing raw body for signature verification",valid:!1};let g=Ot(p,u,t.rawBody,o);if(g.length!==s.length)return{error:"Invalid Xquik webhook signature",valid:!1};let I=vt(Buffer.from(g),Buffer.from(s));return I?{valid:I}:{error:"Invalid Xquik webhook signature",valid:!1}}var qe={match:fe(),handler:async(t,o)=>{let s=$(o,t.key);if(!s.valid)return{error:s.error??"Xquik webhook signature failed",statusCode:401,success:!1};let p=o.payload;return await ge(t,"xquik.webhook.monitorEvent",{eventType:p.eventType},"completed"),{data:p,success:!0}}},xe={match:be("webhook.test"),handler:async(t,o)=>{let s=$(o,t.key);if(!s.valid)return{error:s.error??"Xquik webhook signature failed",statusCode:401,success:!1};let p=o.payload;return await ge(t,"xquik.webhook.test",{eventType:p.eventType},"completed"),{data:p,success:!0}}};var Q={monitorEvent:qe,test:xe};var Ft={media:{download:T.download,uploadFromUrl:T.uploadFromUrl},trends:{get:A.get},tweets:{batch:c.batch,create:c.create,delete:c.deleteTweet,get:c.get,like:c.like,retweet:c.retweet,search:c.search,unlike:c.unlike},users:{batch:d.batch,follow:d.follow,followers:d.followers,following:d.following,get:d.get,search:d.search,tweets:d.tweets,unfollow:d.unfollow},webhooks:{create:w.create,deactivate:w.deactivate,deliveries:w.deliveries,list:w.list,test:w.test,update:w.update},writeActions:{get:P.get}},Gt={events:{monitor:Q.monitorEvent,test:Q.test}},Mt={"media.download":{input:r.mediaDownload,output:a.mediaDownload},"media.uploadFromUrl":{input:r.mediaUploadFromUrl,output:a.mediaUploadFromUrl},"trends.get":{input:r.trendsGet,output:a.trendsGet},"tweets.batch":{input:r.tweetsBatch,output:a.tweetsBatch},"tweets.create":{input:r.tweetsCreate,output:a.tweetsCreate},"tweets.delete":{input:r.tweetsDelete,output:a.tweetsDelete},"tweets.get":{input:r.tweetsGet,output:a.tweetsGet},"tweets.like":{input:r.tweetsLike,output:a.tweetsLike},"tweets.retweet":{input:r.tweetsRetweet,output:a.tweetsRetweet},"tweets.search":{input:r.tweetsSearch,output:a.tweetsSearch},"tweets.unlike":{input:r.tweetsUnlike,output:a.tweetsUnlike},"users.batch":{input:r.usersBatch,output:a.usersBatch},"users.follow":{input:r.usersFollow,output:a.usersFollow},"users.followers":{input:r.usersFollowers,output:a.usersFollowers},"users.following":{input:r.usersFollowing,output:a.usersFollowing},"users.get":{input:r.usersGet,output:a.usersGet},"users.search":{input:r.usersSearch,output:a.usersSearch},"users.tweets":{input:r.usersTweets,output:a.usersTweets},"users.unfollow":{input:r.usersUnfollow,output:a.usersUnfollow},"webhooks.create":{input:r.webhooksCreate,output:a.webhooksCreate},"webhooks.deactivate":{input:r.webhooksDeactivate,output:a.webhooksDeactivate},"webhooks.deliveries":{input:r.webhooksDeliveries,output:a.webhooksDeliveries},"webhooks.list":{input:r.webhooksList,output:a.webhooksList},"webhooks.test":{input:r.webhooksTest,output:a.webhooksTest},"webhooks.update":{input:r.webhooksUpdate,output:a.webhooksUpdate},"writeActions.get":{input:r.writeActionsGet,output:a.writeActionsGet}},Bt={"events.monitor":{description:"Handle a signed Xquik monitor event delivery",payload:l,response:l},"events.test":{description:"Handle a signed Xquik test webhook delivery",payload:l,response:l}},_t="api_key",zt={"media.download":{description:"Download images and videos from one or more tweets",riskLevel:"read"},"media.uploadFromUrl":{description:"Upload public media URLs for use in Xquik tweet creation",riskLevel:"write"},"trends.get":{description:"Get trending X topics by WOEID region",riskLevel:"read"},"tweets.batch":{description:"Fetch up to 100 tweets by ID",riskLevel:"read"},"tweets.create":{description:"Create a tweet or reply from a connected X account",riskLevel:"write"},"tweets.delete":{description:"Delete a tweet from a connected X account",irreversible:!0,riskLevel:"destructive"},"tweets.get":{description:"Get a tweet with full text, author, metrics, and media",riskLevel:"read"},"tweets.like":{description:"Like a tweet from a connected X account",riskLevel:"write"},"tweets.retweet":{description:"Retweet a tweet from a connected X account",riskLevel:"write"},"tweets.search":{description:"Search tweets with X query operators and pagination",riskLevel:"read"},"tweets.unlike":{description:"Remove a like from a connected X account",riskLevel:"write"},"users.batch":{description:"Look up up to 100 X users by ID",riskLevel:"read"},"users.follow":{description:"Follow an X user from a connected account",riskLevel:"write"},"users.followers":{description:"List followers of an X user",riskLevel:"read"},"users.following":{description:"List accounts an X user follows",riskLevel:"read"},"users.get":{description:"Get an X user profile by username or user ID",riskLevel:"read"},"users.search":{description:"Search X users by name or username",riskLevel:"read"},"users.tweets":{description:"List recent tweets posted by an X user",riskLevel:"read"},"users.unfollow":{description:"Unfollow an X user from a connected account",riskLevel:"write"},"webhooks.create":{description:"Create an Xquik webhook endpoint subscription",riskLevel:"write"},"webhooks.deactivate":{description:"Deactivate an Xquik webhook endpoint",riskLevel:"write"},"webhooks.deliveries":{description:"List delivery attempts for an Xquik webhook endpoint",riskLevel:"read"},"webhooks.list":{description:"List configured Xquik webhook endpoints",riskLevel:"read"},"webhooks.test":{description:"Send a test delivery to an Xquik webhook endpoint",riskLevel:"write"},"webhooks.update":{description:"Update a Xquik webhook URL, event types, or active state",riskLevel:"write"},"writeActions.get":{description:"Check the status of a pending Xquik write action",riskLevel:"read"}},jt={api_key:{account:["one","webhook_signature"]}};function Bo(t={}){let o={...t,authType:t.authType??_t};return{authConfig:jt,endpointMeta:zt,endpointSchemas:Mt,endpoints:Ft,errorHandlers:{...ae,...o.errorHandlers},hooks:o.hooks,id:"xquik",keyBuilder:async(s,p)=>{if(p==="webhook"&&o.webhookSecret)return o.webhookSecret;if(p==="webhook")return await s.keys.get_webhook_signature()??"";if(p==="endpoint"&&o.key)return o.key;if(p==="endpoint"&&s.authType==="api_key")return await s.keys.get_api_key()??"";throw new Dt("xquik","api_key")},options:o,pluginWebhookMatcher:ye,schema:we,webhookHooks:o.webhookHooks,webhookSchemas:Bt,webhooks:Gt}}export{Bo as xquik,jt as xquikAuthConfig,Mt as xquikEndpointSchemas};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@corsair-dev/xquik",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Search tweets, inspect users, manage Xquik webhooks, upload media, and run X actions from Corsair",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"tsup": "^8.0.1",
|
|
24
24
|
"typescript": "^5.9.3",
|
|
25
25
|
"zod": "^4.1.13",
|
|
26
|
-
"corsair": "0.1.
|
|
26
|
+
"corsair": "0.1.75"
|
|
27
27
|
},
|
|
28
28
|
"keywords": [
|
|
29
29
|
"corsair",
|