diff --git a/apps/bot/package.json b/apps/bot/package.json index f71b3030..c7c0465a 100644 --- a/apps/bot/package.json +++ b/apps/bot/package.json @@ -28,13 +28,12 @@ "@craig/metrics": "workspace:*", "@discordjs/opus": "^0.10.0", "@henrygd/semaphore": "catalog:", - "@projectdysnomia/dysnomia": "github:projectdysnomia/dysnomia#00d8982d81d365c2cdb2ef5dac59af07977a65d7", + "@projectdysnomia/dysnomia": "github:Snazzah/dysnomia#da3811d70a678bf58480bf99b14fffeb55161427", "@sentry/node": "^11.6.0", - "@snazzah/davey": "^0.1.12", + "@snazzah/davey": "^0.2.0-beta.1", "@snazzah/emoji-sync": "^0.1.2", "common-tags": "catalog:", "cron": "catalog:", - "erlpack": "^0.1.4", "fastify": "catalog:", "fastq": "^1.19.1", "i18next": "^25.7.2", diff --git a/apps/bot/src/modules/metrics.ts b/apps/bot/src/modules/metrics.ts index c8f37e86..f6b62007 100644 --- a/apps/bot/src/modules/metrics.ts +++ b/apps/bot/src/modules/metrics.ts @@ -8,7 +8,8 @@ export default class MetricsModule extends BotModule { commandsRan: 0, gatewayEventsReceived: 0, commands: {} as Record, - voiceServersConnected: {} as Record + voiceServersConnected: {} as Record, + recordingErrors: {} as Record }; private readonly handleRawWS = () => { this.stats.gatewayEventsReceived++; @@ -37,12 +38,23 @@ export default class MetricsModule extends BotModule { else this.stats.voiceServersConnected[region]++; } + onRecordingError(type: string, code = 'none') { + const key = `${type}:${code}`; + if (!this.stats.recordingErrors[key]) this.stats.recordingErrors[key] = 1; + else this.stats.recordingErrors[key]++; + } + collect(name: keyof typeof this.stats) { if (name === 'commands') { const commands = this.stats.commands; this.stats.commands = {}; return commands; } + if (name === 'recordingErrors') { + const stats = this.stats.recordingErrors; + this.stats.recordingErrors = {}; + return stats; + } if (name === 'voiceServersConnected') { const stats = this.stats.voiceServersConnected; this.stats.voiceServersConnected = {}; diff --git a/apps/bot/src/modules/recorder/recording.ts b/apps/bot/src/modules/recorder/recording.ts index 0e775146..b918e5be 100644 --- a/apps/bot/src/modules/recorder/recording.ts +++ b/apps/bot/src/modules/recorder/recording.ts @@ -28,6 +28,12 @@ const MAX_ACTIVITY_LOGS = 10; const MAX_LATENCY_WARNING = 500; const opusSilenceFrame = Buffer.from([0xf8, 0xff, 0xfe]); const ENCRYPTION_RECOVERY_STOP_THRESHOLD = 5; + +// Only pass through Node-style error codes (e.g. ENOTFOUND) to keep metric label cardinality bounded +function getErrorCode(err: unknown) { + const code = (err as any)?.code; + return typeof code === 'string' && /^E[A-Z0-9_]{1,40}$/.test(code) ? code : 'unknown'; +} const BAD_MESSAGE_CODES = [ 404, 10003, // Unknown channel @@ -202,6 +208,7 @@ export default class Recording { await this.connect(); } catch (e) { this.recorder.traceVoiceTimeout(this.connection); + this.recorder.metrics.onRecordingError('connect_failed', getErrorCode(e)); this.recorder.logger.error( `Failed to connect to ${this.channel.name} (${this.channel.id}) in ${this.channel.guild.name} (${this.channel.guild.id}) by ${this.user.username}#${this.user.discriminator} (${this.user.id})`, e @@ -503,6 +510,7 @@ export default class Recording { } if (this.state !== RecordingState.RECORDING) { this.pushToActivity(this.t('recording.panel.reconnect_fail'), false); + this.recorder.metrics.onRecordingError('reconnect_failed'); this.sendWarning(this.t('recording.failed_to_reconnect'), false); this.recorder.logger.warn(`Recording ${this.id} could not properly reconnect`); try { @@ -590,6 +598,7 @@ export default class Recording { if (!this.active || this.encryptionStopIssued || !message.startsWith('Invalidating transition ')) return; this.encryptionRecoveryAttempts++; + this.recorder.metrics.onRecordingError('decryption_tolerance_exceeded'); const endpoint = this.connection?.endpoint; const context = { @@ -608,6 +617,7 @@ export default class Recording { if (this.encryptionRecoveryAttempts < ENCRYPTION_RECOVERY_STOP_THRESHOLD) return; this.encryptionStopIssued = true; + this.recorder.metrics.onRecordingError('e2ee_stopped'); const stopWarning = this.t('recording.e2ee_error'); this.stateDescription = `⚠️ ${stopWarning}`; await this.sendWarning(stopWarning, false); @@ -617,6 +627,7 @@ export default class Recording { async onConnectionError(err: any) { this.writeToLog(`Error: ${err}`, 'connection'); this.recorder.logger.error(`Error in connection for recording ${this.id}`, err); + this.recorder.metrics.onRecordingError('connection', getErrorCode(err)); // The voice server's hostname couldn't be resolved if (err?.code === 'ENOTFOUND' && this.active && this.state === RecordingState.RECORDING) { @@ -642,6 +653,7 @@ export default class Recording { rtcWorkerVersion: this.rtcWorkerVersion }); if (err) { + this.recorder.metrics.onRecordingError('disconnect', String(this.recorder.parseVoiceDisconnectCode(err) ?? 'unknown')); this.state = RecordingState.RECONNECTING; if (err.message.startsWith('4006')) this.pushToActivity(this.t('recording.panel.discord_requested_reconnect')); else this.pushToActivity(this.t('recording.panel.disconnected_from_error')); @@ -697,6 +709,7 @@ export default class Recording { this.encodeChunk(user, user.track, packetNo, chunk!); packetNo += 2; } catch (ex) { + this.recorder.metrics.onRecordingError('encode_failed'); this.recorder.logger.error(`Failed to encode packet ${packetNo} for user ${user.id}`, ex); } } diff --git a/apps/bot/src/sharding/modules/metrics.ts b/apps/bot/src/sharding/modules/metrics.ts index 0a0b88b6..d422470c 100644 --- a/apps/bot/src/sharding/modules/metrics.ts +++ b/apps/bot/src/sharding/modules/metrics.ts @@ -218,6 +218,29 @@ export default class MetricsModule extends ShardManagerModule { } }); + new Counter({ + name: 'craig_bot_recording_errors_total', + help: 'Counter for recording errors by type and code', + labelNames: ['type', 'code'], + async collect() { + try { + await timeout( + Promise.all( + Array.from(manager.shards.values()).map(async (shard) => { + if (shard.status === 'ready' || shard.status === 'resuming') { + const result = (await shard.eval('this.metrics.collect("recordingErrors")')) as Record; + for (const key in result) { + const [type, code] = key.split(':'); + this.inc({ type, code }, result[key]); + } + } + }) + ) + ); + } catch {} + } + }); + new Gauge({ name: 'craig_bot_shard_latency_milliseconds', help: 'Gauge for millisecond latency per shard', diff --git a/apps/botctl/package.json b/apps/botctl/package.json index ee6a28fc..b1ecfc3b 100644 --- a/apps/botctl/package.json +++ b/apps/botctl/package.json @@ -23,7 +23,7 @@ }, "dependencies": { "@craig/logger": "workspace:*", - "@projectdysnomia/dysnomia": "github:projectdysnomia/dysnomia#00d8982d81d365c2cdb2ef5dac59af07977a65d7", + "@projectdysnomia/dysnomia": "github:Snazzah/dysnomia#da3811d70a678bf58480bf99b14fffeb55161427", "common-tags": "catalog:", "slash-create": "^6.8.1" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 067aadec..616b0441 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -236,14 +236,14 @@ importers: specifier: 'catalog:' version: 0.1.0 '@projectdysnomia/dysnomia': - specifier: github:projectdysnomia/dysnomia#00d8982d81d365c2cdb2ef5dac59af07977a65d7 - version: https://codeload.github.com/projectdysnomia/dysnomia/tar.gz/00d8982d81d365c2cdb2ef5dac59af07977a65d7(@discordjs/opus@0.10.0(supports-color@8.1.1))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(erlpack@0.1.4)(eventemitter3@5.0.1)(sodium-native@5.1.0(bare-events@2.8.3)) + specifier: github:Snazzah/dysnomia#da3811d70a678bf58480bf99b14fffeb55161427 + version: https://codeload.github.com/Snazzah/dysnomia/tar.gz/da3811d70a678bf58480bf99b14fffeb55161427(@discordjs/opus@0.10.0(supports-color@8.1.1))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(erlpack@0.1.4)(eventemitter3@5.0.1)(sodium-native@5.1.0(bare-events@2.8.3)) '@sentry/node': specifier: ^11.6.0 version: 11.6.0(rollup@4.63.1) '@snazzah/davey': - specifier: ^0.1.12 - version: 0.1.12(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + specifier: ^0.2.0-beta.1 + version: 0.2.0-beta.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) '@snazzah/emoji-sync': specifier: ^0.1.2 version: 0.1.2 @@ -253,9 +253,6 @@ importers: cron: specifier: 'catalog:' version: 4.4.0 - erlpack: - specifier: ^0.1.4 - version: 0.1.4 fastify: specifier: 'catalog:' version: 5.12.1 @@ -327,8 +324,8 @@ importers: specifier: workspace:* version: link:../../packages/logger '@projectdysnomia/dysnomia': - specifier: github:projectdysnomia/dysnomia#00d8982d81d365c2cdb2ef5dac59af07977a65d7 - version: https://codeload.github.com/projectdysnomia/dysnomia/tar.gz/00d8982d81d365c2cdb2ef5dac59af07977a65d7(@discordjs/opus@0.10.0(supports-color@8.1.1))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(erlpack@0.1.4)(eventemitter3@5.0.1)(sodium-native@5.1.0(bare-events@2.8.3)) + specifier: github:Snazzah/dysnomia#da3811d70a678bf58480bf99b14fffeb55161427 + version: https://codeload.github.com/Snazzah/dysnomia/tar.gz/da3811d70a678bf58480bf99b14fffeb55161427(@discordjs/opus@0.10.0(supports-color@8.1.1))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(erlpack@0.1.4)(eventemitter3@5.0.1)(sodium-native@5.1.0(bare-events@2.8.3)) common-tags: specifier: 'catalog:' version: 1.8.2 @@ -1832,11 +1829,12 @@ packages: os: [linux] libc: [glibc] - '@napi-rs/wasm-runtime@1.1.5': - resolution: {integrity: sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==} + '@napi-rs/wasm-runtime@1.2.6': + resolution: {integrity: sha512-mRyDmEw9/fCDXCGfL1sbgIw/GUK0PVxRW4YwgPN61F3LQ+fSyoBFarJVzgGyhF6kRzEQZ0FejDqm4WLXSeqQmw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} peerDependencies: - '@emnapi/core': ^1.7.1 - '@emnapi/runtime': ^1.7.1 + '@emnapi/core': ^1.7.1 || 2.0.0-beta.2 + '@emnapi/runtime': ^1.7.1 || 2.0.0-beta.2 '@opentelemetry/api@1.9.0': resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} @@ -2178,8 +2176,8 @@ packages: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@projectdysnomia/dysnomia@https://codeload.github.com/projectdysnomia/dysnomia/tar.gz/00d8982d81d365c2cdb2ef5dac59af07977a65d7': - resolution: {gitHosted: true, integrity: sha512-16ShjoS6DJyiwfsD/XAl4SGoj6D6cTvLl56vrq69KXdvsT9m9qSbTnuVqjL9jCpJ912lM6teFkw3Hy31EN06Bg==, tarball: https://codeload.github.com/projectdysnomia/dysnomia/tar.gz/00d8982d81d365c2cdb2ef5dac59af07977a65d7} + '@projectdysnomia/dysnomia@https://codeload.github.com/Snazzah/dysnomia/tar.gz/da3811d70a678bf58480bf99b14fffeb55161427': + resolution: {gitHosted: true, integrity: sha512-6O+nzS9qNa/SwpEREZOoiJYxkRjBKoWZajzY7zDIo9MyKrbeo/6m2wnvSJ3j/994YPwvzCbwsDYxrwMx9uYuxw==, tarball: https://codeload.github.com/Snazzah/dysnomia/tar.gz/da3811d70a678bf58480bf99b14fffeb55161427} version: 0.3.0-dev engines: {node: '>=18.0.0'} peerDependencies: @@ -2898,95 +2896,95 @@ packages: resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} - '@snazzah/davey-android-arm-eabi@0.1.12': - resolution: {integrity: sha512-6VC/an+Sx5dI5skb+90rYcIB1jhm48Rl0nDaw0UNT4bz1rMjpVfmmZqeocYXMq96IdbBMlE6OTKGcBm2C3gkQg==} + '@snazzah/davey-android-arm-eabi@0.2.0-beta.1': + resolution: {integrity: sha512-M0ONRIEoQ5vP9/bJ2C844BQ8Ho2qKQOK7KMeClVlSdytR8UjQalNBR/+ivF4fVnIOZSsshbczhi6YgiGz534yw==} engines: {node: '>= 10'} cpu: [arm] os: [android] - '@snazzah/davey-android-arm64@0.1.12': - resolution: {integrity: sha512-0Bwd03/JsTFhlPhF4q/LW0RxSzntFpQdhz+TBdFljYSg8IEyA38saPJeTNjpIgDfhAumPzvhCdfS6O5qT8yXDw==} + '@snazzah/davey-android-arm64@0.2.0-beta.1': + resolution: {integrity: sha512-lK91rWiENwOpNruHOEk9+PriaNjVZ+Xa7eoX6TW5C/S7mondB39zY6dQhYeT1O3qKozlim/VyPInlsdJA74MOQ==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@snazzah/davey-darwin-arm64@0.1.12': - resolution: {integrity: sha512-lKMV6ITi9BQLt0fx/pAT7M8xcojVK7bryVJGdaW3bq8gABFslS3ti/KzrWabQvhpEV71FZe5mV0UcKHFVaTsZw==} + '@snazzah/davey-darwin-arm64@0.2.0-beta.1': + resolution: {integrity: sha512-tVKs4O0URD9ATWacUrnBb4lD0hQ3kxOgeEeFgU1Hk3DI2H67JmLK519aChqEFclBrbn10jmfwCaO6WLTWylW4w==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@snazzah/davey-darwin-x64@0.1.12': - resolution: {integrity: sha512-vXXc/eW/e3TQeb7VsdtrPqs3/22j0aSqiP1ZXmZtDjQRBwgSxwItWYa6sh5MELP2EHB2igNlGzB6Hc0XlbGi4g==} + '@snazzah/davey-darwin-x64@0.2.0-beta.1': + resolution: {integrity: sha512-btLS6/l5Rzo/07uJVJMrwt34FBiENQr+HoPAPWkoutvkGBECYV2yOp8c/jgL6zMt+8Q42U6Vnep+QV4N3SVSJw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@snazzah/davey-freebsd-x64@0.1.12': - resolution: {integrity: sha512-G1gas5HrC4Xp3mRY0+OeAqXS6fG2tRgBEc8gQh69Hw4YK9RV9mzQKcmoKMkBM72U1+2C+2u57dolnKKzwozByQ==} + '@snazzah/davey-freebsd-x64@0.2.0-beta.1': + resolution: {integrity: sha512-vszROyT6pGBnaHdto9Aaf+h3hF4j6Lm4KtaCmtQIgDV3dvO6LHjntRhs2oiio3srFILjxiXVWh/8sY57aNcpcA==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - '@snazzah/davey-linux-arm-gnueabihf@0.1.12': - resolution: {integrity: sha512-97Fujh82r2Ll7dPZeNuoZ3yKfsqycf3c93OWXOo/ThNL/18Onl2Ht4SIvpX6VHhfeS9bDpHJ1lHCaz1b/i5ocw==} + '@snazzah/davey-linux-arm-gnueabihf@0.2.0-beta.1': + resolution: {integrity: sha512-nU2u5vGoOFJYlSdWZsQgwnZSJNtQr0LMclNVffy7+PI65aD8Ed930xe9ka+5TEczI6+9vMJ63mo4BTc7QxPU/Q==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@snazzah/davey-linux-arm64-gnu@0.1.12': - resolution: {integrity: sha512-FWyAOv52cHKDM4BOsmImKKogHFvqNFoXmZcicNJbX3XpVl8Mas88ZoXQ+IA5V+qc9pNtAl1MbWwEZ9JrqAQtbg==} + '@snazzah/davey-linux-arm64-gnu@0.2.0-beta.1': + resolution: {integrity: sha512-RTkeJMGosGkH5UgFBaBX0spyNcRQtWpWYWEFScAEPlFt5sfWTEoenKwYr+Gr5sbTzTr0xekaGbLZnLaDlyAO/g==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [glibc] - '@snazzah/davey-linux-arm64-musl@0.1.12': - resolution: {integrity: sha512-ptRbLSQxtV6EjXppS5z7qaPDI0NRKhrkJYsTlAjEghmOvlAObozSCYYnMO6nbkt6Ab3+lWqyahClzcRNcD2ouw==} + '@snazzah/davey-linux-arm64-musl@0.2.0-beta.1': + resolution: {integrity: sha512-RF/YAHCrXIzY4df0bhSHEAGQf7z10FhVIeUzApj23lC3cocVJH4WhoIhwdpNGXqhvHfgtnwEl+W7YKrIfDJVtw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [musl] - '@snazzah/davey-linux-x64-gnu@0.1.12': - resolution: {integrity: sha512-w86fZvhJn0ErOoAQHt2UbQ95V/cgwvfvQ4GlTPQLCzt58nn+rLlXLgPn90qYlSQrZxFW38rKXwqVOMbm9p+pwQ==} + '@snazzah/davey-linux-x64-gnu@0.2.0-beta.1': + resolution: {integrity: sha512-NNxTeJdNngROheReSlcw9UCxibVXOX1G+s0VXUzpdm/0GgN9EPNHJFQARle0vdDuOIzfuz0vttp1N0Ag2EG+2A==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [glibc] - '@snazzah/davey-linux-x64-musl@0.1.12': - resolution: {integrity: sha512-LLNnO+hfG41ymeI+O1YHo5/0h3aKaetUNLdkBwpdJsjoyKMXZaeCnB+aHNkkupJCMPmWS0g6iPMCHUOqZSBcTg==} + '@snazzah/davey-linux-x64-musl@0.2.0-beta.1': + resolution: {integrity: sha512-CztUeSCtwrDkn472sTGKP8kcqylVbRF/whP43XBwxIbQWQRKW2P5zCjj6oPwQGLIt92zeCysRsJ/LTudXIOUPQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [musl] - '@snazzah/davey-wasm32-wasi@0.1.12': - resolution: {integrity: sha512-MPKFuqYVkDFXheR7qmtEY4FWxQ/ADfgsCojQWHi13sibUqCTR9q2F1LqNn2i9IVh3sh1sxeg87fdFMCH63pl7g==} + '@snazzah/davey-wasm32-wasi@0.2.0-beta.1': + resolution: {integrity: sha512-Ca79Fl1o5Oj6HzSyJarkyZmDX93aa7HHVJhNcOmh8sKr0SKBMt53G0BuJNROGJb/h9yeRF6Py1D5i3o59CPQ1A==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@snazzah/davey-win32-arm64-msvc@0.1.12': - resolution: {integrity: sha512-Uf4OYHyfbXpzyaOqIV8/h6kv166Qni5+Bxmc1E/ov4uhhKO8qXbOky8zbVOzu0U4cv5ll3s4IQ8jDAJkx/K75Q==} + '@snazzah/davey-win32-arm64-msvc@0.2.0-beta.1': + resolution: {integrity: sha512-7JXUWOm8QZFBGwxR/31mGWFUX4oT2DBaj1pyqQWY96ZgFa1Y8fjI2ImD7J2IIv984MXfRyNTHPy5ODf78se3Tg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@snazzah/davey-win32-ia32-msvc@0.1.12': - resolution: {integrity: sha512-nRVbKTsb2ldcPI8D4BDA7P/UeiMEMvR+wYuUMp7H1pRD/3dF2hKo+MzUU+Pn78EhuYA3CWHItiAcS/GsPld67A==} + '@snazzah/davey-win32-ia32-msvc@0.2.0-beta.1': + resolution: {integrity: sha512-NifS/JgHwRoHvLpnB4eYgUk+Z3lfJvS3/p9IHWuvcxZ82LgJQiFJrGHkIzwJwkSUCkDMIfQUVFkK16ZnQCBOyQ==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@snazzah/davey-win32-x64-msvc@0.1.12': - resolution: {integrity: sha512-AgUA3itPDVkxQq7RIkgE1thCiWePwWjyfOZefBBxGIlMWpRUOSwF4vY9kNLnrScyJcFULdR+Zm8PwiwV8/RKnw==} + '@snazzah/davey-win32-x64-msvc@0.2.0-beta.1': + resolution: {integrity: sha512-S/2MK3fBJt1pvto1989YRMR3r5TjF3jyve/Ffs9bteXmyQCfY+Bcl9qoOt8CMRpHzh9Dwi53nWieQLjpcfDd3Q==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@snazzah/davey@0.1.12': - resolution: {integrity: sha512-V+NlX5931RwVamZhhEfZekMdcvXDKdMAmHW1AuGaykVQsNyBOq3bpmGpoKRBDCYgFWKIufJ0Dcg3m4cYhvUy6g==} + '@snazzah/davey@0.2.0-beta.1': + resolution: {integrity: sha512-ea3QnHuy6T5R75j70rlWnFnLFW8wkbWjcVQbU4MX+mjzXMtBLs9NcyfSpOhg05MOr4hrKng4T5xXePkOT5cF9w==} engines: {node: '>= 10'} '@snazzah/emoji-sync@0.1.2': @@ -3205,8 +3203,8 @@ packages: cpu: [arm64] os: [win32] - '@tybys/wasm-util@0.10.2': - resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + '@tybys/wasm-util@0.10.4': + resolution: {integrity: sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==} '@types/common-tags@1.8.4': resolution: {integrity: sha512-S+1hLDJPjWNDhcGxsxEbepzaxWqURP/o+3cP4aa2w7yBXgdcmKGQtZzP8JbyfOd0m+33nh+8+kvxYE2UJtBDkg==} @@ -7240,11 +7238,11 @@ snapshots: '@napi-rs/lzma-linux-x64-gnu@1.5.1': optional: true - '@napi-rs/wasm-runtime@1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + '@napi-rs/wasm-runtime@1.2.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 - '@tybys/wasm-util': 0.10.2 + '@tybys/wasm-util': 0.10.4 optional: true '@opentelemetry/api@1.9.0': {} @@ -7558,12 +7556,12 @@ snapshots: transitivePeerDependencies: - '@types/react-dom' - '@projectdysnomia/dysnomia@https://codeload.github.com/projectdysnomia/dysnomia/tar.gz/00d8982d81d365c2cdb2ef5dac59af07977a65d7(@discordjs/opus@0.10.0(supports-color@8.1.1))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(erlpack@0.1.4)(eventemitter3@5.0.1)(sodium-native@5.1.0(bare-events@2.8.3))': + '@projectdysnomia/dysnomia@https://codeload.github.com/Snazzah/dysnomia/tar.gz/da3811d70a678bf58480bf99b14fffeb55161427(@discordjs/opus@0.10.0(supports-color@8.1.1))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(erlpack@0.1.4)(eventemitter3@5.0.1)(sodium-native@5.1.0(bare-events@2.8.3))': dependencies: ws: 8.22.0 optionalDependencies: '@discordjs/opus': 0.10.0(supports-color@8.1.1) - '@snazzah/davey': 0.1.12(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@snazzah/davey': 0.2.0-beta.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) '@stablelib/xchacha20poly1305': 1.0.1 erlpack: 0.1.4 eventemitter3: 5.0.1 @@ -7712,7 +7710,7 @@ snapshots: dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@napi-rs/wasm-runtime': 1.2.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': @@ -8030,69 +8028,69 @@ snapshots: '@sindresorhus/merge-streams@4.0.0': {} - '@snazzah/davey-android-arm-eabi@0.1.12': + '@snazzah/davey-android-arm-eabi@0.2.0-beta.1': optional: true - '@snazzah/davey-android-arm64@0.1.12': + '@snazzah/davey-android-arm64@0.2.0-beta.1': optional: true - '@snazzah/davey-darwin-arm64@0.1.12': + '@snazzah/davey-darwin-arm64@0.2.0-beta.1': optional: true - '@snazzah/davey-darwin-x64@0.1.12': + '@snazzah/davey-darwin-x64@0.2.0-beta.1': optional: true - '@snazzah/davey-freebsd-x64@0.1.12': + '@snazzah/davey-freebsd-x64@0.2.0-beta.1': optional: true - '@snazzah/davey-linux-arm-gnueabihf@0.1.12': + '@snazzah/davey-linux-arm-gnueabihf@0.2.0-beta.1': optional: true - '@snazzah/davey-linux-arm64-gnu@0.1.12': + '@snazzah/davey-linux-arm64-gnu@0.2.0-beta.1': optional: true - '@snazzah/davey-linux-arm64-musl@0.1.12': + '@snazzah/davey-linux-arm64-musl@0.2.0-beta.1': optional: true - '@snazzah/davey-linux-x64-gnu@0.1.12': + '@snazzah/davey-linux-x64-gnu@0.2.0-beta.1': optional: true - '@snazzah/davey-linux-x64-musl@0.1.12': + '@snazzah/davey-linux-x64-musl@0.2.0-beta.1': optional: true - '@snazzah/davey-wasm32-wasi@0.1.12(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + '@snazzah/davey-wasm32-wasi@0.2.0-beta.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@napi-rs/wasm-runtime': 1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@napi-rs/wasm-runtime': 1.2.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' optional: true - '@snazzah/davey-win32-arm64-msvc@0.1.12': + '@snazzah/davey-win32-arm64-msvc@0.2.0-beta.1': optional: true - '@snazzah/davey-win32-ia32-msvc@0.1.12': + '@snazzah/davey-win32-ia32-msvc@0.2.0-beta.1': optional: true - '@snazzah/davey-win32-x64-msvc@0.1.12': + '@snazzah/davey-win32-x64-msvc@0.2.0-beta.1': optional: true - '@snazzah/davey@0.1.12(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + '@snazzah/davey@0.2.0-beta.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': optionalDependencies: - '@snazzah/davey-android-arm-eabi': 0.1.12 - '@snazzah/davey-android-arm64': 0.1.12 - '@snazzah/davey-darwin-arm64': 0.1.12 - '@snazzah/davey-darwin-x64': 0.1.12 - '@snazzah/davey-freebsd-x64': 0.1.12 - '@snazzah/davey-linux-arm-gnueabihf': 0.1.12 - '@snazzah/davey-linux-arm64-gnu': 0.1.12 - '@snazzah/davey-linux-arm64-musl': 0.1.12 - '@snazzah/davey-linux-x64-gnu': 0.1.12 - '@snazzah/davey-linux-x64-musl': 0.1.12 - '@snazzah/davey-wasm32-wasi': 0.1.12(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - '@snazzah/davey-win32-arm64-msvc': 0.1.12 - '@snazzah/davey-win32-ia32-msvc': 0.1.12 - '@snazzah/davey-win32-x64-msvc': 0.1.12 + '@snazzah/davey-android-arm-eabi': 0.2.0-beta.1 + '@snazzah/davey-android-arm64': 0.2.0-beta.1 + '@snazzah/davey-darwin-arm64': 0.2.0-beta.1 + '@snazzah/davey-darwin-x64': 0.2.0-beta.1 + '@snazzah/davey-freebsd-x64': 0.2.0-beta.1 + '@snazzah/davey-linux-arm-gnueabihf': 0.2.0-beta.1 + '@snazzah/davey-linux-arm64-gnu': 0.2.0-beta.1 + '@snazzah/davey-linux-arm64-musl': 0.2.0-beta.1 + '@snazzah/davey-linux-x64-gnu': 0.2.0-beta.1 + '@snazzah/davey-linux-x64-musl': 0.2.0-beta.1 + '@snazzah/davey-wasm32-wasi': 0.2.0-beta.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@snazzah/davey-win32-arm64-msvc': 0.2.0-beta.1 + '@snazzah/davey-win32-ia32-msvc': 0.2.0-beta.1 + '@snazzah/davey-win32-x64-msvc': 0.2.0-beta.1 transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -8371,7 +8369,7 @@ snapshots: '@turbo/windows-arm64@2.10.12': optional: true - '@tybys/wasm-util@0.10.2': + '@tybys/wasm-util@0.10.4': dependencies: tslib: 2.8.1 optional: true @@ -8935,6 +8933,7 @@ snapshots: bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 + optional: true bintrees@1.0.2: {} @@ -9294,6 +9293,7 @@ snapshots: dependencies: bindings: 1.5.0 nan: 2.28.0 + optional: true es-define-property@1.0.1: {} @@ -9767,7 +9767,8 @@ snapshots: dependencies: flat-cache: 4.0.1 - file-uri-to-path@1.0.0: {} + file-uri-to-path@1.0.0: + optional: true find-my-way@8.2.2: dependencies: @@ -10553,7 +10554,8 @@ snapshots: dependencies: lru.min: 1.1.4 - nan@2.28.0: {} + nan@2.28.0: + optional: true nanoid@3.3.11: {}