forked from
tokono.ma/diffuse
A music player that connects to your cloud/distributed storage.
1import type { Signal, SignalReader } from "~/common/signal.d.ts";
2import type { DiffuseElement } from "~/common/element.js";
3import type {
4 Facet,
5 PlaylistItem,
6 Setting,
7 Track,
8} from "~/definitions/types.d.ts";
9
10export type OutputElement<Encoding = null> =
11 & DiffuseElement
12 & OutputManagerDeputy<Encoding>;
13
14export type OutputManagerDeputy<Encoding = null> =
15 & Omit<OutputManager<Encoding>, "signals">
16 & { ready: SignalReader<boolean> };
17
18export type OutputManager<Encoding = null> = {
19 facets: {
20 collection: SignalReader<
21 | { state: "loading" }
22 | { state: "loaded"; data: Encoding extends null ? Facet[] : Encoding }
23 >;
24 reload: () => Promise<void>;
25 save: (
26 facets: Encoding extends null ? Facet[] : Encoding,
27 ) => Promise<void>;
28 };
29 playlistItems: {
30 collection: SignalReader<
31 | { state: "loading" }
32 | { state: "loaded"; data: Encoding extends null ? PlaylistItem[] : Encoding }
33 >;
34 reload: () => Promise<void>;
35 save: (
36 playlistItems: Encoding extends null ? PlaylistItem[] : Encoding,
37 ) => Promise<void>;
38 };
39 settings: {
40 collection: SignalReader<
41 | { state: "loading" }
42 | { state: "loaded"; data: Encoding extends null ? Setting[] : Encoding }
43 >;
44 reload: () => Promise<void>;
45 save: (
46 settings: Encoding extends null ? Setting[] : Encoding,
47 ) => Promise<void>;
48 };
49 signals: {
50 facets: Signal<Encoding extends null ? Facet[] : Encoding>;
51 playlistItems: Signal<Encoding extends null ? PlaylistItem[] : Encoding>;
52 settings: Signal<Encoding extends null ? Setting[] : Encoding>;
53 tracks: Signal<Encoding extends null ? Track[] : Encoding>;
54 };
55 tracks: {
56 collection: SignalReader<
57 | { state: "loading" }
58 | { state: "loaded"; data: Encoding extends null ? Track[] : Encoding }
59 >;
60 reload: () => Promise<void>;
61 save: (tracks: Encoding extends null ? Track[] : Encoding) => Promise<void>;
62 };
63};
64
65export type OutputManagerProperties<Encoding = null> = {
66 facets: {
67 empty(): Encoding extends null ? Facet[] : Encoding;
68 get(): Promise<Encoding extends null ? Facet[] : Encoding>;
69 put(
70 facets: Encoding extends null ? Facet[] : Encoding,
71 ): Promise<void>;
72 };
73 init?: () => Promise<boolean>;
74 playlistItems: {
75 empty(): Encoding extends null ? PlaylistItem[] : Encoding;
76 get(): Promise<Encoding extends null ? PlaylistItem[] : Encoding>;
77 put(
78 playlistItems: Encoding extends null ? PlaylistItem[] : Encoding,
79 ): Promise<void>;
80 };
81 settings: {
82 empty(): Encoding extends null ? Setting[] : Encoding;
83 get(): Promise<Encoding extends null ? Setting[] : Encoding>;
84 put(
85 settings: Encoding extends null ? Setting[] : Encoding,
86 ): Promise<void>;
87 };
88 tracks: {
89 empty(): Encoding extends null ? Track[] : Encoding;
90 get(): Promise<Encoding extends null ? Track[] : Encoding>;
91 put(tracks: Encoding extends null ? Track[] : Encoding): Promise<void>;
92 };
93};
94
95export type OutputWorkerActions<DataType> = {
96 get(args: { name: string }): Promise<DataType>;
97 put(args: { data: DataType; name: string }): Promise<void>;
98};