#Discord.js is not working in —watch or —hot mode

1 messages · Page 1 of 1 (latest)

serene shell
#

A discord event like below does not fire :

client.on(event.name, event.listener);
stiff locust
#

it works fine for me
could you share more details?

serene shell
#

I just load all of the events and register them using this code.

#

it breaks at client.on() / once()

stiff locust
#

after you create the client, could you put a client.on("debug", console.log)
I've noticed that sometimes it'd freeze when trying to connect to the WebSocket, so maybe that's why it's not firing the events for you

if it works fine, you should see a bunch of messages about the WebSocket connection
otherwise it'd just be stuck on connecting

serene shell
hasty socket
stiff locust
#

then the client probably can't connect to the Discord gateway
I solved that issue by just restarting the bot a billion times until it worked

stiff locust
#

I guess you just need to wait until full support

serene shell
#

The weird part is that I don't get any error

#

it just doesn't work

stiff locust
#

then that makes everything 1000x weirder

pine rover
serene shell
#

The basic one

#

And I tested it with node.js and it works (I'm currently using node js for development but I'd like to use bun in the future)

serene shell
#

I forgot to mention that client.once works…

#

My guess is that it is related to some web socket stuff

sharp wyvern
#

Yeah that sounds plausible. Maybe something to do with TLS

pine rover
#

@serene shell what exact version of discord.js are you on
i cant reproduce the bug with client.on interactionCreate

pine rover
#

@hasty socket thanks for sharing your bot code. this is enough to segfault bun

import "lodash/omit.js";
import "lodash/findIndex.js";
import "discord.js";

Bun.gc(true);
serene shell
pine rover
#

can you share a full reproduction of what youre doing if it isnt a trillion file project

serene shell
#

i can share my events loader amd core config thought

pine rover
#

can you try removing any client.on()/.once()
adn removing .login()

and putting at the end Bun.gc(true)

#

to see if its this same segfault

serene shell
#
await CommandsManager.loadSlashCommands();
await EventsManager.registerEventListeners(client);
await client.login(Config.discord.CLIENT_TOKEN);
#

my code looks like this

pine rover
#

yeah like comment all that out and just run bun.gc(true)
does that crash or does it just exit

serene shell
#

so I just need to remove these lines?

#

ok

pine rover
#

basically, does it crash with garbage collector related reasons before the bot can even connect

serene shell
#

Yes, it crashes

pine rover
#

im gonna guess this is all the same issue

#

i'll ping you when that gets fixed

serene shell
#

I just upgrade to canary and it crashes even earlier

serene shell
serene shell
pine rover
#

something related to commonjs and garbage collection

serene shell
#

ok, thank you

pine rover
#

also there seems to be

#

long running type of issue

#

because one production experiment i ran crashed after a day

#

or rather this infinite reconnection loop

#
import "discord.js";
import "lodash/omit.js";
import "lodash/findIndex.js";

Bun.gc(true);

this works
@serene shell you might be able to get djs to work if you import it (just plain statement like that) before any other code in your app. no promises

serene shell
#

I'm having some inconsistent behavior of the app. Sometimes it loads i18next and segfaults and sometimes it just segfaults right away.

pine rover
#

interesting

serene shell
#

maybe the issue is from using namespaces?

pine rover
#

maybe. i kind of doubt it

#

more in any place commonjs modules are used

serene shell
#

Hey,
Any update?

sharp wyvern
#

I didn’t check if this still reproduces

#

I thought this was caused by the JSDOM thing

#

But scrolling up it appears unrelated

pine rover
#

@serene shell can you try your code again on bun 0.6.9

#

also @hasty socket

serene shell
#

I’ll keep you informed if it works or not. But it could also be related to some other dependency. We’ll see!

sharp wyvern
#

i think the specific crash is fixed but i'm still seeing another similar issue in a project with many many dependencies

pine rover
#

is the project public?

sharp wyvern
serene shell
#

It still segfaults

#

Is there any tool that I can use to know where the problem comes from?

#
Preparing to connect to the gateway...
[WS => Manager] Fetched Gateway Information
    URL: wss://gateway.discord.gg
    Recommended Shards: 1
[WS => Manager] Session Limit Information
    Total: 1000
    Remaining: 995
[WS => Shard 0] Connecting to wss://gateway.discord.gg?v=10&encoding=json
[WS => Shard 0] Waiting for event hello for 60000ms
[WS => Shard 0] Preparing first heartbeat of the connection with a jitter of 0.8022308351865927; waiting 33092ms
[WS => Shard 0] Waiting for identify throttle
[WS => Shard 0] Identifying
        shard id: 0
        shard count: 1
        intents: 1675
        compression: none
[WS => Shard 0] Waiting for event ready for 15000ms
[1]    3321 segmentation fault (core dumped)  bun run index.ts
#

After a little bit of investigation, I found out that calling the logger.info fun of winston causes a segfault.

#

The bot receives events now!

#

But when I uncomment my command loader, the bot crashes after [WS => Shard 0] Waiting for event ready for 15000ms

#

It's strange since all command related stuff shouldn't get executed at this time.

#

Problem found!

await readdir(commandsPath)

This line causes the crash. For context, the command path is : '/home/max/vscode_projects/suivix_6/src/discord/commands'

#

Hmmm looks like the problem is from the command itself

#

The segfaults comes from this import:

import { Err, Ok, Result } from 'oxide.ts';
#

In summary, here's what I found:

  1. Segaults while calling logger.info from winston
  2. Segaults importing oxide.ts (Probably related to Result)
#

Looks like it is no longer related to Discord.js

#

I hope it will help you!

sharp wyvern
#

sorry this is still happening

#

i have been working on it

#

and haven't been able to fix yet

serene shell
#

No problem! Take your time 😄

sharp wyvern
#

@serene shell can you give it another try once canary builds

#

i think i fixed it

#

module.require was broken

#

require was fine

#

just module.require

serene shell
#

@sharp wyvern

[0.02ms] ".env"
208 | __exportStar(require('discord-api-types/v10'), exports);
209 | __exportStar(require('@discordjs/builders'), exports);
210 | __exportStar(require('@discordjs/formatters'), exports);
211 | __exportStar(require('@discordjs/rest'), exports);
212 | __exportStar(require('@discordjs/util'), exports);
213 | __exportStar(require('@discordjs/ws'), exports);
                                                 ^
TypeError: undefined is not an object (evaluating 'this.module.require = this.require')
      at (eval) (/home/max/vscode_projects/suivix_6/node_modules/discord.js/src/index.js:213:46)
sharp wyvern
#

alright

#

I guess I made it worse

#

Oh yeah

#

Okay

hearty grotto
#

👀

serene shell
#

@sharp wyvern with your lastest cjs commit, there's no longer any segfault.

serene shell
#

Sadly discord.js events are now broken...

hearty grotto
#

well that's nice

hearty grotto
serene shell
#

Yep, they don't fire

hearty grotto
#

can you create a new directory

#

a brand new bot

#

and try client.on("ready", () => console.log(client.user.tag));

serene shell
#

client.once works but client.on('interactionCreate') is broken

hearty grotto
#

intents?

serene shell
#

no

#

it works with node

hearty grotto
#

hmmmmmm

pine rover
#

interesting

#

ill look at this when i get home

#

oh wait what once but on. ok thats odd

#

also let me confirm youre on linux or mac?

#

this shouldnt affect it but just in case

serene shell
#

I'm on a wsl2 arch linux distro.

hearty grotto
pine rover
#

I'll test on arch linux and if not ill test wsl. the specific distro shouldnt change things for the most part

serene shell
#

Sometimes, the program hangs at startup, I need to restart it.

pine rover
#

though i imagine itll repro on mac

serene shell
hearty grotto
pine rover
#

i have noticed long startup time
idk if it's just discord gateway taking long to accept it

serene shell
hearty grotto
#

like new folder

#

and stuff

#

with less code

pine rover
#

if you have a real linux machine you can test it on that would be cool but no worries if not

serene shell
#

Do you have a template or something 🤣 I'm lazy

pine rover
#

single file bot

#

i think the blog post has one of these

serene shell
pine rover
#

relatable

hearty grotto
#

i can test

#

i have arch

serene shell
pine rover
#

yeah

#

and if this doesnt repro the issue but your other project does can you either share the whole thing, or remove parts of it until it is as simple as possible

serene shell
#
import { BaseInteraction, Client, Events, GatewayIntentBits } from "discord.js";

const client = new Client({
    intents: [
        GatewayIntentBits.Guilds,
        GatewayIntentBits.GuildMessages,
        GatewayIntentBits.GuildMessageReactions,
        GatewayIntentBits.GuildMembers,
        GatewayIntentBits.GuildVoiceStates,
        GatewayIntentBits.GuildEmojisAndStickers,
    ],
});

client.on("ready", (client: Client<true>) => {
    console.log(`Logged in as ${client.user.tag}!`);
});

client.on(Events.InteractionCreate, (interaction: BaseInteraction) => {
    console.debug(interaction);
});

client.login(process.env.TOKEN);
#

It works, the event is successfully fired. BUT, looks like the console is being filled infinitely with the interaction data 🤣

hearty grotto
#

you sure?

serene shell
#

Yeah

hearty grotto
#

try 'interactionCreate'

serene shell
#

it is fired when a slash command was used

serene shell
hearty grotto
#

oh lol

#

can you provide log screenshots

serene shell
#

Something's broken for sure

#

That's A LOT of logs for one interaction

hearty grotto
#

uh did you do any modifications to discord.js?

#

try this: rm -rf node_modules bun.lockb ~/.bun/install/cache

serene shell
#

Nope, it's a brand new project, as you wanted.

hearty grotto
#

and then bun add

#

bun still caches libraries

#

even if you did modficiations only in one project

pine rover
#

interesting

serene shell
#

Same enormous log size

pine rover
#

ill look into this

serene shell
#

I didn't modify anything

serene shell
hearty grotto
pine rover
#

if you want sure

pine rover
hearty grotto
pine rover
#

i said that a few times but i havent written down any of what im gonna do lol

serene shell
pine rover
#

id ctrl f for your token if youre gonna post public

#

or dm

serene shell
#

Good idea

hearty grotto
#

when are you at your desk btw

serene shell
#

Well it's a dev bot token anyway

hearty grotto
#

"dev bot token anyway"

#

the reason why it-security sucks

#

you know people can steal your bot and then get you banned

#

cuz your account owns the bot

serene shell
#

I know, it happened to me last year ;) They were after by discord bot earl ydev badge

hearty grotto
#

just regenerate your token or censor it

serene shell
#

Yeah I know, that's what I'm doing right now

hearty grotto
#

good

#

awesome

serene shell
hearty grotto
#

okay

#

still

#

be careful

pine rover
#

@serene shell just demoed the code and i think it got worse

serene shell
#

It doesn’t look good indeed

pine rover
#

😅 yeah

serene shell
#

One day we'll get there

#

I’d love to help you but I don’t really know how all the stuff that works behind the scene operates… I guess I’ll take a look. It looks really interesting!

hearty grotto
#

That means you haven't turned the intent on

#

Which you listed in clients options

pine rover
#

oh
good catch

serene shell
#

Still, the error is weird.

hearty grotto
#

@pine rover i think I had the same error when discord.js was importing the wrong ws package

serene shell
#

Hi, just to keep you updated,

Today I updated to the latest canary version and it segfaults right after launch, nothing works.

sharp wyvern
#

Thanks for the update

#

I have some ideas will try tomorrow

serene shell
#

Alright, thanks & good luck!

serene shell
#

Hey @sharp wyvern, looks like most of the issues are gone now! Amazing work!
Sadly discord.js appears to be still broken:

[WS => Shard 0] Preparing first heartbeat of the connection with a jitter of 0.2632006030628695; waiting 10857ms
[WS => Shard 0] Connecting to wss://gateway.discord.gg?v=10&encoding=json
[WS => Shard 0] Waiting for event hello for 60000ms
[WS => Shard 0] The gateway closed with an unexpected code 1002, attempting to resume.
[WS => Shard 0] Destroying shard
        Reason: none
        Code: 1002
        Recover: Resume
[WS => Shard 0] Connection status during destroy
        Needs closing: false
        Ready state: 3
[WS => Shard 0] Preparing first heartbeat of the connection with a jitter of 0.7774889429330595; waiting 32071ms
[WS => Shard 0] Cancelled initial heartbeat due to #destroy being called
167 | }
168 | 
169 | class AbortError extends Error {
170 |   constructor() {
171 | 
172 |     super("The operation was aborted");
       ^
error: The operation was aborted
 code: "ABORT_ERR"

      at new AbortError (node:timers/promises:172:4)
      at node:timers/promises:46:38
      at /home/max/vscode_projects/suivix_6/node_modules/@discordjs/ws/dist/index.js:680:6
      at destroy (/home/max/vscode_projects/suivix_6/node_modules/@discordjs/ws/dist/index.js:661:16)
      at onClose (/home/max/vscode_projects/suivix_6/node_modules/@discordjs/ws/dist/index.js:1005:16)
      at emit (node:child_process:146:4)
      at ws:71:45
[WS => Shard 0] Connecting to wss://gateway.discord.gg?v=10&encoding=json
[WS => Shard 0] Waiting for event hello for 60000ms
InvalidStateError: The object is in an invalid state.
      at ws:91
pine rover
#

yeah we just landed some cjs fixes

#

there si something still with websockets

sharp wyvern
serene shell
serene shell
#

@sharp wyvern, on latest canary (039bbc68ad1f36ee7a734907ef657e90c7f504ac)

Preparing to connect to the gateway...
[WS => Manager] Fetched Gateway Information
    URL: wss://gateway.discord.gg
    Recommended Shards: 1
[WS => Manager] Session Limit Information
    Total: 1000
    Remaining: 1000
[WS => Shard 0] Connecting to wss://gateway.discord.gg?v=10&encoding=json
[WS => Shard 0] Waiting for event hello for 60000ms
[1]    2742 segmentation fault (core dumped)  bun run index.ts
sharp wyvern
#

damn!

#

i made a bunch of changes there

sharp wyvern
#

okay

#

i have a fix

sharp wyvern
serene shell
sharp wyvern
#

Should work now

serene shell
#

I just hit another error, but the majority of my bot is working now 😁

sharp wyvern
#

Nice

#

What’s the error?

serene shell
#
247 |       });
248 |       const fetchedMembers = new Collection();
249 |       let i = 0;
250 |       const handler = (members, _, chunk) => {
251 |         if (chunk.nonce !== nonce) return;
252 |         timeout.refresh();
            ^
TypeError: undefined is not an object (evaluating 'timeout.refresh')
      at handler (/home/max/vscode_projects/suivix_6/node_modules/discord.js/src/managers/GuildMemberManager.js:252:8)
      at emit2 (node:child_process:158:17)
      at /home/max/vscode_projects/suivix_6/node_modules/discord.js/src/client/websocket/handlers/GUILD_MEMBERS_CHUNK.js:33:2
      at handlePacket (/home/max/vscode_projects/suivix_6/node_modules/discord.js/src/client/websocket/WebSocketManager.js:354:6)
      at /home/max/vscode_projects/suivix_6/node_modules/discord.js/src/client/websocket/WebSocketManager.js:238:6
      at emit (/home/max/vscode_projects/suivix_6/node_modules/@vladfrangu/async_event_emitter/dist/index.js:282:21)
      at emit (/home/max/vscode_projects/suivix_6/node_modules/@vladfrangu/async_event_emitter/dist/index.js:282:21)
      at /home/max/vscode_projects/suivix_6/node_modules/@discordjs/ws/dist/index.js:938:8
sharp wyvern
#

Our timeout object

#

Must be missing this function

#

I don’t remember that existing though

serene shell
#

Do you want me to create an issue on github?

sharp wyvern
#

Yes

#

The good thing about this is

#

It’s not a WebSocket issue

serene shell
#

"This method refreshes the timer’s start time to the current time and reschedules the timer to its callback where the previously specified duration will be adjusted to the current time. This method helps in refreshing the timer without a new JS object."

serene shell
#

The websocket hell is gone (I hope 🤣 )

serene shell
sharp wyvern
#

Look for “CallbackJob”

#

You’ll see some generated code and then zig and the zig one is the real implementation

serene shell
#

There's already doRefresh

serene shell
#

@sharp wyvern thanks for the fix! Everything works fine now :)

#

Ooops, just found an error in WATCH MODE:

🚨 error: ┏ Interaction has already been acknowledged. +131ms
🚨 error: ┃ [ 1] { [Error] originalLine: 32, originalColumn: 32 }
🚨 error: ┃ [ 2] { requestBody: {...}
#

Looks like it is related to discord.js @pine rover

#

it only happens in watch mode though

sharp wyvern
#

watch mode doesn't terminate websocket connections

#

(it would have to terminate server-side)

serene shell
vast cradle
#

How about hot reloading with —hot?

serene shell
hearty grotto
#

Have you tried process.on('exit')

#

Shouldn't there be same event but for watchUpdate?

serene shell
hearty grotto
#

Well, for now you can use no demon or any alternative watcher. Dev team will probably review that

#

But don't close the channel yet

#

Let someone else from dev team see it

serene shell
#

Discord.js is not working in —watch or —hot mode

serene shell
#

Also, looks like bun doesn't really exit when I forcefully exit the process...

#

That wasn't happening before. (no watch mode)

#

I need to manually kill all of the processes...

sharp wyvern
#

Hm

#

watch mode keeps bun alive but process.exit

#

Should still kill it

serene shell
#

I tried adding a client.destroy on process.on(exit,…) but it doesn’t work

hearty grotto
#

but SIGINT and etc.

serene shell
#

Thank you

#

I’ll try that

serene shell
hearty grotto
#

Not just sigint

#

I don't remember all codes

serene shell
#

I also wanted to report that prisma 5 struggles to start on the latest canary/release:

✨ info:  ┏ Starting a postgresql pool with 17 connections. +3s
✨ info:  ┗ [1] { target: 'quaint::pooled' }
🐛 debug: ┏ prisma.query +20ms
🐛 debug: ┃ [1] { query: 'BEGIN',
🐛 debug: ┃ [2]   params: '[]',
🐛 debug: ┃ [3]   duration: 0,
🐛 debug: ┗ [4]   target: 'quaint::connector::metrics' }
error: script "start" exited with code 11 (SIGSEGV)
sharp wyvern
#

Hm

#

Can you file an issue?

serene shell
#

It happens often, around 1 time out of 4.

serene shell
serene shell
serene shell
#

Hey, any update on the prisma issue?

sharp wyvern
#

is that still happening?

#

i honestly am not sure how to reproduce it

#

we have tests that run prisma

#

can you paste a snippet that reproduces it?

serene shell
#

It crashes randomly at startup or during a query.

sharp wyvern
#

If you use --smol and Bun.gc(true) it’ll prob become more deterministic

serene shell
#

Alright I’ll try this.

#

Thanks!

ashen gyro
#

Looks like I've stumbled on this same exact issue. Yeah Prisma queries running just can sometimes randomly initiate a segfault. I have like hundreds of queries running in parallel at the same time

sharp wyvern
#

I think we need a test for exactly that

#

@glad ether can you take a look at updating the prisma integration tests to run like 500 queries and then await Promise.all() them?

#

Earlier today I fixed an async fs bug doing a similar thing

ashen gyro
#

just to add on information it does not seem to happen when i test it locally using my machine. Im using WSL Ubuntu-22.04 with the latest Bun v0.7.3

But when I deploy this to the cloud on Railway.app using Docker (it builds successfully) and let the hundreds of queries run in parallel, it has like a 98% chance of segfault. In rare occassions it does not, but most of the time it does

sharp wyvern
#

Oh I wonder what Linux kernel version

#

They’re on

serene shell
#

Hey, I wanted to report that bun's debugger web window crashes on my computer right when I open it.

#

Firefox displays the following error:

TypeError:​ this._listItemNode.scrollIntoViewIfNeeded is not a function (at manifest-ed2a1ca9ee54e08a.js:​51:​699020)​
    onreveal @ manifest-ed2a1ca9ee54e08a.js:​51:​699020
    reveal @ manifest-ed2a1ca9ee54e08a.js:​51:​646915
    revealAndSelect @ manifest-ed2a1ca9ee54e08a.js:​51:​647578
    _revealAndSelectRepresentedObject @ manifest-ed2a1ca9ee54e08a.js:​51:​759660
    _contentBrowserCurrentContentViewDidChange @ manifest-ed2a1ca9ee54e08a.js:​51:​759384
    $ @ manifest-ed2a1ca9ee54e08a.js:​37:​10910
    dispatchEventToListeners @ manifest-ed2a1ca9ee54e08a.js:​37:​10950
    _currentContentViewDidChange @ manifest-ed2a1ca9ee54e08a.js:​51:​443815
    $ @ manifest-ed2a1ca9ee54e08a.js:​37:​10910
    dispatchEventToListeners @ manifest-ed2a1ca9ee54e08a.js:​37:​10950
    showBackForwardEntryForIndex @ manifest-ed2a1ca9ee54e08a.js:​51:​1231708
    showContentView @ manifest-ed2a1ca9ee54e08a.js:​51:​1231203
    showContentView @ manifest-ed2a1ca9ee54e08a.js:​51:​436455
    _showTimelineViewForType @ manifest-ed2a1ca9ee54e08a.js:​51:​888271
    restoreFromCookie @ manifest-ed2a1ca9ee54e08a.js:​51:​882117
    _recordingSelected @ manifest-ed2a1ca9ee54e08a.js:​51:​887092
    _recordingLoaded @ manifest-ed2a1ca9ee54e08a.js:​51:​887138
    $ @ manifest-ed2a1ca9ee54e08a.js:​37:​10910
    dispatchEventToListeners @ manifest-ed2a1ca9ee54e08a.js:​37:​10950
    _loadNewRecording @ manifest-ed2a1ca9ee54e08a.js:​85:​32059
    reset @ manifest-ed2a1ca9ee54e08a.js:​85:​12828
    enable @ manifest-ed2a1ca9ee54e08a.js:​85:​14016
    Z @ manifest-ed2a1ca9ee54e08a.js:​51:​873255
    WI._createTabContentViewForType @ manifest-ed2a1ca9ee54e08a.js:​85:​91797
    WI.contentLoaded @ manifest-ed2a1ca9ee54e08a.js:​85:​88121
    ?​ @ 
#

It instantly exits on Brave, doesn't work on Edge and displays an error on Firefox.

sharp wyvern
#

"instantly exits" means it didn't wait for the inspector to start

#

can you try --inspect-brk

#

thefirefox error is a missing polyfill

serene shell
#

Still instantly exits.

sharp wyvern
#

If you refresh

#

it should no longer instantly exit

#

and instead go black and white

#

I'm not sure why it's instantly disconnecting

#

but if bun was segfaulting it would do that

serene shell
#

Alright, I don't know why but it's now working on Firefox.

#

And on brave.

#

Problem fixed...

#

Ok maybe not. Now I can see the interface but no data.

#

On firefox it works. (not all the time)

sharp wyvern
#

This happens if the process exits

#

Is the process closed?

sharp wyvern
#

for the missing function

#

in firefox

serene shell
#

It's working on firefox rn, but not in brave.

sharp wyvern
#

If Brave blocks localhost https that would make sense

#

Safari blocks that

serene shell
#

It works now. I guess the polyfill fixed it.

old zenith
sharp wyvern
#

Sorry it’s

mixed content due to the website debug.bun.sh being https but the websocket being http/ws and not wss

serene shell
#

Hey, I'm getting ERROR [unhandledRejection] Cannot redefine property: __internal__deprecationWarning while trying to run an existing nuxt 3 project.

#

No idea how to resolve that...

sharp wyvern
#

cc @pine rover incase anything comes to mind

pine rover
#

interesting

serene shell
#
 ERROR  [unhandledRejection] Cannot redefine property: __internal__deprecationWarning                             2:48:51 PM

  at Function.defineProperty (<anonymous>)
  at Object.<anonymous> (node_modules/@babel/types/lib/index.js:66:8)
  at Module._compile (node:internal/modules/cjs/loader:1241:14)
  at Module._extensions..js (node:internal/modules/cjs/loader:1295:10)
  at Module.load (node:internal/modules/cjs/loader:1091:32)
  at Module._load (node:internal/modules/cjs/loader:938:12)
  at Module.require (node:internal/modules/cjs/loader:1115:19)
  at require (node:internal/modules/helpers:130:18)
  at Object.<anonymous> (node_modules/@babel/types/lib/builders/validateNode.js:8:9)
  at Module._compile (node:internal/modules/cjs/loader:1241:14)
#

It works on node v20.4.0 but not in node v20.6.0 and with bun

sharp wyvern
#

thats in node

#

(node:internal)

serene shell
#

wait now it works with bun

#

I guess I missed something 🤣

ashen gyro
sharp wyvern
#

are you still runing into it?

ashen gyro
#

im trying to test it now with the latest build so ill get back later

#

hmm turns out it is with v0.8.1

sharp wyvern
#

hm

#

what if bun upgrade --canary

ashen gyro
#

hey it worked