@flighthq/audio 0.5.1-next.1069.554a2ac → 0.5.1-next.1201.9b49dee
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/audioFormat.d.ts +2 -2
- package/dist/audioFormat.d.ts.map +1 -1
- package/dist/audioFormat.js +2 -2
- package/dist/audioFormat.js.map +1 -1
- package/dist/audioResourceFrom.d.ts +4 -4
- package/dist/audioResourceFrom.d.ts.map +1 -1
- package/dist/audioResourceFrom.js +12 -12
- package/dist/audioResourceFrom.js.map +1 -1
- package/package.json +4 -4
- package/src/audioFormat.test.ts +6 -6
- package/src/audioResourceFrom.test.ts +29 -21
package/README.md
CHANGED
|
@@ -13,5 +13,5 @@ Import the supported application-facing API from `@flighthq/audio`. The `@flight
|
|
|
13
13
|
This package is part of the locked-version Flight SDK graph. Applications may instead install and import `@flighthq/sdk` when package-level tree shaking is sufficient.
|
|
14
14
|
|
|
15
15
|
- [Flight project](https://github.com/flighthq/flight)
|
|
16
|
-
- [Source for @flighthq/audio@0.5.1-next.
|
|
17
|
-
- [License](https://github.com/flighthq/flight/blob/
|
|
16
|
+
- [Source for @flighthq/audio@0.5.1-next.1201.9b49dee](https://github.com/flighthq/flight/tree/9b49dee3f22f6b2838c3d237edcc77bca65734f2/packages/audio)
|
|
17
|
+
- [License](https://github.com/flighthq/flight/blob/9b49dee3f22f6b2838c3d237edcc77bca65734f2/LICENSE.md)
|
package/dist/audioFormat.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare function canPlayAudioType(
|
|
1
|
+
import type { HostAudioProvider } from '@flighthq/types/contract';
|
|
2
|
+
export declare function canPlayAudioType(hostAudio: Readonly<HostAudioProvider>, mimeType: string): boolean;
|
|
3
3
|
export declare function detectAudioMimeType(data: ArrayBuffer | Uint8Array): string | null;
|
|
4
4
|
export declare function getAudioMimeTypeEssence(mimeType: string): string;
|
|
5
5
|
export declare function getAudioMimeTypeParameter(mimeType: string, name: string): string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audioFormat.d.ts","sourceRoot":"","sources":["../src/audioFormat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"audioFormat.d.ts","sourceRoot":"","sources":["../src/audioFormat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGlG;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,IAAI,CA6BjF;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGhE;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmBvF;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAoB7D"}
|
package/dist/audioFormat.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export function canPlayAudioType(
|
|
1
|
+
export function canPlayAudioType(hostAudio, mimeType) {
|
|
2
2
|
if (mimeType === '')
|
|
3
3
|
return false;
|
|
4
|
-
return
|
|
4
|
+
return hostAudio.canPlayType(mimeType);
|
|
5
5
|
}
|
|
6
6
|
export function detectAudioMimeType(data) {
|
|
7
7
|
const b = data instanceof Uint8Array ? data : new Uint8Array(data);
|
package/dist/audioFormat.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audioFormat.js","sourceRoot":"","sources":["../src/audioFormat.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"audioFormat.js","sourceRoot":"","sources":["../src/audioFormat.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type { AudioResource, AudioResourceUrl,
|
|
1
|
+
import type { AudioResource, AudioResourceUrl, HostAudioProvider, HostNetProvider } from '@flighthq/types/contract';
|
|
2
2
|
export declare function createAudioResourceFromSamples(channels: readonly Float32Array[], sampleRate: number): AudioResource;
|
|
3
3
|
export declare function loadAudioResourceFromBase64(context: AudioContext, base64: string, mimeType: string, signal?: AbortSignal): Promise<AudioResource>;
|
|
4
4
|
export declare function loadAudioResourceFromBlob(context: AudioContext, blob: Blob, signal?: AbortSignal): Promise<AudioResource>;
|
|
5
5
|
export declare function loadAudioResourceFromBytes(context: AudioContext, bytes: Uint8Array, mimeType?: string, signal?: AbortSignal): Promise<AudioResource>;
|
|
6
|
-
export declare function loadAudioResourceFromUrl(
|
|
7
|
-
export declare function loadAudioResourceFromUrls(
|
|
8
|
-
export declare function selectAudioResourceUrl(
|
|
6
|
+
export declare function loadAudioResourceFromUrl(hostNet: Readonly<HostNetProvider>, context: AudioContext, url: string, signal?: AbortSignal): Promise<AudioResource>;
|
|
7
|
+
export declare function loadAudioResourceFromUrls(hostNet: Readonly<HostNetProvider>, hostAudio: Readonly<HostAudioProvider>, context: AudioContext, sources: readonly AudioResourceUrl[], signal?: AbortSignal): Promise<AudioResource>;
|
|
8
|
+
export declare function selectAudioResourceUrl(hostAudio: Readonly<HostAudioProvider>, sources: readonly AudioResourceUrl[]): string | null;
|
|
9
9
|
//# sourceMappingURL=audioResourceFrom.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audioResourceFrom.d.ts","sourceRoot":"","sources":["../src/audioResourceFrom.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"audioResourceFrom.d.ts","sourceRoot":"","sources":["../src/audioResourceFrom.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAWpH,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa,CAUnH;AAGD,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,aAAa,CAAC,CAKxB;AAED,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,YAAY,EACrB,IAAI,EAAE,IAAI,EACV,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,aAAa,CAAC,CAGxB;AAID,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,UAAU,EACjB,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,aAAa,CAAC,CAIxB;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,QAAQ,CAAC,eAAe,CAAC,EAClC,OAAO,EAAE,YAAY,EACrB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,aAAa,CAAC,CAExB;AA2BD,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,QAAQ,CAAC,eAAe,CAAC,EAClC,SAAS,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACtC,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,SAAS,gBAAgB,EAAE,EACpC,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,aAAa,CAAC,CAKxB;AAED,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACtC,OAAO,EAAE,SAAS,gBAAgB,EAAE,GACnC,MAAM,GAAG,IAAI,CAEf"}
|
|
@@ -39,12 +39,12 @@ export async function loadAudioResourceFromBytes(context, bytes, mimeType, signa
|
|
|
39
39
|
throw new Error(`Failed to decode audio${mimeType === undefined ? '' : `: ${mimeType}`}`);
|
|
40
40
|
return resource;
|
|
41
41
|
}
|
|
42
|
-
export async function loadAudioResourceFromUrl(
|
|
43
|
-
return _loadAudioResourceFromUrl(
|
|
42
|
+
export async function loadAudioResourceFromUrl(hostNet, context, url, signal) {
|
|
43
|
+
return _loadAudioResourceFromUrl(hostNet, context, url, inferAudioMimeType(url) ?? undefined, signal);
|
|
44
44
|
}
|
|
45
|
-
async function _loadAudioResourceFromUrl(
|
|
46
|
-
const response = await sendNetRequest(
|
|
47
|
-
// The
|
|
45
|
+
async function _loadAudioResourceFromUrl(hostNet, context, url, mimeType, signal) {
|
|
46
|
+
const response = await sendNetRequest(hostNet, { method: 'GET', responseType: 'arraybuffer', url }, signal === undefined ? undefined : { signal });
|
|
47
|
+
// The HostNetProvider reports network failures and non-2xx responses alike through the response, before
|
|
48
48
|
// the audio decoder can misdiagnose an HTTP error body as invalid audio. This function retains its
|
|
49
49
|
// existing reject-on-failure contract; the transport itself remains caller-replaceable.
|
|
50
50
|
if (!response.ok)
|
|
@@ -53,20 +53,20 @@ async function _loadAudioResourceFromUrl(host, context, url, mimeType, signal) {
|
|
|
53
53
|
throw new Error(`Failed to load audio: ${url} (invalid body)`);
|
|
54
54
|
return loadAudioResourceFromBytes(context, new Uint8Array(response.body), response.headers['content-type'] ?? mimeType, signal);
|
|
55
55
|
}
|
|
56
|
-
export async function loadAudioResourceFromUrls(
|
|
57
|
-
const selected = _selectAudioResourceSource(
|
|
56
|
+
export async function loadAudioResourceFromUrls(hostNet, hostAudio, context, sources, signal) {
|
|
57
|
+
const selected = _selectAudioResourceSource(hostAudio, sources);
|
|
58
58
|
if (selected === null)
|
|
59
59
|
return createAudioResource();
|
|
60
60
|
const mimeType = selected.type ?? inferAudioMimeType(selected.url) ?? undefined;
|
|
61
|
-
return _loadAudioResourceFromUrl(
|
|
61
|
+
return _loadAudioResourceFromUrl(hostNet, context, selected.url, mimeType, signal);
|
|
62
62
|
}
|
|
63
|
-
export function selectAudioResourceUrl(
|
|
64
|
-
return _selectAudioResourceSource(
|
|
63
|
+
export function selectAudioResourceUrl(hostAudio, sources) {
|
|
64
|
+
return _selectAudioResourceSource(hostAudio, sources)?.url ?? null;
|
|
65
65
|
}
|
|
66
|
-
function _selectAudioResourceSource(
|
|
66
|
+
function _selectAudioResourceSource(hostAudio, sources) {
|
|
67
67
|
for (const source of sources) {
|
|
68
68
|
const type = source.type ?? inferAudioMimeType(source.url) ?? '';
|
|
69
|
-
if (hasAudioDecoder(type) || canPlayAudioType(
|
|
69
|
+
if (hasAudioDecoder(type) || canPlayAudioType(hostAudio, type))
|
|
70
70
|
return source;
|
|
71
71
|
}
|
|
72
72
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audioResourceFrom.js","sourceRoot":"","sources":["../src/audioResourceFrom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,6FAA6F;AAC7F,gGAAgG;AAChG,gGAAgG;AAChG,yEAAyE;AACzE,MAAM,UAAU,8BAA8B,CAAC,QAAiC,EAAE,UAAkB;IAClG,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC;IACzC,MAAM,MAAM,GAAG,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,IAAI,gBAAgB,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC;QAAE,OAAO,mBAAmB,EAAE,CAAC;IACzE,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,CAAC,CAAC;IACzE,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,gBAAgB,EAAE,OAAO,EAAE,EAAE,CAAC;QAC5D,6FAA6F;QAC7F,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAA8B,EAAE,OAAO,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC;AAED,yGAAyG;AACzG,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,OAAqB,EACrB,MAAc,EACd,QAAgB,EAChB,MAAoB;IAEpB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACxE,OAAO,0BAA0B,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,OAAqB,EACrB,IAAU,EACV,MAAoB;IAEpB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;IAC7C,OAAO,0BAA0B,CAAC,OAAO,EAAE,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,IAAI,IAAI,SAAS,EAAE,MAAM,CAAC,CAAC;AAC1G,CAAC;AAED,kGAAkG;AAClG,sGAAsG;AACtG,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,OAAqB,EACrB,KAAiB,EACjB,QAAiB,EACjB,MAAoB;IAEpB,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC;IAClH,IAAI,QAAQ,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,EAAE,CAAC,CAAC;IACjH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,
|
|
1
|
+
{"version":3,"file":"audioResourceFrom.js","sourceRoot":"","sources":["../src/audioResourceFrom.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/audio",
|
|
3
|
-
"version": "0.5.1-next.
|
|
3
|
+
"version": "0.5.1-next.1201.9b49dee",
|
|
4
4
|
"author": "Joshua Granick and other contributors",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -38,9 +38,9 @@
|
|
|
38
38
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@flighthq/entity": "0.5.1-next.
|
|
42
|
-
"@flighthq/net": "0.5.1-next.
|
|
43
|
-
"@flighthq/types": "0.5.1-next.
|
|
41
|
+
"@flighthq/entity": "0.5.1-next.1201.9b49dee",
|
|
42
|
+
"@flighthq/net": "0.5.1-next.1201.9b49dee",
|
|
43
|
+
"@flighthq/types": "0.5.1-next.1201.9b49dee"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"typescript": "^5.3.0"
|
package/src/audioFormat.test.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
|
|
2
|
-
import type {
|
|
2
|
+
import type { HostAudioProvider, Entity } from '@flighthq/types/contract';
|
|
3
3
|
|
|
4
4
|
import {
|
|
5
5
|
canPlayAudioType,
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
inferAudioMimeType,
|
|
10
10
|
} from './audioFormat';
|
|
11
11
|
|
|
12
|
-
function hostWith(canPlay: (type: string) => boolean):
|
|
12
|
+
function hostWith(canPlay: (type: string) => boolean): { readonly media: { readonly audioCodec: HostAudioProvider } } {
|
|
13
13
|
return {
|
|
14
14
|
media: {
|
|
15
15
|
audioCodec: (() => {
|
|
@@ -18,22 +18,22 @@ function hostWith(canPlay: (type: string) => boolean): HasMediaAudioCodec {
|
|
|
18
18
|
return finishEntity(out);
|
|
19
19
|
})(),
|
|
20
20
|
},
|
|
21
|
-
} as
|
|
21
|
+
} as { readonly media: { readonly audioCodec: HostAudioProvider } };
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
describe('canPlayAudioType', () => {
|
|
25
25
|
const host = hostWith((type) => type === 'audio/mpeg');
|
|
26
26
|
|
|
27
27
|
it('returns false for the empty string without probing', () => {
|
|
28
|
-
expect(canPlayAudioType(host, '')).toBe(false);
|
|
28
|
+
expect(canPlayAudioType(host.media.audioCodec, '')).toBe(false);
|
|
29
29
|
});
|
|
30
30
|
|
|
31
31
|
it('returns true for a type the backend reports as playable', () => {
|
|
32
|
-
expect(canPlayAudioType(host, 'audio/mpeg')).toBe(true);
|
|
32
|
+
expect(canPlayAudioType(host.media.audioCodec, 'audio/mpeg')).toBe(true);
|
|
33
33
|
});
|
|
34
34
|
|
|
35
35
|
it('returns false for a type the backend cannot play', () => {
|
|
36
|
-
expect(canPlayAudioType(host, 'audio/x-unknown')).toBe(false);
|
|
36
|
+
expect(canPlayAudioType(host.media.audioCodec, 'audio/x-unknown')).toBe(false);
|
|
37
37
|
});
|
|
38
38
|
});
|
|
39
39
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
|
|
2
|
-
import type { AudioDecoder,
|
|
2
|
+
import type { AudioDecoder, HostAudioProvider, HostNetProvider } from '@flighthq/types/contract';
|
|
3
3
|
|
|
4
4
|
import { getAudioDecoderMimeTypes, registerAudioDecoder, unregisterAudioDecoder } from './audioDecoderRegistry';
|
|
5
5
|
import { createAudioResource } from './audioResource';
|
|
@@ -13,18 +13,22 @@ import {
|
|
|
13
13
|
selectAudioResourceUrl,
|
|
14
14
|
} from './audioResourceFrom';
|
|
15
15
|
|
|
16
|
-
function fakeAudioCodecHost(canPlay: (type: string) => boolean):
|
|
16
|
+
function fakeAudioCodecHost(canPlay: (type: string) => boolean): {
|
|
17
|
+
readonly media: { readonly audioCodec: HostAudioProvider };
|
|
18
|
+
} {
|
|
17
19
|
const out = allocateEntity<any>();
|
|
18
20
|
out.canPlayType = canPlay;
|
|
19
21
|
return {
|
|
20
22
|
media: {
|
|
21
23
|
audioCodec: finishEntity(out),
|
|
22
24
|
},
|
|
23
|
-
} as
|
|
25
|
+
} as { readonly media: { readonly audioCodec: HostAudioProvider } };
|
|
24
26
|
}
|
|
25
27
|
|
|
26
|
-
function fakeNetHost(backend?: Pick<
|
|
27
|
-
|
|
28
|
+
function fakeNetHost(backend?: Pick<HostNetProvider, 'sendNetRequest'>): {
|
|
29
|
+
readonly net: { readonly http: HostNetProvider };
|
|
30
|
+
} {
|
|
31
|
+
const out = allocateEntity<HostNetProvider>();
|
|
28
32
|
Object.assign(
|
|
29
33
|
out,
|
|
30
34
|
backend ?? {
|
|
@@ -40,8 +44,10 @@ function fakeNetHost(backend?: Pick<NetBackend, 'sendNetRequest'>): HasNetHttp {
|
|
|
40
44
|
|
|
41
45
|
function fakeNetAudioHost(
|
|
42
46
|
canPlay: (type: string) => boolean,
|
|
43
|
-
backend?: Pick<
|
|
44
|
-
):
|
|
47
|
+
backend?: Pick<HostNetProvider, 'sendNetRequest'>,
|
|
48
|
+
): { readonly net: { readonly http: HostNetProvider } } & {
|
|
49
|
+
readonly media: { readonly audioCodec: HostAudioProvider };
|
|
50
|
+
} {
|
|
45
51
|
return { ...fakeNetHost(backend), ...fakeAudioCodecHost(canPlay) };
|
|
46
52
|
}
|
|
47
53
|
|
|
@@ -247,7 +253,7 @@ describe('loadAudioResourceFromUrl', () => {
|
|
|
247
253
|
});
|
|
248
254
|
const host = fakeNetHost({ sendNetRequest: mockSendNetRequest });
|
|
249
255
|
|
|
250
|
-
const resource = await loadAudioResourceFromUrl(host, mockContext, 'sound.mp3');
|
|
256
|
+
const resource = await loadAudioResourceFromUrl(host.net.http, mockContext, 'sound.mp3');
|
|
251
257
|
|
|
252
258
|
expect(resource.buffer).toBe(decodedBuffer);
|
|
253
259
|
expect(mockSendNetRequest).toHaveBeenCalledWith(
|
|
@@ -267,7 +273,7 @@ describe('loadAudioResourceFromUrl', () => {
|
|
|
267
273
|
url: 'sound.mp3',
|
|
268
274
|
}),
|
|
269
275
|
});
|
|
270
|
-
const resource = await loadAudioResourceFromUrl(host, mockContext, 'sound.mp3');
|
|
276
|
+
const resource = await loadAudioResourceFromUrl(host.net.http, mockContext, 'sound.mp3');
|
|
271
277
|
expect(resource.buffer).toBe(decodedBuffer);
|
|
272
278
|
});
|
|
273
279
|
|
|
@@ -284,7 +290,7 @@ describe('loadAudioResourceFromUrl', () => {
|
|
|
284
290
|
}),
|
|
285
291
|
});
|
|
286
292
|
await expect(
|
|
287
|
-
loadAudioResourceFromUrl(host, { decodeAudioData } as unknown as AudioContext, 'missing.mp3'),
|
|
293
|
+
loadAudioResourceFromUrl(host.net.http, { decodeAudioData } as unknown as AudioContext, 'missing.mp3'),
|
|
288
294
|
).rejects.toThrow('Failed to load audio: missing.mp3 (404 Not Found)');
|
|
289
295
|
expect(decodeAudioData).not.toHaveBeenCalled();
|
|
290
296
|
});
|
|
@@ -302,7 +308,7 @@ describe('loadAudioResourceFromUrl', () => {
|
|
|
302
308
|
}),
|
|
303
309
|
});
|
|
304
310
|
const controller = new AbortController();
|
|
305
|
-
const promise = loadAudioResourceFromUrl(host, context, 'sound.mp3', controller.signal);
|
|
311
|
+
const promise = loadAudioResourceFromUrl(host.net.http, context, 'sound.mp3', controller.signal);
|
|
306
312
|
await Promise.resolve();
|
|
307
313
|
controller.abort(new Error('cancelled'));
|
|
308
314
|
finishDecode();
|
|
@@ -313,7 +319,7 @@ describe('loadAudioResourceFromUrl', () => {
|
|
|
313
319
|
describe('loadAudioResourceFromUrls', () => {
|
|
314
320
|
it('resolves with a null-buffer resource when sources is empty', async () => {
|
|
315
321
|
const host = fakeNetAudioHost(() => false);
|
|
316
|
-
const resource = await loadAudioResourceFromUrls(host, mockContext, []);
|
|
322
|
+
const resource = await loadAudioResourceFromUrls(host.net.http, host.media.audioCodec, mockContext, []);
|
|
317
323
|
expect(resource.buffer).toBeNull();
|
|
318
324
|
});
|
|
319
325
|
|
|
@@ -328,7 +334,10 @@ describe('loadAudioResourceFromUrls', () => {
|
|
|
328
334
|
});
|
|
329
335
|
const host = fakeNetAudioHost((type) => type === 'audio/ogg', { sendNetRequest: mockSendNetRequest });
|
|
330
336
|
|
|
331
|
-
const resource = await loadAudioResourceFromUrls(host, mockContext, [
|
|
337
|
+
const resource = await loadAudioResourceFromUrls(host.net.http, host.media.audioCodec, mockContext, [
|
|
338
|
+
{ url: 'sound.mp3' },
|
|
339
|
+
{ url: 'sound.ogg' },
|
|
340
|
+
]);
|
|
332
341
|
|
|
333
342
|
expect(resource.buffer).toBe(decodedBuffer);
|
|
334
343
|
expect(mockSendNetRequest).toHaveBeenCalledWith(
|
|
@@ -352,7 +361,7 @@ describe('loadAudioResourceFromUrls', () => {
|
|
|
352
361
|
}),
|
|
353
362
|
});
|
|
354
363
|
|
|
355
|
-
const resource = await loadAudioResourceFromUrls(host, mockContext, [
|
|
364
|
+
const resource = await loadAudioResourceFromUrls(host.net.http, host.media.audioCodec, mockContext, [
|
|
356
365
|
{ type: 'audio/vnd.acme.custom', url: 'sound.custom' },
|
|
357
366
|
]);
|
|
358
367
|
|
|
@@ -366,24 +375,23 @@ describe('selectAudioResourceUrl', () => {
|
|
|
366
375
|
const host = fakeAudioCodecHost((type) => type === 'audio/ogg');
|
|
367
376
|
|
|
368
377
|
it('returns the first source whose inferred type is playable', () => {
|
|
369
|
-
expect(selectAudioResourceUrl(host, [{ url: 'a.mp3' }, { url: 'b.ogg' }])).toBe('b.ogg');
|
|
378
|
+
expect(selectAudioResourceUrl(host.media.audioCodec, [{ url: 'a.mp3' }, { url: 'b.ogg' }])).toBe('b.ogg');
|
|
370
379
|
});
|
|
371
380
|
|
|
372
381
|
it('honours an explicit type over the URL extension', () => {
|
|
373
|
-
expect(selectAudioResourceUrl(host, [{ type: 'audio/ogg', url: 'stream' }])).toBe('stream');
|
|
382
|
+
expect(selectAudioResourceUrl(host.media.audioCodec, [{ type: 'audio/ogg', url: 'stream' }])).toBe('stream');
|
|
374
383
|
});
|
|
375
384
|
|
|
376
385
|
it('returns null when no source is playable', () => {
|
|
377
|
-
expect(selectAudioResourceUrl(host, [{ url: 'a.mp3' }, { url: 'b.wav' }])).toBeNull();
|
|
386
|
+
expect(selectAudioResourceUrl(host.media.audioCodec, [{ url: 'a.mp3' }, { url: 'b.wav' }])).toBeNull();
|
|
378
387
|
});
|
|
379
388
|
|
|
380
389
|
it('returns a source handled by a registered decoder', () => {
|
|
381
390
|
registerAudioDecoder('audio/vnd.acme.custom', async () => createAudioResource());
|
|
382
391
|
expect(
|
|
383
|
-
selectAudioResourceUrl(
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
),
|
|
392
|
+
selectAudioResourceUrl(fakeAudioCodecHost(() => false).media.audioCodec, [
|
|
393
|
+
{ type: 'audio/vnd.acme.custom', url: 'sound.custom' },
|
|
394
|
+
]),
|
|
387
395
|
).toBe('sound.custom');
|
|
388
396
|
});
|
|
389
397
|
});
|