@flighthq/audio 0.5.1-next.815.cc08b93 → 0.5.1-next.903.f434bc2

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 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.815.cc08b93](https://github.com/flighthq/flight/tree/cc08b93ef981080fa86bdd5143dc61dbdbf2665b/packages/audio)
17
- - [License](https://github.com/flighthq/flight/blob/cc08b93ef981080fa86bdd5143dc61dbdbf2665b/LICENSE.md)
16
+ - [Source for @flighthq/audio@0.5.1-next.903.f434bc2](https://github.com/flighthq/flight/tree/f434bc233778d75aeea61995df3a8cfaec459a85/packages/audio)
17
+ - [License](https://github.com/flighthq/flight/blob/f434bc233778d75aeea61995df3a8cfaec459a85/LICENSE.md)
@@ -1,4 +1,5 @@
1
- export declare function canPlayAudioType(mimeType: string): boolean;
1
+ import type { HasMediaAudioCodec } from '@flighthq/types/contract';
2
+ export declare function canPlayAudioType(host: Readonly<HasMediaAudioCodec>, mimeType: string): boolean;
2
3
  export declare function detectAudioMimeType(data: ArrayBuffer | Uint8Array): string | null;
3
4
  export declare function getAudioMimeTypeEssence(mimeType: string): string;
4
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":"AAEA,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAG1D;AAKD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,IAAI,CAmCjF;AAKD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGhE;AAID,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAqBvF;AAID,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAoB7D"}
1
+ {"version":3,"file":"audioFormat.d.ts","sourceRoot":"","sources":["../src/audioFormat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAG9F;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"}
@@ -1,17 +1,12 @@
1
- import { getAudioBackend } from './audioBackend';
2
- export function canPlayAudioType(mimeType) {
1
+ export function canPlayAudioType(host, mimeType) {
3
2
  if (mimeType === '')
4
3
  return false;
5
- return getAudioBackend().canPlayType(mimeType);
4
+ return host.media.audioCodec.canPlayType(mimeType);
6
5
  }
7
- // Sniffs the container MIME type from a buffer's leading magic bytes, or null when unrecognized.
8
- // Mirrors detectImageMimeType. Covers wav, flac, ogg, mp3 (ID3 or MPEG frame sync), m4a/aac
9
- // (ISO-BMFF ftyp), and webm (EBML).
10
6
  export function detectAudioMimeType(data) {
11
7
  const b = data instanceof Uint8Array ? data : new Uint8Array(data);
12
8
  if (b.byteLength < 4)
13
9
  return null;
14
- // WAV: 'RIFF' (0-3) .... 'WAVE' (8-11)
15
10
  if (b.byteLength >= 12 &&
16
11
  b[0] === 0x52 &&
17
12
  b[1] === 0x49 &&
@@ -22,38 +17,26 @@ export function detectAudioMimeType(data) {
22
17
  b[10] === 0x56 &&
23
18
  b[11] === 0x45)
24
19
  return 'audio/wav';
25
- // FLAC: 'fLaC'
26
20
  if (b[0] === 0x66 && b[1] === 0x4c && b[2] === 0x61 && b[3] === 0x43)
27
21
  return 'audio/flac';
28
- // Ogg: 'OggS'
29
22
  if (b[0] === 0x4f && b[1] === 0x67 && b[2] === 0x67 && b[3] === 0x53)
30
23
  return 'audio/ogg';
31
- // MP3: 'ID3' tag prefix, or an MPEG audio frame sync (11 set bits: 0xFF followed by 0xE0-mask).
32
24
  if (b[0] === 0x49 && b[1] === 0x44 && b[2] === 0x33)
33
25
  return 'audio/mpeg';
34
26
  if (b[0] === 0xff && (b[1] & 0xe0) === 0xe0)
35
27
  return 'audio/mpeg';
36
- // M4A / AAC (ISO base media): a box-size prefix (0-3) followed by 'ftyp' (4-7).
37
28
  if (b.byteLength >= 8 && b[4] === 0x66 && b[5] === 0x74 && b[6] === 0x79 && b[7] === 0x70)
38
29
  return 'audio/mp4';
39
- // WebM / Matroska (EBML): 1A 45 DF A3
40
30
  if (b[0] === 0x1a && b[1] === 0x45 && b[2] === 0xdf && b[3] === 0xa3)
41
31
  return 'audio/webm';
42
32
  return null;
43
33
  }
44
- // Returns the type/subtype of a MIME string without its parameters, lowercased — `audio/vnd.adobe.swf-adpcm`
45
- // for `audio/vnd.adobe.swf-adpcm; rate=22050`. Decoders register against the essence so one registration
46
- // serves every parameter combination a container emits.
47
34
  export function getAudioMimeTypeEssence(mimeType) {
48
35
  const end = mimeType.indexOf(';');
49
36
  return (end === -1 ? mimeType : mimeType.slice(0, end)).trim().toLowerCase();
50
37
  }
51
- // Returns one MIME parameter's value, or null when the type does not carry it. This is how a decoder for a
52
- // container-less format reads the sample rate and channel count its bitstream does not encode.
53
38
  export function getAudioMimeTypeParameter(mimeType, name) {
54
39
  const wanted = name.toLowerCase();
55
- // Split on semicolons outside quotes: a quoted value may contain one, and treating that as a separator
56
- // would truncate the value and invent a parameter out of its tail.
57
40
  let start = -1;
58
41
  let quoted = false;
59
42
  for (let i = 0; i <= mimeType.length; i++) {
@@ -74,8 +57,6 @@ export function getAudioMimeTypeParameter(mimeType, name) {
74
57
  }
75
58
  return null;
76
59
  }
77
- // Infers the MIME type from a URL's file extension, or null when unrecognized. Extension-based; use
78
- // detectAudioMimeType when the bytes are in hand.
79
60
  export function inferAudioMimeType(url) {
80
61
  const ext = url.split('?')[0].split('.').pop()?.toLowerCase();
81
62
  switch (ext) {
@@ -1 +1 @@
1
- {"version":3,"file":"audioFormat.js","sourceRoot":"","sources":["../src/audioFormat.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audioFormat.js","sourceRoot":"","sources":["../src/audioFormat.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAAC,IAAkC,EAAE,QAAgB;IACnF,IAAI,QAAQ,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IAClC,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAA8B;IAChE,MAAM,CAAC,GAAG,IAAI,YAAY,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IACnE,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAElC,IACE,CAAC,CAAC,UAAU,IAAI,EAAE;QAClB,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;QACb,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;QACb,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;QACb,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;QACb,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;QACb,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;QACb,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI;QACd,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI;QAEd,OAAO,WAAW,CAAC;IAErB,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,YAAY,CAAC;IAE1F,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,WAAW,CAAC;IAEzF,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,YAAY,CAAC;IACzE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,YAAY,CAAC;IAEjE,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,WAAW,CAAC;IAE9G,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,YAAY,CAAC;IAE1F,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,QAAgB;IACtD,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,QAAgB,EAAE,IAAY;IACtE,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAClC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;IACf,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,SAAS,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC1D,IAAI,SAAS,KAAK,GAAG;YAAE,MAAM,GAAG,CAAC,MAAM,CAAC;QACxC,IAAI,MAAM,IAAI,SAAS,KAAK,GAAG;YAAE,SAAS;QAC1C,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACf,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACtC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,SAAS,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;gBAC/E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC/C,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACxG,CAAC;QACH,CAAC;QACD,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC;IAC9D,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,KAAK;YACR,OAAO,YAAY,CAAC;QACtB,KAAK,KAAK;YACR,OAAO,WAAW,CAAC;QACrB,KAAK,KAAK;YACR,OAAO,WAAW,CAAC;QACrB,KAAK,KAAK;YACR,OAAO,WAAW,CAAC;QACrB,KAAK,MAAM;YACT,OAAO,YAAY,CAAC;QACtB,KAAK,MAAM;YACT,OAAO,YAAY,CAAC;QACtB,KAAK,KAAK;YACR,OAAO,WAAW,CAAC;QACrB;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { AudioResource } from '@flighthq/types/contract';
1
+ import type { AudioResource, EntityConstruction } from '@flighthq/types/contract';
2
2
  export declare function cloneAudioResource(resource: Readonly<AudioResource>): AudioResource;
3
3
  export declare function createAudioResource(buffer?: AudioBuffer): AudioResource;
4
4
  export declare function disposeAudioResource(resource: AudioResource): void;
@@ -8,5 +8,6 @@ export declare function getAudioResourceChannelData(resource: Readonly<AudioReso
8
8
  export declare function getAudioResourceDuration(resource: Readonly<AudioResource>): number;
9
9
  export declare function getAudioResourceSampleRate(resource: Readonly<AudioResource>): number;
10
10
  export declare function hasAudioResourceBuffer(resource: Readonly<AudioResource>): boolean;
11
+ export declare function initializeAudioResource(out: EntityConstruction<AudioResource>, buffer?: AudioBuffer): void;
11
12
  export declare function isAudioResourceEmpty(resource: Readonly<AudioResource>): boolean;
12
13
  //# sourceMappingURL=audioResource.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"audioResource.d.ts","sourceRoot":"","sources":["../src/audioResource.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAM9D,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,aAAa,CAEnF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,aAAa,CAEvE;AAID,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAElE;AAID,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,MAAM,CAGlF;AAED,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,MAAM,CAEtF;AAKD,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAInH;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,MAAM,CAElF;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,MAAM,CAEpF;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,OAAO,CAEjF;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,OAAO,CAE/E"}
1
+ {"version":3,"file":"audioResource.d.ts","sourceRoot":"","sources":["../src/audioResource.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAMlF,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,aAAa,CAInF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,aAAa,CAIvE;AAID,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAElE;AAID,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,MAAM,CAGlF;AAED,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,MAAM,CAEtF;AAKD,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAInH;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,MAAM,CAElF;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,MAAM,CAEpF;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,OAAO,CAEjF;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,kBAAkB,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAE1G;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,OAAO,CAE/E"}
@@ -1,13 +1,17 @@
1
- import { createEntity } from '@flighthq/entity/contract';
1
+ import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
2
2
  // Allocates a new resource identity over the SAME underlying AudioBuffer. The buffer is shared by
3
3
  // reference, not duplicated — clone gives an independent resource object over the same decoded PCM,
4
4
  // e.g. to hand one decoded sound to two playback subsystems. Use createAudioResourceFromSamples with
5
5
  // copied channel data when you need the samples themselves duplicated.
6
6
  export function cloneAudioResource(resource) {
7
- return createEntity({ buffer: resource.buffer });
7
+ const out = allocateEntity();
8
+ out.buffer = resource.buffer;
9
+ return finishEntity(out);
8
10
  }
9
11
  export function createAudioResource(buffer) {
10
- return createEntity({ buffer: buffer ?? null });
12
+ const out = allocateEntity();
13
+ initializeAudioResource(out, buffer);
14
+ return finishEntity(out);
11
15
  }
12
16
  // Releases the decoded AudioBuffer reference so it becomes eligible for GC. The AudioBuffer is plain
13
17
  // GC-managed memory with no GPU/native handle to free, so this is dispose*, not destroy*.
@@ -41,6 +45,9 @@ export function getAudioResourceSampleRate(resource) {
41
45
  export function hasAudioResourceBuffer(resource) {
42
46
  return resource.buffer !== null;
43
47
  }
48
+ export function initializeAudioResource(out, buffer) {
49
+ out.buffer = buffer ?? null;
50
+ }
44
51
  export function isAudioResourceEmpty(resource) {
45
52
  return resource.buffer === null || resource.buffer.length === 0;
46
53
  }
@@ -1 +1 @@
1
- {"version":3,"file":"audioResource.js","sourceRoot":"","sources":["../src/audioResource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,kGAAkG;AAClG,oGAAoG;AACpG,qGAAqG;AACrG,uEAAuE;AACvE,MAAM,UAAU,kBAAkB,CAAC,QAAiC;IAClE,OAAO,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAoB;IACtD,OAAO,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,qGAAqG;AACrG,0FAA0F;AAC1F,MAAM,UAAU,oBAAoB,CAAC,QAAuB;IAC1D,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC;AACzB,CAAC;AAED,oGAAoG;AACpG,kFAAkF;AAClF,MAAM,UAAU,wBAAwB,CAAC,QAAiC;IACxE,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC/B,OAAO,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,QAAiC;IAC5E,OAAO,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,qGAAqG;AACrG,iGAAiG;AACjG,uCAAuC;AACvC,MAAM,UAAU,2BAA2B,CAAC,QAAiC,EAAE,OAAe;IAC5F,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC/B,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO,IAAI,MAAM,CAAC,gBAAgB;QAAE,OAAO,IAAI,CAAC;IACtF,OAAO,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,QAAiC;IACxE,OAAO,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,QAAiC;IAC1E,OAAO,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAAiC;IACtE,OAAO,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAiC;IACpE,OAAO,QAAQ,CAAC,MAAM,KAAK,IAAI,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;AAClE,CAAC"}
1
+ {"version":3,"file":"audioResource.js","sourceRoot":"","sources":["../src/audioResource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzE,kGAAkG;AAClG,oGAAoG;AACpG,qGAAqG;AACrG,uEAAuE;AACvE,MAAM,UAAU,kBAAkB,CAAC,QAAiC;IAClE,MAAM,GAAG,GAAG,cAAc,EAAiB,CAAC;IAC5C,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC7B,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAoB;IACtD,MAAM,GAAG,GAAG,cAAc,EAAiB,CAAC;IAC5C,uBAAuB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACrC,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,qGAAqG;AACrG,0FAA0F;AAC1F,MAAM,UAAU,oBAAoB,CAAC,QAAuB;IAC1D,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC;AACzB,CAAC;AAED,oGAAoG;AACpG,kFAAkF;AAClF,MAAM,UAAU,wBAAwB,CAAC,QAAiC;IACxE,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC/B,OAAO,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,QAAiC;IAC5E,OAAO,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,qGAAqG;AACrG,iGAAiG;AACjG,uCAAuC;AACvC,MAAM,UAAU,2BAA2B,CAAC,QAAiC,EAAE,OAAe;IAC5F,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC/B,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO,IAAI,MAAM,CAAC,gBAAgB;QAAE,OAAO,IAAI,CAAC;IACtF,OAAO,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,QAAiC;IACxE,OAAO,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,QAAiC;IAC1E,OAAO,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAAiC;IACtE,OAAO,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAsC,EAAE,MAAoB;IAClG,GAAG,CAAC,MAAM,GAAG,MAAM,IAAI,IAAI,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAiC;IACpE,OAAO,QAAQ,CAAC,MAAM,KAAK,IAAI,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;AAClE,CAAC"}
@@ -1,9 +1,9 @@
1
- import type { AudioResource, AudioResourceUrl, HasNetHttp } from '@flighthq/types/contract';
1
+ import type { AudioResource, AudioResourceUrl, HasMediaAudioCodec, HasNetHttp } 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
6
  export declare function loadAudioResourceFromUrl(host: HasNetHttp, context: AudioContext, url: string, signal?: AbortSignal): Promise<AudioResource>;
7
- export declare function loadAudioResourceFromUrls(host: HasNetHttp, context: AudioContext, sources: readonly AudioResourceUrl[], signal?: AbortSignal): Promise<AudioResource>;
8
- export declare function selectAudioResourceUrl(sources: readonly AudioResourceUrl[]): string | null;
7
+ export declare function loadAudioResourceFromUrls(host: HasNetHttp & HasMediaAudioCodec, context: AudioContext, sources: readonly AudioResourceUrl[], signal?: AbortSignal): Promise<AudioResource>;
8
+ export declare function selectAudioResourceUrl(host: Readonly<HasMediaAudioCodec>, 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,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAS5F,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa,CAUnH;AAID,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;AAKD,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,CAWxB;AAED,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,YAAY,EACrB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,aAAa,CAAC,CAYxB;AAED,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,SAAS,gBAAgB,EAAE,EACpC,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,aAAa,CAAC,CAIxB;AAID,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,GAAG,MAAM,GAAG,IAAI,CAM1F"}
1
+ {"version":3,"file":"audioResourceFrom.d.ts","sourceRoot":"","sources":["../src/audioResourceFrom.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAShH,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa,CAUnH;AAID,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;AAKD,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,CAWxB;AAED,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,YAAY,EACrB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,aAAa,CAAC,CAYxB;AAED,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,UAAU,GAAG,kBAAkB,EACrC,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,SAAS,gBAAgB,EAAE,EACpC,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,aAAa,CAAC,CAIxB;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAClC,OAAO,EAAE,SAAS,gBAAgB,EAAE,GACnC,MAAM,GAAG,IAAI,CAMf"}
@@ -57,17 +57,15 @@ export async function loadAudioResourceFromUrl(host, context, url, signal) {
57
57
  return loadAudioResourceFromBytes(context, new Uint8Array(response.body), response.headers['content-type'], signal);
58
58
  }
59
59
  export async function loadAudioResourceFromUrls(host, context, sources, signal) {
60
- const selected = selectAudioResourceUrl(sources);
60
+ const selected = selectAudioResourceUrl(host, sources);
61
61
  if (selected === null)
62
62
  return createAudioResource();
63
63
  return loadAudioResourceFromUrl(host, context, selected, signal);
64
64
  }
65
- // Picks the first source URL the environment can play, or null when none is playable. A source's
66
- // explicit `type` wins; otherwise the MIME type is inferred from the URL extension.
67
- export function selectAudioResourceUrl(sources) {
65
+ export function selectAudioResourceUrl(host, sources) {
68
66
  for (const source of sources) {
69
67
  const type = source.type ?? inferAudioMimeType(source.url) ?? '';
70
- if (canPlayAudioType(type))
68
+ if (canPlayAudioType(host, type))
71
69
  return source.url;
72
70
  }
73
71
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"audioResourceFrom.js","sourceRoot":"","sources":["../src/audioResourceFrom.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audioResourceFrom.js","sourceRoot":"","sources":["../src/audioResourceFrom.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,11 @@
1
- import type { AudioResource, AudioResourceFailure, AudioResourceFetch, AudioResourceReference, AudioResourceReferenceResolutionExplanation, EmbeddedAudioResourceReference, ExternalAudioResourceReference } from '@flighthq/types/contract';
1
+ import type { AudioResource, AudioResourceFailure, AudioResourceFetch, AudioResourceReference, AudioResourceReferenceResolutionExplanation, EmbeddedAudioResourceReference, EntityConstruction, ExternalAudioResourceReference } from '@flighthq/types/contract';
2
2
  export declare function createAudioResourceFailure(cause: unknown): AudioResourceFailure;
3
3
  export declare function createEmbeddedAudioResourceReference(bytes: Uint8Array, mimeType?: string | null, name?: string | null): EmbeddedAudioResourceReference;
4
4
  export declare function createExternalAudioResourceReference(uri: string, basePath?: string | null, mimeType?: string | null, name?: string | null): ExternalAudioResourceReference;
5
5
  export declare function explainAudioResourceReferenceResolution(ref: Readonly<AudioResourceReference>): AudioResourceReferenceResolutionExplanation;
6
6
  export declare function findAudioResourceReferenceByName(references: readonly Readonly<AudioResourceReference>[], name: string): Readonly<AudioResourceReference> | null;
7
+ export declare function initializeEmbeddedAudioResourceReference(out: EntityConstruction<EmbeddedAudioResourceReference>, bytes: Uint8Array, mimeType?: string | null, name?: string | null): void;
8
+ export declare function initializeExternalAudioResourceReference(out: EntityConstruction<ExternalAudioResourceReference>, uri: string, basePath?: string | null, mimeType?: string | null, name?: string | null): void;
7
9
  export declare function resetFailedAudioResourceReference(ref: AudioResourceReference): boolean;
8
10
  export declare function resolveAudioResourceReference(ref: AudioResourceReference, context: AudioContext | null, fetch: AudioResourceFetch, signal: AbortSignal): Promise<AudioResource | null>;
9
11
  //# sourceMappingURL=audioResourceReference.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"audioResourceReference.d.ts","sourceRoot":"","sources":["../src/audioResourceReference.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,EACtB,2CAA2C,EAC3C,8BAA8B,EAC9B,8BAA8B,EAC/B,MAAM,0BAA0B,CAAC;AAalC,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CAK/E;AAMD,wBAAgB,oCAAoC,CAClD,KAAK,EAAE,UAAU,EACjB,QAAQ,GAAE,MAAM,GAAG,IAAW,EAC9B,IAAI,GAAE,MAAM,GAAG,IAAW,GACzB,8BAA8B,CAUhC;AAED,wBAAgB,oCAAoC,CAClD,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAAM,GAAG,IAAW,EAC9B,QAAQ,GAAE,MAAM,GAAG,IAAW,EAC9B,IAAI,GAAE,MAAM,GAAG,IAAW,GACzB,8BAA8B,CAWhC;AAID,wBAAgB,uCAAuC,CACrD,GAAG,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GACpC,2CAA2C,CAO7C;AAKD,wBAAgB,gCAAgC,CAC9C,UAAU,EAAE,SAAS,QAAQ,CAAC,sBAAsB,CAAC,EAAE,EACvD,IAAI,EAAE,MAAM,GACX,QAAQ,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAKzC;AAID,wBAAgB,iCAAiC,CAAC,GAAG,EAAE,sBAAsB,GAAG,OAAO,CAKtF;AAUD,wBAAsB,6BAA6B,CACjD,GAAG,EAAE,sBAAsB,EAC3B,OAAO,EAAE,YAAY,GAAG,IAAI,EAC5B,KAAK,EAAE,kBAAkB,EACzB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA+B/B"}
1
+ {"version":3,"file":"audioResourceReference.d.ts","sourceRoot":"","sources":["../src/audioResourceReference.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,EACtB,2CAA2C,EAC3C,8BAA8B,EAC9B,kBAAkB,EAClB,8BAA8B,EAC/B,MAAM,0BAA0B,CAAC;AAalC,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CAa/E;AAED,wBAAgB,oCAAoC,CAClD,KAAK,EAAE,UAAU,EACjB,QAAQ,GAAE,MAAM,GAAG,IAAW,EAC9B,IAAI,GAAE,MAAM,GAAG,IAAW,GACzB,8BAA8B,CAIhC;AAED,wBAAgB,oCAAoC,CAClD,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAAM,GAAG,IAAW,EAC9B,QAAQ,GAAE,MAAM,GAAG,IAAW,EAC9B,IAAI,GAAE,MAAM,GAAG,IAAW,GACzB,8BAA8B,CAIhC;AAID,wBAAgB,uCAAuC,CACrD,GAAG,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GACpC,2CAA2C,CAO7C;AAKD,wBAAgB,gCAAgC,CAC9C,UAAU,EAAE,SAAS,QAAQ,CAAC,sBAAsB,CAAC,EAAE,EACvD,IAAI,EAAE,MAAM,GACX,QAAQ,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAKzC;AAMD,wBAAgB,wCAAwC,CACtD,GAAG,EAAE,kBAAkB,CAAC,8BAA8B,CAAC,EACvD,KAAK,EAAE,UAAU,EACjB,QAAQ,GAAE,MAAM,GAAG,IAAW,EAC9B,IAAI,GAAE,MAAM,GAAG,IAAW,GACzB,IAAI,CAQN;AAED,wBAAgB,wCAAwC,CACtD,GAAG,EAAE,kBAAkB,CAAC,8BAA8B,CAAC,EACvD,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAAM,GAAG,IAAW,EAC9B,QAAQ,GAAE,MAAM,GAAG,IAAW,EAC9B,IAAI,GAAE,MAAM,GAAG,IAAW,GACzB,IAAI,CASN;AAID,wBAAgB,iCAAiC,CAAC,GAAG,EAAE,sBAAsB,GAAG,OAAO,CAKtF;AAUD,wBAAsB,6BAA6B,CACjD,GAAG,EAAE,sBAAsB,EAC3B,OAAO,EAAE,YAAY,GAAG,IAAI,EAC5B,KAAK,EAAE,kBAAkB,EACzB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAiC/B"}
@@ -1,4 +1,4 @@
1
- import { createEntity } from '@flighthq/entity/contract';
1
+ import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
2
2
  import { AudioResourceFailureKind, AudioResourceReferenceKind, ResourceResolutionState, } from '@flighthq/types/contract';
3
3
  import { getAudioDecoder } from './audioDecoderRegistry';
4
4
  import { createAudioResource } from './audioResource';
@@ -7,36 +7,27 @@ import { loadAudioResourceFromBytes } from './audioResourceFrom';
7
7
  // arbitrary thrown values stay inside the resolving operation; diagnostics get category, name, and message.
8
8
  export function createAudioResourceFailure(cause) {
9
9
  if (cause instanceof Error) {
10
- return createEntity({ kind: AudioResourceFailureKind.Error, message: cause.message, name: cause.name });
10
+ const out = allocateEntity();
11
+ out.kind = AudioResourceFailureKind.Error;
12
+ out.message = cause.message;
13
+ out.name = cause.name;
14
+ return finishEntity(out);
11
15
  }
12
- return createEntity({ kind: AudioResourceFailureKind.Error, message: String(cause), name: null });
16
+ const out = allocateEntity();
17
+ out.kind = AudioResourceFailureKind.Error;
18
+ out.message = String(cause);
19
+ out.name = null;
20
+ return finishEntity(out);
13
21
  }
14
- // `bytes` is retained as the view the container handed over, not a copy: a parser carves a sound payload
15
- // out of its source and the reference borrows it, so a document that never resolves a sound never pays for
16
- // its samples. The `resource` is allocated here rather than by the caller, because a trigger has to have
17
- // something to bind to before anything decodes.
18
22
  export function createEmbeddedAudioResourceReference(bytes, mimeType = null, name = null) {
19
- return createEntity({
20
- bytes,
21
- failure: null,
22
- kind: AudioResourceReferenceKind.Embedded,
23
- mimeType,
24
- name,
25
- resource: createAudioResource(),
26
- state: ResourceResolutionState.Unresolved,
27
- });
23
+ const out = allocateEntity();
24
+ initializeEmbeddedAudioResourceReference(out, bytes, mimeType, name);
25
+ return finishEntity(out);
28
26
  }
29
27
  export function createExternalAudioResourceReference(uri, basePath = null, mimeType = null, name = null) {
30
- return createEntity({
31
- basePath,
32
- failure: null,
33
- kind: AudioResourceReferenceKind.External,
34
- mimeType,
35
- name,
36
- resource: createAudioResource(),
37
- state: ResourceResolutionState.Unresolved,
38
- uri,
39
- });
28
+ const out = allocateEntity();
29
+ initializeExternalAudioResourceReference(out, uri, basePath, mimeType, name);
30
+ return finishEntity(out);
40
31
  }
41
32
  // Returns a detached plain-data explanation suitable for logs, tools, and serialization. It never throws
42
33
  // and exposes no resolver runtime or raw thrown value.
@@ -58,6 +49,29 @@ export function findAudioResourceReferenceByName(references, name) {
58
49
  }
59
50
  return null;
60
51
  }
52
+ // `bytes` is retained as the view the container handed over, not a copy: a parser carves a sound payload
53
+ // out of its source and the reference borrows it, so a document that never resolves a sound never pays for
54
+ // its samples. The `resource` is allocated here rather than by the caller, because a trigger has to have
55
+ // something to bind to before anything decodes.
56
+ export function initializeEmbeddedAudioResourceReference(out, bytes, mimeType = null, name = null) {
57
+ out.bytes = bytes;
58
+ out.failure = null;
59
+ out.kind = AudioResourceReferenceKind.Embedded;
60
+ out.mimeType = mimeType;
61
+ out.name = name;
62
+ out.resource = createAudioResource();
63
+ out.state = ResourceResolutionState.Unresolved;
64
+ }
65
+ export function initializeExternalAudioResourceReference(out, uri, basePath = null, mimeType = null, name = null) {
66
+ out.basePath = basePath;
67
+ out.failure = null;
68
+ out.kind = AudioResourceReferenceKind.External;
69
+ out.mimeType = mimeType;
70
+ out.name = name;
71
+ out.resource = createAudioResource();
72
+ out.state = ResourceResolutionState.Unresolved;
73
+ out.uri = uri;
74
+ }
61
75
  // Returns a failed reference to the requestable state. Loading/resolved/unresolved references are unchanged
62
76
  // so this atom cannot invalidate live work or a successfully bound resource accidentally.
63
77
  export function resetFailedAudioResourceReference(ref) {
@@ -83,11 +97,13 @@ export async function resolveAudioResourceReference(ref, context, fetch, signal)
83
97
  ? await decodeAudioResourceBytes(ref, context, signal)
84
98
  : await fetch(ref, signal);
85
99
  if (decoded === null || decoded.buffer === null) {
86
- ref.failure = createEntity({
87
- kind: AudioResourceFailureKind.Unavailable,
88
- message: 'Audio resource unavailable',
89
- name: null,
90
- });
100
+ ref.failure = (() => {
101
+ const out = allocateEntity();
102
+ out.kind = AudioResourceFailureKind.Unavailable;
103
+ out.message = 'Audio resource unavailable';
104
+ out.name = null;
105
+ return finishEntity(out);
106
+ })();
91
107
  ref.state = ResourceResolutionState.Failed;
92
108
  return null;
93
109
  }
@@ -1 +1 @@
1
- {"version":3,"file":"audioResourceReference.js","sourceRoot":"","sources":["../src/audioResourceReference.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audioResourceReference.js","sourceRoot":"","sources":["../src/audioResourceReference.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
- export * from './audioBackend';
2
1
  export * from './audioDecoderRegistry';
3
2
  export * from './audioFormat';
4
3
  export * from './audioResource';
5
4
  export * from './audioResourceReference';
6
5
  export * from './audioResourceFrom';
6
+ export { initializeAudioResource } from './audioResource';
7
+ export { initializeEmbeddedAudioResourceReference, initializeExternalAudioResourceReference, } from './audioResourceReference';
7
8
  //# sourceMappingURL=contract.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EACL,wCAAwC,EACxC,wCAAwC,GACzC,MAAM,0BAA0B,CAAC"}
package/dist/contract.js CHANGED
@@ -1,7 +1,8 @@
1
- export * from './audioBackend';
2
1
  export * from './audioDecoderRegistry';
3
2
  export * from './audioFormat';
4
3
  export * from './audioResource';
5
4
  export * from './audioResourceReference';
6
5
  export * from './audioResourceFrom';
6
+ export { initializeAudioResource } from './audioResource';
7
+ export { initializeEmbeddedAudioResourceReference, initializeExternalAudioResourceReference, } from './audioResourceReference';
7
8
  //# sourceMappingURL=contract.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EACL,wCAAwC,EACxC,wCAAwC,GACzC,MAAM,0BAA0B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flighthq/audio",
3
- "version": "0.5.1-next.815.cc08b93",
3
+ "version": "0.5.1-next.903.f434bc2",
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.815.cc08b93",
42
- "@flighthq/net": "0.5.1-next.815.cc08b93",
43
- "@flighthq/types": "0.5.1-next.815.cc08b93"
41
+ "@flighthq/entity": "0.5.1-next.903.f434bc2",
42
+ "@flighthq/net": "0.5.1-next.903.f434bc2",
43
+ "@flighthq/types": "0.5.1-next.903.f434bc2"
44
44
  },
45
45
  "devDependencies": {
46
46
  "typescript": "^5.3.0"
@@ -1,4 +1,6 @@
1
- import { resetAudioBackendForTest, setAudioBackend } from './audioBackend';
1
+ import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
2
+ import type { AudioBackend, Entity, HasMediaAudioCodec } from '@flighthq/types/contract';
3
+
2
4
  import {
3
5
  canPlayAudioType,
4
6
  detectAudioMimeType,
@@ -7,30 +9,31 @@ import {
7
9
  inferAudioMimeType,
8
10
  } from './audioFormat';
9
11
 
10
- describe('canPlayAudioType', () => {
11
- beforeEach(() => {
12
- setAudioBackend(createEntity({ canPlayType: (type: string) => type === 'audio/mpeg' }));
13
- });
12
+ function hostWith(canPlay: (type: string) => boolean): HasMediaAudioCodec {
13
+ return {
14
+ media: {
15
+ audioCodec: (() => {
16
+ const out = allocateEntity<any>();
17
+ out.canPlayType = canPlay;
18
+ return finishEntity(out);
19
+ })(),
20
+ },
21
+ } as HasMediaAudioCodec;
22
+ }
14
23
 
15
- afterEach(() => {
16
- resetAudioBackendForTest();
17
- });
24
+ describe('canPlayAudioType', () => {
25
+ const host = hostWith((type) => type === 'audio/mpeg');
18
26
 
19
27
  it('returns false for the empty string without probing', () => {
20
- expect(canPlayAudioType('')).toBe(false);
28
+ expect(canPlayAudioType(host, '')).toBe(false);
21
29
  });
22
30
 
23
31
  it('returns true for a type the backend reports as playable', () => {
24
- expect(canPlayAudioType('audio/mpeg')).toBe(true);
32
+ expect(canPlayAudioType(host, 'audio/mpeg')).toBe(true);
25
33
  });
26
34
 
27
35
  it('returns false for a type the backend cannot play', () => {
28
- expect(canPlayAudioType('audio/x-unknown')).toBe(false);
29
- });
30
-
31
- it('returns false when no backend is installed (sentinel)', () => {
32
- resetAudioBackendForTest();
33
- expect(canPlayAudioType('audio/mpeg')).toBe(false);
36
+ expect(canPlayAudioType(host, 'audio/x-unknown')).toBe(false);
34
37
  });
35
38
  });
36
39
 
@@ -159,4 +162,3 @@ describe('inferAudioMimeType', () => {
159
162
  expect(inferAudioMimeType('audio')).toBeNull();
160
163
  });
161
164
  });
162
- import { createEntity } from '@flighthq/entity/contract';
@@ -1,7 +1,6 @@
1
- import { createEntity } from '@flighthq/entity/contract';
2
- import type { HasNetHttp, NetBackend } from '@flighthq/types/contract';
1
+ import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
2
+ import type { AudioBackend, Entity, HasMediaAudioCodec, HasNetHttp, NetBackend } from '@flighthq/types/contract';
3
3
 
4
- import { resetAudioBackendForTest, setAudioBackend } from './audioBackend';
5
4
  import {
6
5
  createAudioResourceFromSamples,
7
6
  loadAudioResourceFromBase64,
@@ -12,18 +11,38 @@ import {
12
11
  selectAudioResourceUrl,
13
12
  } from './audioResourceFrom';
14
13
 
14
+ function fakeAudioCodecHost(canPlay: (type: string) => boolean): HasMediaAudioCodec {
15
+ const out = allocateEntity<any>();
16
+ out.canPlayType = canPlay;
17
+ return {
18
+ media: {
19
+ audioCodec: finishEntity(out),
20
+ },
21
+ } as HasMediaAudioCodec;
22
+ }
23
+
15
24
  function fakeNetHost(backend?: Pick<NetBackend, 'sendNetRequest'>): HasNetHttp {
25
+ const out = allocateEntity<NetBackend>();
26
+ Object.assign(
27
+ out,
28
+ backend ?? {
29
+ sendNetRequest: async () => ({ status: 200, statusText: 'OK', ok: true, headers: {}, body: null, url: '' }),
30
+ },
31
+ );
16
32
  return {
17
33
  net: {
18
- http: createEntity(
19
- backend ?? {
20
- sendNetRequest: async () => ({ status: 200, statusText: 'OK', ok: true, headers: {}, body: null, url: '' }),
21
- },
22
- ),
34
+ http: finishEntity(out),
23
35
  },
24
36
  };
25
37
  }
26
38
 
39
+ function fakeNetAudioHost(
40
+ canPlay: (type: string) => boolean,
41
+ backend?: Pick<NetBackend, 'sendNetRequest'>,
42
+ ): HasNetHttp & HasMediaAudioCodec {
43
+ return { ...fakeNetHost(backend), ...fakeAudioCodecHost(canPlay) };
44
+ }
45
+
27
46
  const decodedBuffer = { duration: 1 } as AudioBuffer;
28
47
 
29
48
  const mockContext = {
@@ -71,7 +90,6 @@ beforeEach(() => {
71
90
  });
72
91
 
73
92
  afterEach(() => {
74
- resetAudioBackendForTest();
75
93
  vi.unstubAllGlobals();
76
94
  vi.restoreAllMocks();
77
95
  (mockContext.decodeAudioData as ReturnType<typeof vi.fn>).mockClear();
@@ -267,13 +285,12 @@ describe('loadAudioResourceFromUrl', () => {
267
285
 
268
286
  describe('loadAudioResourceFromUrls', () => {
269
287
  it('resolves with a null-buffer resource when sources is empty', async () => {
270
- const host = fakeNetHost();
288
+ const host = fakeNetAudioHost(() => false);
271
289
  const resource = await loadAudioResourceFromUrls(host, mockContext, []);
272
290
  expect(resource.buffer).toBeNull();
273
291
  });
274
292
 
275
293
  it('loads the first playable source', async () => {
276
- setAudioBackend(createEntity({ canPlayType: (type: string) => type === 'audio/ogg' }));
277
294
  const mockSendNetRequest = vi.fn().mockResolvedValue({
278
295
  body: new ArrayBuffer(8),
279
296
  headers: { 'content-type': 'audio/ogg' },
@@ -282,7 +299,7 @@ describe('loadAudioResourceFromUrls', () => {
282
299
  statusText: 'OK',
283
300
  url: 'sound.ogg',
284
301
  });
285
- const host = fakeNetHost({ sendNetRequest: mockSendNetRequest });
302
+ const host = fakeNetAudioHost((type) => type === 'audio/ogg', { sendNetRequest: mockSendNetRequest });
286
303
 
287
304
  const resource = await loadAudioResourceFromUrls(host, mockContext, [{ url: 'sound.mp3' }, { url: 'sound.ogg' }]);
288
305
 
@@ -295,19 +312,17 @@ describe('loadAudioResourceFromUrls', () => {
295
312
  });
296
313
 
297
314
  describe('selectAudioResourceUrl', () => {
298
- beforeEach(() => {
299
- setAudioBackend(createEntity({ canPlayType: (type: string) => type === 'audio/ogg' }));
300
- });
315
+ const host = fakeAudioCodecHost((type) => type === 'audio/ogg');
301
316
 
302
317
  it('returns the first source whose inferred type is playable', () => {
303
- expect(selectAudioResourceUrl([{ url: 'a.mp3' }, { url: 'b.ogg' }])).toBe('b.ogg');
318
+ expect(selectAudioResourceUrl(host, [{ url: 'a.mp3' }, { url: 'b.ogg' }])).toBe('b.ogg');
304
319
  });
305
320
 
306
321
  it('honours an explicit type over the URL extension', () => {
307
- expect(selectAudioResourceUrl([{ type: 'audio/ogg', url: 'stream' }])).toBe('stream');
322
+ expect(selectAudioResourceUrl(host, [{ type: 'audio/ogg', url: 'stream' }])).toBe('stream');
308
323
  });
309
324
 
310
325
  it('returns null when no source is playable', () => {
311
- expect(selectAudioResourceUrl([{ url: 'a.mp3' }, { url: 'b.wav' }])).toBeNull();
326
+ expect(selectAudioResourceUrl(host, [{ url: 'a.mp3' }, { url: 'b.wav' }])).toBeNull();
312
327
  });
313
328
  });
@@ -1,4 +1,4 @@
1
- import { createEntity } from '@flighthq/entity/contract';
1
+ import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
2
2
  import type { AudioDecoder, AudioResourceFetch } from '@flighthq/types/contract';
3
3
  import { EntityRuntimeKey, ResourceResolutionState } from '@flighthq/types/contract';
4
4
 
@@ -94,12 +94,16 @@ describe('explainAudioResourceReferenceResolution', () => {
94
94
  it('detaches the failure so a caller cannot mutate the reference through it', () => {
95
95
  const reference = createEmbeddedAudioResourceReference(new Uint8Array([1]));
96
96
  reference.state = ResourceResolutionState.Failed;
97
- reference.failure = createEntity({ kind: 'Error' as const, message: 'boom', name: null });
97
+ const _entity = allocateEntity<any>();
98
+ _entity.kind = 'Error' as const;
99
+ _entity.message = 'boom';
100
+ _entity.name = null;
101
+ reference.failure = finishEntity(_entity);
98
102
  const explanation = explainAudioResourceReferenceResolution(reference);
99
103
  expect(explanation.retryable).toBe(true);
100
104
  expect(explanation.failure).not.toBe(reference.failure);
101
105
  explanation.failure!.message = 'changed';
102
- expect(reference.failure.message).toBe('boom');
106
+ expect(reference.failure!.message).toBe('boom');
103
107
  });
104
108
  });
105
109
 
@@ -121,7 +125,11 @@ describe('resetFailedAudioResourceReference', () => {
121
125
  it('returns a failed reference to unresolved', () => {
122
126
  const reference = createEmbeddedAudioResourceReference(new Uint8Array([1]));
123
127
  reference.state = ResourceResolutionState.Failed;
124
- reference.failure = createEntity({ kind: 'Error' as const, message: 'boom', name: null });
128
+ const _entity = allocateEntity<any>();
129
+ _entity.kind = 'Error' as const;
130
+ _entity.message = 'boom';
131
+ _entity.name = null;
132
+ reference.failure = finishEntity(_entity);
125
133
  expect(resetFailedAudioResourceReference(reference)).toBe(true);
126
134
  expect(reference.state).toBe(ResourceResolutionState.Unresolved);
127
135
  expect(reference.failure).toBeNull();
@@ -1,9 +0,0 @@
1
- import type { AudioBackend, BackendExplanation } from '@flighthq/types/contract';
2
- export declare function createWebAudioBackend(): AudioBackend;
3
- export declare function explainAudioBackend(): BackendExplanation;
4
- export declare function getAudioBackend(): AudioBackend;
5
- export declare function installAudioHostBackend(backend: AudioBackend): void;
6
- export declare function observeAudioHostResult(operation: string, succeeded: boolean): void;
7
- export declare function resetAudioBackendForTest(): void;
8
- export declare function setAudioBackend(backend: AudioBackend | null): void;
9
- //# sourceMappingURL=audioBackend.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"audioBackend.d.ts","sourceRoot":"","sources":["../src/audioBackend.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAU,MAAM,0BAA0B,CAAC;AAEzF,wBAAgB,qBAAqB,IAAI,YAAY,CAMpD;AAED,wBAAgB,mBAAmB,IAAI,kBAAkB,CAaxD;AAED,wBAAgB,eAAe,IAAI,YAAY,CAE9C;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAMnE;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI,CAKlF;AAED,wBAAgB,wBAAwB,IAAI,IAAI,CAK/C;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAElE"}
@@ -1,58 +0,0 @@
1
- import { createEntity } from '@flighthq/entity/contract';
2
- export function createWebAudioBackend() {
3
- return createEntity({
4
- canPlayType(mimeType) {
5
- return new Audio().canPlayType(mimeType) !== '';
6
- },
7
- });
8
- }
9
- export function explainAudioBackend() {
10
- if (_custom !== null) {
11
- return { conflict: _hostConflict, layer: 'custom', operation: null, viability: 'unobserved' };
12
- }
13
- if (_host !== null) {
14
- return {
15
- conflict: _hostConflict,
16
- layer: 'host',
17
- operation: _hostObservation !== null ? _hostObservation.operation : null,
18
- viability: _hostObservation !== null ? _hostObservation.viability : 'unobserved',
19
- };
20
- }
21
- return { conflict: false, layer: 'host-not-enabled', operation: null, viability: 'unobserved' };
22
- }
23
- export function getAudioBackend() {
24
- return _custom ?? _host ?? _sentinel;
25
- }
26
- export function installAudioHostBackend(backend) {
27
- if (_host !== null) {
28
- if (_host !== backend)
29
- _hostConflict = true;
30
- return;
31
- }
32
- _host = backend;
33
- }
34
- export function observeAudioHostResult(operation, succeeded) {
35
- _hostObservation = {
36
- operation,
37
- viability: succeeded ? 'available' : 'runtime-api-unavailable',
38
- };
39
- }
40
- export function resetAudioBackendForTest() {
41
- _custom = null;
42
- _host = null;
43
- _hostConflict = false;
44
- _hostObservation = null;
45
- }
46
- export function setAudioBackend(backend) {
47
- _custom = backend;
48
- }
49
- let _custom = null;
50
- let _host = null;
51
- let _hostConflict = false;
52
- let _hostObservation = null;
53
- const _sentinel = createEntity({
54
- canPlayType(_mimeType) {
55
- return false;
56
- },
57
- });
58
- //# sourceMappingURL=audioBackend.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"audioBackend.js","sourceRoot":"","sources":["../src/audioBackend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,MAAM,UAAU,qBAAqB;IACnC,OAAO,YAAY,CAAmC;QACpD,WAAW,CAAC,QAAgB;YAC1B,OAAO,IAAI,KAAK,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClD,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;IAChG,CAAC;IACD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO;YACL,QAAQ,EAAE,aAAa;YACvB,KAAK,EAAE,MAAM;YACb,SAAS,EAAE,gBAAgB,KAAK,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;YACxE,SAAS,EAAE,gBAAgB,KAAK,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY;SACjF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AAClG,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,OAAO,IAAI,KAAK,IAAI,SAAS,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAqB;IAC3D,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,IAAI,KAAK,KAAK,OAAO;YAAE,aAAa,GAAG,IAAI,CAAC;QAC5C,OAAO;IACT,CAAC;IACD,KAAK,GAAG,OAAO,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,SAAiB,EAAE,SAAkB;IAC1E,gBAAgB,GAAG;QACjB,SAAS;QACT,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,yBAAyB;KAC/D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,OAAO,GAAG,IAAI,CAAC;IACf,KAAK,GAAG,IAAI,CAAC;IACb,aAAa,GAAG,KAAK,CAAC;IACtB,gBAAgB,GAAG,IAAI,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAA4B;IAC1D,OAAO,GAAG,OAAO,CAAC;AACpB,CAAC;AAED,IAAI,OAAO,GAAwB,IAAI,CAAC;AACxC,IAAI,KAAK,GAAwB,IAAI,CAAC;AACtC,IAAI,aAAa,GAAG,KAAK,CAAC;AAC1B,IAAI,gBAAgB,GAAqF,IAAI,CAAC;AAE9G,MAAM,SAAS,GAAiB,YAAY,CAAmC;IAC7E,WAAW,CAAC,SAAiB;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;CACF,CAAC,CAAC"}
@@ -1,141 +0,0 @@
1
- import { createEntity } from '@flighthq/entity/contract';
2
- import type { AudioBackend } from '@flighthq/types/contract';
3
- import { afterEach, describe, expect, it } from 'vitest';
4
-
5
- import {
6
- explainAudioBackend,
7
- getAudioBackend,
8
- installAudioHostBackend,
9
- observeAudioHostResult,
10
- resetAudioBackendForTest,
11
- setAudioBackend,
12
- } from './audioBackend';
13
-
14
- afterEach(() => {
15
- resetAudioBackendForTest();
16
- });
17
-
18
- function audioBackend(canPlayType: (mimeType: string) => boolean): AudioBackend {
19
- return createEntity({ canPlayType });
20
- }
21
-
22
- describe('createWebAudioBackend', () => {
23
- it('is tested via host-web', () => {
24
- expect(true).toBe(true);
25
- });
26
- });
27
-
28
- describe('explainAudioBackend', () => {
29
- it('reports host-not-enabled when no backend is installed', () => {
30
- const explanation = explainAudioBackend();
31
- expect(explanation.layer).toBe('host-not-enabled');
32
- expect(explanation.conflict).toBe(false);
33
- expect(explanation.viability).toBe('unobserved');
34
- });
35
-
36
- it('reports host layer when host backend is installed', () => {
37
- installAudioHostBackend(audioBackend(() => false));
38
- const explanation = explainAudioBackend();
39
- expect(explanation.layer).toBe('host');
40
- expect(explanation.viability).toBe('unobserved');
41
- });
42
-
43
- it('reports custom layer when custom backend is set', () => {
44
- installAudioHostBackend(audioBackend(() => false));
45
- setAudioBackend(audioBackend(() => true));
46
- const explanation = explainAudioBackend();
47
- expect(explanation.layer).toBe('custom');
48
- });
49
-
50
- it('reports observed viability after observeAudioHostResult', () => {
51
- installAudioHostBackend(audioBackend(() => true));
52
- observeAudioHostResult('canPlayType', true);
53
- const explanation = explainAudioBackend();
54
- expect(explanation.viability).toBe('available');
55
- expect(explanation.operation).toBe('canPlayType');
56
- });
57
-
58
- it('reports runtime-api-unavailable on failed observation', () => {
59
- installAudioHostBackend(audioBackend(() => false));
60
- observeAudioHostResult('canPlayType', false);
61
- const explanation = explainAudioBackend();
62
- expect(explanation.viability).toBe('runtime-api-unavailable');
63
- });
64
- });
65
-
66
- describe('getAudioBackend', () => {
67
- it('returns sentinel when no backend is installed', () => {
68
- const backend = getAudioBackend();
69
- expect(backend.canPlayType('audio/mpeg')).toBe(false);
70
- });
71
-
72
- it('returns host backend when installed', () => {
73
- const host = audioBackend(() => true);
74
- installAudioHostBackend(host);
75
- expect(getAudioBackend()).toBe(host);
76
- });
77
-
78
- it('returns custom backend over host', () => {
79
- const host = audioBackend(() => false);
80
- const custom = audioBackend(() => true);
81
- installAudioHostBackend(host);
82
- setAudioBackend(custom);
83
- expect(getAudioBackend()).toBe(custom);
84
- });
85
- });
86
-
87
- describe('installAudioHostBackend', () => {
88
- it('installs the host backend', () => {
89
- const host = audioBackend(() => true);
90
- installAudioHostBackend(host);
91
- expect(getAudioBackend()).toBe(host);
92
- });
93
-
94
- it('detects conflict on double install with different backend', () => {
95
- installAudioHostBackend(audioBackend(() => false));
96
- installAudioHostBackend(audioBackend(() => true));
97
- expect(explainAudioBackend().conflict).toBe(true);
98
- });
99
-
100
- it('does not flag conflict on same backend', () => {
101
- const host = audioBackend(() => false);
102
- installAudioHostBackend(host);
103
- installAudioHostBackend(host);
104
- expect(explainAudioBackend().conflict).toBe(false);
105
- });
106
- });
107
-
108
- describe('observeAudioHostResult', () => {
109
- it('records the operation and viability', () => {
110
- installAudioHostBackend(audioBackend(() => true));
111
- observeAudioHostResult('canPlayType', true);
112
- const explanation = explainAudioBackend();
113
- expect(explanation.operation).toBe('canPlayType');
114
- expect(explanation.viability).toBe('available');
115
- });
116
- });
117
-
118
- describe('resetAudioBackendForTest', () => {
119
- it('clears all state', () => {
120
- installAudioHostBackend(audioBackend(() => true));
121
- setAudioBackend(audioBackend(() => true));
122
- observeAudioHostResult('canPlayType', true);
123
- resetAudioBackendForTest();
124
- expect(explainAudioBackend().layer).toBe('host-not-enabled');
125
- expect(getAudioBackend().canPlayType('audio/mpeg')).toBe(false);
126
- });
127
- });
128
-
129
- describe('setAudioBackend', () => {
130
- it('overrides the active backend', () => {
131
- const custom = audioBackend(() => true);
132
- setAudioBackend(custom);
133
- expect(getAudioBackend()).toBe(custom);
134
- });
135
-
136
- it('clears the custom backend when null', () => {
137
- setAudioBackend(audioBackend(() => true));
138
- setAudioBackend(null);
139
- expect(getAudioBackend().canPlayType('audio/mpeg')).toBe(false);
140
- });
141
- });