I just changed an incorrect key name that was introduced in Pull Request #3722. When destroying the websocket from the WebSocketShard#_send method it's using `close` as the key name instead of `closeCode`
* cleanup(StreamDispatcher): remove old 'end' event
* fix(StreamDispatcher): only listen to finish event once
* refactor(VoiceWebSocket): use `connection.client` in favour of `connection.voiceManager.client`
* fix(VoiceWebSocket): use `client.clearInterval` in favour of `clearInterval`
* refactor: destructure EventEmitter
* refactor: destructure EventEmitter from events
* refactor: use EventEmitter.off in favour of EventEmitter.removeListener
* style: order typings alphabetically
* oops
* fix indent
* style: alphabetically organize imports
* style: remove extra line
* Revert "style: remove extra line"
This reverts commit 96e182ed69.
* Revert "style: alphabetically organize imports"
This reverts commit 02aee9b06d.
* Revert "refactor: destructure EventEmitter from events"
This reverts commit 9953b4d267.
* Revert "refactor: destructure EventEmitter"
This reverts commit 930d7751ab.
* Revert "fix(StreamDispatcher): only listen to finish event once"
This reverts commit 485a6430a8.
* refactor: use .removeListener instead of .off
* src: Fix up WebSocketShard errors
* typings: Forgot to update
* src: Forgot debug variable
* src: Fix issue Bella found
If the WS was not connected when the HELLO timeout passes
(CONNECTING, etc), the shard would get stuck
due to never rejecting the WebSocketShard#connect
Promise with the DESTROYED event
* src: Cleanup event listeners on WebSocket connections
Should prevent #3641 from happening, as well as double connections on a shard
* typings: Forgot to add the method
* src: Step 1 of who knows how many
* src: Remove accidentally committed test file
* src: Remove useless added property in package.json
* docs: Trailing spaces, come back >.>
* src: Buhbye uws, we will miss you..not!
* src: Move 'auto' shard selection from totalShardCount to shards
* src: tweak
* src: Filter out floats from shard IDs
You want half of a shard or what?
* src: Misc cleanup and bugfix for GUILD_BAN_ADD
* src: Rewrite checkReady
* src: Misse this while merging master into my branch
* typings: Bring these up to date
* typings: Forgot allReady event
* src: Don't checkReady if the shard isn't waiting for guilds
* src: Fix a possible bug for when the ws dies and the session becomes -1
* src: Hopefully fix last edge case that could case a shard to infinitely boot loop
* src: Rename totalShardCount to shardCount
* src: Small bugfix
* src: Correct error message for shardCount being imvalid
Co-Authored-By: bdistin <bdistin@gmail.com>
* src: Small tweaks
* src: If this doesn't fix the issues I'm gonna throw a brick at my PC
* src: I swear, STOP BREAKING
* src: *groans at a certain snake*
* src: Use undefined instead of null on destroy in close event
Setting it to null sets the close code to null, which causes a WebSocket error to be thrown. The error is thrown from WebSocket, although there is no connection alive. Fun times!
* src: @SpaceEEC's requested changes
* src: Remove zucc from discord.js
Discord is removing support for it, sooo... Bye bye
* src: Missed this
* src: Apply @kyranet's suggestions
Co-Authored-By: Antonio Román <kyradiscord@gmail.com>
* src: @kyranet's suggestions
* src: Remove pako, update debug messages
- Pako is officially gone from both enviroments
Install zlib-sync on node.js if you want it
- Improve a few debug messages some more
- Discover that internal sharding works in browsers but please don't do that
* add a public alternative to the private raw event
while retaining raw for use in debugging privately
* only emit dispatch packets
* requested changes
TIL, that's neat
* fix padding
* requested changes
* Update WebSocketManager.js
* src: WIP Internal Sharding refactor
* src: Refactor unavailable guild check
Co-Authored-By: kyranet <kyradiscord@gmail.com>
* src: More WIP Code
F in the chat to the old manager
* src: It should work but Discord says no.
Seriously why is this not working!
* fix: Inflator causing issues
* src: Finishing touches and typings
* misc: Proper debug message
* fix: Making things hidden needs writable: true as well
* fix: Sharding allowing multiple of the same shard, negative shards or strings
* fix: Again... edge cases
I love you guys .w.
* misc: Touchups
* misc: Better error?
* docs: Typo
* typings: Requested changes
* src: Requested changes
* src: Fix issues, validate provided shard options and more
* src: Forgot to remove the listener
* lint: eslint complaining
* fix: Setting shardCount to auto crashing the process
* misc: Requested changes
* typings: Correct typings for shardCount client option
* typings: Add invalidSession event to the shard and correct typings
* src: Minor docs adjustements, and code consistency between setHelloTimeout and setHeartbeatTimeout
* src: Don't block reconnect while creating shards
Might fix silent disconnects *again*
* src: Prevent reconnect from running if the Manager isn't READY
That way, if a shard dies while we're still spawning, it won't cause issues
* fix: Retry to reconnect if there's a network error going on.
The manager *should* keep reconnecting unless the token is invalid
* src: Enhance onClose handler for shards in the manager
- If the close code is between 1000 and 2000 (inclusive), you cannot resume
I tested this locally
- If there's a session ID still present, immediately try to resume
Faster resumes :papaBless:
Otherwise, the invalid session event will trigger and it'll handle accordingly
I swear if I see a SINGULAR Silent DC I'm yeeting
* src: Fix error check
* src: Make sure message exists on the error
* src: Used the wrong property for the shardQueue
* src: Make the hello timeout be made by the client
god help
* docs: Correct docs for WSEvents
* misc: Remove old events from the Events constant
* src: Throw the HTTP error if we don't get a 401
* typings: Can't forget about them
* src: Implement some more fail safes just in case
Seriously, better safe than sorry! Gotta failproof it completely
* fix: Sharding bugs, silent disconnects and cleanup code
* typings
* fix: Destroy connecting with close code different from 1000
Per `If a client does not receive a heartbeat ack between its attempts at sending heartbeats, it should immediately terminate the connection with a non-1000 close code, reconnect, and attempt to resume.`
* misc: Wait x ms before reconnecting
Per https://discordapp.com/developers/docs/topics/gateway#resuming
* docs
* nit: docs
* misc: Prevent multiple calls to WebSocketManager#destroy
* fix: Implement destroying if you reset the token
* misc: Clear the WS packet queue on WebSocketShard#destroy
You can't send those packets anywhere anymore, so no point in keeping them
* fix: Handle session limits when reconnecting a full shard, cleanup
* misc: No need to create a new shard instance
* fix: closeSequence being null, thus emitting null on Client#resumed
* misc: Remove GUILD_SYNC Gateway handler and add missing dot to string
* misc: Close WS with code 4000 if we didn't get a heartbeat in time
As said in the Discord API server
* fix: Handle ready emitting in onPacket
Doesn't allow broken packets
* misc: Close the connection if Discord asks for a reconnect
Prevents double triggers
* testing: Prevent multiple reconnect attempts on a shard
Should fix some issues some people have had.
* fix: Prevent multiple reconnect calls on the shard, re-use conn to identify, remove reconnect function
Note: Closing the WS with 1000 makes the session invalid
* misc: Forgot to remove 2 unneeded setters
* docs: Wrong param docstring for WebSocketShard#destroy
* misc: Set status to reconnecting after destroying
* misc: Close connection with code 1000 on session invalidated
Allows us to cleanup the shard and do a full reconnect
Also remove identify wait delay, not used anywhere
* fix: Fix zlib crash on node
And with that, the PR is done!
* misc: Implement a reconnect queue
And that is all there was to be done in this PR.
Shards now queue up for a reconnect
* nit: Debug the queue after destroying
* docs: Make the invalidated event clearer
* lint: I'm good at my job
* docs
* docs: Make description for isReconnectingShards accurate
*can I stop finding issues, this PR is meant to be done*
* misc: Remove shard from bind params
* misc: Code re-ordering and cleanup
Resumes do not need to be queued up, as they do not count to the identify limit, and after some testing, they don't have the 5 second delay required, like in identify
* fix: Issues with token regeneration and shards not properly handling them
We close the ws connection with code 1000 if we get an invalid session payload,
that way we can queue the reconnects and handle any issues
* misc: Remove useless delays on session invalidated
They get handled by the rest of the code already
* lint
* misc: reset the sequence on Shard#destroy
This especially is a problem if you need to re-identify, as the sequence doesn't get set to the current one,
causing the sequence to be wrong
* fix: GitHub rebase and minor tweak
* Implement a 15 second timeout if shards don't connect till then
Should prevent shards that never reconnect
* revert: Make WebSocketShard#send and WebSocketManager#broadcast public
* typings: Set type to void instead of undefined
* docs: Requested Changes
This PR attempts to fix the reported resumed event count in the debug output (where it is always displayed only as 1 event replayed) and in the emitted `resumed` event, where it passed the current sequence instead of passing the actual replayed event count (which was an utopic high number for smaller bots on resume).
* fix: Sharding causing constant heartbeat / identify spam
* misc: Remove wait param in connect
* misc: Wait 2.5 seconds before sending identify again if session is resumable
* misc: Remove useless destroy call
* nit: Capitalization
* fix: Identify on HELLO not connectionOpen
* misc: Add different intervals for identify after invalid session
- 2500 if we couldn't resume in time
- 5000 if we didn't have a session ID (per the docs on identify, that a client can only connect every 5 seconds)
- Otherwise, just identify again
* misc: Only clear heartbeat if shard is fully dead
Reconnect clears it otherwise
* fix: Accessing .length on a Collection