diff --git a/package.json b/package.json index 63b2fc7..0c93483 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "packages/components/*", "packages/core/*", "packages/infrastructure/*", + "packages/services/*", "packages/workflows/*", "packages/workers/*" ] diff --git a/packages/components/state/package.json b/packages/components/state/package.json index 10fe189..7b53de5 100644 --- a/packages/components/state/package.json +++ b/packages/components/state/package.json @@ -9,7 +9,7 @@ "dependencies": { "@echo/components-effect-bridge": "^1.0.0", "@echo/core-types": "^1.0.0", - "@echo/infrastructure-bootstrap": "^1.0.0", + "@echo/services-bootstrap": "^1.0.0", "effect": "^3.2.8", "jotai": "^2.8.3" }, diff --git a/packages/components/state/src/provider.state.ts b/packages/components/state/src/provider.state.ts index 756d712..49a3f6a 100644 --- a/packages/components/state/src/provider.state.ts +++ b/packages/components/state/src/provider.state.ts @@ -5,7 +5,7 @@ import { type ProviderMetadata, type ProviderStatus, } from "@echo/core-types"; -import { MainLive } from "@echo/infrastructure-bootstrap"; +import { MainLive } from "@echo/services-bootstrap"; import { Effect, Fiber } from "effect"; import { atom, useAtom } from "jotai"; import { useCallback, useRef } from "react"; diff --git a/packages/core/types/src/model/index.ts b/packages/core/types/src/model/index.ts index 57020e0..3cd96d0 100644 --- a/packages/core/types/src/model/index.ts +++ b/packages/core/types/src/model/index.ts @@ -4,5 +4,6 @@ export * from "./artist"; export * from "./authentication"; export * from "./common"; export * from "./file-system"; +export * from "./player-state"; export * from "./provider-metadata"; export * from "./track"; diff --git a/packages/core/types/src/model/player-state.ts b/packages/core/types/src/model/player-state.ts new file mode 100644 index 0000000..a6fc7d8 --- /dev/null +++ b/packages/core/types/src/model/player-state.ts @@ -0,0 +1,32 @@ +import type { Option } from "effect"; +import type { Track } from "./track"; + +/** + * Defines whether the player is playing, paused or stopped. + */ +export type PlayingStatus = "playing" | "paused" | "stopped"; + +/** + * Represents the current state of the player. + */ +export type PlayerState = { + /** + * Whether the player is playing, paused or stopped. + */ + status: PlayingStatus; + + /** + * Current track that is being played, if any. + */ + currentTrack: Option.Option; + + /** + * List of tracks that have been played before the current track. + */ + previouslyPlayedTracks: Track[]; + + /** + * List of tracks that will be played after the current track. + */ + comingUpTracks: Track[]; +}; diff --git a/packages/core/types/src/services/index.ts b/packages/core/types/src/services/index.ts index aa0fe2f..69016ed 100644 --- a/packages/core/types/src/services/index.ts +++ b/packages/core/types/src/services/index.ts @@ -5,3 +5,4 @@ export * from "./database"; export * from "./library"; export * from "./metadata-provider"; export * from "./mediaProvider"; +export * from "./player"; diff --git a/packages/core/types/src/services/player.ts b/packages/core/types/src/services/player.ts new file mode 100644 index 0000000..5a335bd --- /dev/null +++ b/packages/core/types/src/services/player.ts @@ -0,0 +1,18 @@ +import { Context, Effect } from "effect"; +import type { Album } from "../model"; + +/** + * Service that provides a way to interact with the player and its state. + */ +export type Player = { + /** + * Plays the given album, detecting the source from each track and delegating + * the playback to the appropriate media provider. + */ + readonly playAlbum: (album: Album) => Effect.Effect; +}; + +/** + * Tag to identify the player service. + */ +export const Player = Context.GenericTag("@echo/core-types/Player"); diff --git a/packages/infrastructure/bootstrap/index.ts b/packages/services/bootstrap/index.ts similarity index 100% rename from packages/infrastructure/bootstrap/index.ts rename to packages/services/bootstrap/index.ts diff --git a/packages/infrastructure/bootstrap/package.json b/packages/services/bootstrap/package.json similarity index 77% rename from packages/infrastructure/bootstrap/package.json rename to packages/services/bootstrap/package.json index 7f50c7b..e663495 100644 --- a/packages/infrastructure/bootstrap/package.json +++ b/packages/services/bootstrap/package.json @@ -1,8 +1,8 @@ { - "name": "@echo/infrastructure-bootstrap", + "name": "@echo/services-bootstrap", "private": true, "version": "1.0.0", - "description": "Contains the Bootstrap related infrastructure", + "description": "Orchestrates the initialization of the layers for the application and workers", "main": "index.js", "scripts": { "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", @@ -13,7 +13,7 @@ "@echo/infrastructure-broadcast-channel": "^1.0.0", "@echo/infrastructure-browser-crypto": "^1.0.0", "@echo/infrastructure-dexie-database": "^1.0.0", - "@echo/infrastructure-library": "^1.0.0", + "@echo/services-library": "^1.0.0", "@echo/infrastructure-mmb-metadata-provider": "^1.0.0", "@echo/infrastructure-onedrive-provider": "^1.0.0", "@echo/workers-media-provider": "^1.0.0", diff --git a/packages/infrastructure/bootstrap/src/app-config.ts b/packages/services/bootstrap/src/app-config.ts similarity index 100% rename from packages/infrastructure/bootstrap/src/app-config.ts rename to packages/services/bootstrap/src/app-config.ts diff --git a/packages/infrastructure/bootstrap/src/layers.ts b/packages/services/bootstrap/src/layers.ts similarity index 95% rename from packages/infrastructure/bootstrap/src/layers.ts rename to packages/services/bootstrap/src/layers.ts index 0fc892f..54e0f9e 100644 --- a/packages/infrastructure/bootstrap/src/layers.ts +++ b/packages/services/bootstrap/src/layers.ts @@ -5,7 +5,7 @@ import { } from "@echo/infrastructure-broadcast-channel"; import { BrowserCryptoLive } from "@echo/infrastructure-browser-crypto"; import { DexieDatabaseLive } from "@echo/infrastructure-dexie-database"; -import { LibraryLive } from "@echo/infrastructure-library"; +import { LibraryLive } from "@echo/services-library"; import { MmbMetadataProviderLive } from "@echo/infrastructure-mmb-metadata-provider"; import { LazyLoadedProviderLive } from "./loaders/provider"; import { AppConfigLive } from "./app-config"; diff --git a/packages/infrastructure/bootstrap/src/loaders/index.ts b/packages/services/bootstrap/src/loaders/index.ts similarity index 100% rename from packages/infrastructure/bootstrap/src/loaders/index.ts rename to packages/services/bootstrap/src/loaders/index.ts diff --git a/packages/infrastructure/bootstrap/src/loaders/provider.ts b/packages/services/bootstrap/src/loaders/provider.ts similarity index 97% rename from packages/infrastructure/bootstrap/src/loaders/provider.ts rename to packages/services/bootstrap/src/loaders/provider.ts index e8b4e7a..00ee5ba 100644 --- a/packages/infrastructure/bootstrap/src/loaders/provider.ts +++ b/packages/services/bootstrap/src/loaders/provider.ts @@ -22,7 +22,7 @@ export type LazyLoadedProvider = { * Tag to identify the lazy loaded provider service. */ export const LazyLoadedProvider = Context.GenericTag( - "@echo/infrastructure-bootstrap/LazyLoadedProvider", + "@echo/services-bootstrap/LazyLoadedProvider", ); /** diff --git a/packages/infrastructure/bootstrap/src/loaders/workers.ts b/packages/services/bootstrap/src/loaders/workers.ts similarity index 100% rename from packages/infrastructure/bootstrap/src/loaders/workers.ts rename to packages/services/bootstrap/src/loaders/workers.ts diff --git a/packages/infrastructure/bootstrap/src/vite-env.d.ts b/packages/services/bootstrap/src/vite-env.d.ts similarity index 100% rename from packages/infrastructure/bootstrap/src/vite-env.d.ts rename to packages/services/bootstrap/src/vite-env.d.ts diff --git a/packages/infrastructure/bootstrap/tsconfig.json b/packages/services/bootstrap/tsconfig.json similarity index 100% rename from packages/infrastructure/bootstrap/tsconfig.json rename to packages/services/bootstrap/tsconfig.json diff --git a/packages/infrastructure/library/index.ts b/packages/services/library/index.ts similarity index 100% rename from packages/infrastructure/library/index.ts rename to packages/services/library/index.ts diff --git a/packages/infrastructure/library/package.json b/packages/services/library/package.json similarity index 90% rename from packages/infrastructure/library/package.json rename to packages/services/library/package.json index 8f9187b..eecb816 100644 --- a/packages/infrastructure/library/package.json +++ b/packages/services/library/package.json @@ -1,5 +1,5 @@ { - "name": "@echo/infrastructure-library", + "name": "@echo/services-library", "private": true, "version": "1.0.0", "description": "Implementation of the library service that uses the underlying database mechanism", diff --git a/packages/infrastructure/library/tsconfig.json b/packages/services/library/tsconfig.json similarity index 100% rename from packages/infrastructure/library/tsconfig.json rename to packages/services/library/tsconfig.json diff --git a/packages/web/package.json b/packages/web/package.json index 962f551..a501975 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -14,7 +14,7 @@ "@echo/components-effect-bridge": "^1.0.0", "@echo/components-state": "^1.0.0", "@echo/core-types": "^1.0.0", - "@echo/infrastructure-bootstrap": "^1.0.0", + "@echo/services-bootstrap": "^1.0.0", "effect": "^3.2.8", "jotai": "^2.8.3" }, diff --git a/packages/web/src/App.tsx b/packages/web/src/App.tsx index 5374474..fb3157a 100644 --- a/packages/web/src/App.tsx +++ b/packages/web/src/App.tsx @@ -21,7 +21,7 @@ import { providerStateAtom, } from "@echo/components-state"; import { Effect, Fiber, Match } from "effect"; -import { LazyLoadedProvider, MainLive } from "@echo/infrastructure-bootstrap"; +import { LazyLoadedProvider, MainLive } from "@echo/services-bootstrap"; import { useAtom } from "jotai"; const retrieveLazyLoader = Effect.gen(function* () { diff --git a/packages/web/src/main.tsx b/packages/web/src/main.tsx index 02b5eff..ccb77ae 100644 --- a/packages/web/src/main.tsx +++ b/packages/web/src/main.tsx @@ -1,7 +1,7 @@ import React from "react"; import { createRoot } from "react-dom/client"; import { App } from "./App"; -import { initializeWorkers } from "@echo/infrastructure-bootstrap"; +import { initializeWorkers } from "@echo/services-bootstrap"; initializeWorkers(); diff --git a/packages/workers/media-provider/package.json b/packages/workers/media-provider/package.json index d935bc5..26b5962 100644 --- a/packages/workers/media-provider/package.json +++ b/packages/workers/media-provider/package.json @@ -14,7 +14,7 @@ "@echo/core-types": "^1.0.0", "@echo/infrastructure-broadcast-channel": "^1.0.0", "@echo/infrastructure-browser-crypto": "^1.0.0", - "@echo/infrastructure-bootstrap": "^1.0.0", + "@echo/services-bootstrap": "^1.0.0", "@effect/schema": "^0.67.18", "effect": "^3.2.8" } diff --git a/packages/workers/media-provider/src/media-provider.worker.ts b/packages/workers/media-provider/src/media-provider.worker.ts index d2f5c2e..ef0db4a 100644 --- a/packages/workers/media-provider/src/media-provider.worker.ts +++ b/packages/workers/media-provider/src/media-provider.worker.ts @@ -1,4 +1,4 @@ -import { WorkerLive } from "@echo/infrastructure-bootstrap"; +import { WorkerLive } from "@echo/services-bootstrap"; import { Effect, Match, Ref, Stream } from "effect"; import * as S from "@effect/schema/Schema"; import { InitMessage, init } from "./init"; diff --git a/packages/workers/media-provider/src/resolvers/start.resolver.ts b/packages/workers/media-provider/src/resolvers/start.resolver.ts index 5dba53b..4c571b3 100644 --- a/packages/workers/media-provider/src/resolvers/start.resolver.ts +++ b/packages/workers/media-provider/src/resolvers/start.resolver.ts @@ -7,7 +7,7 @@ import { Database, Crypto, } from "@echo/core-types"; -import { LazyLoadedProvider } from "@echo/infrastructure-bootstrap"; +import { LazyLoadedProvider } from "@echo/services-bootstrap"; import { Effect, Match, Ref } from "effect"; import type { WorkerState } from "../state"; import { isValidToken } from "@echo/core-auth"; diff --git a/packages/workers/media-provider/src/state.ts b/packages/workers/media-provider/src/state.ts index 9cb9900..05ea137 100644 --- a/packages/workers/media-provider/src/state.ts +++ b/packages/workers/media-provider/src/state.ts @@ -16,7 +16,6 @@ export type WorkerState = { /** * Tag that can provide a ref to the current worker state. */ -export class WorkerStateRef extends Context.Tag("")< - WorkerStateRef, - Ref.Ref ->() {} +export class WorkerStateRef extends Context.Tag( + "@echo/workers-media-provider/WorkerStateRef", +)>() {}