fix(discord): make opus optional and log fallback
This commit is contained in:
@@ -46,6 +46,7 @@ Docs: https://docs.openclaw.ai
|
||||
- Memory/Remote HTTP: centralize remote memory HTTP calls behind a shared guarded helper (`withRemoteHttpResponse`) so embeddings and batch flows use one request/release path.
|
||||
- Memory/Embeddings: apply configured remote-base host pinning (`allowedHostnames`) across OpenAI/Voyage/Gemini embedding requests to keep private/self-hosted endpoints working without cross-host drift. (#18198) Thanks @ianpcook.
|
||||
- Memory/Batch: route OpenAI/Voyage/Gemini batch upload/create/status/download requests through the same guarded HTTP path for consistent SSRF policy enforcement.
|
||||
- Install/Discord Voice: make `@discordjs/opus` an optional dependency so `openclaw` install/update no longer hard-fails when native Opus builds fail, while keeping `opusscript` as the runtime fallback decoder for Discord voice flows. (#23737, #23733, #23703)
|
||||
- Signal/RPC: guard malformed Signal RPC JSON responses with a clear status-scoped error and add regression coverage for invalid JSON responses. (#22995) Thanks @adhitShet.
|
||||
- Gateway/Subagents: guard gateway and subagent session-key/message trim paths against undefined inputs to prevent early `Cannot read properties of undefined (reading 'trim')` crashes during subagent spawn and wait flows.
|
||||
- Agents/Workspace: guard `resolveUserPath` against undefined/null input to prevent `Cannot read properties of undefined (reading 'trim')` crashes when workspace paths are missing in embedded runner flows.
|
||||
|
||||
+3
-1
@@ -142,7 +142,6 @@
|
||||
"@aws-sdk/client-bedrock": "^3.995.0",
|
||||
"@buape/carbon": "0.0.0-beta-20260216184201",
|
||||
"@clack/prompts": "^1.0.1",
|
||||
"@discordjs/opus": "^0.10.0",
|
||||
"@discordjs/voice": "^0.19.0",
|
||||
"@grammyjs/runner": "^2.0.3",
|
||||
"@grammyjs/transformer-throttler": "^1.2.1",
|
||||
@@ -217,6 +216,9 @@
|
||||
"@napi-rs/canvas": "^0.1.89",
|
||||
"node-llama-cpp": "3.15.1"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@discordjs/opus": "^0.10.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=22.12.0"
|
||||
},
|
||||
|
||||
Generated
+29
-22
@@ -32,9 +32,6 @@ importers:
|
||||
'@clack/prompts':
|
||||
specifier: ^1.0.1
|
||||
version: 1.0.1
|
||||
'@discordjs/opus':
|
||||
specifier: ^0.10.0
|
||||
version: 0.10.0
|
||||
'@discordjs/voice':
|
||||
specifier: ^0.19.0
|
||||
version: 0.19.0(@discordjs/[email protected])([email protected])
|
||||
@@ -243,6 +240,10 @@ importers:
|
||||
vitest:
|
||||
specifier: ^4.0.18
|
||||
version: 4.0.18(@opentelemetry/[email protected])(@types/[email protected])(@vitest/[email protected])([email protected])([email protected])([email protected])([email protected])
|
||||
optionalDependencies:
|
||||
'@discordjs/opus':
|
||||
specifier: ^0.10.0
|
||||
version: 0.10.0
|
||||
|
||||
extensions/bluebubbles:
|
||||
devDependencies:
|
||||
@@ -6525,6 +6526,7 @@ snapshots:
|
||||
transitivePeerDependencies:
|
||||
- encoding
|
||||
- supports-color
|
||||
optional: true
|
||||
|
||||
'@discordjs/[email protected]':
|
||||
dependencies:
|
||||
@@ -6533,6 +6535,7 @@ snapshots:
|
||||
transitivePeerDependencies:
|
||||
- encoding
|
||||
- supports-color
|
||||
optional: true
|
||||
|
||||
'@discordjs/[email protected](@discordjs/[email protected])([email protected])':
|
||||
dependencies:
|
||||
@@ -6880,7 +6883,7 @@ snapshots:
|
||||
|
||||
'@larksuiteoapi/[email protected]':
|
||||
dependencies:
|
||||
axios: 1.13.5
|
||||
axios: 1.13.5([email protected])
|
||||
lodash.identity: 3.0.0
|
||||
lodash.merge: 4.6.2
|
||||
lodash.pickby: 4.6.0
|
||||
@@ -6896,7 +6899,7 @@ snapshots:
|
||||
dependencies:
|
||||
'@types/node': 24.10.13
|
||||
optionalDependencies:
|
||||
axios: 1.13.5
|
||||
axios: 1.13.5([email protected])
|
||||
transitivePeerDependencies:
|
||||
- debug
|
||||
|
||||
@@ -7085,7 +7088,7 @@ snapshots:
|
||||
'@azure/core-auth': 1.10.1
|
||||
'@azure/msal-node': 5.0.4
|
||||
'@microsoft/agents-activity': 1.3.1
|
||||
axios: 1.13.5
|
||||
axios: 1.13.5([email protected])
|
||||
jsonwebtoken: 9.0.3
|
||||
jwks-rsa: 3.2.2
|
||||
object-path: 0.11.8
|
||||
@@ -7987,7 +7990,7 @@ snapshots:
|
||||
'@slack/types': 2.20.0
|
||||
'@slack/web-api': 7.14.1
|
||||
'@types/express': 5.0.6
|
||||
axios: 1.13.5
|
||||
axios: 1.13.5([email protected])
|
||||
express: 5.2.1
|
||||
path-to-regexp: 8.3.0
|
||||
raw-body: 3.0.2
|
||||
@@ -8033,7 +8036,7 @@ snapshots:
|
||||
'@slack/types': 2.20.0
|
||||
'@types/node': 25.3.0
|
||||
'@types/retry': 0.12.0
|
||||
axios: 1.13.5
|
||||
axios: 1.13.5([email protected])
|
||||
eventemitter3: 5.0.4
|
||||
form-data: 2.5.4
|
||||
is-electron: 2.2.2
|
||||
@@ -8771,7 +8774,8 @@ snapshots:
|
||||
curve25519-js: 0.0.4
|
||||
protobufjs: 6.8.8
|
||||
|
||||
[email protected]: {}
|
||||
[email protected]:
|
||||
optional: true
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
@@ -8798,6 +8802,7 @@ snapshots:
|
||||
debug: 4.4.3
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
optional: true
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
@@ -8848,6 +8853,7 @@ snapshots:
|
||||
dependencies:
|
||||
delegates: 1.0.0
|
||||
readable-stream: 3.6.2
|
||||
optional: true
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
@@ -8922,14 +8928,6 @@ snapshots:
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
follow-redirects: 1.15.11
|
||||
form-data: 2.5.4
|
||||
proxy-from-env: 1.1.0
|
||||
transitivePeerDependencies:
|
||||
- debug
|
||||
|
||||
[email protected]([email protected]):
|
||||
dependencies:
|
||||
follow-redirects: 1.15.11([email protected])
|
||||
@@ -9499,8 +9497,6 @@ snapshots:
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]([email protected]):
|
||||
optionalDependencies:
|
||||
debug: 4.4.3
|
||||
@@ -9537,7 +9533,8 @@ snapshots:
|
||||
jsonfile: 6.2.0
|
||||
universalify: 2.0.1
|
||||
|
||||
[email protected]: {}
|
||||
[email protected]:
|
||||
optional: true
|
||||
|
||||
[email protected]:
|
||||
optional: true
|
||||
@@ -9558,6 +9555,7 @@ snapshots:
|
||||
string-width: 4.2.3
|
||||
strip-ansi: 6.0.1
|
||||
wide-align: 1.1.5
|
||||
optional: true
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
@@ -9652,6 +9650,7 @@ snapshots:
|
||||
minimatch: 10.2.1
|
||||
once: 1.4.0
|
||||
path-is-absolute: 1.0.1
|
||||
optional: true
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
@@ -9781,6 +9780,7 @@ snapshots:
|
||||
debug: 4.4.3
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
optional: true
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
@@ -9816,6 +9816,7 @@ snapshots:
|
||||
dependencies:
|
||||
once: 1.4.0
|
||||
wrappy: 1.0.2
|
||||
optional: true
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
@@ -10178,6 +10179,7 @@ snapshots:
|
||||
[email protected]:
|
||||
dependencies:
|
||||
semver: 6.3.1
|
||||
optional: true
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
@@ -10386,6 +10388,7 @@ snapshots:
|
||||
[email protected]:
|
||||
dependencies:
|
||||
abbrev: 1.1.1
|
||||
optional: true
|
||||
|
||||
[email protected]([email protected]):
|
||||
dependencies:
|
||||
@@ -10407,6 +10410,7 @@ snapshots:
|
||||
console-control-strings: 1.1.0
|
||||
gauge: 3.0.2
|
||||
set-blocking: 2.0.0
|
||||
optional: true
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
@@ -10624,7 +10628,8 @@ snapshots:
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]: {}
|
||||
[email protected]:
|
||||
optional: true
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
@@ -10898,6 +10903,7 @@ snapshots:
|
||||
[email protected]:
|
||||
dependencies:
|
||||
glob: 7.2.3
|
||||
optional: true
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
@@ -11002,7 +11008,8 @@ snapshots:
|
||||
dependencies:
|
||||
parseley: 0.12.1
|
||||
|
||||
[email protected]: {}
|
||||
[email protected]:
|
||||
optional: true
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
|
||||
@@ -146,25 +146,33 @@ type OpusDecoder = {
|
||||
decode: (buffer: Buffer) => Buffer;
|
||||
};
|
||||
|
||||
let warnedOpusFallback = false;
|
||||
|
||||
function createOpusDecoder(): { decoder: OpusDecoder; name: string } | null {
|
||||
try {
|
||||
const OpusScript = require("opusscript") as {
|
||||
new (sampleRate: number, channels: number, application: number): OpusDecoder;
|
||||
Application: { AUDIO: number };
|
||||
};
|
||||
const decoder = new OpusScript(SAMPLE_RATE, CHANNELS, OpusScript.Application.AUDIO);
|
||||
return { decoder, name: "opusscript" };
|
||||
} catch (err) {
|
||||
logger.warn(`discord voice: opusscript init failed: ${formatErrorMessage(err)}`);
|
||||
}
|
||||
try {
|
||||
const { OpusEncoder } = require("@discordjs/opus") as {
|
||||
OpusEncoder: new (sampleRate: number, channels: number) => OpusDecoder;
|
||||
};
|
||||
const decoder = new OpusEncoder(SAMPLE_RATE, CHANNELS);
|
||||
return { decoder, name: "@discordjs/opus" };
|
||||
} catch (err) {
|
||||
logger.warn(`discord voice: opus decoder init failed: ${formatErrorMessage(err)}`);
|
||||
} catch (nativeErr) {
|
||||
try {
|
||||
const OpusScript = require("opusscript") as {
|
||||
new (sampleRate: number, channels: number, application: number): OpusDecoder;
|
||||
Application: { AUDIO: number };
|
||||
};
|
||||
const decoder = new OpusScript(SAMPLE_RATE, CHANNELS, OpusScript.Application.AUDIO);
|
||||
if (!warnedOpusFallback) {
|
||||
warnedOpusFallback = true;
|
||||
logger.warn(
|
||||
`discord voice: @discordjs/opus unavailable (${formatErrorMessage(nativeErr)}); using opusscript fallback`,
|
||||
);
|
||||
}
|
||||
return { decoder, name: "opusscript" };
|
||||
} catch (jsErr) {
|
||||
logger.warn(`discord voice: opus decoder init failed: ${formatErrorMessage(nativeErr)}`);
|
||||
logger.warn(`discord voice: opusscript init failed: ${formatErrorMessage(jsErr)}`);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user