Skip to content

Commit 23a3b6e

Browse files
committed
fix: properly handle setting buffer to null in AudioNode ctors
1 parent f8be904 commit 23a3b6e

File tree

4 files changed

+45
-13
lines changed

4 files changed

+45
-13
lines changed

generator/rs/audio_nodes.tmpl.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -250,10 +250,18 @@ fn constructor(ctx: CallContext) -> Result<JsUndefined> {
250250
// AudioBuffer, PeriodicWave
251251
case 'interface':
252252
return `
253-
let some_${simple_slug}_js = options_js.get::<&str, JsObject>("${m.name}")?;
253+
let some_${simple_slug}_js = options_js.get::<&str, JsUnknown>("${m.name}")?;
254254
let ${slug} = if let Some(${simple_slug}_js) = some_${simple_slug}_js {
255-
let ${simple_slug}_napi = ctx.env.unwrap::<${d.napiName(idl)}>(&${simple_slug}_js)?;
256-
Some(${simple_slug}_napi.unwrap().clone())
255+
// nullable options
256+
match ${simple_slug}_js.get_type()? {
257+
ValueType::Object => {
258+
let ${simple_slug}_js = ${simple_slug}_js.coerce_to_object()?;
259+
let ${simple_slug}_napi = ctx.env.unwrap::<${d.napiName(idl)}>(&${simple_slug}_js)?;
260+
Some(${simple_slug}_napi.unwrap().clone())
261+
},
262+
ValueType::Null => None,
263+
_ => unreachable!(),
264+
}
257265
} else {
258266
None
259267
};

src/audio_buffer_source_node.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,10 +146,18 @@ fn constructor(ctx: CallContext) -> Result<JsUndefined> {
146146
let options = if let Ok(either_options) = ctx.try_get::<JsObject>(1) {
147147
match either_options {
148148
Either::A(options_js) => {
149-
let some_buffer_js = options_js.get::<&str, JsObject>("buffer")?;
149+
let some_buffer_js = options_js.get::<&str, JsUnknown>("buffer")?;
150150
let buffer = if let Some(buffer_js) = some_buffer_js {
151-
let buffer_napi = ctx.env.unwrap::<NapiAudioBuffer>(&buffer_js)?;
152-
Some(buffer_napi.unwrap().clone())
151+
// nullable options
152+
match buffer_js.get_type()? {
153+
ValueType::Object => {
154+
let buffer_js = buffer_js.coerce_to_object()?;
155+
let buffer_napi = ctx.env.unwrap::<NapiAudioBuffer>(&buffer_js)?;
156+
Some(buffer_napi.unwrap().clone())
157+
}
158+
ValueType::Null => None,
159+
_ => unreachable!(),
160+
}
153161
} else {
154162
None
155163
};

src/convolver_node.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,18 @@ fn constructor(ctx: CallContext) -> Result<JsUndefined> {
130130
let options = if let Ok(either_options) = ctx.try_get::<JsObject>(1) {
131131
match either_options {
132132
Either::A(options_js) => {
133-
let some_buffer_js = options_js.get::<&str, JsObject>("buffer")?;
133+
let some_buffer_js = options_js.get::<&str, JsUnknown>("buffer")?;
134134
let buffer = if let Some(buffer_js) = some_buffer_js {
135-
let buffer_napi = ctx.env.unwrap::<NapiAudioBuffer>(&buffer_js)?;
136-
Some(buffer_napi.unwrap().clone())
135+
// nullable options
136+
match buffer_js.get_type()? {
137+
ValueType::Object => {
138+
let buffer_js = buffer_js.coerce_to_object()?;
139+
let buffer_napi = ctx.env.unwrap::<NapiAudioBuffer>(&buffer_js)?;
140+
Some(buffer_napi.unwrap().clone())
141+
}
142+
ValueType::Null => None,
143+
_ => unreachable!(),
144+
}
137145
} else {
138146
None
139147
};

src/oscillator_node.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -166,11 +166,19 @@ fn constructor(ctx: CallContext) -> Result<JsUndefined> {
166166
0.
167167
};
168168

169-
let some_periodic_wave_js = options_js.get::<&str, JsObject>("periodicWave")?;
169+
let some_periodic_wave_js = options_js.get::<&str, JsUnknown>("periodicWave")?;
170170
let periodic_wave = if let Some(periodic_wave_js) = some_periodic_wave_js {
171-
let periodic_wave_napi =
172-
ctx.env.unwrap::<NapiPeriodicWave>(&periodic_wave_js)?;
173-
Some(periodic_wave_napi.unwrap().clone())
171+
// nullable options
172+
match periodic_wave_js.get_type()? {
173+
ValueType::Object => {
174+
let periodic_wave_js = periodic_wave_js.coerce_to_object()?;
175+
let periodic_wave_napi =
176+
ctx.env.unwrap::<NapiPeriodicWave>(&periodic_wave_js)?;
177+
Some(periodic_wave_napi.unwrap().clone())
178+
}
179+
ValueType::Null => None,
180+
_ => unreachable!(),
181+
}
174182
} else {
175183
None
176184
};

0 commit comments

Comments
 (0)