@moq/watch 0.1.0 → 0.2.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.
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/chat/message.ts","../src/chat/typing.ts","../src/chat/index.ts","../../lite/src/zod.ts","../src/location/peers.ts","../src/location/window.ts","../src/location/index.ts","../src/preview.ts"],"sourcesContent":["import * as Catalog from \"@moq/hang/catalog\";\nimport type * as Moq from \"@moq/lite\";\nimport { Effect, type Getter, Signal } from \"@moq/signals\";\n\nexport interface MessageProps {\n\t// Whether to start downloading the chat.\n\t// Defaults to false so you can make sure everything is ready before starting.\n\tenabled?: boolean | Signal<boolean>;\n}\n\nexport class Message {\n\tbroadcast: Signal<Moq.Broadcast | undefined>;\n\tenabled: Signal<boolean>;\n\n\t// Empty string is a valid message.\n\t#latest = new Signal<string | undefined>(undefined);\n\treadonly latest: Getter<string | undefined> = this.#latest;\n\n\t#catalog = new Signal<Catalog.Track | undefined>(undefined);\n\treadonly catalog: Getter<Catalog.Track | undefined> = this.#catalog;\n\n\t#signals = new Effect();\n\n\tconstructor(\n\t\tbroadcast: Signal<Moq.Broadcast | undefined>,\n\t\tcatalog: Signal<Catalog.Root | undefined>,\n\t\tprops?: MessageProps,\n\t) {\n\t\tthis.broadcast = broadcast;\n\t\tthis.enabled = Signal.from(props?.enabled ?? false);\n\n\t\t// Grab the chat section from the catalog (if it's changed).\n\t\tthis.#signals.effect((effect) => {\n\t\t\tif (!effect.get(this.enabled)) return;\n\t\t\tthis.#catalog.set(effect.get(catalog)?.chat?.message);\n\t\t});\n\n\t\tthis.#signals.effect(this.#run.bind(this));\n\t}\n\n\t#run(effect: Effect) {\n\t\tconst values = effect.getAll([this.enabled, this.#catalog, this.broadcast]);\n\t\tif (!values) return;\n\t\tconst [_, catalog, broadcast] = values;\n\n\t\tconst track = broadcast.subscribe(catalog.name, Catalog.PRIORITY.chat);\n\t\teffect.cleanup(() => track.close());\n\n\t\t// Undefined is only when we're not subscribed to the track.\n\t\teffect.set(this.#latest, \"\");\n\t\teffect.cleanup(() => this.#latest.set(undefined));\n\n\t\teffect.spawn(async () => {\n\t\t\tfor (;;) {\n\t\t\t\tconst frame = await track.readString();\n\t\t\t\tif (frame === undefined) break;\n\n\t\t\t\t// Use a function to avoid the dequal check.\n\t\t\t\tthis.#latest.set(frame);\n\t\t\t}\n\t\t});\n\t}\n\n\tclose() {\n\t\tthis.#signals.close();\n\t}\n}\n","import * as Catalog from \"@moq/hang/catalog\";\nimport type * as Moq from \"@moq/lite\";\nimport { Effect, type Getter, Signal } from \"@moq/signals\";\n\nexport interface TypingProps {\n\t// Whether to start downloading the chat.\n\t// Defaults to false so you can make sure everything is ready before starting.\n\tenabled?: boolean | Signal<boolean>;\n}\n\nexport class Typing {\n\tbroadcast: Signal<Moq.Broadcast | undefined>;\n\tenabled: Signal<boolean>;\n\tactive: Signal<boolean | undefined>;\n\n\t#catalog = new Signal<Catalog.Track | undefined>(undefined);\n\treadonly catalog: Getter<Catalog.Track | undefined> = this.#catalog;\n\n\t#signals = new Effect();\n\n\tconstructor(\n\t\tbroadcast: Signal<Moq.Broadcast | undefined>,\n\t\tcatalog: Signal<Catalog.Root | undefined>,\n\t\tprops?: TypingProps,\n\t) {\n\t\tthis.broadcast = broadcast;\n\t\tthis.active = new Signal<boolean | undefined>(undefined);\n\t\tthis.enabled = Signal.from(props?.enabled ?? false);\n\n\t\t// Grab the chat section from the catalog (if it's changed).\n\t\tthis.#signals.effect((effect) => {\n\t\t\tif (!effect.get(this.enabled)) return;\n\t\t\tthis.#catalog.set(effect.get(catalog)?.chat?.typing);\n\t\t});\n\n\t\tthis.#signals.effect(this.#run.bind(this));\n\t}\n\n\t#run(effect: Effect) {\n\t\tconst values = effect.getAll([this.enabled, this.#catalog, this.broadcast]);\n\t\tif (!values) return;\n\t\tconst [_, catalog, broadcast] = values;\n\n\t\tconst track = broadcast.subscribe(catalog.name, Catalog.PRIORITY.typing);\n\t\teffect.cleanup(() => track.close());\n\n\t\teffect.spawn(async () => {\n\t\t\tfor (;;) {\n\t\t\t\tconst value = await track.readBool();\n\t\t\t\tif (value === undefined) break;\n\n\t\t\t\tthis.active.set(value);\n\t\t\t}\n\t\t});\n\n\t\teffect.cleanup(() => this.active.set(undefined));\n\t}\n\n\tclose() {\n\t\tthis.#signals.close();\n\t}\n}\n","import type * as Catalog from \"@moq/hang/catalog\";\nimport type * as Moq from \"@moq/lite\";\nimport { Effect, Signal } from \"@moq/signals\";\nimport { Message, type MessageProps } from \"./message\";\nimport { Typing, type TypingProps } from \"./typing\";\n\nexport interface ChatProps {\n\tmessage?: MessageProps;\n\ttyping?: TypingProps;\n}\n\nexport class Chat {\n\tmessage: Message;\n\ttyping: Typing;\n\n\t#catalog = new Signal<Catalog.Chat | undefined>(undefined);\n\t#signals = new Effect();\n\n\tconstructor(\n\t\tbroadcast: Signal<Moq.Broadcast | undefined>,\n\t\tcatalog: Signal<Catalog.Root | undefined>,\n\t\tprops?: ChatProps,\n\t) {\n\t\tthis.message = new Message(broadcast, catalog, props?.message);\n\t\tthis.typing = new Typing(broadcast, catalog, props?.typing);\n\n\t\t// Grab the chat section from the catalog (if it's changed).\n\t\tthis.#signals.effect((effect) => {\n\t\t\tconst message = effect.get(this.message.catalog);\n\t\t\tconst typing = effect.get(this.typing.catalog);\n\t\t\tif (!message && !typing) return;\n\n\t\t\teffect.set(this.#catalog, {\n\t\t\t\tmessage,\n\t\t\t\ttyping,\n\t\t\t});\n\t\t});\n\t}\n\n\tclose() {\n\t\tthis.#signals.close();\n\t\tthis.message.close();\n\t\tthis.typing.close();\n\t}\n}\n","// Helper containers for Zod-validated track encoding/decoding.\n\nimport type * as z from \"zod\";\nimport type { Group } from \"./group.ts\";\nimport type { Track } from \"./track.ts\";\n\nexport async function read<T = unknown>(source: Track | Group, schema: z.ZodSchema<T>): Promise<T | undefined> {\n\tconst next = await source.readJson();\n\tif (next === undefined) return undefined; // only treat undefined as EOF, not other falsy values\n\treturn schema.parse(next);\n}\n\nexport function write<T = unknown>(source: Track | Group, value: T, schema: z.ZodSchema<T>) {\n\tconst valid = schema.parse(value);\n\tsource.writeJson(valid);\n}\n","import * as Catalog from \"@moq/hang/catalog\";\nimport type * as Moq from \"@moq/lite\";\nimport * as Zod from \"@moq/lite/zod\";\nimport { Effect, type Getter, Signal } from \"@moq/signals\";\n\nexport interface PeersProps {\n\tenabled?: boolean | Signal<boolean>;\n}\n\nexport class Peers {\n\tenabled: Signal<boolean>;\n\tbroadcast: Signal<Moq.Broadcast | undefined>;\n\n\t#catalog = new Signal<Catalog.Track | undefined>(undefined);\n\t#positions = new Signal<Record<string, Catalog.Position> | undefined>(undefined);\n\n\tsignals = new Effect();\n\n\tconstructor(\n\t\tbroadcast: Signal<Moq.Broadcast | undefined>,\n\t\tcatalog: Signal<Catalog.Root | undefined>,\n\t\tprops?: PeersProps,\n\t) {\n\t\tthis.broadcast = broadcast;\n\t\tthis.enabled = Signal.from(props?.enabled ?? false);\n\n\t\tthis.signals.effect((effect) => {\n\t\t\tthis.#catalog.set(effect.get(catalog)?.location?.peers);\n\t\t});\n\n\t\tthis.signals.effect(this.#run.bind(this));\n\t}\n\n\t#run(effect: Effect) {\n\t\tconst values = effect.getAll([this.enabled, this.#catalog, this.broadcast]);\n\t\tif (!values) return;\n\t\tconst [_, catalog, broadcast] = values;\n\n\t\tconst track = broadcast.subscribe(catalog.name, Catalog.PRIORITY.location);\n\t\teffect.cleanup(() => track.close());\n\n\t\teffect.spawn(this.#runTrack.bind(this, track));\n\t}\n\n\tasync #runTrack(track: Moq.Track) {\n\t\ttry {\n\t\t\tfor (;;) {\n\t\t\t\tconst frame = await Zod.read(track, Catalog.PeersSchema);\n\t\t\t\tif (!frame) break;\n\n\t\t\t\tthis.#positions.set(frame);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.#positions.set(undefined);\n\t\t\ttrack.close();\n\t\t}\n\t}\n\n\tget positions(): Getter<Record<string, Catalog.Position> | undefined> {\n\t\treturn this.#positions;\n\t}\n\n\tclose() {\n\t\tthis.signals.close();\n\t}\n}\n","import * as Catalog from \"@moq/hang/catalog\";\nimport type * as Moq from \"@moq/lite\";\nimport * as Zod from \"@moq/lite/zod\";\nimport { Effect, type Getter, Signal } from \"@moq/signals\";\n\nexport interface WindowProps {\n\tenabled?: boolean | Signal<boolean>;\n}\n\nexport class Window {\n\tbroadcast: Signal<Moq.Broadcast | undefined>;\n\n\tenabled: Signal<boolean>;\n\n\t#handle = new Signal<string | undefined>(undefined);\n\treadonly handle: Getter<string | undefined> = this.#handle;\n\n\t#catalog = new Signal<Catalog.Location | undefined>(undefined);\n\n\t#position = new Signal<Catalog.Position | undefined>(undefined);\n\treadonly position: Getter<Catalog.Position | undefined> = this.#position;\n\n\tsignals = new Effect();\n\n\tconstructor(\n\t\tbroadcast: Signal<Moq.Broadcast | undefined>,\n\t\tcatalog: Signal<Catalog.Root | undefined>,\n\t\tprops?: WindowProps,\n\t) {\n\t\tthis.broadcast = broadcast;\n\t\tthis.enabled = Signal.from(props?.enabled ?? false);\n\n\t\tthis.signals.effect((effect) => {\n\t\t\tthis.#catalog.set(effect.get(catalog)?.location);\n\t\t});\n\n\t\tthis.signals.effect((effect) => {\n\t\t\tif (!effect.get(this.enabled)) return;\n\t\t\tthis.#position.set(effect.get(this.#catalog)?.initial);\n\t\t});\n\n\t\tthis.signals.effect((effect) => {\n\t\t\tthis.#handle.set(effect.get(this.#catalog)?.handle);\n\t\t});\n\n\t\tthis.signals.effect((effect) => {\n\t\t\tconst broadcast = effect.get(this.broadcast);\n\t\t\tif (!broadcast) return;\n\n\t\t\tconst updates = effect.get(this.#catalog)?.track;\n\t\t\tif (!updates) return;\n\n\t\t\tconst track = broadcast.subscribe(updates.name, Catalog.PRIORITY.location);\n\t\t\teffect.cleanup(() => track.close());\n\n\t\t\teffect.spawn(this.#runTrack.bind(this, track));\n\t\t});\n\t}\n\n\tasync #runTrack(track: Moq.Track) {\n\t\ttry {\n\t\t\tfor (;;) {\n\t\t\t\tconst position = await Zod.read(track, Catalog.PositionSchema);\n\t\t\t\tif (!position) break;\n\n\t\t\t\tthis.#position.set(position);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.#position.set(undefined);\n\t\t\ttrack.close();\n\t\t}\n\t}\n\n\tclose() {\n\t\tthis.signals.close();\n\t}\n}\n","import type * as Catalog from \"@moq/hang/catalog\";\nimport type * as Moq from \"@moq/lite\";\nimport { Effect, type Signal } from \"@moq/signals\";\nimport { Peers, type PeersProps } from \"./peers\";\nimport { Window, type WindowProps } from \"./window\";\n\nexport interface Props {\n\twindow?: WindowProps;\n\tpeers?: PeersProps;\n}\n\nexport class Root {\n\twindow: Window;\n\tpeers: Peers;\n\n\tsignals = new Effect();\n\n\tconstructor(\n\t\tbroadcast: Signal<Moq.Broadcast | undefined>,\n\t\tcatalog: Signal<Catalog.Root | undefined>,\n\t\tprops?: Props,\n\t) {\n\t\tthis.window = new Window(broadcast, catalog, props?.window);\n\t\tthis.peers = new Peers(broadcast, catalog, props?.peers);\n\t}\n\n\tclose() {\n\t\tthis.signals.close();\n\t\tthis.window.close();\n\t\tthis.peers.close();\n\t}\n}\n","import * as Catalog from \"@moq/hang/catalog\";\nimport type * as Moq from \"@moq/lite\";\nimport * as Zod from \"@moq/lite/zod\";\nimport { Effect, Signal } from \"@moq/signals\";\n\nexport interface PreviewProps {\n\tenabled?: boolean | Signal<boolean>;\n}\n\nexport class Preview {\n\tbroadcast: Signal<Moq.Broadcast | undefined>;\n\tenabled: Signal<boolean>;\n\tpreview = new Signal<Catalog.Preview | undefined>(undefined);\n\t#catalog = new Signal<Catalog.Track | undefined>(undefined);\n\n\t#signals = new Effect();\n\n\tconstructor(\n\t\tbroadcast: Signal<Moq.Broadcast | undefined>,\n\t\tcatalog: Signal<Catalog.Root | undefined>,\n\t\tprops?: PreviewProps,\n\t) {\n\t\tthis.broadcast = broadcast;\n\t\tthis.enabled = Signal.from(props?.enabled ?? false);\n\n\t\tthis.#signals.effect((effect) => {\n\t\t\tthis.#catalog.set(effect.get(catalog)?.preview);\n\t\t});\n\n\t\tthis.#signals.effect((effect) => {\n\t\t\tconst values = effect.getAll([this.enabled, this.broadcast, this.#catalog]);\n\t\t\tif (!values) return;\n\t\t\tconst [_, broadcast, catalog] = values;\n\n\t\t\t// Subscribe to the preview.json track directly\n\t\t\tconst track = broadcast.subscribe(catalog.name, Catalog.PRIORITY.preview);\n\t\t\teffect.cleanup(() => track.close());\n\n\t\t\teffect.spawn(async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst info = await Zod.read(track, Catalog.PreviewSchema);\n\t\t\t\t\tif (!info) return;\n\n\t\t\t\t\tthis.preview.set(info);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.warn(\"Failed to parse preview JSON:\", error);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\teffect.cleanup(() => this.preview.set(undefined));\n\t\t});\n\t}\n\n\tclose() {\n\t\tthis.#signals.close();\n\t}\n}\n"],"names":["Message","#latest","Signal","#catalog","#signals","Effect","broadcast","catalog","props","effect","#run","values","_","track","Catalog.PRIORITY","frame","Typing","value","Chat","message","typing","read","source","schema","next","Peers","#positions","#runTrack","Zod.read","Catalog.PeersSchema","Window","#handle","#position","updates","position","Catalog.PositionSchema","Root","Preview","info","Catalog.PreviewSchema","error"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/chat/message.ts","../src/chat/typing.ts","../src/chat/index.ts","../../lite/src/zod.ts","../src/location/peers.ts","../src/location/window.ts","../src/location/index.ts","../src/preview.ts"],"sourcesContent":["import * as Catalog from \"@moq/hang/catalog\";\nimport type * as Moq from \"@moq/lite\";\nimport { Effect, type Getter, Signal } from \"@moq/signals\";\n\nexport interface MessageProps {\n\t// Whether to start downloading the chat.\n\t// Defaults to false so you can make sure everything is ready before starting.\n\tenabled?: boolean | Signal<boolean>;\n}\n\nexport class Message {\n\tbroadcast: Signal<Moq.Broadcast | undefined>;\n\tenabled: Signal<boolean>;\n\n\t// Empty string is a valid message.\n\t#latest = new Signal<string | undefined>(undefined);\n\treadonly latest: Getter<string | undefined> = this.#latest;\n\n\t#catalog = new Signal<Catalog.Track | undefined>(undefined);\n\treadonly catalog: Getter<Catalog.Track | undefined> = this.#catalog;\n\n\t#signals = new Effect();\n\n\tconstructor(\n\t\tbroadcast: Signal<Moq.Broadcast | undefined>,\n\t\tcatalog: Signal<Catalog.Root | undefined>,\n\t\tprops?: MessageProps,\n\t) {\n\t\tthis.broadcast = broadcast;\n\t\tthis.enabled = Signal.from(props?.enabled ?? false);\n\n\t\t// Grab the chat section from the catalog (if it's changed).\n\t\tthis.#signals.run((effect) => {\n\t\t\tif (!effect.get(this.enabled)) return;\n\t\t\tthis.#catalog.set(effect.get(catalog)?.chat?.message);\n\t\t});\n\n\t\tthis.#signals.run(this.#run.bind(this));\n\t}\n\n\t#run(effect: Effect) {\n\t\tconst values = effect.getAll([this.enabled, this.#catalog, this.broadcast]);\n\t\tif (!values) return;\n\t\tconst [_, catalog, broadcast] = values;\n\n\t\tconst track = broadcast.subscribe(catalog.name, Catalog.PRIORITY.chat);\n\t\teffect.cleanup(() => track.close());\n\n\t\t// Undefined is only when we're not subscribed to the track.\n\t\teffect.set(this.#latest, \"\");\n\t\teffect.cleanup(() => this.#latest.set(undefined));\n\n\t\teffect.spawn(async () => {\n\t\t\tfor (;;) {\n\t\t\t\tconst frame = await track.readString();\n\t\t\t\tif (frame === undefined) break;\n\n\t\t\t\t// Use a function to avoid the dequal check.\n\t\t\t\tthis.#latest.set(frame);\n\t\t\t}\n\t\t});\n\t}\n\n\tclose() {\n\t\tthis.#signals.close();\n\t}\n}\n","import * as Catalog from \"@moq/hang/catalog\";\nimport type * as Moq from \"@moq/lite\";\nimport { Effect, type Getter, Signal } from \"@moq/signals\";\n\nexport interface TypingProps {\n\t// Whether to start downloading the chat.\n\t// Defaults to false so you can make sure everything is ready before starting.\n\tenabled?: boolean | Signal<boolean>;\n}\n\nexport class Typing {\n\tbroadcast: Signal<Moq.Broadcast | undefined>;\n\tenabled: Signal<boolean>;\n\tactive: Signal<boolean | undefined>;\n\n\t#catalog = new Signal<Catalog.Track | undefined>(undefined);\n\treadonly catalog: Getter<Catalog.Track | undefined> = this.#catalog;\n\n\t#signals = new Effect();\n\n\tconstructor(\n\t\tbroadcast: Signal<Moq.Broadcast | undefined>,\n\t\tcatalog: Signal<Catalog.Root | undefined>,\n\t\tprops?: TypingProps,\n\t) {\n\t\tthis.broadcast = broadcast;\n\t\tthis.active = new Signal<boolean | undefined>(undefined);\n\t\tthis.enabled = Signal.from(props?.enabled ?? false);\n\n\t\t// Grab the chat section from the catalog (if it's changed).\n\t\tthis.#signals.run((effect) => {\n\t\t\tif (!effect.get(this.enabled)) return;\n\t\t\tthis.#catalog.set(effect.get(catalog)?.chat?.typing);\n\t\t});\n\n\t\tthis.#signals.run(this.#run.bind(this));\n\t}\n\n\t#run(effect: Effect) {\n\t\tconst values = effect.getAll([this.enabled, this.#catalog, this.broadcast]);\n\t\tif (!values) return;\n\t\tconst [_, catalog, broadcast] = values;\n\n\t\tconst track = broadcast.subscribe(catalog.name, Catalog.PRIORITY.typing);\n\t\teffect.cleanup(() => track.close());\n\n\t\teffect.spawn(async () => {\n\t\t\tfor (;;) {\n\t\t\t\tconst value = await track.readBool();\n\t\t\t\tif (value === undefined) break;\n\n\t\t\t\tthis.active.set(value);\n\t\t\t}\n\t\t});\n\n\t\teffect.cleanup(() => this.active.set(undefined));\n\t}\n\n\tclose() {\n\t\tthis.#signals.close();\n\t}\n}\n","import type * as Catalog from \"@moq/hang/catalog\";\nimport type * as Moq from \"@moq/lite\";\nimport { Effect, Signal } from \"@moq/signals\";\nimport { Message, type MessageProps } from \"./message\";\nimport { Typing, type TypingProps } from \"./typing\";\n\nexport interface ChatProps {\n\tmessage?: MessageProps;\n\ttyping?: TypingProps;\n}\n\nexport class Chat {\n\tmessage: Message;\n\ttyping: Typing;\n\n\t#catalog = new Signal<Catalog.Chat | undefined>(undefined);\n\t#signals = new Effect();\n\n\tconstructor(\n\t\tbroadcast: Signal<Moq.Broadcast | undefined>,\n\t\tcatalog: Signal<Catalog.Root | undefined>,\n\t\tprops?: ChatProps,\n\t) {\n\t\tthis.message = new Message(broadcast, catalog, props?.message);\n\t\tthis.typing = new Typing(broadcast, catalog, props?.typing);\n\n\t\t// Grab the chat section from the catalog (if it's changed).\n\t\tthis.#signals.run((effect) => {\n\t\t\tconst message = effect.get(this.message.catalog);\n\t\t\tconst typing = effect.get(this.typing.catalog);\n\t\t\tif (!message && !typing) return;\n\n\t\t\teffect.set(this.#catalog, {\n\t\t\t\tmessage,\n\t\t\t\ttyping,\n\t\t\t});\n\t\t});\n\t}\n\n\tclose() {\n\t\tthis.#signals.close();\n\t\tthis.message.close();\n\t\tthis.typing.close();\n\t}\n}\n","// Helper containers for Zod-validated track encoding/decoding.\n\nimport type * as z from \"zod\";\nimport type { Group } from \"./group.ts\";\nimport type { Track } from \"./track.ts\";\n\nexport async function read<T = unknown>(source: Track | Group, schema: z.ZodSchema<T>): Promise<T | undefined> {\n\tconst next = await source.readJson();\n\tif (next === undefined) return undefined; // only treat undefined as EOF, not other falsy values\n\treturn schema.parse(next);\n}\n\nexport function write<T = unknown>(source: Track | Group, value: T, schema: z.ZodSchema<T>) {\n\tconst valid = schema.parse(value);\n\tsource.writeJson(valid);\n}\n","import * as Catalog from \"@moq/hang/catalog\";\nimport type * as Moq from \"@moq/lite\";\nimport * as Zod from \"@moq/lite/zod\";\nimport { Effect, type Getter, Signal } from \"@moq/signals\";\n\nexport interface PeersProps {\n\tenabled?: boolean | Signal<boolean>;\n}\n\nexport class Peers {\n\tenabled: Signal<boolean>;\n\tbroadcast: Signal<Moq.Broadcast | undefined>;\n\n\t#catalog = new Signal<Catalog.Track | undefined>(undefined);\n\t#positions = new Signal<Record<string, Catalog.Position> | undefined>(undefined);\n\n\tsignals = new Effect();\n\n\tconstructor(\n\t\tbroadcast: Signal<Moq.Broadcast | undefined>,\n\t\tcatalog: Signal<Catalog.Root | undefined>,\n\t\tprops?: PeersProps,\n\t) {\n\t\tthis.broadcast = broadcast;\n\t\tthis.enabled = Signal.from(props?.enabled ?? false);\n\n\t\tthis.signals.run((effect) => {\n\t\t\tthis.#catalog.set(effect.get(catalog)?.location?.peers);\n\t\t});\n\n\t\tthis.signals.run(this.#run.bind(this));\n\t}\n\n\t#run(effect: Effect) {\n\t\tconst values = effect.getAll([this.enabled, this.#catalog, this.broadcast]);\n\t\tif (!values) return;\n\t\tconst [_, catalog, broadcast] = values;\n\n\t\tconst track = broadcast.subscribe(catalog.name, Catalog.PRIORITY.location);\n\t\teffect.cleanup(() => track.close());\n\n\t\teffect.spawn(this.#runTrack.bind(this, track));\n\t}\n\n\tasync #runTrack(track: Moq.Track) {\n\t\ttry {\n\t\t\tfor (;;) {\n\t\t\t\tconst frame = await Zod.read(track, Catalog.PeersSchema);\n\t\t\t\tif (!frame) break;\n\n\t\t\t\tthis.#positions.set(frame);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.#positions.set(undefined);\n\t\t\ttrack.close();\n\t\t}\n\t}\n\n\tget positions(): Getter<Record<string, Catalog.Position> | undefined> {\n\t\treturn this.#positions;\n\t}\n\n\tclose() {\n\t\tthis.signals.close();\n\t}\n}\n","import * as Catalog from \"@moq/hang/catalog\";\nimport type * as Moq from \"@moq/lite\";\nimport * as Zod from \"@moq/lite/zod\";\nimport { Effect, type Getter, Signal } from \"@moq/signals\";\n\nexport interface WindowProps {\n\tenabled?: boolean | Signal<boolean>;\n}\n\nexport class Window {\n\tbroadcast: Signal<Moq.Broadcast | undefined>;\n\n\tenabled: Signal<boolean>;\n\n\t#handle = new Signal<string | undefined>(undefined);\n\treadonly handle: Getter<string | undefined> = this.#handle;\n\n\t#catalog = new Signal<Catalog.Location | undefined>(undefined);\n\n\t#position = new Signal<Catalog.Position | undefined>(undefined);\n\treadonly position: Getter<Catalog.Position | undefined> = this.#position;\n\n\tsignals = new Effect();\n\n\tconstructor(\n\t\tbroadcast: Signal<Moq.Broadcast | undefined>,\n\t\tcatalog: Signal<Catalog.Root | undefined>,\n\t\tprops?: WindowProps,\n\t) {\n\t\tthis.broadcast = broadcast;\n\t\tthis.enabled = Signal.from(props?.enabled ?? false);\n\n\t\tthis.signals.run((effect) => {\n\t\t\tthis.#catalog.set(effect.get(catalog)?.location);\n\t\t});\n\n\t\tthis.signals.run((effect) => {\n\t\t\tif (!effect.get(this.enabled)) return;\n\t\t\tthis.#position.set(effect.get(this.#catalog)?.initial);\n\t\t});\n\n\t\tthis.signals.run((effect) => {\n\t\t\tthis.#handle.set(effect.get(this.#catalog)?.handle);\n\t\t});\n\n\t\tthis.signals.run((effect) => {\n\t\t\tconst broadcast = effect.get(this.broadcast);\n\t\t\tif (!broadcast) return;\n\n\t\t\tconst updates = effect.get(this.#catalog)?.track;\n\t\t\tif (!updates) return;\n\n\t\t\tconst track = broadcast.subscribe(updates.name, Catalog.PRIORITY.location);\n\t\t\teffect.cleanup(() => track.close());\n\n\t\t\teffect.spawn(this.#runTrack.bind(this, track));\n\t\t});\n\t}\n\n\tasync #runTrack(track: Moq.Track) {\n\t\ttry {\n\t\t\tfor (;;) {\n\t\t\t\tconst position = await Zod.read(track, Catalog.PositionSchema);\n\t\t\t\tif (!position) break;\n\n\t\t\t\tthis.#position.set(position);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.#position.set(undefined);\n\t\t\ttrack.close();\n\t\t}\n\t}\n\n\tclose() {\n\t\tthis.signals.close();\n\t}\n}\n","import type * as Catalog from \"@moq/hang/catalog\";\nimport type * as Moq from \"@moq/lite\";\nimport { Effect, type Signal } from \"@moq/signals\";\nimport { Peers, type PeersProps } from \"./peers\";\nimport { Window, type WindowProps } from \"./window\";\n\nexport interface Props {\n\twindow?: WindowProps;\n\tpeers?: PeersProps;\n}\n\nexport class Root {\n\twindow: Window;\n\tpeers: Peers;\n\n\tsignals = new Effect();\n\n\tconstructor(\n\t\tbroadcast: Signal<Moq.Broadcast | undefined>,\n\t\tcatalog: Signal<Catalog.Root | undefined>,\n\t\tprops?: Props,\n\t) {\n\t\tthis.window = new Window(broadcast, catalog, props?.window);\n\t\tthis.peers = new Peers(broadcast, catalog, props?.peers);\n\t}\n\n\tclose() {\n\t\tthis.signals.close();\n\t\tthis.window.close();\n\t\tthis.peers.close();\n\t}\n}\n","import * as Catalog from \"@moq/hang/catalog\";\nimport type * as Moq from \"@moq/lite\";\nimport * as Zod from \"@moq/lite/zod\";\nimport { Effect, Signal } from \"@moq/signals\";\n\nexport interface PreviewProps {\n\tenabled?: boolean | Signal<boolean>;\n}\n\nexport class Preview {\n\tbroadcast: Signal<Moq.Broadcast | undefined>;\n\tenabled: Signal<boolean>;\n\tpreview = new Signal<Catalog.Preview | undefined>(undefined);\n\t#catalog = new Signal<Catalog.Track | undefined>(undefined);\n\n\t#signals = new Effect();\n\n\tconstructor(\n\t\tbroadcast: Signal<Moq.Broadcast | undefined>,\n\t\tcatalog: Signal<Catalog.Root | undefined>,\n\t\tprops?: PreviewProps,\n\t) {\n\t\tthis.broadcast = broadcast;\n\t\tthis.enabled = Signal.from(props?.enabled ?? false);\n\n\t\tthis.#signals.run((effect) => {\n\t\t\tthis.#catalog.set(effect.get(catalog)?.preview);\n\t\t});\n\n\t\tthis.#signals.run((effect) => {\n\t\t\tconst values = effect.getAll([this.enabled, this.broadcast, this.#catalog]);\n\t\t\tif (!values) return;\n\t\t\tconst [_, broadcast, catalog] = values;\n\n\t\t\t// Subscribe to the preview.json track directly\n\t\t\tconst track = broadcast.subscribe(catalog.name, Catalog.PRIORITY.preview);\n\t\t\teffect.cleanup(() => track.close());\n\n\t\t\teffect.spawn(async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst info = await Zod.read(track, Catalog.PreviewSchema);\n\t\t\t\t\tif (!info) return;\n\n\t\t\t\t\tthis.preview.set(info);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.warn(\"Failed to parse preview JSON:\", error);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\teffect.cleanup(() => this.preview.set(undefined));\n\t\t});\n\t}\n\n\tclose() {\n\t\tthis.#signals.close();\n\t}\n}\n"],"names":["Message","#latest","Signal","#catalog","#signals","Effect","broadcast","catalog","props","effect","#run","values","_","track","Catalog.PRIORITY","frame","Typing","value","Chat","message","typing","read","source","schema","next","Peers","#positions","#runTrack","Zod.read","Catalog.PeersSchema","Window","#handle","#position","updates","position","Catalog.PositionSchema","Root","Preview","info","Catalog.PreviewSchema","error"],"mappings":";;;;;;;;;;;;;;;;AAUO,MAAMA,EAAQ;AAAA,EACpB;AAAA,EACA;AAAA;AAAA,EAGAC,KAAU,IAAIC,EAA2B,MAAS;AAAA,EACzC,SAAqC,KAAKD;AAAA,EAEnDE,KAAW,IAAID,EAAkC,MAAS;AAAA,EACjD,UAA6C,KAAKC;AAAA,EAE3DC,KAAW,IAAIC,EAAA;AAAA,EAEf,YACCC,GACAC,GACAC,GACC;AACD,SAAK,YAAYF,GACjB,KAAK,UAAUJ,EAAO,KAAKM,GAAO,WAAW,EAAK,GAGlD,KAAKJ,GAAS,IAAI,CAACK,MAAW;AAC7B,MAAKA,EAAO,IAAI,KAAK,OAAO,KAC5B,KAAKN,GAAS,IAAIM,EAAO,IAAIF,CAAO,GAAG,MAAM,OAAO;AAAA,IACrD,CAAC,GAED,KAAKH,GAAS,IAAI,KAAKM,GAAK,KAAK,IAAI,CAAC;AAAA,EACvC;AAAA,EAEAA,GAAKD,GAAgB;AACpB,UAAME,IAASF,EAAO,OAAO,CAAC,KAAK,SAAS,KAAKN,IAAU,KAAK,SAAS,CAAC;AAC1E,QAAI,CAACQ,EAAQ;AACb,UAAM,CAACC,GAAGL,GAASD,CAAS,IAAIK,GAE1BE,IAAQP,EAAU,UAAUC,EAAQ,MAAMO,EAAiB,IAAI;AACrE,IAAAL,EAAO,QAAQ,MAAMI,EAAM,MAAA,CAAO,GAGlCJ,EAAO,IAAI,KAAKR,IAAS,EAAE,GAC3BQ,EAAO,QAAQ,MAAM,KAAKR,GAAQ,IAAI,MAAS,CAAC,GAEhDQ,EAAO,MAAM,YAAY;AACxB,iBAAS;AACR,cAAMM,IAAQ,MAAMF,EAAM,WAAA;AAC1B,YAAIE,MAAU,OAAW;AAGzB,aAAKd,GAAQ,IAAIc,CAAK;AAAA,MACvB;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEA,QAAQ;AACP,SAAKX,GAAS,MAAA;AAAA,EACf;AACD;ACxDO,MAAMY,EAAO;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EAEAb,KAAW,IAAID,EAAkC,MAAS;AAAA,EACjD,UAA6C,KAAKC;AAAA,EAE3DC,KAAW,IAAIC,EAAA;AAAA,EAEf,YACCC,GACAC,GACAC,GACC;AACD,SAAK,YAAYF,GACjB,KAAK,SAAS,IAAIJ,EAA4B,MAAS,GACvD,KAAK,UAAUA,EAAO,KAAKM,GAAO,WAAW,EAAK,GAGlD,KAAKJ,GAAS,IAAI,CAACK,MAAW;AAC7B,MAAKA,EAAO,IAAI,KAAK,OAAO,KAC5B,KAAKN,GAAS,IAAIM,EAAO,IAAIF,CAAO,GAAG,MAAM,MAAM;AAAA,IACpD,CAAC,GAED,KAAKH,GAAS,IAAI,KAAKM,GAAK,KAAK,IAAI,CAAC;AAAA,EACvC;AAAA,EAEAA,GAAKD,GAAgB;AACpB,UAAME,IAASF,EAAO,OAAO,CAAC,KAAK,SAAS,KAAKN,IAAU,KAAK,SAAS,CAAC;AAC1E,QAAI,CAACQ,EAAQ;AACb,UAAM,CAACC,GAAGL,GAASD,CAAS,IAAIK,GAE1BE,IAAQP,EAAU,UAAUC,EAAQ,MAAMO,EAAiB,MAAM;AACvE,IAAAL,EAAO,QAAQ,MAAMI,EAAM,MAAA,CAAO,GAElCJ,EAAO,MAAM,YAAY;AACxB,iBAAS;AACR,cAAMQ,IAAQ,MAAMJ,EAAM,SAAA;AAC1B,YAAII,MAAU,OAAW;AAEzB,aAAK,OAAO,IAAIA,CAAK;AAAA,MACtB;AAAA,IACD,CAAC,GAEDR,EAAO,QAAQ,MAAM,KAAK,OAAO,IAAI,MAAS,CAAC;AAAA,EAChD;AAAA,EAEA,QAAQ;AACP,SAAKL,GAAS,MAAA;AAAA,EACf;AACD;AClDO,MAAMc,EAAK;AAAA,EACjB;AAAA,EACA;AAAA,EAEAf,KAAW,IAAID,EAAiC,MAAS;AAAA,EACzDE,KAAW,IAAIC,EAAA;AAAA,EAEf,YACCC,GACAC,GACAC,GACC;AACD,SAAK,UAAU,IAAIR,EAAQM,GAAWC,GAASC,GAAO,OAAO,GAC7D,KAAK,SAAS,IAAIQ,EAAOV,GAAWC,GAASC,GAAO,MAAM,GAG1D,KAAKJ,GAAS,IAAI,CAACK,MAAW;AAC7B,YAAMU,IAAUV,EAAO,IAAI,KAAK,QAAQ,OAAO,GACzCW,IAASX,EAAO,IAAI,KAAK,OAAO,OAAO;AAC7C,MAAI,CAACU,KAAW,CAACC,KAEjBX,EAAO,IAAI,KAAKN,IAAU;AAAA,QACzB,SAAAgB;AAAA,QACA,QAAAC;AAAA,MAAA,CACA;AAAA,IACF,CAAC;AAAA,EACF;AAAA,EAEA,QAAQ;AACP,SAAKhB,GAAS,MAAA,GACd,KAAK,QAAQ,MAAA,GACb,KAAK,OAAO,MAAA;AAAA,EACb;AACD;;;;;ACtCA,eAAsBiB,EAAkBC,GAAuBC,GAAgD;AAC9G,QAAMC,IAAO,MAAMF,EAAO,SAAA;AAC1B,MAAIE,MAAS;AACb,WAAOD,EAAO,MAAMC,CAAI;AACzB;ACDO,MAAMC,EAAM;AAAA,EAClB;AAAA,EACA;AAAA,EAEAtB,KAAW,IAAID,EAAkC,MAAS;AAAA,EAC1DwB,KAAa,IAAIxB,EAAqD,MAAS;AAAA,EAE/E,UAAU,IAAIG,EAAA;AAAA,EAEd,YACCC,GACAC,GACAC,GACC;AACD,SAAK,YAAYF,GACjB,KAAK,UAAUJ,EAAO,KAAKM,GAAO,WAAW,EAAK,GAElD,KAAK,QAAQ,IAAI,CAACC,MAAW;AAC5B,WAAKN,GAAS,IAAIM,EAAO,IAAIF,CAAO,GAAG,UAAU,KAAK;AAAA,IACvD,CAAC,GAED,KAAK,QAAQ,IAAI,KAAKG,GAAK,KAAK,IAAI,CAAC;AAAA,EACtC;AAAA,EAEAA,GAAKD,GAAgB;AACpB,UAAME,IAASF,EAAO,OAAO,CAAC,KAAK,SAAS,KAAKN,IAAU,KAAK,SAAS,CAAC;AAC1E,QAAI,CAACQ,EAAQ;AACb,UAAM,CAACC,GAAGL,GAASD,CAAS,IAAIK,GAE1BE,IAAQP,EAAU,UAAUC,EAAQ,MAAMO,EAAiB,QAAQ;AACzE,IAAAL,EAAO,QAAQ,MAAMI,EAAM,MAAA,CAAO,GAElCJ,EAAO,MAAM,KAAKkB,GAAU,KAAK,MAAMd,CAAK,CAAC;AAAA,EAC9C;AAAA,EAEA,MAAMc,GAAUd,GAAkB;AACjC,QAAI;AACH,iBAAS;AACR,cAAME,IAAQ,MAAMa,EAASf,GAAOgB,CAAmB;AACvD,YAAI,CAACd,EAAO;AAEZ,aAAKW,GAAW,IAAIX,CAAK;AAAA,MAC1B;AAAA,IACD,UAAA;AACC,WAAKW,GAAW,IAAI,MAAS,GAC7Bb,EAAM,MAAA;AAAA,IACP;AAAA,EACD;AAAA,EAEA,IAAI,YAAkE;AACrE,WAAO,KAAKa;AAAA,EACb;AAAA,EAEA,QAAQ;AACP,SAAK,QAAQ,MAAA;AAAA,EACd;AACD;ACxDO,MAAMI,EAAO;AAAA,EACnB;AAAA,EAEA;AAAA,EAEAC,KAAU,IAAI7B,EAA2B,MAAS;AAAA,EACzC,SAAqC,KAAK6B;AAAA,EAEnD5B,KAAW,IAAID,EAAqC,MAAS;AAAA,EAE7D8B,KAAY,IAAI9B,EAAqC,MAAS;AAAA,EACrD,WAAiD,KAAK8B;AAAA,EAE/D,UAAU,IAAI3B,EAAA;AAAA,EAEd,YACCC,GACAC,GACAC,GACC;AACD,SAAK,YAAYF,GACjB,KAAK,UAAUJ,EAAO,KAAKM,GAAO,WAAW,EAAK,GAElD,KAAK,QAAQ,IAAI,CAACC,MAAW;AAC5B,WAAKN,GAAS,IAAIM,EAAO,IAAIF,CAAO,GAAG,QAAQ;AAAA,IAChD,CAAC,GAED,KAAK,QAAQ,IAAI,CAACE,MAAW;AAC5B,MAAKA,EAAO,IAAI,KAAK,OAAO,KAC5B,KAAKuB,GAAU,IAAIvB,EAAO,IAAI,KAAKN,EAAQ,GAAG,OAAO;AAAA,IACtD,CAAC,GAED,KAAK,QAAQ,IAAI,CAACM,MAAW;AAC5B,WAAKsB,GAAQ,IAAItB,EAAO,IAAI,KAAKN,EAAQ,GAAG,MAAM;AAAA,IACnD,CAAC,GAED,KAAK,QAAQ,IAAI,CAACM,MAAW;AAC5B,YAAMH,IAAYG,EAAO,IAAI,KAAK,SAAS;AAC3C,UAAI,CAACH,EAAW;AAEhB,YAAM2B,IAAUxB,EAAO,IAAI,KAAKN,EAAQ,GAAG;AAC3C,UAAI,CAAC8B,EAAS;AAEd,YAAMpB,IAAQP,EAAU,UAAU2B,EAAQ,MAAMnB,EAAiB,QAAQ;AACzE,MAAAL,EAAO,QAAQ,MAAMI,EAAM,MAAA,CAAO,GAElCJ,EAAO,MAAM,KAAKkB,GAAU,KAAK,MAAMd,CAAK,CAAC;AAAA,IAC9C,CAAC;AAAA,EACF;AAAA,EAEA,MAAMc,GAAUd,GAAkB;AACjC,QAAI;AACH,iBAAS;AACR,cAAMqB,IAAW,MAAMN,EAASf,GAAOsB,CAAsB;AAC7D,YAAI,CAACD,EAAU;AAEf,aAAKF,GAAU,IAAIE,CAAQ;AAAA,MAC5B;AAAA,IACD,UAAA;AACC,WAAKF,GAAU,IAAI,MAAS,GAC5BnB,EAAM,MAAA;AAAA,IACP;AAAA,EACD;AAAA,EAEA,QAAQ;AACP,SAAK,QAAQ,MAAA;AAAA,EACd;AACD;ACjEO,MAAMuB,EAAK;AAAA,EACjB;AAAA,EACA;AAAA,EAEA,UAAU,IAAI/B,EAAA;AAAA,EAEd,YACCC,GACAC,GACAC,GACC;AACD,SAAK,SAAS,IAAIsB,EAAOxB,GAAWC,GAASC,GAAO,MAAM,GAC1D,KAAK,QAAQ,IAAIiB,EAAMnB,GAAWC,GAASC,GAAO,KAAK;AAAA,EACxD;AAAA,EAEA,QAAQ;AACP,SAAK,QAAQ,MAAA,GACb,KAAK,OAAO,MAAA,GACZ,KAAK,MAAM,MAAA;AAAA,EACZ;AACD;;;;;ACtBO,MAAM6B,EAAQ;AAAA,EACpB;AAAA,EACA;AAAA,EACA,UAAU,IAAInC,EAAoC,MAAS;AAAA,EAC3DC,KAAW,IAAID,EAAkC,MAAS;AAAA,EAE1DE,KAAW,IAAIC,EAAA;AAAA,EAEf,YACCC,GACAC,GACAC,GACC;AACD,SAAK,YAAYF,GACjB,KAAK,UAAUJ,EAAO,KAAKM,GAAO,WAAW,EAAK,GAElD,KAAKJ,GAAS,IAAI,CAACK,MAAW;AAC7B,WAAKN,GAAS,IAAIM,EAAO,IAAIF,CAAO,GAAG,OAAO;AAAA,IAC/C,CAAC,GAED,KAAKH,GAAS,IAAI,CAACK,MAAW;AAC7B,YAAME,IAASF,EAAO,OAAO,CAAC,KAAK,SAAS,KAAK,WAAW,KAAKN,EAAQ,CAAC;AAC1E,UAAI,CAACQ,EAAQ;AACb,YAAM,CAACC,GAAGN,GAAWC,CAAO,IAAII,GAG1BE,IAAQP,EAAU,UAAUC,EAAQ,MAAMO,EAAiB,OAAO;AACxE,MAAAL,EAAO,QAAQ,MAAMI,EAAM,MAAA,CAAO,GAElCJ,EAAO,MAAM,YAAY;AACxB,YAAI;AACH,gBAAM6B,IAAO,MAAMV,EAASf,GAAO0B,CAAqB;AACxD,cAAI,CAACD,EAAM;AAEX,eAAK,QAAQ,IAAIA,CAAI;AAAA,QACtB,SAASE,GAAO;AACf,kBAAQ,KAAK,iCAAiCA,CAAK;AAAA,QACpD;AAAA,MACD,CAAC,GAED/B,EAAO,QAAQ,MAAM,KAAK,QAAQ,IAAI,MAAS,CAAC;AAAA,IACjD,CAAC;AAAA,EACF;AAAA,EAEA,QAAQ;AACP,SAAKL,GAAS,MAAA;AAAA,EACf;AACD;"}
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@moq/watch",
3
3
  "type": "module",
4
- "version": "0.1.0",
5
- "description": "Watch/subscribe to Media over QUIC streams",
4
+ "version": "0.2.0",
5
+ "description": "Watch Media over QUIC broadcasts",
6
6
  "license": "(MIT OR Apache-2.0)",
7
7
  "repository": "github:moq-dev/moq",
8
8
  "exports": {
@@ -33,9 +33,9 @@
33
33
  "./support/element.js"
34
34
  ],
35
35
  "dependencies": {
36
- "@moq/hang": "^0.1.3",
37
- "@moq/lite": "^0.1.3",
38
- "@moq/signals": "^0.1.2",
36
+ "@moq/hang": "^0.2.0",
37
+ "@moq/lite": "^0.1.4",
38
+ "@moq/signals": "^0.1.3",
39
39
  "@moq/ui-core": "^0.1.0"
40
40
  }
41
41
  }
@@ -12,7 +12,7 @@ function d(h, e, ...t) {
12
12
  typeof r == "string" ? n.appendChild(document.createTextNode(r)) : n.appendChild(r);
13
13
  }), Object.assign(n, s), n;
14
14
  }
15
- const f = navigator.userAgent.toLowerCase().includes("firefox"), C = ["show", "details"];
15
+ const g = navigator.userAgent.toLowerCase().includes("firefox"), C = ["show", "details"];
16
16
  class y extends HTMLElement {
17
17
  #i = new u("warning");
18
18
  #e = new u(!1);
@@ -24,7 +24,7 @@ class y extends HTMLElement {
24
24
  super(), m().then((e) => this.#n.set(e)).catch((e) => console.error("Failed to detect watch support:", e));
25
25
  }
26
26
  connectedCallback() {
27
- this.#t = new b(), this.#t.effect(this.#s.bind(this));
27
+ this.#t = new b(), this.#t.run(this.#s.bind(this));
28
28
  }
29
29
  disconnectedCallback() {
30
30
  this.#t?.close(), this.#t = void 0;
@@ -94,7 +94,7 @@ class y extends HTMLElement {
94
94
  });
95
95
  n.event(o, "click", () => {
96
96
  this.#e.update((s) => !s);
97
- }), n.effect((s) => {
97
+ }), n.run((s) => {
98
98
  o.textContent = s.get(this.#e) ? "Details ➖" : "Details ➕";
99
99
  });
100
100
  const l = d(
@@ -121,7 +121,7 @@ class y extends HTMLElement {
121
121
  padding: "1rem",
122
122
  fontSize: "0.875rem"
123
123
  }
124
- }), a = (r) => r ? "🟢 Yes" : "🔴 No", o = (r) => r?.hardware ? "🟢 Hardware" : r?.software ? `🟡 Software${f ? "*" : ""}` : "🔴 No", l = (r) => r === "full" ? "🟢 Full" : r === "partial" ? "🟡 Polyfill" : "🔴 None", s = (r, c, g) => {
124
+ }), a = (r) => r ? "🟢 Yes" : "🔴 No", o = (r) => r?.hardware ? "🟢 Hardware" : r?.software ? `🟡 Software${g ? "*" : ""}` : "🔴 No", l = (r) => r === "full" ? "🟢 Full" : r === "partial" ? "🟡 Polyfill" : "🔴 None", s = (r, c, f) => {
125
125
  const p = d(
126
126
  "div",
127
127
  {
@@ -146,11 +146,11 @@ class y extends HTMLElement {
146
146
  {
147
147
  style: { gridColumnStart: "3" }
148
148
  },
149
- g
149
+ f
150
150
  );
151
151
  i.appendChild(p), i.appendChild(w), i.appendChild(v);
152
152
  };
153
- if (s("WebTransport", "", l(t.webtransport)), s("Rendering", "Audio", a(t.audio.render)), s("", "Video", a(t.video.render)), s("Decoding", "Opus", l(t.audio.decoding.opus)), s("", "AAC", a(t.audio.decoding.aac)), s("", "AV1", o(t.video.decoding?.av1)), s("", "H.265", o(t.video.decoding?.h265)), s("", "H.264", o(t.video.decoding?.h264)), s("", "VP9", o(t.video.decoding?.vp9)), s("", "VP8", o(t.video.decoding?.vp8)), f) {
153
+ if (s("WebTransport", "", l(t.webtransport)), s("Rendering", "Audio", a(t.audio.render)), s("", "Video", a(t.video.render)), s("Decoding", "Opus", l(t.audio.decoding.opus)), s("", "AAC", a(t.audio.decoding.aac)), s("", "AV1", o(t.video.decoding?.av1)), s("", "H.265", o(t.video.decoding?.h265)), s("", "H.264", o(t.video.decoding?.h264)), s("", "VP9", o(t.video.decoding?.vp9)), s("", "VP8", o(t.video.decoding?.vp8)), g) {
154
154
  const r = d(
155
155
  "div",
156
156
  {
@@ -1 +1 @@
1
- {"version":3,"file":"element.js","sources":["../../../signals/src/dom.ts","../../src/support/element.ts"],"sourcesContent":["import type { Effect } from \".\";\n\nexport type CreateOptions<T extends HTMLElement> = {\n\tstyle?: Partial<CSSStyleDeclaration>;\n\tclassName?: string;\n\tclassList?: string[];\n\tid?: string;\n\tdataset?: Record<string, string>;\n\tattributes?: Record<string, string>;\n} & Partial<Omit<T, \"style\" | \"dataset\">>;\n\nexport function create<K extends keyof HTMLElementTagNameMap>(\n\ttagName: K,\n\toptions?: CreateOptions<HTMLElementTagNameMap[K] & HTMLElement>,\n\t...children: (HTMLElement | string)[]\n): HTMLElementTagNameMap[K] {\n\tconst element = document.createElement(tagName);\n\n\tif (!options) return element;\n\n\tconst { style, classList, dataset, attributes, ...props } = options;\n\n\t// Apply styles\n\tif (style) {\n\t\tObject.assign(element.style, style);\n\t}\n\n\t// Apply class list\n\tif (classList) {\n\t\telement.classList.add(...classList);\n\t}\n\n\t// Apply dataset\n\tif (dataset) {\n\t\tObject.entries(dataset).forEach(([key, value]) => {\n\t\t\telement.dataset[key] = value;\n\t\t});\n\t}\n\n\t// Apply attributes\n\tif (attributes) {\n\t\tObject.entries(attributes).forEach(([key, value]) => {\n\t\t\telement.setAttribute(key, value);\n\t\t});\n\t}\n\n\t// Append children\n\tif (children) {\n\t\tchildren.forEach((child) => {\n\t\t\tif (typeof child === \"string\") {\n\t\t\t\telement.appendChild(document.createTextNode(child));\n\t\t\t} else {\n\t\t\t\telement.appendChild(child);\n\t\t\t}\n\t\t});\n\t}\n\n\t// Apply other properties\n\tObject.assign(element, props);\n\n\treturn element;\n}\n\n// Matches solid.js's JSX.Element type.\nexport type Element = Node | ArrayElement | (string & {}) | number | boolean | null | undefined;\ninterface ArrayElement extends Array<Element> {}\n\nexport function render(effect: Effect, parent: Node, element: Element | ((effect: Effect) => Element)) {\n\tconst e = typeof element === \"function\" ? element(effect) : element;\n\tif (e === undefined || e === null) return;\n\n\tlet node: Node;\n\tif (e instanceof Node) {\n\t\tnode = e;\n\t} else if (Array.isArray(e)) {\n\t\tnode = document.createDocumentFragment();\n\t\tfor (const child of e) {\n\t\t\trender(effect, node, child);\n\t\t}\n\t} else if (typeof e === \"number\" || typeof e === \"boolean\" || typeof e === \"string\") {\n\t\tnode = document.createTextNode(e.toString());\n\t} else {\n\t\tconst exhaustive: never = e;\n\t\tthrow new Error(`Invalid element type: ${exhaustive}`);\n\t}\n\n\tparent.appendChild(node);\n\teffect.cleanup(() => parent.removeChild(node));\n}\n\nexport function setClass(effect: Effect, element: HTMLElement, ...classNames: string[]) {\n\tfor (const className of classNames) {\n\t\telement.classList.add(className);\n\t}\n\n\teffect.cleanup(() => {\n\t\tfor (const className of classNames) {\n\t\t\telement.classList.remove(className);\n\t\t}\n\t});\n}\n","import { Effect, Signal } from \"@moq/signals\";\nimport * as DOM from \"@moq/signals/dom\";\nimport { type Codec, type Full, isSupported, type Partial } from \"./\";\n\n// https://bugzilla.mozilla.org/show_bug.cgi?id=1967793\nconst isFirefox = navigator.userAgent.toLowerCase().includes(\"firefox\");\n\nconst OBSERVED = [\"show\", \"details\"] as const;\ntype Observed = (typeof OBSERVED)[number];\n\n// Whether to display the support banner.\n// - \"always\": Always display the banner.\n// - \"warning\": Display the banner if a required feature needs a polyfill/fallback.\n// - \"error\": Display the banner if a required feature is unsupported.\n// - \"never\": Never display the banner.\nexport type Show = \"always\" | \"warning\" | \"error\" | \"never\";\n\nexport default class MoqWatchSupport extends HTMLElement {\n\t#show = new Signal<Show>(\"warning\");\n\t#details = new Signal<boolean>(false);\n\t#support = new Signal<Full | undefined>(undefined);\n\t#close = new Signal<boolean>(false);\n\n\t#signals?: Effect;\n\n\tstatic observedAttributes = OBSERVED;\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tisSupported()\n\t\t\t.then((s) => this.#support.set(s))\n\t\t\t.catch((err) => console.error(\"Failed to detect watch support:\", err));\n\t}\n\n\tconnectedCallback() {\n\t\tthis.#signals = new Effect();\n\t\tthis.#signals.effect(this.#render.bind(this));\n\t}\n\n\tdisconnectedCallback() {\n\t\tthis.#signals?.close();\n\t\tthis.#signals = undefined;\n\t}\n\n\tattributeChangedCallback(name: Observed, _oldValue: string | null, newValue: string | null) {\n\t\tif (name === \"show\") {\n\t\t\tconst show = newValue ?? \"warning\";\n\t\t\tif (show === \"always\" || show === \"warning\" || show === \"error\" || show === \"never\") {\n\t\t\t\tthis.show = show;\n\t\t\t} else {\n\t\t\t\tthrow new Error(`Invalid show: ${show}`);\n\t\t\t}\n\t\t} else if (name === \"details\") {\n\t\t\tthis.details = newValue !== null;\n\t\t} else {\n\t\t\tconst exhaustive: never = name;\n\t\t\tthrow new Error(`Invalid attribute: ${exhaustive}`);\n\t\t}\n\t}\n\n\tget show(): Show {\n\t\treturn this.#show.peek();\n\t}\n\n\tset show(show: Show) {\n\t\tthis.#show.set(show);\n\t}\n\n\tget details(): boolean {\n\t\treturn this.#details.peek();\n\t}\n\n\tset details(details: boolean) {\n\t\tthis.#details.set(details);\n\t}\n\n\t#getSummary(support: Full): Partial {\n\t\tif (support.webtransport === \"none\") return \"none\";\n\n\t\tif (!support.audio.decoding || !support.video.decoding) return \"none\";\n\t\tif (!support.audio.render || !support.video.render) return \"none\";\n\n\t\tif (!Object.values(support.audio.decoding).some((v) => v === true || v === \"full\" || v === \"partial\"))\n\t\t\treturn \"none\";\n\t\tif (!Object.values(support.video.decoding).some((v) => v.software || v.hardware)) return \"none\";\n\n\t\tif (!Object.values(support.audio.decoding).every((v) => v === true || v === \"full\")) return \"partial\";\n\t\tif (!Object.values(support.video.decoding).every((v) => v.software || v.hardware)) return \"partial\";\n\n\t\treturn \"full\";\n\t}\n\n\t#render(effect: Effect) {\n\t\tconst support = effect.get(this.#support);\n\t\tif (!support) return;\n\n\t\tconst close = effect.get(this.#close);\n\t\tif (close) return;\n\n\t\tconst show = effect.get(this.#show);\n\t\tif (show === \"never\") return;\n\n\t\tconst summary = this.#getSummary(support);\n\n\t\t// Don't render the banner if we have full support and they only asked for warnings.\n\t\tif (show === \"warning\" && summary === \"full\") return;\n\n\t\t// Don't render the banner if we have at least partial support and they only asked for errors.\n\t\tif (show === \"error\" && summary !== \"none\") return;\n\n\t\tconst container = DOM.create(\"div\", {\n\t\t\tstyle: {\n\t\t\t\tmargin: \"0 auto\",\n\t\t\t\tmaxWidth: \"28rem\",\n\t\t\t\tpadding: \"1rem\",\n\t\t\t},\n\t\t});\n\n\t\tthis.appendChild(container);\n\t\teffect.cleanup(() => this.removeChild(container));\n\n\t\tthis.#renderHeader(container, summary, effect);\n\n\t\tif (effect.get(this.#details)) {\n\t\t\tthis.#renderDetails(container, support, effect);\n\t\t}\n\t}\n\n\t#renderHeader(parent: HTMLDivElement, summary: Partial, effect: Effect) {\n\t\tconst headerDiv = DOM.create(\"div\", {\n\t\t\tstyle: {\n\t\t\t\tdisplay: \"flex\",\n\t\t\t\tflexDirection: \"row\",\n\t\t\t\tgap: \"1rem\",\n\t\t\t\tflexWrap: \"wrap\",\n\t\t\t\tjustifyContent: \"space-between\",\n\t\t\t\talignItems: \"center\",\n\t\t\t},\n\t\t});\n\n\t\tconst statusDiv = DOM.create(\"div\", {\n\t\t\tstyle: { fontWeight: \"bold\" },\n\t\t});\n\n\t\tif (summary === \"full\") {\n\t\t\tstatusDiv.textContent = \"🟢 Full Browser Support\";\n\t\t} else if (summary === \"partial\") {\n\t\t\tstatusDiv.textContent = \"🟡 Partial Browser Support\";\n\t\t} else if (summary === \"none\") {\n\t\t\tstatusDiv.textContent = \"🔴 No Browser Support\";\n\t\t}\n\n\t\tconst detailsButton = DOM.create(\"button\", {\n\t\t\ttype: \"button\",\n\t\t\tstyle: { fontSize: \"14px\" },\n\t\t});\n\n\t\teffect.event(detailsButton, \"click\", () => {\n\t\t\tthis.#details.update((prev) => !prev);\n\t\t});\n\n\t\teffect.effect((effect) => {\n\t\t\tdetailsButton.textContent = effect.get(this.#details) ? \"Details ➖\" : \"Details ➕\";\n\t\t});\n\n\t\tconst closeButton = DOM.create(\n\t\t\t\"button\",\n\t\t\t{\n\t\t\t\ttype: \"button\",\n\t\t\t\tstyle: { fontSize: \"14px\" },\n\t\t\t},\n\t\t\t\"Close ❌\",\n\t\t);\n\n\t\teffect.event(closeButton, \"click\", () => {\n\t\t\tthis.#close.set(true);\n\t\t});\n\n\t\theaderDiv.appendChild(statusDiv);\n\t\theaderDiv.appendChild(detailsButton);\n\t\theaderDiv.appendChild(closeButton);\n\n\t\tparent.appendChild(headerDiv);\n\t\teffect.cleanup(() => parent.removeChild(headerDiv));\n\t}\n\n\t#renderDetails(parent: HTMLDivElement, support: Full, effect: Effect) {\n\t\tconst container = DOM.create(\"div\", {\n\t\t\tstyle: {\n\t\t\t\tdisplay: \"grid\",\n\t\t\t\tgridTemplateColumns: \"1fr 1fr 1fr\",\n\t\t\t\tcolumnGap: \"0.5rem\",\n\t\t\t\trowGap: \"0.2rem\",\n\t\t\t\tbackgroundColor: \"rgba(0, 0, 0, 0.6)\",\n\t\t\t\tborderRadius: \"0.5rem\",\n\t\t\t\tpadding: \"1rem\",\n\t\t\t\tfontSize: \"0.875rem\",\n\t\t\t},\n\t\t});\n\n\t\tconst binary = (value: boolean | undefined) => (value ? \"🟢 Yes\" : \"🔴 No\");\n\t\tconst hardware = (codec: Codec | undefined) =>\n\t\t\tcodec?.hardware ? \"🟢 Hardware\" : codec?.software ? `🟡 Software${isFirefox ? \"*\" : \"\"}` : \"🔴 No\";\n\t\tconst partial = (value: Partial | undefined) =>\n\t\t\tvalue === \"full\" ? \"🟢 Full\" : value === \"partial\" ? \"🟡 Polyfill\" : \"🔴 None\";\n\n\t\tconst addRow = (label: string, col2: string, col3: string) => {\n\t\t\tconst labelDiv = DOM.create(\n\t\t\t\t\"div\",\n\t\t\t\t{\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tgridColumnStart: \"1\",\n\t\t\t\t\t\tfontWeight: \"bold\",\n\t\t\t\t\t\ttextAlign: \"right\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tlabel,\n\t\t\t);\n\n\t\t\tconst col2Div = DOM.create(\n\t\t\t\t\"div\",\n\t\t\t\t{\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tgridColumnStart: \"2\",\n\t\t\t\t\t\ttextAlign: \"center\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tcol2,\n\t\t\t);\n\n\t\t\tconst col3Div = DOM.create(\n\t\t\t\t\"div\",\n\t\t\t\t{\n\t\t\t\t\tstyle: { gridColumnStart: \"3\" },\n\t\t\t\t},\n\t\t\t\tcol3,\n\t\t\t);\n\n\t\t\tcontainer.appendChild(labelDiv);\n\t\t\tcontainer.appendChild(col2Div);\n\t\t\tcontainer.appendChild(col3Div);\n\t\t};\n\n\t\taddRow(\"WebTransport\", \"\", partial(support.webtransport));\n\t\taddRow(\"Rendering\", \"Audio\", binary(support.audio.render));\n\t\taddRow(\"\", \"Video\", binary(support.video.render));\n\t\taddRow(\"Decoding\", \"Opus\", partial(support.audio.decoding.opus));\n\t\taddRow(\"\", \"AAC\", binary(support.audio.decoding.aac));\n\t\taddRow(\"\", \"AV1\", hardware(support.video.decoding?.av1));\n\t\taddRow(\"\", \"H.265\", hardware(support.video.decoding?.h265));\n\t\taddRow(\"\", \"H.264\", hardware(support.video.decoding?.h264));\n\t\taddRow(\"\", \"VP9\", hardware(support.video.decoding?.vp9));\n\t\taddRow(\"\", \"VP8\", hardware(support.video.decoding?.vp8));\n\n\t\tif (isFirefox) {\n\t\t\tconst noteDiv = DOM.create(\n\t\t\t\t\"div\",\n\t\t\t\t{\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tgridColumnStart: \"1\",\n\t\t\t\t\t\tgridColumnEnd: \"4\",\n\t\t\t\t\t\ttextAlign: \"center\",\n\t\t\t\t\t\tfontSize: \"0.875rem\",\n\t\t\t\t\t\tfontStyle: \"italic\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"Hardware acceleration is \",\n\t\t\t\tDOM.create(\n\t\t\t\t\t\"a\",\n\t\t\t\t\t{\n\t\t\t\t\t\thref: \"https://github.com/w3c/webcodecs/issues/896\",\n\t\t\t\t\t},\n\t\t\t\t\t\"undetectable\",\n\t\t\t\t),\n\t\t\t\t\" on Firefox.\",\n\t\t\t);\n\t\t\tcontainer.appendChild(noteDiv);\n\t\t}\n\n\t\tparent.appendChild(container);\n\t\teffect.cleanup(() => parent.removeChild(container));\n\t}\n}\n\ncustomElements.define(\"moq-watch-support\", MoqWatchSupport);\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t\"moq-watch-support\": MoqWatchSupport;\n\t}\n}\n"],"names":["create","tagName","options","children","element","style","classList","dataset","attributes","props","key","value","child","isFirefox","OBSERVED","MoqWatchSupport","#show","Signal","#details","#support","#close","#signals","isSupported","s","err","Effect","#render","name","_oldValue","newValue","show","exhaustive","details","#getSummary","support","v","effect","summary","container","DOM.create","#renderHeader","#renderDetails","parent","headerDiv","statusDiv","detailsButton","prev","closeButton","binary","hardware","codec","partial","addRow","label","col2","col3","labelDiv","col2Div","col3Div","noteDiv"],"mappings":"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"}
1
+ {"version":3,"file":"element.js","sources":["../../../signals/src/dom.ts","../../src/support/element.ts"],"sourcesContent":["import type { Effect } from \".\";\n\nexport type CreateOptions<T extends HTMLElement> = {\n\tstyle?: Partial<CSSStyleDeclaration>;\n\tclassName?: string;\n\tclassList?: string[];\n\tid?: string;\n\tdataset?: Record<string, string>;\n\tattributes?: Record<string, string>;\n} & Partial<Omit<T, \"style\" | \"dataset\">>;\n\nexport function create<K extends keyof HTMLElementTagNameMap>(\n\ttagName: K,\n\toptions?: CreateOptions<HTMLElementTagNameMap[K] & HTMLElement>,\n\t...children: (HTMLElement | string)[]\n): HTMLElementTagNameMap[K] {\n\tconst element = document.createElement(tagName);\n\n\tif (!options) return element;\n\n\tconst { style, classList, dataset, attributes, ...props } = options;\n\n\t// Apply styles\n\tif (style) {\n\t\tObject.assign(element.style, style);\n\t}\n\n\t// Apply class list\n\tif (classList) {\n\t\telement.classList.add(...classList);\n\t}\n\n\t// Apply dataset\n\tif (dataset) {\n\t\tObject.entries(dataset).forEach(([key, value]) => {\n\t\t\telement.dataset[key] = value;\n\t\t});\n\t}\n\n\t// Apply attributes\n\tif (attributes) {\n\t\tObject.entries(attributes).forEach(([key, value]) => {\n\t\t\telement.setAttribute(key, value);\n\t\t});\n\t}\n\n\t// Append children\n\tif (children) {\n\t\tchildren.forEach((child) => {\n\t\t\tif (typeof child === \"string\") {\n\t\t\t\telement.appendChild(document.createTextNode(child));\n\t\t\t} else {\n\t\t\t\telement.appendChild(child);\n\t\t\t}\n\t\t});\n\t}\n\n\t// Apply other properties\n\tObject.assign(element, props);\n\n\treturn element;\n}\n\n// Matches solid.js's JSX.Element type.\nexport type Element = Node | ArrayElement | (string & {}) | number | boolean | null | undefined;\ninterface ArrayElement extends Array<Element> {}\n\nexport function render(effect: Effect, parent: Node, element: Element | ((effect: Effect) => Element)) {\n\tconst e = typeof element === \"function\" ? element(effect) : element;\n\tif (e === undefined || e === null) return;\n\n\tlet node: Node;\n\tif (e instanceof Node) {\n\t\tnode = e;\n\t} else if (Array.isArray(e)) {\n\t\tnode = document.createDocumentFragment();\n\t\tfor (const child of e) {\n\t\t\trender(effect, node, child);\n\t\t}\n\t} else if (typeof e === \"number\" || typeof e === \"boolean\" || typeof e === \"string\") {\n\t\tnode = document.createTextNode(e.toString());\n\t} else {\n\t\tconst exhaustive: never = e;\n\t\tthrow new Error(`Invalid element type: ${exhaustive}`);\n\t}\n\n\tparent.appendChild(node);\n\teffect.cleanup(() => parent.removeChild(node));\n}\n\nexport function setClass(effect: Effect, element: HTMLElement, ...classNames: string[]) {\n\tfor (const className of classNames) {\n\t\telement.classList.add(className);\n\t}\n\n\teffect.cleanup(() => {\n\t\tfor (const className of classNames) {\n\t\t\telement.classList.remove(className);\n\t\t}\n\t});\n}\n","import { Effect, Signal } from \"@moq/signals\";\nimport * as DOM from \"@moq/signals/dom\";\nimport { type Codec, type Full, isSupported, type Partial } from \"./\";\n\n// https://bugzilla.mozilla.org/show_bug.cgi?id=1967793\nconst isFirefox = navigator.userAgent.toLowerCase().includes(\"firefox\");\n\nconst OBSERVED = [\"show\", \"details\"] as const;\ntype Observed = (typeof OBSERVED)[number];\n\n// Whether to display the support banner.\n// - \"always\": Always display the banner.\n// - \"warning\": Display the banner if a required feature needs a polyfill/fallback.\n// - \"error\": Display the banner if a required feature is unsupported.\n// - \"never\": Never display the banner.\nexport type Show = \"always\" | \"warning\" | \"error\" | \"never\";\n\nexport default class MoqWatchSupport extends HTMLElement {\n\t#show = new Signal<Show>(\"warning\");\n\t#details = new Signal<boolean>(false);\n\t#support = new Signal<Full | undefined>(undefined);\n\t#close = new Signal<boolean>(false);\n\n\t#signals?: Effect;\n\n\tstatic observedAttributes = OBSERVED;\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tisSupported()\n\t\t\t.then((s) => this.#support.set(s))\n\t\t\t.catch((err) => console.error(\"Failed to detect watch support:\", err));\n\t}\n\n\tconnectedCallback() {\n\t\tthis.#signals = new Effect();\n\t\tthis.#signals.run(this.#render.bind(this));\n\t}\n\n\tdisconnectedCallback() {\n\t\tthis.#signals?.close();\n\t\tthis.#signals = undefined;\n\t}\n\n\tattributeChangedCallback(name: Observed, _oldValue: string | null, newValue: string | null) {\n\t\tif (name === \"show\") {\n\t\t\tconst show = newValue ?? \"warning\";\n\t\t\tif (show === \"always\" || show === \"warning\" || show === \"error\" || show === \"never\") {\n\t\t\t\tthis.show = show;\n\t\t\t} else {\n\t\t\t\tthrow new Error(`Invalid show: ${show}`);\n\t\t\t}\n\t\t} else if (name === \"details\") {\n\t\t\tthis.details = newValue !== null;\n\t\t} else {\n\t\t\tconst exhaustive: never = name;\n\t\t\tthrow new Error(`Invalid attribute: ${exhaustive}`);\n\t\t}\n\t}\n\n\tget show(): Show {\n\t\treturn this.#show.peek();\n\t}\n\n\tset show(show: Show) {\n\t\tthis.#show.set(show);\n\t}\n\n\tget details(): boolean {\n\t\treturn this.#details.peek();\n\t}\n\n\tset details(details: boolean) {\n\t\tthis.#details.set(details);\n\t}\n\n\t#getSummary(support: Full): Partial {\n\t\tif (support.webtransport === \"none\") return \"none\";\n\n\t\tif (!support.audio.decoding || !support.video.decoding) return \"none\";\n\t\tif (!support.audio.render || !support.video.render) return \"none\";\n\n\t\tif (!Object.values(support.audio.decoding).some((v) => v === true || v === \"full\" || v === \"partial\"))\n\t\t\treturn \"none\";\n\t\tif (!Object.values(support.video.decoding).some((v) => v.software || v.hardware)) return \"none\";\n\n\t\tif (!Object.values(support.audio.decoding).every((v) => v === true || v === \"full\")) return \"partial\";\n\t\tif (!Object.values(support.video.decoding).every((v) => v.software || v.hardware)) return \"partial\";\n\n\t\treturn \"full\";\n\t}\n\n\t#render(effect: Effect) {\n\t\tconst support = effect.get(this.#support);\n\t\tif (!support) return;\n\n\t\tconst close = effect.get(this.#close);\n\t\tif (close) return;\n\n\t\tconst show = effect.get(this.#show);\n\t\tif (show === \"never\") return;\n\n\t\tconst summary = this.#getSummary(support);\n\n\t\t// Don't render the banner if we have full support and they only asked for warnings.\n\t\tif (show === \"warning\" && summary === \"full\") return;\n\n\t\t// Don't render the banner if we have at least partial support and they only asked for errors.\n\t\tif (show === \"error\" && summary !== \"none\") return;\n\n\t\tconst container = DOM.create(\"div\", {\n\t\t\tstyle: {\n\t\t\t\tmargin: \"0 auto\",\n\t\t\t\tmaxWidth: \"28rem\",\n\t\t\t\tpadding: \"1rem\",\n\t\t\t},\n\t\t});\n\n\t\tthis.appendChild(container);\n\t\teffect.cleanup(() => this.removeChild(container));\n\n\t\tthis.#renderHeader(container, summary, effect);\n\n\t\tif (effect.get(this.#details)) {\n\t\t\tthis.#renderDetails(container, support, effect);\n\t\t}\n\t}\n\n\t#renderHeader(parent: HTMLDivElement, summary: Partial, effect: Effect) {\n\t\tconst headerDiv = DOM.create(\"div\", {\n\t\t\tstyle: {\n\t\t\t\tdisplay: \"flex\",\n\t\t\t\tflexDirection: \"row\",\n\t\t\t\tgap: \"1rem\",\n\t\t\t\tflexWrap: \"wrap\",\n\t\t\t\tjustifyContent: \"space-between\",\n\t\t\t\talignItems: \"center\",\n\t\t\t},\n\t\t});\n\n\t\tconst statusDiv = DOM.create(\"div\", {\n\t\t\tstyle: { fontWeight: \"bold\" },\n\t\t});\n\n\t\tif (summary === \"full\") {\n\t\t\tstatusDiv.textContent = \"🟢 Full Browser Support\";\n\t\t} else if (summary === \"partial\") {\n\t\t\tstatusDiv.textContent = \"🟡 Partial Browser Support\";\n\t\t} else if (summary === \"none\") {\n\t\t\tstatusDiv.textContent = \"🔴 No Browser Support\";\n\t\t}\n\n\t\tconst detailsButton = DOM.create(\"button\", {\n\t\t\ttype: \"button\",\n\t\t\tstyle: { fontSize: \"14px\" },\n\t\t});\n\n\t\teffect.event(detailsButton, \"click\", () => {\n\t\t\tthis.#details.update((prev) => !prev);\n\t\t});\n\n\t\teffect.run((effect) => {\n\t\t\tdetailsButton.textContent = effect.get(this.#details) ? \"Details ➖\" : \"Details ➕\";\n\t\t});\n\n\t\tconst closeButton = DOM.create(\n\t\t\t\"button\",\n\t\t\t{\n\t\t\t\ttype: \"button\",\n\t\t\t\tstyle: { fontSize: \"14px\" },\n\t\t\t},\n\t\t\t\"Close ❌\",\n\t\t);\n\n\t\teffect.event(closeButton, \"click\", () => {\n\t\t\tthis.#close.set(true);\n\t\t});\n\n\t\theaderDiv.appendChild(statusDiv);\n\t\theaderDiv.appendChild(detailsButton);\n\t\theaderDiv.appendChild(closeButton);\n\n\t\tparent.appendChild(headerDiv);\n\t\teffect.cleanup(() => parent.removeChild(headerDiv));\n\t}\n\n\t#renderDetails(parent: HTMLDivElement, support: Full, effect: Effect) {\n\t\tconst container = DOM.create(\"div\", {\n\t\t\tstyle: {\n\t\t\t\tdisplay: \"grid\",\n\t\t\t\tgridTemplateColumns: \"1fr 1fr 1fr\",\n\t\t\t\tcolumnGap: \"0.5rem\",\n\t\t\t\trowGap: \"0.2rem\",\n\t\t\t\tbackgroundColor: \"rgba(0, 0, 0, 0.6)\",\n\t\t\t\tborderRadius: \"0.5rem\",\n\t\t\t\tpadding: \"1rem\",\n\t\t\t\tfontSize: \"0.875rem\",\n\t\t\t},\n\t\t});\n\n\t\tconst binary = (value: boolean | undefined) => (value ? \"🟢 Yes\" : \"🔴 No\");\n\t\tconst hardware = (codec: Codec | undefined) =>\n\t\t\tcodec?.hardware ? \"🟢 Hardware\" : codec?.software ? `🟡 Software${isFirefox ? \"*\" : \"\"}` : \"🔴 No\";\n\t\tconst partial = (value: Partial | undefined) =>\n\t\t\tvalue === \"full\" ? \"🟢 Full\" : value === \"partial\" ? \"🟡 Polyfill\" : \"🔴 None\";\n\n\t\tconst addRow = (label: string, col2: string, col3: string) => {\n\t\t\tconst labelDiv = DOM.create(\n\t\t\t\t\"div\",\n\t\t\t\t{\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tgridColumnStart: \"1\",\n\t\t\t\t\t\tfontWeight: \"bold\",\n\t\t\t\t\t\ttextAlign: \"right\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tlabel,\n\t\t\t);\n\n\t\t\tconst col2Div = DOM.create(\n\t\t\t\t\"div\",\n\t\t\t\t{\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tgridColumnStart: \"2\",\n\t\t\t\t\t\ttextAlign: \"center\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tcol2,\n\t\t\t);\n\n\t\t\tconst col3Div = DOM.create(\n\t\t\t\t\"div\",\n\t\t\t\t{\n\t\t\t\t\tstyle: { gridColumnStart: \"3\" },\n\t\t\t\t},\n\t\t\t\tcol3,\n\t\t\t);\n\n\t\t\tcontainer.appendChild(labelDiv);\n\t\t\tcontainer.appendChild(col2Div);\n\t\t\tcontainer.appendChild(col3Div);\n\t\t};\n\n\t\taddRow(\"WebTransport\", \"\", partial(support.webtransport));\n\t\taddRow(\"Rendering\", \"Audio\", binary(support.audio.render));\n\t\taddRow(\"\", \"Video\", binary(support.video.render));\n\t\taddRow(\"Decoding\", \"Opus\", partial(support.audio.decoding.opus));\n\t\taddRow(\"\", \"AAC\", binary(support.audio.decoding.aac));\n\t\taddRow(\"\", \"AV1\", hardware(support.video.decoding?.av1));\n\t\taddRow(\"\", \"H.265\", hardware(support.video.decoding?.h265));\n\t\taddRow(\"\", \"H.264\", hardware(support.video.decoding?.h264));\n\t\taddRow(\"\", \"VP9\", hardware(support.video.decoding?.vp9));\n\t\taddRow(\"\", \"VP8\", hardware(support.video.decoding?.vp8));\n\n\t\tif (isFirefox) {\n\t\t\tconst noteDiv = DOM.create(\n\t\t\t\t\"div\",\n\t\t\t\t{\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tgridColumnStart: \"1\",\n\t\t\t\t\t\tgridColumnEnd: \"4\",\n\t\t\t\t\t\ttextAlign: \"center\",\n\t\t\t\t\t\tfontSize: \"0.875rem\",\n\t\t\t\t\t\tfontStyle: \"italic\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"Hardware acceleration is \",\n\t\t\t\tDOM.create(\n\t\t\t\t\t\"a\",\n\t\t\t\t\t{\n\t\t\t\t\t\thref: \"https://github.com/w3c/webcodecs/issues/896\",\n\t\t\t\t\t},\n\t\t\t\t\t\"undetectable\",\n\t\t\t\t),\n\t\t\t\t\" on Firefox.\",\n\t\t\t);\n\t\t\tcontainer.appendChild(noteDiv);\n\t\t}\n\n\t\tparent.appendChild(container);\n\t\teffect.cleanup(() => parent.removeChild(container));\n\t}\n}\n\ncustomElements.define(\"moq-watch-support\", MoqWatchSupport);\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t\"moq-watch-support\": MoqWatchSupport;\n\t}\n}\n"],"names":["create","tagName","options","children","element","style","classList","dataset","attributes","props","key","value","child","isFirefox","OBSERVED","MoqWatchSupport","#show","Signal","#details","#support","#close","#signals","isSupported","s","err","Effect","#render","name","_oldValue","newValue","show","exhaustive","details","#getSummary","support","v","effect","summary","container","DOM.create","#renderHeader","#renderDetails","parent","headerDiv","statusDiv","detailsButton","prev","closeButton","binary","hardware","codec","partial","addRow","label","col2","col3","labelDiv","col2Div","col3Div","noteDiv"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"BufferControl.d.ts","sourceRoot":"","sources":["../../../src/ui/components/BufferControl.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAQhC,KAAK,kBAAkB,GAAG;IACzB,kEAAkE;IAClE,GAAG,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;CACrB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,KAAK,EAAE,kBAAkB,kCAsJ9D"}
1
+ {"version":3,"file":"BufferControl.d.ts","sourceRoot":"","sources":["../../../src/ui/components/BufferControl.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAQhC,KAAK,kBAAkB,GAAG;IACzB,kEAAkE;IAClE,GAAG,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;CACrB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,KAAK,EAAE,kBAAkB,kCA0J9D"}
@@ -1 +1 @@
1
- {"version":3,"file":"WatchStatusIndicator.d.ts","sourceRoot":"","sources":["../../../src/ui/components/WatchStatusIndicator.tsx"],"names":[],"mappings":"AAGA,MAAM,CAAC,OAAO,UAAU,oBAAoB,mCAgB3C"}
1
+ {"version":3,"file":"WatchStatusIndicator.d.ts","sourceRoot":"","sources":["../../../src/ui/components/WatchStatusIndicator.tsx"],"names":[],"mappings":"AAiBA,MAAM,CAAC,OAAO,UAAU,oBAAoB,mCAgB3C"}
package/ui/context.d.ts CHANGED
@@ -6,7 +6,7 @@ type WatchUIContextProviderProps = {
6
6
  moqWatch: MoqWatch;
7
7
  children: JSX.Element;
8
8
  };
9
- type WatchStatus = "no-url" | "disconnected" | "connecting" | "offline" | "loading" | "live" | "connected";
9
+ export type WatchStatus = "no-url" | "disconnected" | "connecting" | "offline" | "loading" | "live" | "connected";
10
10
  export type Rendition = {
11
11
  name: string;
12
12
  width?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/ui/context.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAW,MAAM,WAAW,CAAC;AAE9C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AACzC,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AAEvC,KAAK,2BAA2B,GAAG;IAClC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC;CACtB,CAAC;AAEF,KAAK,WAAW,GAAG,QAAQ,GAAG,cAAc,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,WAAW,CAAC;AAE3G,MAAM,MAAM,SAAS,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IAClC,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,MAAM,WAAW,CAAC;IAC/B,SAAS,EAAE,MAAM,OAAO,CAAC;IACzB,OAAO,EAAE,MAAM,OAAO,CAAC;IACvB,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,aAAa,EAAE,MAAM,MAAM,CAAC;IAC5B,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,OAAO,CAAC;IACzB,MAAM,EAAE,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;IAC7B,SAAS,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC;IAC3C,mBAAmB,EAAE,MAAM,SAAS,EAAE,CAAC;IACvC,eAAe,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAC1C,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IACvD,mBAAmB,EAAE,MAAM,OAAO,CAAC;IACnC,sBAAsB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACnD,YAAY,EAAE,MAAM,OAAO,CAAC;IAC5B,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,SAAS,EAAE,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;IAC5C,aAAa,EAAE,MAAM,cAAc,CAAC;IACpC,aAAa,EAAE,MAAM,cAAc,CAAC;CACpC,CAAC;AAEF,eAAO,MAAM,cAAc,8DAAwC,CAAC;AAEpE,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,eAoJhF"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/ui/context.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAW,MAAM,WAAW,CAAC;AAE9C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AACzC,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AAEvC,KAAK,2BAA2B,GAAG;IAClC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,cAAc,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,WAAW,CAAC;AAElH,MAAM,MAAM,SAAS,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IAClC,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,MAAM,WAAW,CAAC;IAC/B,SAAS,EAAE,MAAM,OAAO,CAAC;IACzB,OAAO,EAAE,MAAM,OAAO,CAAC;IACvB,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,aAAa,EAAE,MAAM,MAAM,CAAC;IAC5B,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,OAAO,CAAC;IACzB,MAAM,EAAE,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;IAC7B,SAAS,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC;IAC3C,mBAAmB,EAAE,MAAM,SAAS,EAAE,CAAC;IACvC,eAAe,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAC1C,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IACvD,mBAAmB,EAAE,MAAM,OAAO,CAAC;IACnC,sBAAsB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACnD,YAAY,EAAE,MAAM,OAAO,CAAC;IAC5B,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,SAAS,EAAE,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;IAC5C,aAAa,EAAE,MAAM,cAAc,CAAC;IACpC,aAAa,EAAE,MAAM,cAAc,CAAC;CACpC,CAAC;AAEF,eAAO,MAAM,cAAc,8DAAwC,CAAC;AAEpE,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,eA+HhF"}