- From: Eric Shepherd via GitHub <sysbot+gh@w3.org>
- Date: Thu, 30 Apr 2020 21:18:48 +0000
- To: public-houdini-archive@w3.org
a2sheppy has just created a new issue for https://github.com/w3c/css-houdini-drafts:
== [worklets] Add ability to determine if a module is available ==
While the `addModule()` method available on Worklets lets you load and install modules into the worklet, and uses a promise to let the caller know success or failure, there's no after-the-fact method available to determine the state of the module.
One scenario (slightly contrived but not in a very improbable way) in which this could come into play is a function which is used to set up a new `AudioWorkletNode` that looks like this:
```
let audioInfo = {
audioContext: null,
myAudioProcessor: null,
...
};
async function createMyAudioProcessor() {
if (!audioInfo.audioContext) {
try {
audioInfo.audioContext = new AudioContext();
await audioInfo.audioContext.resume();
await audioInfo.audioContext.audioWorklet.addModule(
"module-url/module.js");
} catch(e) {
return null;
}
}
return new AudioWorkletNode(audioInfo.audioContext,
"processor-name");
}
```
This function checks the specified `AudioContext` to see if it's `null` and if it is, creates the context and installs the processor module into it before then proceeding to create a new `AudioWorkletNode` and return it to the caller.
However, if the user does the following, there's a problem:
```
let audioInfo.audioContext = new AudioContext();
let audioInfo.myAudioProcessor = createMyProcessor(context);
```
This will fail because the module hasn't been loaded. To solve problems like this, a method to determine if the module has been loaded would be helpful. That would let the `createMyAudioProcessor()` function become something like:
```
async function createMyAudioProcessor() {
if (!audioInfo.audioContext) {
try {
audioInfo.audioContext = new AudioContext();
await audioInfo.audioContext.resume();
} catch(e) {
return null;
}
}
if (!audioContext.isModuleLoaded("module-url/module.js") {
await audioInfo.audioContext.audioWorklet.addModule(
"module-url/module.js");
}
return new AudioWorkletNode(audioInfo.audioContext,
"processor-name");
}
```
This now will work even if the context has already been created:
```
let audioInfo = {
audioContext: null,
myAudioProcessor: null,
...
};
audioInfo.audioContext = new AudioContext();
audioInfo.myAudioProcessor = createMyAudioProcessor();
```
An alternative to `isModuleLoaded()` would be a method on `Worklet` that returns a status string, such as:
```
let moduleStatus = audioContext.audioWorklet.getModuleStatus(
"module-url/module.js");
```
This could also be done at the `AudioWorklet` level to ask about a processor rather than a module:
```
let moduleStatus = audioContext.audioWorklet.getProcessorStatus(
"processor-name");
```
The could be a string such as `available` or `unavailable`, with the possibility of other statuses.
Please view or discuss this issue at https://github.com/w3c/css-houdini-drafts/issues/986 using your GitHub account
Received on Thursday, 30 April 2020 21:18:50 UTC