Removing double-encoding of urls, testing baseUrl

This commit is contained in:
Yotam Mann 2024-06-11 15:37:24 -04:00
parent 73f158f686
commit 52e6e3d1c4
2 changed files with 34 additions and 37 deletions

View file

@ -117,6 +117,39 @@ describe("ToneAudioBuffer", () => {
}); });
}); });
context("baseUrl", () => {
afterEach(() => {
// reset baseUrl
ToneAudioBuffer.baseUrl = "";
});
it("can resolve a url without a baseUrl", async () => {
const buffer = new ToneAudioBuffer("./test/audio/sine.wav");
expect(buffer.loaded).to.be.false;
await ToneAudioBuffer.loaded();
expect(buffer.loaded).to.be.true;
expect(buffer.duration).to.be.closeTo(3, 0.01);
});
it("can resolve a url with a baseUrl", async () => {
ToneAudioBuffer.baseUrl = "./test/audio";
const buffer = new ToneAudioBuffer("sine.wav");
expect(buffer.loaded).to.be.false;
await ToneAudioBuffer.loaded();
expect(buffer.loaded).to.be.true;
expect(buffer.duration).to.be.closeTo(3, 0.01);
});
it("can resolve a url with a baseUrl that has a trailing slash", async () => {
ToneAudioBuffer.baseUrl = "./test/audio/";
const buffer = new ToneAudioBuffer("sine.wav");
expect(buffer.loaded).to.be.false;
await ToneAudioBuffer.loaded();
expect(buffer.loaded).to.be.true;
expect(buffer.duration).to.be.closeTo(3, 0.01);
});
});
context("loading", () => { context("loading", () => {
it("invokes the error callback if there is a problem with the file", (done) => { it("invokes the error callback if there is a problem with the file", (done) => {
const buffer = new ToneAudioBuffer( const buffer = new ToneAudioBuffer(
@ -141,20 +174,6 @@ describe("ToneAudioBuffer", () => {
expect(hadError).to.equal(true); expect(hadError).to.equal(true);
}); });
it("can load a file with fallback extensions", async () => {
const buffer = await ToneAudioBuffer.load(
"./test/audio/sine.[nope|nada|wav]"
);
expect(buffer).to.exist;
});
it("takes the first supported format when multiple extensions are provided", async () => {
const buffer = await ToneAudioBuffer.load(
"./test/audio/sine.[wav|nope]"
);
expect(buffer).to.exist;
});
it("instance .load method returns Promise", (done) => { it("instance .load method returns Promise", (done) => {
const promise = new ToneAudioBuffer().load(testFile); const promise = new ToneAudioBuffer().load(testFile);
expect(promise).to.have.property("then"); expect(promise).to.have.property("then");

View file

@ -372,20 +372,6 @@ export class ToneAudioBuffer extends Tone {
* Loads a url using fetch and returns the AudioBuffer. * Loads a url using fetch and returns the AudioBuffer.
*/ */
static async load(url: string): Promise<AudioBuffer> { static async load(url: string): Promise<AudioBuffer> {
// test if the url contains multiple extensions
const matches = url.match(/\[([^\]\[]+\|.+)\]$/);
if (matches) {
const extensions = matches[1].split("|");
let extension = extensions[0];
for (const ext of extensions) {
if (ToneAudioBuffer.supportsType(ext)) {
extension = ext;
break;
}
}
url = url.replace(matches[0], extension);
}
// make sure there is a slash between the baseUrl and the url // make sure there is a slash between the baseUrl and the url
const baseUrl = const baseUrl =
ToneAudioBuffer.baseUrl === "" || ToneAudioBuffer.baseUrl === "" ||
@ -393,15 +379,7 @@ export class ToneAudioBuffer extends Tone {
? ToneAudioBuffer.baseUrl ? ToneAudioBuffer.baseUrl
: ToneAudioBuffer.baseUrl + "/"; : ToneAudioBuffer.baseUrl + "/";
// encode special characters in file path const response = await fetch(baseUrl + url);
const location = document.createElement("a");
location.href = baseUrl + url;
location.pathname = (location.pathname + location.hash)
.split("/")
.map(encodeURIComponent)
.join("/");
const response = await fetch(location.href);
if (!response.ok) { if (!response.ok) {
throw new Error(`could not load url: ${url}`); throw new Error(`could not load url: ${url}`);
} }