A music player that connects to your cloud/distributed storage.
5
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: search-tracks orchestrator

+117 -83
-68
_backup/pages/orchestrator/search-tracks/_applet.astro
··· 1 - <script> 2 - import type { GroupConsult, ManagedOutput, Track } from "@applets/core/types.d.ts"; 3 - import { applet, reactive, register, wait } from "@scripts/applet/common"; 4 - 5 - //////////////////////////////////////////// 6 - // SETUP 7 - //////////////////////////////////////////// 8 - const context = register(); 9 - 10 - // Applet connections 11 - const configurator = { 12 - input: applet("/configurator/input"), 13 - output: applet<ManagedOutput>("/configurator/output"), 14 - }; 15 - 16 - const processor = { 17 - search: applet("/processor/search"), 18 - }; 19 - 20 - //////////////////////////////////////////// 21 - // SEARCH ⭤ TRACKS 22 - //////////////////////////////////////////// 23 - async function monitorTracks() { 24 - await context.settled(); 25 - 26 - // Add tracks to the search supply once the tracks have been loaded; 27 - // and every time the collection changes. 28 - 29 - const input = await configurator.input; 30 - const output = await configurator.output; 31 - const search = await processor.search; 32 - 33 - await wait(output, (d) => d?.tracks.state === "loaded"); 34 - 35 - reactive( 36 - output, 37 - (data) => data.tracks.cacheId, 38 - async () => { 39 - if (!context.isMainInstance()) return; 40 - 41 - const groups = await input.sendAction<GroupConsult>( 42 - "groupConsult", 43 - output.data.tracks.collection, 44 - { timeoutDuration: 60000 * 5, worker: true }, 45 - ); 46 - 47 - // Available tracks 48 - let tracks: Track[] = []; 49 - 50 - Object.values(groups).forEach((value) => { 51 - if (value.available === false) return; 52 - tracks = tracks.concat(value.tracks); 53 - }, []); 54 - 55 - // Supply 56 - await search.sendAction("supply", tracks, { 57 - timeoutDuration: 60000, 58 - worker: true, 59 - }); 60 - }, 61 - ); 62 - } 63 - 64 - //////////////////////////////////////////// 65 - // 🚀 66 - //////////////////////////////////////////// 67 - monitorTracks(); 68 - </script>
-6
_backup/pages/orchestrator/search-tracks/_manifest.json
··· 1 - { 2 - "name": "diffuse/orchestrator/queue-tracks", 3 - "title": "Diffuse Orchestrator | Queue Tracks", 4 - "entrypoint": "index.html", 5 - "actions": {} 6 - }
-9
_backup/pages/orchestrator/search-tracks/index.astro
··· 1 - --- 2 - import Layout from "@layouts/applet.astro"; 3 - import Applet from "./_applet.astro"; 4 - import { title } from "./_manifest.json"; 5 - --- 6 - 7 - <Layout title={title}> 8 - <Applet /> 9 - </Layout>
+78
src/component/orchestrator/search-tracks/element.js
··· 1 + import { DiffuseElement, query } from "@common/element.js"; 2 + 3 + /** 4 + * @import {InputElement, OutputElement, Track} from "@component/core/types.d.ts" 5 + */ 6 + 7 + //////////////////////////////////////////// 8 + // ELEMENT 9 + //////////////////////////////////////////// 10 + 11 + /** 12 + * Fill the search supply automatically with 13 + * tracks whenever they have been loaded, 14 + * or the tracks collection changes. 15 + */ 16 + class SearchTracksOrchestrator extends DiffuseElement { 17 + constructor() { 18 + super(); 19 + 20 + /** @type {InputElement} */ 21 + this.input = query(this, "input-selector"); 22 + 23 + /** @type {OutputElement} */ 24 + this.output = query(this, "output-selector"); 25 + 26 + /** @type {import("@component/processor/search/element.js").CLASS} */ 27 + this.search = query(this, "search-processor-selector"); 28 + } 29 + 30 + // LIFECYCLE 31 + 32 + /** 33 + * @override 34 + */ 35 + async connectedCallback() { 36 + super.connectedCallback(); 37 + 38 + // When defined 39 + await customElements.whenDefined(this.output.localName); 40 + 41 + // Watch tracks collection 42 + this.effect(() => { 43 + const tracks = this.output.tracks.collection(); 44 + this.supplyAvailable(tracks); 45 + }); 46 + } 47 + 48 + // 🚛 49 + 50 + /** 51 + * @param {Track[]} cachedTracks 52 + */ 53 + async supplyAvailable(cachedTracks) { 54 + const groups = await this.input.groupConsult(cachedTracks); 55 + 56 + /** @type {Track[]} */ 57 + let availableTracks = []; 58 + 59 + Object.values(groups).forEach((value) => { 60 + if (value.available === false) return; 61 + availableTracks = availableTracks.concat(value.tracks); 62 + }, []); 63 + 64 + // Set pool 65 + await this.search.supply(availableTracks); 66 + } 67 + } 68 + 69 + export default SearchTracksOrchestrator; 70 + 71 + //////////////////////////////////////////// 72 + // REGISTER 73 + //////////////////////////////////////////// 74 + 75 + export const CLASS = SearchTracksOrchestrator; 76 + export const NAME = "do-search-tracks"; 77 + 78 + customElements.define(NAME, SearchTracksOrchestrator);
+39
src/component/processor/search/element.js
··· 1 + import { DiffuseElement } from "@common/element.js"; 2 + import { use } from "@common/worker.js"; 3 + 4 + /** 5 + * @import {Actions} from "./types.d.ts" 6 + */ 7 + 8 + //////////////////////////////////////////// 9 + // ELEMENT 10 + //////////////////////////////////////////// 11 + 12 + /** 13 + * @implements {Actions} 14 + */ 15 + class SearchProcessor extends DiffuseElement { 16 + constructor() { 17 + super(); 18 + 19 + // Setup worker 20 + const name = `diffuse/processor/search/${this.group}`; 21 + const url = "/component/processor/search/worker.js"; 22 + const worker = new Worker(url, { name, type: "module" }); 23 + 24 + // Worker proxy 25 + this.search = use("search", worker); 26 + this.supply = use("supply", worker); 27 + } 28 + } 29 + 30 + export default SearchProcessor; 31 + 32 + //////////////////////////////////////////// 33 + // REGISTER 34 + //////////////////////////////////////////// 35 + 36 + export const CLASS = SearchProcessor; 37 + export const NAME = "dp-search"; 38 + 39 + customElements.define(NAME, SearchProcessor);