snowtransfer 0.17.2 → 0.17.3
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.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -6,7 +6,7 @@ var web = require('stream/web');
|
|
|
6
6
|
var events = require('events');
|
|
7
7
|
var v10 = require('discord-api-types/v10');
|
|
8
8
|
|
|
9
|
-
var __getOwnPropNames=Object.getOwnPropertyNames;var __require=(x=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(x,{get:(a,b)=>(typeof require<"u"?require:a)[b]}):x)(function(x){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+x+'" is not supported')});var __esm=(fn,res)=>function(){return fn&&(res=(0, fn[__getOwnPropNames(fn)[0]])(fn=0)),res};var __commonJS=(cb,mod)=>function(){return mod||(0, cb[__getOwnPropNames(cb)[0]])((mod={exports:{}}).exports,mod),mod.exports};var require_StateMachine=__commonJS({"src/StateMachine.ts"(exports,module){var EventEmitter2=__require("events"),StateMachine=class extends EventEmitter2{constructor(currentStateName){super();this.currentStateName=currentStateName;this.deferredTransitionCreators.push(()=>{this.states.has(currentStateName)||this.defineState(currentStateName);});}states=new Map;editable=true;deferredTransitionCreators=[];history=[];guardEditable(){if(!this.editable)throw new Error("tried to edit state machine after machine has been frozen")}guardNotEditable(){if(this.editable)throw new Error("tried to do transition before machine has been frozen")}defineState(name,cbs={onEnter:[],onLeave:[],transitions:new Map}){if(this.guardEditable(),this.states.has(name))throw new Error(`attempt to redefine state ${name}, please edit it instead`);return this.states.set(name,{onEnter:cbs.onEnter,onLeave:cbs.onLeave,transitions:cbs.transitions}),this}defineTransition(from,event,to,cb){this.guardEditable();let state=this.states.get(from);if(state.transitions.has(event))throw new Error(`attempt to redefine transition ${from} --${event}--> *, please only create transitions once`);let onTransition=[];return cb&&onTransition.push(cb),state.transitions.set(event,{destination:to,onTransition}),this}defineUniversalTransition(event,to){return this.guardEditable(),this.deferredTransitionCreators.push(()=>{for(let[stateName,state]of this.states.entries())state.transitions.has(event)||this.defineTransition(stateName,event,to);}),this}freeze(){this.guardEditable();for(let cb of this.deferredTransitionCreators)cb();let problems=[];for(let[stateName,state]of this.states.entries())for(let[transitionName,transition]of state.transitions.entries())this.states.has(transition.destination)||problems.push(`transition ${stateName} --${transitionName}--> ${transition.destination} has an invalid destination`);if(problems.length)throw new Error(`Consistency problems in state machine: ${problems.join(";")}`);this.editable=false;}doTransition(event,...args){this.guardNotEditable();let from=this.currentStateName,transition=this.states.get(this.currentStateName).transitions.get(event);if(!transition)throw new Error(`undefined transition: ${this.currentStateName} -> ${event} -> ?`);this.history.push({from,event,to:transition.destination,time:Date.now()}),this.history.length>20&&this.history.shift();for(let cb of this.states.get(this.currentStateName).onLeave)try{cb(event);}catch(e){throw this.debug(),new Error(`onLeave callback for state ${from} (during transition ${from} --${event}--> ${transition.destination})`,{cause:e})}this.currentStateName=transition.destination;for(let cb of transition.onTransition??[])try{cb(...args);}catch(e){throw this.debug(),new Error(`onTransition callback during ${from} --${event}--> ${transition.destination}`,{cause:e})}this.emit("enter",this.currentStateName);for(let cb of this.states.get(this.currentStateName).onEnter)try{cb(event);}catch(e){throw this.debug(),new Error(`onEnter callback for state ${from} (during transition ${this.currentStateName} --${event}--> ${transition.destination})`,{cause:e})}}doTransitionLater(event,delayMs,...args){this.guardNotEditable();let timer=setTimeout(()=>{this.doTransition(event,...args);},delayMs);this.once("enter",()=>{clearTimeout(timer);});}debug(){console.table(this.history.map(h=>({At:new Date(h.time),"From -->":h.from,"-- Event -->":h.event,"--> To":h.to})).concat({At:new Date,"From -->":this.currentStateName,"-- Event -->":"(debug)","--> To":""}));}};module.exports=StateMachine;}});var require_Constants=__commonJS({"src/Constants.ts"(exports,module){var Constants3={REST_API_VERSION:10,GET_CHANNEL_MESSAGES_MIN_RESULTS:1,GET_CHANNEL_MESSAGES_MAX_RESULTS:100,GET_GUILD_SCHEDULED_EVENT_USERS_MIN_RESULTS:1,GET_GUILD_SCHEDULED_EVENT_USERS_MAX_RESULTS:100,SEARCH_MEMBERS_MIN_RESULTS:1,SEARCH_MEMBERS_MAX_RESULTS:1e3,BULK_DELETE_MESSAGES_MIN:2,BULK_DELETE_MESSAGES_MAX:100,OK_STATUS_CODES:new Set([200,201,204,304]),DO_NOT_RETRY_STATUS_CODES:new Set([401,403,404,405,411,413]),DEFAULT_RETRY_LIMIT:3,GLOBAL_REQUESTS_PER_SECOND:50,async standardMultipartHandler(data){let form=new FormData;if(data.files&&Array.isArray(data.files)&&data.files.every(f=>!!f.name&&!!f.file)){let index=0;for(let file of data.files)await Constants3.standardAddToFormHandler(form,`files[${index}]`,file.file,file.name),delete file.file,index++;}return data.data&&delete data.files,form.append("payload_json",JSON.stringify(data)),form},async standardAddToFormHandler(form,name,value,filename){if(value instanceof Buffer||typeof value=="string")form.append(name,new buffer.Blob([value]),filename);else if(value instanceof buffer.Blob||value instanceof buffer.File)form.append(name,value,filename);else if(value instanceof stream.Readable||value instanceof web.ReadableStream){let blob=await new Response(value instanceof web.ReadableStream?value:stream.Readable.toWeb(value)).blob();form.set(name,blob,filename);}else throw new Error(`Don't know how to add ${value?.constructor?.name??typeof value} to form`)},reasonHeader(reason){return reason?{"X-Audit-Log-Reason":reason}:{}}};module.exports=Constants3;}});var require_Endpoints=__commonJS({"src/Endpoints.ts"(exports,module){var Constants3=require_Constants(),Endpoints3={BASE_URL:"/api/v"+Constants3.REST_API_VERSION,BASE_HOST:"https://discord.com",CDN_URL:"https://cdn.discordapp.com",APPLICATION_COMMAND:(appId,cmdId)=>`${Endpoints3.APPLICATION_COMMANDS(appId)}/${cmdId}`,APPLICATION_COMMANDS:appId=>`/applications/${appId}/commands`,APPLICATION_EMOJI:(appId,emojiId)=>`${Endpoints3.APPLICATION_EMOJIS(appId)}/${emojiId}`,APPLICATION_EMOJIS:appId=>`/applications/${appId}/emojis`,APPLICATION_ENTITLEMENT:(appId,entitlementId)=>`${Endpoints3.APPLICATION_ENTITLEMENTS(appId)}/${entitlementId}`,APPLICATION_ENTITLEMENT_CONSUME:(appId,entitlementId)=>`${Endpoints3.APPLICATION_ENTITLEMENT(appId,entitlementId)}/consume`,APPLICATION_ENTITLEMENTS:appId=>`/applications/${appId}/entitlements`,APPLICATION_GUILD_COMMANDS_PERMISSIONS:(appId,guildId)=>`${Endpoints3.APPLICATION_GUILD_COMMANDS(appId,guildId)}/permissions`,APPLICATION_GUILD_COMMAND_PERMISSIONS:(appId,guildId,cmdId)=>`${Endpoints3.APPLICATION_GUILD_COMMAND(appId,guildId,cmdId)}/permissions`,APPLICATION_GUILD_COMMAND:(appId,guildId,cmdId)=>`${Endpoints3.APPLICATION_GUILD_COMMANDS(appId,guildId)}/${cmdId}`,APPLICATION_GUILD_COMMANDS:(appId,guildId)=>`/applications/${appId}/guilds/${guildId}/commands`,APPLICATION_SKUS:appId=>`/applications/${appId}/skus`,ATTACHMENTS_REFRESH_URLS:"/attachments/refresh-urls",CHANNEL:chanId=>`${Endpoints3.CHANNELS}/${chanId}`,CHANNEL_ATTACHMENTS:chanId=>`${Endpoints3.CHANNEL(chanId)}/attachments`,CHANNEL_BULK_DELETE:chanId=>`${Endpoints3.CHANNEL_MESSAGES(chanId)}/bulk-delete`,CHANNEL_FOLLOWERS:chanId=>`${Endpoints3.CHANNEL(chanId)}/followers`,CHANNEL_INVITES:chanId=>`${Endpoints3.CHANNEL(chanId)}/invites`,CHANNEL_MESSAGE:(chanId,msgId)=>`${Endpoints3.CHANNEL_MESSAGES(chanId)}/${msgId}`,CHANNEL_MESSAGE_CROSSPOST:(chanId,msgId)=>`${Endpoints3.CHANNEL_MESSAGE(chanId,msgId)}/crosspost`,CHANNEL_MESSAGE_REACTION:(chanId,msgId,reaction)=>`${Endpoints3.CHANNEL_MESSAGE_REACTIONS(chanId,msgId)}/${reaction}`,CHANNEL_MESSAGE_REACTION_USER:(chanId,msgId,reaction,userId)=>`${Endpoints3.CHANNEL_MESSAGE_REACTION(chanId,msgId,reaction)}/${userId}`,CHANNEL_MESSAGE_REACTIONS:(chanId,msgId)=>`${Endpoints3.CHANNEL_MESSAGE(chanId,msgId)}/reactions`,CHANNEL_MESSAGE_THREADS:(chanId,msgId)=>`${Endpoints3.CHANNEL_MESSAGE(chanId,msgId)}/threads`,CHANNEL_MESSAGES:chanId=>`${Endpoints3.CHANNEL(chanId)}/messages`,CHANNEL_PERMISSION:(chanId,permId)=>`${Endpoints3.CHANNEL_PERMISSIONS(chanId)}/${permId}`,CHANNEL_PERMISSIONS:chanId=>`${Endpoints3.CHANNEL(chanId)}/permissions`,CHANNEL_PIN:(chanId,msgId)=>`${Endpoints3.CHANNEL_PINS(chanId)}/${msgId}`,CHANNEL_PINS:chanId=>`${Endpoints3.CHANNEL(chanId)}/messages/pins`,CHANNEL_RECIPIENT:(chanId,userId)=>`${Endpoints3.CHANNEL(chanId)}/recipients/${userId}`,CHANNEL_THREADS:chanId=>`${Endpoints3.CHANNEL(chanId)}/threads`,CHANNEL_THREAD_MEMBER:(chanId,memberId)=>`${Endpoints3.CHANNEL_THREAD_MEMBERS(chanId)}/${memberId}`,CHANNEL_THREAD_MEMBERS:chanId=>`${Endpoints3.CHANNEL(chanId)}/thread-members`,CHANNEL_THREADS_ARCHIVED_PRIVATE:chanId=>`${Endpoints3.CHANNEL_THREADS(chanId)}/archived/private`,CHANNEL_THREADS_ARCHIVED_PRIVATE_USER:chanId=>`${Endpoints3.CHANNEL(chanId)}/users/@me/threads/archived/private`,CHANNEL_THREADS_ARCHIVED_PUBLIC:chanId=>`${Endpoints3.CHANNEL_THREADS(chanId)}/archived/public`,CHANNEL_TYPING:chanId=>`${Endpoints3.CHANNEL(chanId)}/typing`,CHANNEL_VOICE_STATUS:chanId=>`${Endpoints3.CHANNEL(chanId)}/voice-status`,CHANNEL_WEBHOOKS:chanId=>`${Endpoints3.CHANNEL(chanId)}/webhooks`,CHANNELS:"/channels",GATEWAY:"/gateway",GATEWAY_BOT:"/gateway/bot",GUILD:guildId=>`${Endpoints3.GUILDS}/${guildId}`,GUILD_AUDIT_LOGS:guildId=>`${Endpoints3.GUILD(guildId)}/audit-logs`,GUILD_AUTO_MOD_RULE:(guildId,ruleId)=>`${Endpoints3.GUILD_AUTO_MOD_RULES(guildId)}/${ruleId}`,GUILD_AUTO_MOD_RULES:guildId=>`${Endpoints3.GUILD(guildId)}/auto-moderation/rules`,GUILD_BAN:(guildId,memberId)=>`${Endpoints3.GUILD_BANS(guildId)}/${memberId}`,GUILD_BANS:guildId=>`${Endpoints3.GUILD(guildId)}/bans`,GUILD_CHANNELS:guildId=>`${Endpoints3.GUILD(guildId)}/channels`,GUILD_EMOJI:(guildId,emojiId)=>`${Endpoints3.GUILD_EMOJIS(guildId)}/${emojiId}`,GUILD_EMOJIS:guildId=>`${Endpoints3.GUILD(guildId)}/emojis`,GUILD_INVITES:guildId=>`${Endpoints3.GUILD(guildId)}/invites`,GUILD_INTEGRATION:(guildId,integrationId)=>`${Endpoints3.GUILD_INTEGRATIONS(guildId)}/${integrationId}`,GUILD_INTEGRATIONS:guildId=>`${Endpoints3.GUILD(guildId)}/integrations`,GUILD_MEMBER:(guildId,memberId)=>`${Endpoints3.GUILD_MEMBERS(guildId)}/${memberId}`,GUILD_MEMBER_ROLE:(guildId,memberId,roleId)=>`${Endpoints3.GUILD_MEMBER(guildId,memberId)}/roles/${roleId}`,GUILD_MEMBERS:guildId=>`${Endpoints3.GUILD(guildId)}/members`,GUILD_MEMBERS_SEARCH:guildId=>`${Endpoints3.GUILD_MEMBERS(guildId)}/search`,GUILD_PREVIEW:guildId=>`${Endpoints3.GUILD(guildId)}/preview`,GUILD_PRUNE:guildId=>`${Endpoints3.GUILD(guildId)}/prune`,GUILD_ROLE:(guildId,roleId)=>`${Endpoints3.GUILD_ROLES(guildId)}/${roleId}`,GUILD_ROLES:guildId=>`${Endpoints3.GUILD(guildId)}/roles`,GUILD_SCHEDULED_EVENTS:guildId=>`${Endpoints3.GUILD(guildId)}/scheduled-events`,GUILD_SCHEDULED_EVENT:(guildId,eventId)=>`${Endpoints3.GUILD_SCHEDULED_EVENTS(guildId)}/${eventId}`,GUILD_SCHEDULED_EVENT_USERS:(guildId,eventId)=>`${Endpoints3.GUILD_SCHEDULED_EVENT(guildId,eventId)}/users`,GUILD_STICKER:(guildId,stickerId)=>`${Endpoints3.GUILD_STICKERS(guildId)}/${stickerId}`,GUILD_STICKERS:guildId=>`${Endpoints3.GUILD(guildId)}/stickers`,GUILD_TEMPLATE:(guildId,code)=>`${Endpoints3.GUILD_TEMPLATES(guildId)}/${code}`,GUILD_THREADS_ACTIVE:guildId=>`${Endpoints3.GUILD(guildId)}/threads/active`,GUILD_TEMPLATES:guildId=>`${Endpoints3.GUILD(guildId)}/templates`,GUILD_VANITY:guildId=>`${Endpoints3.GUILD(guildId)}/vanity-url`,GUILD_VOICE_REGIONS:guildId=>`${Endpoints3.GUILD(guildId)}/regions`,GUILD_VOICE_STATE_USER:(guildId,memberId)=>`${Endpoints3.GUILD(guildId)}/voice-states/${memberId}`,GUILD_WEBHOOKS:guildId=>`${Endpoints3.GUILD(guildId)}/webhooks`,GUILD_WELCOME_SCREEN:guildId=>`${Endpoints3.GUILD(guildId)}/welcome-screen`,GUILD_WIDGET:guildId=>`${Endpoints3.GUILD(guildId)}/widget.json`,GUILD_WIDGET_SETTINGS:guildId=>`${Endpoints3.GUILD(guildId)}/widget`,GUILDS:"/guilds",INTERACTION_CALLBACK:(interactionId,token)=>`/interactions/${interactionId}/${token}/callback`,INVITES:inviteId=>`/invites/${inviteId}`,INVITE_TARGET_USERS:inviteId=>`${Endpoints3.INVITES(inviteId)}/target-users`,INVITE_TARGET_USERS_JOB_STATUS:inviteId=>`${Endpoints3.INVITE_TARGET_USERS(inviteId)}/job-status`,OAUTH2_APPLICATION:appId=>`/oauth2/applications/${appId}`,OAUTH2_TOKEN:"/api/oauth2/token",POLL_ANSWER:(chanId,msgId,answerId)=>`${Endpoints3.CHANNEL(chanId)}/polls/${msgId}/answers/${answerId}`,POLL_EXPIRE:(chanId,msgId)=>`${Endpoints3.CHANNEL(chanId)}/polls/${msgId}/expire`,SKU_SUBSCRIPTIONS:skuId=>`/skus/${skuId}/subscriptions`,SKU_SUBSCRIPTION:(skuId,subscriptionId)=>`${Endpoints3.SKU_SUBSCRIPTIONS(skuId)}/${subscriptionId}`,STAGE_INSTANCE_CHANNEL:chanId=>`${Endpoints3.STAGE_INSTANCES}/${chanId}`,STAGE_INSTANCES:"/stage-instances",STICKER:stickerId=>`/stickers/${stickerId}`,TEMPLATE:code=>`/guilds/templates/${code}`,USER:userId=>`${Endpoints3.USERS}/${userId}`,USER_APPLICATION_ROLE_CONNECTION:(userId,appId)=>`${Endpoints3.USER(userId)}/applications/${appId}/role-connection`,USER_CHANNELS:userId=>`${Endpoints3.USER(userId)}/channels`,USER_CONNECTIONS:userId=>`${Endpoints3.USER(userId)}/connections`,USER_GUILD:(userId,guildId)=>`${Endpoints3.USER_GUILDS(userId)}/${guildId}`,USER_GUILDS:userId=>`${Endpoints3.USER(userId)}/guilds`,USER_GUILD_VOICE_STATE:(guildId,userId)=>`${Endpoints3.GUILD(guildId)}/voice-states/${userId}`,USERS:"/users",VOICE_REGIONS:"/voice/regions",WEBHOOK:hookId=>`/webhooks/${hookId}`,WEBHOOK_TOKEN:(hookId,token)=>`${Endpoints3.WEBHOOK(hookId)}/${token}`,WEBHOOK_TOKEN_GITHUB:(hookId,token)=>`${Endpoints3.WEBHOOK_TOKEN(hookId,token)}/github`,WEBHOOK_TOKEN_MESSAGE:(hookId,token,msgId)=>`/webhooks/${hookId}/${token}/messages/${msgId}`,WEBHOOK_TOKEN_SLACK:(hookId,token)=>`${Endpoints3.WEBHOOK_TOKEN(hookId,token)}/slack`};module.exports=Endpoints3;}});function appendQuery(query){let count=0;for(let[key,value]of Object.entries(query))value==null?delete query[key]:count++;return count>0?`?${new URLSearchParams(query).toString()}`:""}var fs,path,crypto,util,Endpoints,version,Constants,SM2,routeRegex,reactionsRegex,reactionsUserRegex,webhooksRegex,isMessageEndpointRegex,isGuildChannelsRegex,messagesRegex,disallowedBodyMethods;exports.DiscordAPIError = void 0;exports.IntervalCounter = void 0;exports.LeakyCounter = void 0;exports.Bucket = void 0;exports.Ratelimiter = void 0;exports.RequestHandler = void 0;var init_RequestHandler=__esm({"src/RequestHandler.ts"(){fs=__require("fs"),path=__require("path"),crypto=__require("crypto"),util=__require("util"),Endpoints=require_Endpoints(),{version}=JSON.parse(fs.readFileSync(path.join(__dirname,"../package.json"),{encoding:"utf8"})),Constants=require_Constants(),SM2=require_StateMachine(),routeRegex=/\/([a-z-]+)\/(?:\d+)/g,reactionsRegex=/\/reactions\/[^/]+/g,reactionsUserRegex=/\/reactions\/:id\/[^/]+/g,webhooksRegex=/^\/webhooks\/(\d+)\/[A-Za-z0-9-_]{64,}/,isMessageEndpointRegex=/\/messages\/:id$/,isGuildChannelsRegex=/\/guilds\/\d+\/channels$/,messagesRegex=/\/messages\/\d+$/,disallowedBodyMethods=new Set(["head","get","delete"]),exports.DiscordAPIError=class extends Error{method;path;code;httpStatus;request;response;constructor(error,request,response){super(),this.name="DiscordAPIError",this.message=error.message??util.inspect(error),this.method=request.method,this.path=request.endpoint,this.code=error.code??4e3,this.httpStatus=response.status,Object.defineProperties(this,{request:{enumerable:false,value:request},response:{enumerable:false,value:response}});}},exports.IntervalCounter=class{constructor(limit,reset){this.limit=limit;this.reset=reset;this.remaining=limit;}remaining;firstRequestTime=0;resetAt=null;id=new Array(3).fill(0).map(()=>String.fromCodePoint(Math.floor(Math.random()*26+65))).join("");checkReset(){let now=Date.now();this.resetAt!==null?now>this.resetAt&&(this.firstRequestTime=0,this.remaining=this.limit,this.resetAt=null,globalThis.snowtransferDebugLogging&&console.log(`${new Date().toISOString()} [itrv] [${this.id}] informed reset: ${this.remaining}/${this.limit}`)):now>this.firstRequestTime+this.reset&&(this.firstRequestTime=0,this.remaining=this.limit,globalThis.snowtransferDebugLogging&&console.log(`${new Date().toISOString()} [itrv] [${this.id}] predicted reset: ${this.remaining}/${this.limit}`));}hasReset(){return this.checkReset(),this.remaining===this.limit}canTake(){return this.checkReset(),this.remaining>0}take(){this.checkReset(),this.remaining===this.limit&&(this.firstRequestTime=Date.now());let ok=this.remaining>0;return this.remaining--,ok}timeUntilReset(){let now=Date.now();return this.resetAt?Math.max(this.resetAt-now+1,0):Math.max(this.firstRequestTime+this.reset-Date.now()+1,0)}responseReceived(){this.remaining===this.limit-1&&this.firstRequestTime&&(this.firstRequestTime=Date.now());}applyCount(limit,remaining,resetAfter){limit!=null&&(this.limit=limit),this.remaining=remaining,this.resetAt=Date.now()+resetAfter;}},exports.LeakyCounter=class{constructor(limit){this.limit=limit;this.remaining=limit;}remaining;resetAt=null;id=new Array(3).fill(0).map(()=>String.fromCodePoint(Math.floor(Math.random()*26+65))).join("");checkReset(){let now=Date.now();this.resetAt&&now>this.resetAt&&(this.remaining=Math.min(this.limit,this.remaining+1),this.resetAt=null,globalThis.snowtransferDebugLogging&&console.log(`${new Date().toISOString()} [leak] [${this.id}] restore one: ${this.remaining}/${this.limit}`));}hasReset(){return this.checkReset(),this.remaining===this.limit}canTake(){return this.checkReset(),this.remaining>0}take(){return this.checkReset(),globalThis.snowtransferDebugLogging&&console.log(`${new Date().toISOString()} [leak] [${this.id}] took: ${this.remaining-1} left`),this.remaining-- >0}timeUntilReset(){let now=Date.now();return this.resetAt?Math.max(this.resetAt-now+1,0):0}responseReceived(){}applyCount(limit,remaining,resetAfter){limit!=null&&(this.limit=limit),this.remaining=remaining,this.resetAt=Date.now()+resetAfter,globalThis.snowtransferDebugLogging&&console.log(`${new Date().toISOString()} [leak] [${this.id}] applied: ${remaining}/${limit} - wait another ${resetAfter}`);}},exports.Bucket=class{sm=new SM2("ready");calls=[];counters=[];pauseRequested=false;constructor(counters){this.counters=counters,this.sm.defineState("ready",{onEnter:[],onLeave:[],transitions:new Map([["enqueue",{destination:"check"}],["pause",{destination:"paused"}]])}),this.sm.defineState("check",{onEnter:[()=>this.pauseRequested?this.sm.doTransition("pause"):this.counters.every(c=>c.canTake())?this.calls.length?this.sm.doTransition("run"):this.sm.doTransition("empty"):this.sm.doTransition("cooldown")],onLeave:[],transitions:new Map([["pause",{destination:"paused"}],["cooldown",{destination:"cooldown"}],["run",{destination:"running"}],["empty",{destination:"ready"}]])}),this.sm.defineState("running",{onEnter:[()=>{this.counters.forEach(c=>c.take()),this.calls.shift()().then(()=>{this.sm.doTransition("complete");});}],onLeave:[],transitions:new Map([["complete",{destination:"check"}]])}),this.sm.defineState("cooldown",{onEnter:[()=>{this.sm.doTransitionLater("reset",Math.max(...this.counters.map(c=>c.timeUntilReset())));}],onLeave:[],transitions:new Map([["reset",{destination:"check"}]])}),this.sm.defineState("paused",{onEnter:[],onLeave:[()=>{this.pauseRequested=false;}],transitions:new Map([["resume",{destination:"check"}]])}),this.sm.freeze();}enqueue(fn){return new Promise((resolve,reject)=>{this.calls.push(()=>fn(this).then(resolve).catch(reject)),this.sm.currentStateName==="ready"&&this.sm.doTransition("enqueue");})}pause(){this.pauseRequested=true,this.sm.currentStateName==="ready"&&this.sm.doTransition("pause");}resume(){this.pauseRequested=false,this.sm.currentStateName==="paused"&&this.sm.doTransition("resume");}dropQueue(){this.calls.length=0;}},exports.Ratelimiter=class{buckets=new Map;globalBucket=new exports.Bucket([new exports.IntervalCounter(Constants.GLOBAL_REQUESTS_PER_SECOND,1e3)]);get global(){return !this.globalBucket.counters[0].canTake()}constructor(){setInterval(()=>{for(let[key,value]of this.buckets.entries())value.counters[0].hasReset()&&this.buckets.delete(key);},3600*1e3).unref();}routify(url,method){let route=url.replaceAll(routeRegex,function(match,p){return p==="channels"||p==="guilds"||p==="webhooks"?match:`/${p}/:id`}).replaceAll(reactionsRegex,"/reactions/:id").replaceAll(reactionsUserRegex,"/reactions/:id/:userId").replace(webhooksRegex,"/webhooks/$1/:token");if(method==="DELETE"&&isMessageEndpointRegex.test(route)?route=method+route:method==="GET"&&isGuildChannelsRegex.test(route)&&(route="/guilds/:id/channels"),method==="PUT"||method==="DELETE"){let index=route.indexOf("/reactions");index!==-1&&(route="MODIFY"+route.slice(0,index+10));}return route}queue(fn,url,method){let routeKey=this.routify(url,method),bucket=this.buckets.get(routeKey);return bucket||(method==="DELETE"&&messagesRegex.test(url)?bucket=new exports.Bucket([new exports.LeakyCounter(1),new exports.IntervalCounter(5,5e3),this.globalBucket.counters[0]]):bucket=new exports.Bucket([new exports.LeakyCounter(1),this.globalBucket.counters[0]]),this.buckets.set(routeKey,bucket)),bucket.enqueue(fn)}setGlobal(ms){this.globalBucket.counters[0].applyCount(Constants.GLOBAL_REQUESTS_PER_SECOND,0,ms);}},exports.RequestHandler=class extends events.EventEmitter{constructor(ratelimiter,options){super();this.ratelimiter=ratelimiter;this.options={baseHost:options?.baseHost??Endpoints.BASE_HOST,baseURL:options?.baseURL??Endpoints.BASE_URL,bypassBuckets:options?.bypassBuckets??false,retryFailed:options?.retryFailed??false,retryLimit:options?.retryLimit??Constants.DEFAULT_RETRY_LIMIT,headers:{"User-Agent":`Discordbot (https://github.com/DasWolke/SnowTransfer, ${version}) Node.js/${process.version}`},fetch:options?.fetch??fetch},options?.token&&(this.options.headers.Authorization=options.token),this.apiURL=this.options.baseHost+Endpoints.BASE_URL,this.latency=500;}options;latency;apiURL;request(endpoint,params={},method,dataType,data,extraHeaders,retries=this.options.retryLimit,rawResponse=false){let stack=new Error().stack;return new Promise(async(resolve,reject)=>{let fn=async bkt=>{let reqId=crypto.randomBytes(20).toString("hex");try{let request={endpoint,method:method.toUpperCase(),dataType,data:data??{}};this.emit("request",reqId,request);let before=Date.now(),response;switch(dataType){case "json":response=await this._request(endpoint,params,method,data,extraHeaders);break;case "multipart":if(!data)throw new Error("No multipart data");response=await this._multiPartRequest(endpoint,params,method,data,extraHeaders);break;default:throw new Error("Forbidden dataType. Use json or multipart or ensure multipart has FormData")}if(this.latency=Date.now()-before,bkt?.counters.forEach(c=>c.responseReceived()),bkt&&this._applyRatelimitHeaders(bkt,response.headers),response.status&&!Constants.OK_STATUS_CODES.has(response.status)){if(this.options.retryFailed&&!Constants.DO_NOT_RETRY_STATUS_CODES.has(response.status)&&retries!==0)return this.request(endpoint,params,method,dataType,data,extraHeaders,response.status===429?0:retries--).then(resolve).catch(reject);if(response.status!==429)throw new exports.DiscordAPIError({message:await response.text()},request,response)}if(response.status===429){let b=await response.json();throw b.global&&this.ratelimiter.setGlobal(b.retry_after*1e3),globalThis.snowtransferDebugLogging&&console.log(`${new Date().toISOString()} [rate] [${bkt?.counters[0].id}] !! 429 - guess there was 0 remaining, wait another ${b.retry_after*1e3} (route: ${this.ratelimiter.routify(endpoint,method.toUpperCase())})`),this.emit("rateLimit",{method:method.toUpperCase(),path:endpoint,route:this.ratelimiter.routify(endpoint,method.toUpperCase())}),new exports.DiscordAPIError({message:b.message,code:b.code??429},request,response)}if(this.emit("done",reqId,response,request),rawResponse)return resolve(response);if(response.body){let b;try{b=await response.json();}catch{return resolve(void 0)}return resolve(b)}else return resolve(void 0)}catch(error){return error?.stack&&(error.stack=error.stack+`
|
|
9
|
+
var __getOwnPropNames=Object.getOwnPropertyNames;var __require=(x=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(x,{get:(a,b)=>(typeof require<"u"?require:a)[b]}):x)(function(x){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+x+'" is not supported')});var __esm=(fn,res)=>function(){return fn&&(res=(0, fn[__getOwnPropNames(fn)[0]])(fn=0)),res};var __commonJS=(cb,mod)=>function(){return mod||(0, cb[__getOwnPropNames(cb)[0]])((mod={exports:{}}).exports,mod),mod.exports};var require_StateMachine=__commonJS({"src/StateMachine.ts"(exports,module){var EventEmitter2=__require("events"),StateMachine=class extends EventEmitter2{constructor(currentStateName){super();this.currentStateName=currentStateName;this.deferredTransitionCreators.push(()=>{this.states.has(currentStateName)||this.defineState(currentStateName);});}states=new Map;editable=true;deferredTransitionCreators=[];history=[];guardEditable(){if(!this.editable)throw new Error("tried to edit state machine after machine has been frozen")}guardNotEditable(){if(this.editable)throw new Error("tried to do transition before machine has been frozen")}defineState(name,cbs={onEnter:[],onLeave:[],transitions:new Map}){if(this.guardEditable(),this.states.has(name))throw new Error(`attempt to redefine state ${name}, please edit it instead`);return this.states.set(name,{onEnter:cbs.onEnter,onLeave:cbs.onLeave,transitions:cbs.transitions}),this}defineTransition(from,event,to,cb){this.guardEditable();let state=this.states.get(from);if(state.transitions.has(event))throw new Error(`attempt to redefine transition ${from} --${event}--> *, please only create transitions once`);let onTransition=[];return cb&&onTransition.push(cb),state.transitions.set(event,{destination:to,onTransition}),this}defineUniversalTransition(event,to){return this.guardEditable(),this.deferredTransitionCreators.push(()=>{for(let[stateName,state]of this.states.entries())state.transitions.has(event)||this.defineTransition(stateName,event,to);}),this}freeze(){this.guardEditable();for(let cb of this.deferredTransitionCreators)cb();let problems=[];for(let[stateName,state]of this.states.entries())for(let[transitionName,transition]of state.transitions.entries())this.states.has(transition.destination)||problems.push(`transition ${stateName} --${transitionName}--> ${transition.destination} has an invalid destination`);if(problems.length)throw new Error(`Consistency problems in state machine: ${problems.join(";")}`);this.editable=false;}doTransition(event,...args){this.guardNotEditable();let from=this.currentStateName,transition=this.states.get(this.currentStateName).transitions.get(event);if(!transition)throw new Error(`undefined transition: ${this.currentStateName} -> ${event} -> ?`);this.history.push({from,event,to:transition.destination,time:Date.now()}),this.history.length>20&&this.history.shift();for(let cb of this.states.get(this.currentStateName).onLeave)try{cb(event);}catch(e){throw this.debug(),new Error(`onLeave callback for state ${from} (during transition ${from} --${event}--> ${transition.destination})`,{cause:e})}this.currentStateName=transition.destination;for(let cb of transition.onTransition??[])try{cb(...args);}catch(e){throw this.debug(),new Error(`onTransition callback during ${from} --${event}--> ${transition.destination}`,{cause:e})}this.emit("enter",this.currentStateName);for(let cb of this.states.get(this.currentStateName).onEnter)try{cb(event);}catch(e){throw this.debug(),new Error(`onEnter callback for state ${from} (during transition ${this.currentStateName} --${event}--> ${transition.destination})`,{cause:e})}}doTransitionLater(event,delayMs,...args){this.guardNotEditable();let timer=setTimeout(()=>{this.doTransition(event,...args);},delayMs);this.once("enter",()=>{clearTimeout(timer);});}debug(){console.table(this.history.map(h=>({At:new Date(h.time),"From -->":h.from,"-- Event -->":h.event,"--> To":h.to})).concat({At:new Date,"From -->":this.currentStateName,"-- Event -->":"(debug)","--> To":""}));}};module.exports=StateMachine;}});var require_Constants=__commonJS({"src/Constants.ts"(exports,module){var Constants3={REST_API_VERSION:10,GET_CHANNEL_MESSAGES_MIN_RESULTS:1,GET_CHANNEL_MESSAGES_MAX_RESULTS:100,GET_GUILD_SCHEDULED_EVENT_USERS_MIN_RESULTS:1,GET_GUILD_SCHEDULED_EVENT_USERS_MAX_RESULTS:100,SEARCH_MEMBERS_MIN_RESULTS:1,SEARCH_MEMBERS_MAX_RESULTS:1e3,BULK_DELETE_MESSAGES_MIN:2,BULK_DELETE_MESSAGES_MAX:100,OK_STATUS_CODES:new Set([200,201,204,304]),DO_NOT_RETRY_STATUS_CODES:new Set([401,403,404,405,411,413]),DEFAULT_RETRY_LIMIT:3,GLOBAL_REQUESTS_PER_SECOND:50,async standardMultipartHandler(data){let form=new FormData;if(data.files&&Array.isArray(data.files)&&data.files.every(f=>!!f.name&&!!f.file)){let index=0;for(let file of data.files)await Constants3.standardAddToFormHandler(form,`files[${index}]`,file.file,file.name),delete file.file,index++;}return data.data&&delete data.files,form.append("payload_json",JSON.stringify(data)),form},async standardAddToFormHandler(form,name,value,filename){if(value instanceof Buffer||typeof value=="string")form.append(name,new buffer.Blob([value]),filename);else if(value instanceof buffer.Blob||value instanceof buffer.File)form.append(name,value,filename);else if(value instanceof stream.Readable||value instanceof web.ReadableStream){let blob=await new Response(value instanceof web.ReadableStream?value:stream.Readable.toWeb(value)).blob();form.set(name,blob,filename);}else throw new Error(`Don't know how to add ${value?.constructor?.name??typeof value} to form`)},reasonHeader(reason){return reason?{"X-Audit-Log-Reason":reason}:{}}};module.exports=Constants3;}});var require_Endpoints=__commonJS({"src/Endpoints.ts"(exports,module){var Constants3=require_Constants(),Endpoints3={BASE_URL:"/api/v"+Constants3.REST_API_VERSION,BASE_HOST:"https://discord.com",CDN_URL:"https://cdn.discordapp.com",APPLICATION_COMMAND:(appId,cmdId)=>`${Endpoints3.APPLICATION_COMMANDS(appId)}/${cmdId}`,APPLICATION_COMMANDS:appId=>`/applications/${appId}/commands`,APPLICATION_EMOJI:(appId,emojiId)=>`${Endpoints3.APPLICATION_EMOJIS(appId)}/${emojiId}`,APPLICATION_EMOJIS:appId=>`/applications/${appId}/emojis`,APPLICATION_ENTITLEMENT:(appId,entitlementId)=>`${Endpoints3.APPLICATION_ENTITLEMENTS(appId)}/${entitlementId}`,APPLICATION_ENTITLEMENT_CONSUME:(appId,entitlementId)=>`${Endpoints3.APPLICATION_ENTITLEMENT(appId,entitlementId)}/consume`,APPLICATION_ENTITLEMENTS:appId=>`/applications/${appId}/entitlements`,APPLICATION_GUILD_COMMANDS_PERMISSIONS:(appId,guildId)=>`${Endpoints3.APPLICATION_GUILD_COMMANDS(appId,guildId)}/permissions`,APPLICATION_GUILD_COMMAND_PERMISSIONS:(appId,guildId,cmdId)=>`${Endpoints3.APPLICATION_GUILD_COMMAND(appId,guildId,cmdId)}/permissions`,APPLICATION_GUILD_COMMAND:(appId,guildId,cmdId)=>`${Endpoints3.APPLICATION_GUILD_COMMANDS(appId,guildId)}/${cmdId}`,APPLICATION_GUILD_COMMANDS:(appId,guildId)=>`/applications/${appId}/guilds/${guildId}/commands`,APPLICATION_SKUS:appId=>`/applications/${appId}/skus`,ATTACHMENTS_REFRESH_URLS:"/attachments/refresh-urls",CHANNEL:chanId=>`${Endpoints3.CHANNELS}/${chanId}`,CHANNEL_ATTACHMENTS:chanId=>`${Endpoints3.CHANNEL(chanId)}/attachments`,CHANNEL_BULK_DELETE:chanId=>`${Endpoints3.CHANNEL_MESSAGES(chanId)}/bulk-delete`,CHANNEL_FOLLOWERS:chanId=>`${Endpoints3.CHANNEL(chanId)}/followers`,CHANNEL_INVITES:chanId=>`${Endpoints3.CHANNEL(chanId)}/invites`,CHANNEL_MESSAGE:(chanId,msgId)=>`${Endpoints3.CHANNEL_MESSAGES(chanId)}/${msgId}`,CHANNEL_MESSAGE_CROSSPOST:(chanId,msgId)=>`${Endpoints3.CHANNEL_MESSAGE(chanId,msgId)}/crosspost`,CHANNEL_MESSAGE_REACTION:(chanId,msgId,reaction)=>`${Endpoints3.CHANNEL_MESSAGE_REACTIONS(chanId,msgId)}/${reaction}`,CHANNEL_MESSAGE_REACTION_USER:(chanId,msgId,reaction,userId)=>`${Endpoints3.CHANNEL_MESSAGE_REACTION(chanId,msgId,reaction)}/${userId}`,CHANNEL_MESSAGE_REACTIONS:(chanId,msgId)=>`${Endpoints3.CHANNEL_MESSAGE(chanId,msgId)}/reactions`,CHANNEL_MESSAGE_THREADS:(chanId,msgId)=>`${Endpoints3.CHANNEL_MESSAGE(chanId,msgId)}/threads`,CHANNEL_MESSAGES:chanId=>`${Endpoints3.CHANNEL(chanId)}/messages`,CHANNEL_PERMISSION:(chanId,permId)=>`${Endpoints3.CHANNEL_PERMISSIONS(chanId)}/${permId}`,CHANNEL_PERMISSIONS:chanId=>`${Endpoints3.CHANNEL(chanId)}/permissions`,CHANNEL_PIN:(chanId,msgId)=>`${Endpoints3.CHANNEL_PINS(chanId)}/${msgId}`,CHANNEL_PINS:chanId=>`${Endpoints3.CHANNEL(chanId)}/messages/pins`,CHANNEL_RECIPIENT:(chanId,userId)=>`${Endpoints3.CHANNEL(chanId)}/recipients/${userId}`,CHANNEL_THREADS:chanId=>`${Endpoints3.CHANNEL(chanId)}/threads`,CHANNEL_THREAD_MEMBER:(chanId,memberId)=>`${Endpoints3.CHANNEL_THREAD_MEMBERS(chanId)}/${memberId}`,CHANNEL_THREAD_MEMBERS:chanId=>`${Endpoints3.CHANNEL(chanId)}/thread-members`,CHANNEL_THREADS_ARCHIVED_PRIVATE:chanId=>`${Endpoints3.CHANNEL_THREADS(chanId)}/archived/private`,CHANNEL_THREADS_ARCHIVED_PRIVATE_USER:chanId=>`${Endpoints3.CHANNEL(chanId)}/users/@me/threads/archived/private`,CHANNEL_THREADS_ARCHIVED_PUBLIC:chanId=>`${Endpoints3.CHANNEL_THREADS(chanId)}/archived/public`,CHANNEL_TYPING:chanId=>`${Endpoints3.CHANNEL(chanId)}/typing`,CHANNEL_VOICE_STATUS:chanId=>`${Endpoints3.CHANNEL(chanId)}/voice-status`,CHANNEL_WEBHOOKS:chanId=>`${Endpoints3.CHANNEL(chanId)}/webhooks`,CHANNELS:"/channels",GATEWAY:"/gateway",GATEWAY_BOT:"/gateway/bot",GUILD:guildId=>`${Endpoints3.GUILDS}/${guildId}`,GUILD_AUDIT_LOGS:guildId=>`${Endpoints3.GUILD(guildId)}/audit-logs`,GUILD_AUTO_MOD_RULE:(guildId,ruleId)=>`${Endpoints3.GUILD_AUTO_MOD_RULES(guildId)}/${ruleId}`,GUILD_AUTO_MOD_RULES:guildId=>`${Endpoints3.GUILD(guildId)}/auto-moderation/rules`,GUILD_BAN:(guildId,memberId)=>`${Endpoints3.GUILD_BANS(guildId)}/${memberId}`,GUILD_BANS:guildId=>`${Endpoints3.GUILD(guildId)}/bans`,GUILD_CHANNELS:guildId=>`${Endpoints3.GUILD(guildId)}/channels`,GUILD_EMOJI:(guildId,emojiId)=>`${Endpoints3.GUILD_EMOJIS(guildId)}/${emojiId}`,GUILD_EMOJIS:guildId=>`${Endpoints3.GUILD(guildId)}/emojis`,GUILD_INVITES:guildId=>`${Endpoints3.GUILD(guildId)}/invites`,GUILD_INTEGRATION:(guildId,integrationId)=>`${Endpoints3.GUILD_INTEGRATIONS(guildId)}/${integrationId}`,GUILD_INTEGRATIONS:guildId=>`${Endpoints3.GUILD(guildId)}/integrations`,GUILD_MEMBER:(guildId,memberId)=>`${Endpoints3.GUILD_MEMBERS(guildId)}/${memberId}`,GUILD_MEMBER_ROLE:(guildId,memberId,roleId)=>`${Endpoints3.GUILD_MEMBER(guildId,memberId)}/roles/${roleId}`,GUILD_MEMBERS:guildId=>`${Endpoints3.GUILD(guildId)}/members`,GUILD_MEMBERS_SEARCH:guildId=>`${Endpoints3.GUILD_MEMBERS(guildId)}/search`,GUILD_PREVIEW:guildId=>`${Endpoints3.GUILD(guildId)}/preview`,GUILD_PRUNE:guildId=>`${Endpoints3.GUILD(guildId)}/prune`,GUILD_ROLE:(guildId,roleId)=>`${Endpoints3.GUILD_ROLES(guildId)}/${roleId}`,GUILD_ROLES:guildId=>`${Endpoints3.GUILD(guildId)}/roles`,GUILD_SCHEDULED_EVENTS:guildId=>`${Endpoints3.GUILD(guildId)}/scheduled-events`,GUILD_SCHEDULED_EVENT:(guildId,eventId)=>`${Endpoints3.GUILD_SCHEDULED_EVENTS(guildId)}/${eventId}`,GUILD_SCHEDULED_EVENT_USERS:(guildId,eventId)=>`${Endpoints3.GUILD_SCHEDULED_EVENT(guildId,eventId)}/users`,GUILD_STICKER:(guildId,stickerId)=>`${Endpoints3.GUILD_STICKERS(guildId)}/${stickerId}`,GUILD_STICKERS:guildId=>`${Endpoints3.GUILD(guildId)}/stickers`,GUILD_TEMPLATE:(guildId,code)=>`${Endpoints3.GUILD_TEMPLATES(guildId)}/${code}`,GUILD_THREADS_ACTIVE:guildId=>`${Endpoints3.GUILD(guildId)}/threads/active`,GUILD_TEMPLATES:guildId=>`${Endpoints3.GUILD(guildId)}/templates`,GUILD_VANITY:guildId=>`${Endpoints3.GUILD(guildId)}/vanity-url`,GUILD_VOICE_REGIONS:guildId=>`${Endpoints3.GUILD(guildId)}/regions`,GUILD_VOICE_STATE_USER:(guildId,memberId)=>`${Endpoints3.GUILD(guildId)}/voice-states/${memberId}`,GUILD_WEBHOOKS:guildId=>`${Endpoints3.GUILD(guildId)}/webhooks`,GUILD_WELCOME_SCREEN:guildId=>`${Endpoints3.GUILD(guildId)}/welcome-screen`,GUILD_WIDGET:guildId=>`${Endpoints3.GUILD(guildId)}/widget.json`,GUILD_WIDGET_SETTINGS:guildId=>`${Endpoints3.GUILD(guildId)}/widget`,GUILDS:"/guilds",INTERACTION_CALLBACK:(interactionId,token)=>`/interactions/${interactionId}/${token}/callback`,INVITES:inviteId=>`/invites/${inviteId}`,INVITE_TARGET_USERS:inviteId=>`${Endpoints3.INVITES(inviteId)}/target-users`,INVITE_TARGET_USERS_JOB_STATUS:inviteId=>`${Endpoints3.INVITE_TARGET_USERS(inviteId)}/job-status`,OAUTH2_APPLICATION:appId=>`/oauth2/applications/${appId}`,OAUTH2_TOKEN:"/api/oauth2/token",POLL_ANSWER:(chanId,msgId,answerId)=>`${Endpoints3.CHANNEL(chanId)}/polls/${msgId}/answers/${answerId}`,POLL_EXPIRE:(chanId,msgId)=>`${Endpoints3.CHANNEL(chanId)}/polls/${msgId}/expire`,SKU_SUBSCRIPTIONS:skuId=>`/skus/${skuId}/subscriptions`,SKU_SUBSCRIPTION:(skuId,subscriptionId)=>`${Endpoints3.SKU_SUBSCRIPTIONS(skuId)}/${subscriptionId}`,STAGE_INSTANCE_CHANNEL:chanId=>`${Endpoints3.STAGE_INSTANCES}/${chanId}`,STAGE_INSTANCES:"/stage-instances",STICKER:stickerId=>`/stickers/${stickerId}`,TEMPLATE:code=>`/guilds/templates/${code}`,USER:userId=>`${Endpoints3.USERS}/${userId}`,USER_APPLICATION_ROLE_CONNECTION:(userId,appId)=>`${Endpoints3.USER(userId)}/applications/${appId}/role-connection`,USER_CHANNELS:userId=>`${Endpoints3.USER(userId)}/channels`,USER_CONNECTIONS:userId=>`${Endpoints3.USER(userId)}/connections`,USER_GUILD:(userId,guildId)=>`${Endpoints3.USER_GUILDS(userId)}/${guildId}`,USER_GUILDS:userId=>`${Endpoints3.USER(userId)}/guilds`,USER_GUILD_VOICE_STATE:(guildId,userId)=>`${Endpoints3.GUILD(guildId)}/voice-states/${userId}`,USERS:"/users",VOICE_REGIONS:"/voice/regions",WEBHOOK:hookId=>`/webhooks/${hookId}`,WEBHOOK_TOKEN:(hookId,token)=>`${Endpoints3.WEBHOOK(hookId)}/${token}`,WEBHOOK_TOKEN_GITHUB:(hookId,token)=>`${Endpoints3.WEBHOOK_TOKEN(hookId,token)}/github`,WEBHOOK_TOKEN_MESSAGE:(hookId,token,msgId)=>`/webhooks/${hookId}/${token}/messages/${msgId}`,WEBHOOK_TOKEN_SLACK:(hookId,token)=>`${Endpoints3.WEBHOOK_TOKEN(hookId,token)}/slack`};module.exports=Endpoints3;}});function appendQuery(query){let count=0;for(let[key,value]of Object.entries(query))value==null?delete query[key]:count++;return count>0?`?${new URLSearchParams(query).toString()}`:""}var fs,path,crypto,util,Endpoints,version,Constants,SM2,routeRegex,reactionsRegex,reactionsUserRegex,webhooksRegex,isMessageEndpointRegex,isGuildChannelsRegex,messagesRegex,disallowedBodyMethods;exports.DiscordAPIError = void 0;exports.IntervalCounter = void 0;exports.LeakyCounter = void 0;exports.Bucket = void 0;exports.Ratelimiter = void 0;exports.RequestHandler = void 0;var init_RequestHandler=__esm({"src/RequestHandler.ts"(){fs=__require("fs"),path=__require("path"),crypto=__require("crypto"),util=__require("util"),Endpoints=require_Endpoints(),{version}=JSON.parse(fs.readFileSync(path.join(__dirname,"../package.json"),{encoding:"utf8"})),Constants=require_Constants(),SM2=require_StateMachine(),routeRegex=/\/([a-z-]+)\/(?:\d+)/g,reactionsRegex=/\/reactions\/[^/]+/g,reactionsUserRegex=/\/reactions\/:id\/[^/]+/g,webhooksRegex=/^\/webhooks\/(\d+)\/[A-Za-z0-9-_]{64,}/,isMessageEndpointRegex=/\/messages\/:id$/,isGuildChannelsRegex=/\/guilds\/\d+\/channels$/,messagesRegex=/\/messages\/\d+$/,disallowedBodyMethods=new Set(["head","get","delete"]),exports.DiscordAPIError=class extends Error{method;path;code;httpStatus;request;response;constructor(error,request,response){super(),this.name="DiscordAPIError",this.message=error.message??util.inspect(error),this.method=request.method,this.path=request.endpoint,this.code=error.code??4e3,this.httpStatus=response.status,Object.defineProperties(this,{request:{enumerable:false,value:request},response:{enumerable:false,value:response}});}},exports.IntervalCounter=class{constructor(limit,reset){this.limit=limit;this.reset=reset;this.remaining=limit;}remaining;firstRequestTime=0;resetAt=null;id=new Array(3).fill(0).map(()=>String.fromCodePoint(Math.floor(Math.random()*26+65))).join("");checkReset(){let now=Date.now();this.resetAt!==null?now>this.resetAt&&(this.firstRequestTime=0,this.remaining=this.limit,this.resetAt=null,globalThis.snowtransferDebugLogging&&console.log(`${new Date().toISOString()} [itrv] [${this.id}] informed reset: ${this.remaining}/${this.limit}`)):now>this.firstRequestTime+this.reset&&(this.firstRequestTime=0,this.remaining=this.limit,globalThis.snowtransferDebugLogging&&console.log(`${new Date().toISOString()} [itrv] [${this.id}] predicted reset: ${this.remaining}/${this.limit}`));}hasReset(){return this.checkReset(),this.remaining===this.limit}canTake(){return this.checkReset(),this.remaining>0}take(){this.checkReset(),this.remaining===this.limit&&(this.firstRequestTime=Date.now());let ok=this.remaining>0;return this.remaining--,ok}timeUntilReset(){let now=Date.now();return this.resetAt?Math.max(this.resetAt-now+1,0):Math.max(this.firstRequestTime+this.reset-Date.now()+1,0)}responseReceived(){this.remaining===this.limit-1&&this.firstRequestTime&&(this.firstRequestTime=Date.now());}applyCount(limit,remaining,resetAfter){limit!=null&&(this.limit=limit),this.remaining=remaining,this.resetAt=Date.now()+resetAfter;}},exports.LeakyCounter=class{constructor(limit){this.limit=limit;this.remaining=limit;}remaining;resetAt=null;id=new Array(3).fill(0).map(()=>String.fromCodePoint(Math.floor(Math.random()*26+65))).join("");checkReset(){let now=Date.now();this.resetAt&&now>this.resetAt&&(this.remaining=Math.min(this.limit,this.remaining+1),this.resetAt=null,globalThis.snowtransferDebugLogging&&console.log(`${new Date().toISOString()} [leak] [${this.id}] restore one: ${this.remaining}/${this.limit}`));}hasReset(){return this.checkReset(),this.remaining===this.limit}canTake(){return this.checkReset(),this.remaining>0}take(){return this.checkReset(),globalThis.snowtransferDebugLogging&&console.log(`${new Date().toISOString()} [leak] [${this.id}] took: ${this.remaining-1} left`),this.remaining-- >0}timeUntilReset(){let now=Date.now();return this.resetAt?Math.max(this.resetAt-now+1,0):0}responseReceived(){}applyCount(limit,remaining,resetAfter){limit!=null&&(this.limit=limit),this.remaining=remaining,this.resetAt=Date.now()+resetAfter,globalThis.snowtransferDebugLogging&&console.log(`${new Date().toISOString()} [leak] [${this.id}] applied: ${remaining}/${limit} - wait another ${resetAfter}`);}},exports.Bucket=class{sm=new SM2("ready");calls=[];counters=[];pauseRequested=false;constructor(counters){this.counters=counters,this.sm.defineState("ready",{onEnter:[],onLeave:[],transitions:new Map([["enqueue",{destination:"check"}],["pause",{destination:"paused"}]])}),this.sm.defineState("check",{onEnter:[()=>this.pauseRequested?this.sm.doTransition("pause"):this.counters.every(c=>c.canTake())?this.calls.length?this.sm.doTransition("run"):this.sm.doTransition("empty"):this.sm.doTransition("cooldown")],onLeave:[],transitions:new Map([["pause",{destination:"paused"}],["cooldown",{destination:"cooldown"}],["run",{destination:"running"}],["empty",{destination:"ready"}]])}),this.sm.defineState("running",{onEnter:[()=>{this.counters.forEach(c=>c.take()),this.calls.shift()().then(()=>{this.sm.doTransition("complete");});}],onLeave:[],transitions:new Map([["complete",{destination:"check"}]])}),this.sm.defineState("cooldown",{onEnter:[()=>{this.sm.doTransitionLater("reset",Math.max(...this.counters.map(c=>c.timeUntilReset())));}],onLeave:[],transitions:new Map([["reset",{destination:"check"}]])}),this.sm.defineState("paused",{onEnter:[],onLeave:[()=>{this.pauseRequested=false;}],transitions:new Map([["resume",{destination:"check"}]])}),this.sm.freeze();}enqueue(fn){return new Promise((resolve,reject)=>{this.calls.push(()=>fn(this).then(resolve).catch(reject)),this.sm.currentStateName==="ready"&&this.sm.doTransition("enqueue");})}pause(){this.pauseRequested=true,this.sm.currentStateName==="ready"&&this.sm.doTransition("pause");}resume(){this.pauseRequested=false,this.sm.currentStateName==="paused"&&this.sm.doTransition("resume");}dropQueue(){this.calls.length=0;}},exports.Ratelimiter=class{buckets=new Map;globalBucket=new exports.Bucket([new exports.IntervalCounter(Constants.GLOBAL_REQUESTS_PER_SECOND,1e3)]);get global(){return !this.globalBucket.counters[0].canTake()}constructor(){setInterval(()=>{for(let[key,value]of this.buckets.entries())value.counters[0].hasReset()&&this.buckets.delete(key);},3600*1e3).unref();}routify(url,method){let route=url.replaceAll(routeRegex,function(match,p){return p==="channels"||p==="guilds"||p==="webhooks"?match:`/${p}/:id`}).replaceAll(reactionsRegex,"/reactions/:id").replaceAll(reactionsUserRegex,"/reactions/:id/:userId").replace(webhooksRegex,"/webhooks/$1/:token");if(method==="DELETE"&&isMessageEndpointRegex.test(route)?route=method+route:method==="GET"&&isGuildChannelsRegex.test(route)&&(route="/guilds/:id/channels"),method==="PUT"||method==="DELETE"){let index=route.indexOf("/reactions");index!==-1&&(route="MODIFY"+route.slice(0,index+10));}return route}queue(fn,url,method){let routeKey=this.routify(url,method),bucket=this.buckets.get(routeKey);return bucket||(method==="DELETE"&&messagesRegex.test(url)?bucket=new exports.Bucket([new exports.LeakyCounter(1),new exports.IntervalCounter(5,5e3),this.globalBucket.counters[0]]):bucket=new exports.Bucket([new exports.LeakyCounter(1),this.globalBucket.counters[0]]),this.buckets.set(routeKey,bucket)),bucket.enqueue(fn)}setGlobal(ms){this.globalBucket.counters[0].applyCount(Constants.GLOBAL_REQUESTS_PER_SECOND,0,ms);}},exports.RequestHandler=class extends events.EventEmitter{constructor(ratelimiter,options){super();this.ratelimiter=ratelimiter;this.options={baseHost:options?.baseHost??Endpoints.BASE_HOST,baseURL:options?.baseURL??Endpoints.BASE_URL,bypassBuckets:options?.bypassBuckets??false,retryFailed:options?.retryFailed??false,retryLimit:options?.retryLimit??Constants.DEFAULT_RETRY_LIMIT,headers:{"User-Agent":`Discordbot (https://github.com/DasWolke/SnowTransfer, ${version}) Node.js/${process.version}`},fetch:options?.fetch??fetch},options?.token&&(this.options.headers.Authorization=options.token),this.apiURL=this.options.baseHost+Endpoints.BASE_URL,this.latency=500;}options;latency;apiURL;request(endpoint,params={},method,dataType,data,extraHeaders,retries=this.options.retryLimit,rawResponse=false){let stack=new Error().stack;return new Promise(async(resolve,reject)=>{let fn=async bkt=>{let reqId=crypto.randomBytes(20).toString("hex");try{let request={endpoint,method:method.toUpperCase(),dataType,data:data??{}};this.emit("request",reqId,request);let before=Date.now(),response;switch(dataType){case "json":response=await this._request(endpoint,params,method,data,extraHeaders);break;case "multipart":if(!data)throw new Error("No multipart data");response=await this._multiPartRequest(endpoint,params,method,data,extraHeaders);break;default:throw new Error("Forbidden dataType. Use json or multipart or ensure multipart has FormData")}if(this.latency=Date.now()-before,bkt?.counters.forEach(c=>c.responseReceived()),bkt&&this._applyRatelimitHeaders(bkt,response.headers),response.status&&!Constants.OK_STATUS_CODES.has(response.status)&&response.status!==429){if(this.options.retryFailed&&!Constants.DO_NOT_RETRY_STATUS_CODES.has(response.status)&&retries!==0)return this.request(endpoint,params,method,dataType,data,extraHeaders,retries--).then(resolve).catch(reject);throw new exports.DiscordAPIError({message:await response.text()},request,response)}if(response.status===429){let b=await response.json();if(b.global&&this.ratelimiter.setGlobal(b.retry_after*1e3),globalThis.snowtransferDebugLogging&&console.log(`${new Date().toISOString()} [rate] [${bkt?.counters[0].id}] !! 429 - guess there was 0 remaining, wait another ${b.retry_after*1e3} (route: ${this.ratelimiter.routify(endpoint,method.toUpperCase())})`),this.emit("rateLimit",{method:method.toUpperCase(),path:endpoint,route:this.ratelimiter.routify(endpoint,method.toUpperCase())}),this.options.retryFailed&&retries!==0)return this.request(endpoint,params,method,dataType,data,extraHeaders,0).then(resolve).catch(reject);throw new exports.DiscordAPIError({message:b.message,code:b.code??429},request,response)}if(this.emit("done",reqId,response,request),rawResponse)return resolve(response);if(response.body){let b;try{b=await response.json();}catch{return resolve(void 0)}return resolve(b)}else return resolve(void 0)}catch(error){return error?.stack&&(error.stack=error.stack+`
|
|
10
10
|
${stack.split(`
|
|
11
11
|
`).slice(1).join(`
|
|
12
12
|
`)}`),this.emit("requestError",reqId,error),reject(error)}};this.options.bypassBuckets?fn():this.ratelimiter.queue(fn,endpoint,method.toUpperCase());})}_applyRatelimitHeaders(bkt,headers){let remaining=headers.get("x-ratelimit-remaining"),limit=headers.get("x-ratelimit-limit"),resetAfter=headers.get("x-ratelimit-reset-after"),isGlobal=headers.get("x-ratelimit-global");remaining===null&&!bkt.counters[0].canTake()&&!isGlobal&&bkt.counters[0].applyCount(null,1,0),remaining&&limit&&resetAfter&&!isGlobal&&bkt.counters[0].applyCount(Number.parseInt(limit),Number.parseInt(remaining),Number.parseFloat(resetAfter)*1e3);}async _request(endpoint,params={},method,data,extraHeaders){let headers={...this.options.headers,...extraHeaders},body;return disallowedBodyMethods.has(method)||(typeof data=="object"?body=JSON.stringify(data):body=String(data),headers["Content-Type"]="application/json"),this.options.fetch(`${this.apiURL}${endpoint}${appendQuery(params)}`,{method:method.toUpperCase(),headers,body})}async _multiPartRequest(endpoint,params={},method,data,extraHeaders){let headers={...this.options.headers,...extraHeaders};return this.options.fetch(`${this.apiURL}${endpoint}${appendQuery(params)}`,{method:method.toUpperCase(),headers,body:data})}};}});var require_AuditLog=__commonJS({"src/methods/AuditLog.ts"(exports,module){var Endpoints3=require_Endpoints(),AuditLogMethods=class{constructor(requestHandler){this.requestHandler=requestHandler;}async getAuditLog(guildId,options){return this.requestHandler.request(Endpoints3.GUILD_AUDIT_LOGS(guildId),options,"get","json")}};module.exports=AuditLogMethods;}});var require_AutoModeration=__commonJS({"src/methods/AutoModeration.ts"(exports,module){var Endpoints3=require_Endpoints(),Constants3=require_Constants(),AutoModerationMethods=class{constructor(requestHandler){this.requestHandler=requestHandler;}async getAutoModerationRules(guildId){return this.requestHandler.request(Endpoints3.GUILD_AUTO_MOD_RULES(guildId),{},"get","json")}async getAutoModerationRule(guildId,ruleId){return this.requestHandler.request(Endpoints3.GUILD_AUTO_MOD_RULE(guildId,ruleId),{},"get","json")}async createAutoModerationRule(guildId,data,reason){return this.requestHandler.request(Endpoints3.GUILD_AUTO_MOD_RULES(guildId),{},"post","json",data,Constants3.reasonHeader(reason))}async editAutoModerationRule(guildId,ruleId,data,reason){return this.requestHandler.request(Endpoints3.GUILD_AUTO_MOD_RULE(guildId,ruleId),{},"patch","json",data,Constants3.reasonHeader(reason))}async deleteAutoModerationRule(guildId,ruleId,reason){return this.requestHandler.request(Endpoints3.GUILD_AUTO_MOD_RULE(guildId,ruleId),{},"delete","json",{},Constants3.reasonHeader(reason))}};module.exports=AutoModerationMethods;}});var require_Bot=__commonJS({"src/methods/Bot.ts"(exports,module){var Endpoints3=require_Endpoints(),BotMethods=class{constructor(requestHandler){this.requestHandler=requestHandler;}async getGateway(){return this.requestHandler.request(Endpoints3.GATEWAY,{},"get","json")}async getGatewayBot(){return this.requestHandler.request(Endpoints3.GATEWAY_BOT,{},"get","json")}async getApplicationInfo(){return this.requestHandler.request(Endpoints3.OAUTH2_APPLICATION("@me"),{},"get","json")}async updateApplicationInfo(data){return this.requestHandler.request(Endpoints3.OAUTH2_APPLICATION("@me"),{},"patch","json",data)}};module.exports=BotMethods;}});var require_Channel=__commonJS({"src/methods/Channel.ts"(exports,module){var Endpoints3=require_Endpoints(),Constants3=require_Constants(),ChannelMethods=class{constructor(requestHandler,options){this.requestHandler=requestHandler;this.options=options;}async getChannel(channelId){return this.requestHandler.request(Endpoints3.CHANNEL(channelId),{},"get","json")}async updateChannel(channelId,data,reason){return this.requestHandler.request(Endpoints3.CHANNEL(channelId),{},"patch","json",data,Constants3.reasonHeader(reason))}async deleteChannel(channelId,reason){return this.requestHandler.request(Endpoints3.CHANNEL(channelId),{},"delete","json",{},Constants3.reasonHeader(reason))}async getChannelMessages(channelId,options={limit:50}){if(options.around?(delete options.before,delete options.after):options.before?(delete options.around,delete options.after):options.after&&(delete options.before,delete options.around),options.limit!==void 0&&(options.limit<Constants3.GET_CHANNEL_MESSAGES_MIN_RESULTS||options.limit>Constants3.GET_CHANNEL_MESSAGES_MAX_RESULTS))throw new RangeError(`Amount of messages that may be requested has to be between ${Constants3.GET_CHANNEL_MESSAGES_MIN_RESULTS} and ${Constants3.GET_CHANNEL_MESSAGES_MAX_RESULTS}`);return this.requestHandler.request(Endpoints3.CHANNEL_MESSAGES(channelId),options,"get","json")}async getChannelMessage(channelId,messageId){return this.requestHandler.request(Endpoints3.CHANNEL_MESSAGE(channelId,messageId),{},"get","json")}async createMessage(channelId,data){if(typeof data!="string"&&!data.content&&(!data.message_reference||data.message_reference&&data.message_reference.type===v10.MessageReferenceType.Default)&&!data.embeds&&!data.sticker_ids&&!data.components&&!data.files&&!data.poll)throw new Error("Missing content, message_reference type 1, embeds, sticker_ids, components, files, or poll");if(typeof data=="string"&&(data={content:data}),(data.content||data.embeds)&&data.flags&&(data.flags&v10.MessageFlags.IsComponentsV2)===v10.MessageFlags.IsComponentsV2)throw new Error("The message flags was set to include IsComponentsV2, but content and/or embeds were also present. You can either have content/embeds or components v2, not both.");return data.allowed_mentions??=this.options.allowed_mentions,data.files?this.requestHandler.request(Endpoints3.CHANNEL_MESSAGES(channelId),{},"post","multipart",await Constants3.standardMultipartHandler(data)):this.requestHandler.request(Endpoints3.CHANNEL_MESSAGES(channelId),{},"post","json",data)}async createVoiceMessage(channelId,data,audioDurationSeconds,waveform=""){let{upload_url,upload_filename}=await this.requestHandler.request(Endpoints3.CHANNEL_ATTACHMENTS(channelId),{},"post","json",{files:[{id:"69420",filename:"voice-message.ogg",file_size:data.byteLength}]}).then(d=>d.attachments[0]);return await fetch(upload_url,{method:"PUT",body:data}),this.requestHandler.request(Endpoints3.CHANNEL_MESSAGES(channelId),{},"post","json",{attachments:[{id:"42069",uploaded_filename:upload_filename,filename:"voice-message.ogg",duration_secs:audioDurationSeconds,waveform}],flags:8192})}async crosspostMessage(channelId,messageId){return this.requestHandler.request(Endpoints3.CHANNEL_MESSAGE_CROSSPOST(channelId,messageId),{},"post","json")}async createReaction(channelId,messageId,emoji){return this.requestHandler.request(Endpoints3.CHANNEL_MESSAGE_REACTION_USER(channelId,messageId,emoji,"@me"),{},"put","json")}async deleteReactionSelf(channelId,messageId,emoji){return this.requestHandler.request(Endpoints3.CHANNEL_MESSAGE_REACTION_USER(channelId,messageId,emoji,"@me"),{},"delete","json")}async deleteReaction(channelId,messageId,emoji,userId){return this.requestHandler.request(userId?Endpoints3.CHANNEL_MESSAGE_REACTION_USER(channelId,messageId,emoji,userId):Endpoints3.CHANNEL_MESSAGE_REACTION(channelId,messageId,emoji),{},"delete","json")}async getReactions(channelId,messageId,emoji,options){return this.requestHandler.request(Endpoints3.CHANNEL_MESSAGE_REACTION(channelId,messageId,emoji),options,"get","json")}async deleteAllReactions(channelId,messageId){return this.requestHandler.request(Endpoints3.CHANNEL_MESSAGE_REACTIONS(channelId,messageId),{},"delete","json")}async editMessage(channelId,messageId,data){return typeof data=="string"&&(data={content:data}),(data.content||data.components)&&(data.allowed_mentions??=this.options.allowed_mentions),data.files?this.requestHandler.request(Endpoints3.CHANNEL_MESSAGE(channelId,messageId),{},"patch","multipart",await Constants3.standardMultipartHandler(data)):this.requestHandler.request(Endpoints3.CHANNEL_MESSAGE(channelId,messageId),{},"patch","json",data)}async deleteMessage(channelId,messageId,reason){return this.requestHandler.request(Endpoints3.CHANNEL_MESSAGE(channelId,messageId),{},"delete","json",{},Constants3.reasonHeader(reason))}async bulkDeleteMessages(channelId,messages,reason){if(messages.length<Constants3.BULK_DELETE_MESSAGES_MIN||messages.length>Constants3.BULK_DELETE_MESSAGES_MAX)throw new RangeError(`Amount of messages to be deleted has to be between ${Constants3.BULK_DELETE_MESSAGES_MIN} and ${Constants3.BULK_DELETE_MESSAGES_MAX}`);let oldestSnowflake=BigInt(Date.now()-142128e7)*BigInt(2)**BigInt(22),forbiddenMessage=messages.find(m=>BigInt(m)<oldestSnowflake);if(forbiddenMessage)throw new Error(`The message ${forbiddenMessage} is older than 2 weeks and may not be deleted using the bulk delete endpoint`);let data={messages};return this.requestHandler.request(Endpoints3.CHANNEL_BULK_DELETE(channelId),{},"post","json",data,Constants3.reasonHeader(reason))}async editChannelPermission(channelId,permissionId,data,reason){return this.requestHandler.request(Endpoints3.CHANNEL_PERMISSION(channelId,permissionId),{},"put","json",data,Constants3.reasonHeader(reason))}async getChannelInvites(channelId){return this.requestHandler.request(Endpoints3.CHANNEL_INVITES(channelId),{},"get","json")}async createChannelInvite(channelId,data={max_age:86400,max_uses:0,temporary:false,unique:false},reason){let targetUsers=data?.target_users;if(targetUsers?.length){delete data.target_users;let form=new FormData;return await Constants3.standardAddToFormHandler(form,"target_users_file",`Users
|