@moq/watch 0.1.0

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.
Files changed (110) hide show
  1. package/README.md +102 -0
  2. package/audio/backend.d.ts +15 -0
  3. package/audio/backend.d.ts.map +1 -0
  4. package/audio/decoder.d.ts +25 -0
  5. package/audio/decoder.d.ts.map +1 -0
  6. package/audio/emitter.d.ts +17 -0
  7. package/audio/emitter.d.ts.map +1 -0
  8. package/audio/index.d.ts +6 -0
  9. package/audio/index.d.ts.map +1 -0
  10. package/audio/mse.d.ts +21 -0
  11. package/audio/mse.d.ts.map +1 -0
  12. package/audio/render-worklet.d.ts +2 -0
  13. package/audio/render-worklet.d.ts.map +1 -0
  14. package/audio/render.d.ts +24 -0
  15. package/audio/render.d.ts.map +1 -0
  16. package/audio/ring-buffer.d.ts +19 -0
  17. package/audio/ring-buffer.d.ts.map +1 -0
  18. package/audio/ring-buffer.test.d.ts +2 -0
  19. package/audio/ring-buffer.test.d.ts.map +1 -0
  20. package/audio/source.d.ts +34 -0
  21. package/audio/source.d.ts.map +1 -0
  22. package/backend.d.ts +53 -0
  23. package/backend.d.ts.map +1 -0
  24. package/broadcast-CSXy8QiX.js +8192 -0
  25. package/broadcast-CSXy8QiX.js.map +1 -0
  26. package/broadcast.d.ts +23 -0
  27. package/broadcast.d.ts.map +1 -0
  28. package/chat/index.d.ts +17 -0
  29. package/chat/index.d.ts.map +1 -0
  30. package/chat/message.d.ts +16 -0
  31. package/chat/message.d.ts.map +1 -0
  32. package/chat/typing.d.ts +16 -0
  33. package/chat/typing.d.ts.map +1 -0
  34. package/element.d.ts +35 -0
  35. package/element.d.ts.map +1 -0
  36. package/element.js +105 -0
  37. package/element.js.map +1 -0
  38. package/index.d.ts +10 -0
  39. package/index.d.ts.map +1 -0
  40. package/index.js +232 -0
  41. package/index.js.map +1 -0
  42. package/libav-opus-af-BlMWboA7.js +368 -0
  43. package/libav-opus-af-BlMWboA7.js.map +1 -0
  44. package/location/index.d.ts +17 -0
  45. package/location/index.d.ts.map +1 -0
  46. package/location/peers.d.ts +16 -0
  47. package/location/peers.d.ts.map +1 -0
  48. package/location/window.d.ts +17 -0
  49. package/location/window.d.ts.map +1 -0
  50. package/main-DGBFe0O7.js +2301 -0
  51. package/main-DGBFe0O7.js.map +1 -0
  52. package/mse.d.ts +19 -0
  53. package/mse.d.ts.map +1 -0
  54. package/package.json +41 -0
  55. package/preview.d.ts +23 -0
  56. package/preview.d.ts.map +1 -0
  57. package/support/element.d.ts +22 -0
  58. package/support/element.d.ts.map +1 -0
  59. package/support/element.js +184 -0
  60. package/support/element.js.map +1 -0
  61. package/support/index.d.ts +29 -0
  62. package/support/index.d.ts.map +1 -0
  63. package/support/index.js +55 -0
  64. package/support/index.js.map +1 -0
  65. package/sync.d.ts +21 -0
  66. package/sync.d.ts.map +1 -0
  67. package/ui/components/BufferControl.d.ts +8 -0
  68. package/ui/components/BufferControl.d.ts.map +1 -0
  69. package/ui/components/BufferingIndicator.d.ts +2 -0
  70. package/ui/components/BufferingIndicator.d.ts.map +1 -0
  71. package/ui/components/FullscreenButton.d.ts +2 -0
  72. package/ui/components/FullscreenButton.d.ts.map +1 -0
  73. package/ui/components/LatencySlider.d.ts +2 -0
  74. package/ui/components/LatencySlider.d.ts.map +1 -0
  75. package/ui/components/PlayPauseButton.d.ts +2 -0
  76. package/ui/components/PlayPauseButton.d.ts.map +1 -0
  77. package/ui/components/QualitySelector.d.ts +3 -0
  78. package/ui/components/QualitySelector.d.ts.map +1 -0
  79. package/ui/components/StatsButton.d.ts +5 -0
  80. package/ui/components/StatsButton.d.ts.map +1 -0
  81. package/ui/components/VolumeSlider.d.ts +2 -0
  82. package/ui/components/VolumeSlider.d.ts.map +1 -0
  83. package/ui/components/WatchControls.d.ts +2 -0
  84. package/ui/components/WatchControls.d.ts.map +1 -0
  85. package/ui/components/WatchStatusIndicator.d.ts +2 -0
  86. package/ui/components/WatchStatusIndicator.d.ts.map +1 -0
  87. package/ui/context.d.ts +41 -0
  88. package/ui/context.d.ts.map +1 -0
  89. package/ui/element.d.ts +5 -0
  90. package/ui/element.d.ts.map +1 -0
  91. package/ui/hooks/use-watch-ui.d.ts +3 -0
  92. package/ui/hooks/use-watch-ui.d.ts.map +1 -0
  93. package/ui/index.d.ts +7 -0
  94. package/ui/index.d.ts.map +1 -0
  95. package/ui/index.js +1121 -0
  96. package/ui/index.js.map +1 -0
  97. package/user.d.ts +17 -0
  98. package/user.d.ts.map +1 -0
  99. package/video/backend.d.ts +16 -0
  100. package/video/backend.d.ts.map +1 -0
  101. package/video/decoder.d.ts +25 -0
  102. package/video/decoder.d.ts.map +1 -0
  103. package/video/index.d.ts +6 -0
  104. package/video/index.d.ts.map +1 -0
  105. package/video/mse.d.ts +23 -0
  106. package/video/mse.d.ts.map +1 -0
  107. package/video/renderer.d.ts +15 -0
  108. package/video/renderer.d.ts.map +1 -0
  109. package/video/source.d.ts +35 -0
  110. package/video/source.d.ts.map +1 -0
package/README.md ADDED
@@ -0,0 +1,102 @@
1
+ <p align="center">
2
+ <img height="128px" src="https://github.com/moq-dev/moq/blob/main/.github/logo.svg" alt="Media over QUIC">
3
+ </p>
4
+
5
+ # @moq/watch
6
+
7
+ [![npm](https://img.shields.io/npm/v/@moq/watch)](https://www.npmjs.com/package/@moq/watch)
8
+ [![TypeScript](https://img.shields.io/badge/TypeScript-ready-blue.svg)](https://www.typescriptlang.org/)
9
+
10
+ Subscribe to and render [Media over QUIC](https://moq.dev/) (MoQ) broadcasts, built on top of [@moq/hang](../hang) and [@moq/lite](../lite).
11
+
12
+ ## Installation
13
+
14
+ ```bash
15
+ bun add @moq/watch
16
+ # or
17
+ npm add @moq/watch
18
+ ```
19
+
20
+ ## Web Component
21
+
22
+ The simplest way to watch a stream:
23
+
24
+ ```html
25
+ <script type="module">
26
+ import "@moq/watch/element";
27
+ </script>
28
+
29
+ <moq-watch
30
+ url="https://relay.example.com/anon"
31
+ path="room/alice"
32
+ controls>
33
+ <canvas></canvas>
34
+ </moq-watch>
35
+ ```
36
+
37
+ ### Attributes
38
+
39
+ | Attribute | Type | Default | Description |
40
+ |-----------|---------|----------|-----------------------|
41
+ | `url` | string | required | Relay server URL |
42
+ | `path` | string | required | Broadcast path |
43
+ | `paused` | boolean | false | Pause playback |
44
+ | `muted` | boolean | false | Mute audio |
45
+ | `volume` | number | 1 | Audio volume (0-1) |
46
+
47
+ ## JavaScript API
48
+
49
+ For more control:
50
+
51
+ ```typescript
52
+ import * as Watch from "@moq/watch";
53
+
54
+ const watch = new Watch.Broadcast(connection, {
55
+ enabled: true,
56
+ name: "alice",
57
+ video: { enabled: true },
58
+ audio: { enabled: true },
59
+ });
60
+
61
+ // Access the video stream
62
+ watch.video.media.subscribe((stream) => {
63
+ if (stream) {
64
+ videoElement.srcObject = stream;
65
+ }
66
+ });
67
+ ```
68
+
69
+ ## UI Web Component
70
+
71
+ `@moq/watch` includes a SolidJS-powered UI overlay (`<moq-watch-ui>`) with playback controls, volume, buffering indicator, quality selector, and stats panel. It depends on [`@moq/ui-core`](../ui-core) for shared UI primitives.
72
+
73
+ ```html
74
+ <script type="module">
75
+ import "@moq/watch/element";
76
+ import "@moq/watch/ui";
77
+ </script>
78
+
79
+ <moq-watch-ui>
80
+ <moq-watch url="https://relay.example.com/anon" path="room/alice">
81
+ <canvas></canvas>
82
+ </moq-watch>
83
+ </moq-watch-ui>
84
+ ```
85
+
86
+ The `<moq-watch-ui>` element automatically discovers the nested `<moq-watch>` element and wires up reactive controls.
87
+
88
+ ## Features
89
+
90
+ - **WebCodecs decoding** — Hardware-accelerated video and audio decoding
91
+ - **MSE fallback** — Media Source Extensions for broader codec support
92
+ - **Reactive state** — All properties are signals from `@moq/signals`
93
+ - **Chat** — Subscribe to text chat channels
94
+ - **Location** — Peer location and window tracking
95
+ - **Quality selection** — Switch between available renditions
96
+
97
+ ## License
98
+
99
+ Licensed under either:
100
+
101
+ - Apache License, Version 2.0 ([LICENSE-APACHE](../../LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
102
+ - MIT license ([LICENSE-MIT](../../LICENSE-MIT) or http://opensource.org/licenses/MIT)
@@ -0,0 +1,15 @@
1
+ import type { Getter, Signal } from "@moq/signals";
2
+ import type { BufferedRanges } from "../backend";
3
+ import type { Source } from "./source";
4
+ export interface Backend {
5
+ source: Source;
6
+ volume: Signal<number>;
7
+ muted: Signal<boolean>;
8
+ stats: Getter<Stats | undefined>;
9
+ buffered: Getter<BufferedRanges>;
10
+ }
11
+ export interface Stats {
12
+ sampleCount: number;
13
+ bytesReceived: number;
14
+ }
15
+ //# sourceMappingURL=backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/audio/backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGvC,MAAM,WAAW,OAAO;IAEvB,MAAM,EAAE,MAAM,CAAC;IAGf,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAGvB,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAGvB,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;IAGjC,QAAQ,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,KAAK;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACtB"}
@@ -0,0 +1,25 @@
1
+ import { Time } from "@moq/lite";
2
+ import { type Getter, Signal } from "@moq/signals";
3
+ import type { BufferedRanges } from "../backend";
4
+ import type { Source } from "./source";
5
+ export type DecoderProps = {
6
+ enabled?: boolean | Signal<boolean>;
7
+ };
8
+ export interface AudioStats {
9
+ bytesReceived: number;
10
+ }
11
+ export declare class Decoder {
12
+ #private;
13
+ source: Source;
14
+ enabled: Signal<boolean>;
15
+ readonly context: Getter<AudioContext | undefined>;
16
+ readonly root: Getter<AudioNode | undefined>;
17
+ readonly sampleRate: Getter<number | undefined>;
18
+ readonly stats: Getter<AudioStats | undefined>;
19
+ readonly timestamp: Getter<Time.Milli | undefined>;
20
+ readonly stalled: Getter<boolean>;
21
+ readonly buffered: Getter<BufferedRanges>;
22
+ constructor(source: Source, props?: DecoderProps);
23
+ close(): void;
24
+ }
25
+ //# sourceMappingURL=decoder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decoder.d.ts","sourceRoot":"","sources":["../../src/audio/decoder.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAU,KAAK,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAKjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,MAAM,YAAY,GAAG;IAE1B,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;CACpC,CAAC;AAEF,MAAM,WAAW,UAAU;IAC1B,aAAa,EAAE,MAAM,CAAC;CACtB;AAID,qBAAa,OAAO;;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAGzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC,CAAiB;IAKnE,QAAQ,CAAC,IAAI,EAAoB,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IAG/D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAoB;IAGnE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,GAAG,SAAS,CAAC,CAAe;IAI7D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,CAAmB;IAIrE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAiB;IAOlD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,cAAc,CAAC,CAAkB;gBAI/C,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,YAAY;IAyThD,KAAK;CAGL"}
@@ -0,0 +1,17 @@
1
+ import { Signal } from "@moq/signals";
2
+ import type { Decoder } from "./decoder";
3
+ export type EmitterProps = {
4
+ volume?: number | Signal<number>;
5
+ muted?: boolean | Signal<boolean>;
6
+ paused?: boolean | Signal<boolean>;
7
+ };
8
+ export declare class Emitter {
9
+ #private;
10
+ source: Decoder;
11
+ volume: Signal<number>;
12
+ muted: Signal<boolean>;
13
+ paused: Signal<boolean>;
14
+ constructor(source: Decoder, props?: EmitterProps);
15
+ close(): void;
16
+ }
17
+ //# sourceMappingURL=emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../../src/audio/emitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,MAAM,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,MAAM,MAAM,YAAY,GAAG;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;CACnC,CAAC;AAGF,qBAAa,OAAO;;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAIvB,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;gBAUZ,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,YAAY;IAiEjD,KAAK;CAGL"}
@@ -0,0 +1,6 @@
1
+ export type * from "./backend";
2
+ export * from "./decoder";
3
+ export * from "./emitter";
4
+ export * from "./mse";
5
+ export * from "./source";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/audio/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,WAAW,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,OAAO,CAAC;AACtB,cAAc,UAAU,CAAC"}
package/audio/mse.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ import { type Getter, Signal } from "@moq/signals";
2
+ import { type BufferedRanges } from "../backend";
3
+ import type { Muxer } from "../mse";
4
+ import type { Backend, Stats } from "./backend";
5
+ import type { Source } from "./source";
6
+ export type MseProps = {
7
+ volume?: number | Signal<number>;
8
+ muted?: boolean | Signal<boolean>;
9
+ };
10
+ export declare class Mse implements Backend {
11
+ #private;
12
+ muxer: Muxer;
13
+ source: Source;
14
+ volume: Signal<number>;
15
+ muted: Signal<boolean>;
16
+ readonly stats: Getter<Stats | undefined>;
17
+ readonly buffered: Getter<BufferedRanges>;
18
+ constructor(muxer: Muxer, source: Source, props?: MseProps);
19
+ close(): void;
20
+ }
21
+ //# sourceMappingURL=mse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mse.d.ts","sourceRoot":"","sources":["../../src/audio/mse.ts"],"names":[],"mappings":"AAGA,OAAO,EAAU,KAAK,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,KAAK,cAAc,EAAqB,MAAM,YAAY,CAAC;AACpE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,MAAM,QAAQ,GAAG;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;CAClC,CAAC;AAEF,qBAAa,GAAI,YAAW,OAAO;;IAClC,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IAEf,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAGvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC,CAAe;IAGxD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,cAAc,CAAC,CAAkB;gBAI/C,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,QAAQ;IAsM1D,KAAK,IAAI,IAAI;CAGb"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=render-worklet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-worklet.d.ts","sourceRoot":"","sources":["../../src/audio/render-worklet.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ import type { Time } from "@moq/lite";
2
+ export type Message = Init | Data | Latency;
3
+ export type ToMain = State;
4
+ export interface State {
5
+ type: "state";
6
+ timestamp: Time.Micro;
7
+ stalled: boolean;
8
+ }
9
+ export interface Data {
10
+ type: "data";
11
+ data: Float32Array[];
12
+ timestamp: Time.Micro;
13
+ }
14
+ export interface Init {
15
+ type: "init";
16
+ rate: number;
17
+ channels: number;
18
+ latency: Time.Milli;
19
+ }
20
+ export interface Latency {
21
+ type: "latency";
22
+ latency: Time.Milli;
23
+ }
24
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/audio/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,MAAM,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC;AAE5C,MAAM,MAAM,MAAM,GAAG,KAAK,CAAC;AAE3B,MAAM,WAAW,KAAK;IACrB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,IAAI;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,IAAI;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;CACpB;AAED,MAAM,WAAW,OAAO;IACvB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;CACpB"}
@@ -0,0 +1,19 @@
1
+ import { Time } from "@moq/lite";
2
+ export declare class AudioRingBuffer {
3
+ #private;
4
+ readonly rate: number;
5
+ readonly channels: number;
6
+ constructor(props: {
7
+ rate: number;
8
+ channels: number;
9
+ latency: Time.Milli;
10
+ });
11
+ get stalled(): boolean;
12
+ get timestamp(): Time.Micro;
13
+ get length(): number;
14
+ get capacity(): number;
15
+ resize(latency: Time.Milli): void;
16
+ write(timestamp: Time.Micro, data: Float32Array[]): void;
17
+ read(output: Float32Array[]): number;
18
+ }
19
+ //# sourceMappingURL=ring-buffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ring-buffer.d.ts","sourceRoot":"","sources":["../../src/audio/ring-buffer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,qBAAa,eAAe;;IAK3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAGd,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAA;KAAE;IAiB1E,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,SAAS,IAAI,IAAI,CAAC,KAAK,CAE1B;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI;IAgCjC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,IAAI;IAiExD,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM;CAsBpC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ring-buffer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ring-buffer.test.d.ts","sourceRoot":"","sources":["../../src/audio/ring-buffer.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,34 @@
1
+ import type * as Catalog from "@moq/hang/catalog";
2
+ import { type Getter, Signal } from "@moq/signals";
3
+ import type { Broadcast } from "../broadcast";
4
+ import type { Sync } from "../sync";
5
+ export type Target = {
6
+ name?: string;
7
+ };
8
+ /**
9
+ * A function that checks if an audio configuration is supported by the backend.
10
+ */
11
+ export type Supported = (config: Catalog.AudioConfig) => Promise<boolean>;
12
+ export type SourceProps = {
13
+ broadcast?: Broadcast | Signal<Broadcast | undefined>;
14
+ target?: Target | Signal<Target | undefined>;
15
+ supported?: Supported;
16
+ };
17
+ /**
18
+ * Source handles catalog extraction, support checking, and rendition selection
19
+ * for audio playback. It is used by both MSE and Decoder backends.
20
+ */
21
+ export declare class Source {
22
+ #private;
23
+ broadcast: Signal<Broadcast | undefined>;
24
+ target: Signal<Target | undefined>;
25
+ readonly catalog: Getter<Catalog.Audio | undefined>;
26
+ readonly available: Getter<Record<string, Catalog.AudioConfig>>;
27
+ readonly track: Signal<string | undefined>;
28
+ readonly config: Getter<Catalog.AudioConfig | undefined>;
29
+ supported: Signal<Supported | undefined>;
30
+ sync: Sync;
31
+ constructor(sync: Sync, props?: SourceProps);
32
+ close(): void;
33
+ }
34
+ //# sourceMappingURL=source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/audio/source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,OAAO,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAU,KAAK,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAEpC,MAAM,MAAM,MAAM,GAAG;IAEpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAE1E,MAAM,MAAM,WAAW,GAAG;IACzB,SAAS,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IAGtD,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAG7C,SAAS,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF;;;GAGG;AACH,qBAAa,MAAM;;IAClB,SAAS,EAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IACzC,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAGnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAAiB;IAGpE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAmB;IAGlF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAe;IAGzD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAgB;IAExE,SAAS,EAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IAGzC,IAAI,EAAE,IAAI,CAAC;gBAIC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,WAAW;IAyF3C,KAAK,IAAI,IAAI;CAGb"}
package/backend.d.ts ADDED
@@ -0,0 +1,53 @@
1
+ import * as Moq from "@moq/lite";
2
+ import { Signal } from "@moq/signals";
3
+ import * as Audio from "./audio";
4
+ import type { Broadcast } from "./broadcast";
5
+ import * as Video from "./video";
6
+ export interface BufferedRange {
7
+ start: Moq.Time.Milli;
8
+ end: Moq.Time.Milli;
9
+ }
10
+ export type BufferedRanges = BufferedRange[];
11
+ export declare function timeRangesToArray(ranges: TimeRanges): BufferedRanges;
12
+ export interface Backend {
13
+ paused: Signal<boolean>;
14
+ video?: Video.Backend;
15
+ audio?: Audio.Backend;
16
+ jitter: Signal<Moq.Time.Milli>;
17
+ }
18
+ export interface MultiBackendProps {
19
+ element?: HTMLCanvasElement | HTMLVideoElement | Signal<HTMLCanvasElement | HTMLVideoElement | undefined>;
20
+ broadcast?: Broadcast | Signal<Broadcast | undefined>;
21
+ jitter?: Moq.Time.Milli | Signal<Moq.Time.Milli>;
22
+ paused?: boolean | Signal<boolean>;
23
+ }
24
+ declare class VideoBackend implements Video.Backend {
25
+ source: Video.Source;
26
+ stats: Moq.Signals.Signal<Video.Stats | undefined>;
27
+ stalled: Moq.Signals.Signal<boolean>;
28
+ buffered: Moq.Signals.Signal<BufferedRanges>;
29
+ timestamp: Moq.Signals.Signal<Moq.Time.Milli>;
30
+ constructor(source: Video.Source);
31
+ }
32
+ declare class AudioBackend implements Audio.Backend {
33
+ source: Audio.Source;
34
+ volume: Moq.Signals.Signal<number>;
35
+ muted: Moq.Signals.Signal<boolean>;
36
+ stats: Moq.Signals.Signal<Audio.Stats | undefined>;
37
+ buffered: Moq.Signals.Signal<BufferedRanges>;
38
+ constructor(source: Audio.Source);
39
+ }
40
+ export declare class MultiBackend implements Backend {
41
+ #private;
42
+ element: Moq.Signals.Signal<HTMLVideoElement | HTMLCanvasElement | undefined>;
43
+ broadcast: Signal<Broadcast | undefined>;
44
+ jitter: Signal<Moq.Time.Milli>;
45
+ paused: Signal<boolean>;
46
+ video: VideoBackend;
47
+ audio: AudioBackend;
48
+ signals: Moq.Signals.Effect;
49
+ constructor(props?: MultiBackendProps);
50
+ close(): void;
51
+ }
52
+ export {};
53
+ //# sourceMappingURL=backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,WAAW,CAAC;AACjC,OAAO,EAAU,MAAM,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AAGjC,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;IACtB,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;CACpB;AACD,MAAM,MAAM,cAAc,GAAG,aAAa,EAAE,CAAC;AAG7C,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,cAAc,CAUpE;AAED,MAAM,WAAW,OAAO;IAEvB,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAGxB,KAAK,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC;IAGtB,KAAK,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC;IAGtB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IACjC,OAAO,CAAC,EAAE,iBAAiB,GAAG,gBAAgB,GAAG,MAAM,CAAC,iBAAiB,GAAG,gBAAgB,GAAG,SAAS,CAAC,CAAC;IAC1G,SAAS,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IAGtD,MAAM,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEjD,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;CACnC;AAGD,cAAM,YAAa,YAAW,KAAK,CAAC,OAAO;IAE1C,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;IAGrB,KAAK,8CAAkD;IAGvD,OAAO,8BAA8B;IAGrC,QAAQ,qCAAkC;IAG1C,SAAS,qCAAmD;gBAEhD,MAAM,EAAE,KAAK,CAAC,MAAM;CAGhC;AAGD,cAAM,YAAa,YAAW,KAAK,CAAC,OAAO;IAC1C,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;IAGrB,MAAM,6BAA2B;IAGjC,KAAK,8BAA8B;IAGnC,KAAK,8CAAkD;IAGvD,QAAQ,qCAAkC;gBAE9B,MAAM,EAAE,KAAK,CAAC,MAAM;CAGhC;AAKD,qBAAa,YAAa,YAAW,OAAO;;IAC3C,OAAO,uEAA2E;IAClF,SAAS,EAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IACzC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAExB,KAAK,EAAE,YAAY,CAAC;IAGpB,KAAK,EAAE,YAAY,CAAC;IAMpB,OAAO,qBAAgB;gBAEX,KAAK,CAAC,EAAE,iBAAiB;IAyFrC,KAAK,IAAI,IAAI;CAGb"}