diff --git a/package.json b/package.json index 88e404f..3bfad80 100644 --- a/package.json +++ b/package.json @@ -15,8 +15,8 @@ "prepare": "husky" }, "dependencies": { - "@effect/schema": "^0.67.18", - "effect": "^3.5.8", + "@effect/schema": "^0.71.1", + "effect": "^3.6.5", "react": "^18.2.0", "react-dom": "^18.2.0" }, diff --git a/packages/components/add-provider/package.json b/packages/components/add-provider/package.json index 7abc669..0002e2c 100644 --- a/packages/components/add-provider/package.json +++ b/packages/components/add-provider/package.json @@ -10,9 +10,10 @@ "@echo/core-types": "^1.0.0", "@echo/services-bootstrap": "^1.0.0", "@echo/services-bootstrap-services": "^1.0.0", + "@echo/services-add-provider-workflow": "^1.0.0", "@effect-rx/rx": "^0.33.8", "@effect-rx/rx-react": "^0.30.11", - "effect": "^3.2.8" + "effect": "^3.6.5" }, "devDependencies": { "@types/react": "^18.2.66", diff --git a/packages/components/add-provider/src/AddProvider.tsx b/packages/components/add-provider/src/AddProvider.tsx index f1874a9..dc9dfdc 100644 --- a/packages/components/add-provider/src/AddProvider.tsx +++ b/packages/components/add-provider/src/AddProvider.tsx @@ -1,37 +1,22 @@ import { - ActiveMediaProviderCache, + AddProviderWorkflow, AvailableProviders, - MediaProviderMainThreadBroadcastChannel, - type Authentication, - type AuthenticationInfo, type FolderMetadata, - type MediaPlayer, - type MediaProvider, type ProviderMetadata, } from "@echo/core-types"; -import { LazyLoadedProvider } from "@echo/services-bootstrap"; +import { AddProviderWorkflowLive } from "@echo/services-add-provider-workflow"; import { AppLive } from "@echo/services-bootstrap-services"; -import { LazyLoadedMediaPlayer } from "@echo/services-bootstrap/src/loaders"; import { Rx } from "@effect-rx/rx"; import { useRx } from "@effect-rx/rx-react"; -import { Effect, Match } from "effect"; -import { useCallback, useEffect, useMemo } from "react"; +import { Layer, Match } from "effect"; +import { useCallback } from "react"; -const runtime = Rx.runtime(AppLive); -const loadProviderFn = runtime.fn(LazyLoadedProvider.load); -const loadMediaPlayerFn = runtime.fn( - ({ - metadata, - authInfo, - }: { - metadata: ProviderMetadata; - authInfo: AuthenticationInfo; - }) => - Effect.gen(function* () { - const { createMediaPlayer } = yield* LazyLoadedMediaPlayer.load(metadata); - return yield* createMediaPlayer(authInfo); - }), +const runtime = Rx.runtime( + AddProviderWorkflowLive.pipe(Layer.provide(AppLive)), ); +const loadProviderFn = runtime.fn(AddProviderWorkflow.loadProvider); +const connectToProviderFn = runtime.fn(AddProviderWorkflow.connectToProvider); +const selectRootFn = runtime.fn(AddProviderWorkflow.selectRoot); export const AddProvider = () => { const [loadStatus, loadProvider] = useRx(loadProviderFn); @@ -47,16 +32,7 @@ export const AddProvider = () => { Match.tag("Initial", () => ( )), - Match.tag( - "Success", - ({ value: { metadata, authentication, createMediaProvider } }) => ( - - ), - ), + Match.tag("Success", () => ), Match.tag("Failure", () => (
Failed to load provider.
)), @@ -77,35 +53,18 @@ const ProviderSelector = ({ )); -const authenticateFn = runtime.fn( - (authentication: Authentication) => authentication.connect, -); - -const ProviderAuthenticator = ({ - metadata, - authentication, - createMediaProvider, -}: { - metadata: ProviderMetadata; - authentication: Authentication; - createMediaProvider: (authInfo: AuthenticationInfo) => MediaProvider; -}) => { - const [connectionStatus, connectToProvider] = useRx(authenticateFn); - const _connectToProvider = () => connectToProvider(authentication); +const ProviderAuthenticator = () => { + const [connectionStatus, connectToProvider] = useRx(connectToProviderFn); + const _connectToProvider = () => connectToProvider(); return (
- {metadata.id} {Match.value(connectionStatus).pipe( Match.tag("Initial", () => ( )), - Match.tag("Success", ({ value: authInfo }) => ( - + Match.tag("Success", ({ value: rootFolderContent }) => ( + )), Match.tag("Failure", (error) => (
Error: {JSON.stringify(error)}
@@ -116,128 +75,17 @@ const ProviderAuthenticator = ({ ); }; -const listRootFn = runtime.fn( - (mediaProvider: MediaProvider) => mediaProvider.listRoot, -); - -const addMediaProviderToCacheFn = runtime.fn( - ({ - metadata, - provider, - player, - }: { - metadata: ProviderMetadata; - provider: MediaProvider; - player: MediaPlayer; - }) => ActiveMediaProviderCache.add(metadata, provider, player), -); - const SelectRoot = ({ - authInfo, - metadata, - createMediaProvider, -}: { - authInfo: AuthenticationInfo; - metadata: ProviderMetadata; - createMediaProvider: (authInfo: AuthenticationInfo) => MediaProvider; -}) => { - const [mediaPlayerStatus, createMediaPlayer] = useRx(loadMediaPlayerFn); - - const mediaProvider = useMemo( - () => createMediaProvider(authInfo), - [createMediaProvider, authInfo], - ); - - const [listStatus, listRoot] = useRx(listRootFn); - const [, addMediaProviderToCache] = useRx(addMediaProviderToCacheFn); - - useEffect(() => { - listRoot(mediaProvider); - createMediaPlayer({ metadata, authInfo }); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - // TODO: Refactor this mess somehow? - useEffect(() => { - Match.value(mediaPlayerStatus).pipe( - Match.tag("Success", ({ value: player }) => { - addMediaProviderToCache({ - metadata, - provider: mediaProvider, - player, - }); - }), - ); - }, [mediaPlayerStatus, mediaProvider, metadata, addMediaProviderToCache]); - - return ( -
- {Match.value(listStatus).pipe( - Match.tag("Initial", () => ( -
Loading root of media provider...
- )), - Match.tag("Success", ({ value: folders }) => ( - - )), - Match.tag("Failure", (error) => ( -
Error: {JSON.stringify(error)}
- )), - Match.exhaustive, - )} -
- ); -}; - -const startMediaProviderEffect = ( - authInfo: AuthenticationInfo, - metadata: ProviderMetadata, - rootFolder: FolderMetadata, -) => - Effect.gen(function* () { - const broadcastChannel = yield* MediaProviderMainThreadBroadcastChannel; - - yield* broadcastChannel.send("start", { - _tag: "file-based", - metadata, - authInfo, - rootFolder, - }); - }); - -const startMediaProviderFn = runtime.fn( - ({ - authInfo, - metadata, - rootFolder, - }: { - authInfo: AuthenticationInfo; - metadata: ProviderMetadata; - rootFolder: FolderMetadata; - }) => startMediaProviderEffect(authInfo, metadata, rootFolder), -); - -const FolderSelector = ({ - authInfo, - folders, - metadata, + rootFolderContent: folders, }: { - authInfo: AuthenticationInfo; - folders: FolderMetadata[]; - metadata: ProviderMetadata; + rootFolderContent: FolderMetadata[]; }) => { - const [selectRootStatus, selectRoot] = useRx(startMediaProviderFn); + const [selectRootStatus, selectRoot] = useRx(selectRootFn); return Match.value(selectRootStatus).pipe( Match.tag("Initial", () => folders.map((folder) => ( - )), diff --git a/packages/components/library/package.json b/packages/components/library/package.json index fb1c6c5..887e751 100644 --- a/packages/components/library/package.json +++ b/packages/components/library/package.json @@ -13,7 +13,7 @@ "@echo/services-player": "^1.0.0", "@effect-rx/rx": "^0.33.8", "@effect-rx/rx-react": "^0.30.11", - "effect": "^3.2.8" + "effect": "^3.6.5" }, "devDependencies": { "@types/react": "^18.2.66", diff --git a/packages/components/provider-status/package.json b/packages/components/provider-status/package.json index 576ca60..4c762e3 100644 --- a/packages/components/provider-status/package.json +++ b/packages/components/provider-status/package.json @@ -11,7 +11,7 @@ "@echo/services-bootstrap-services": "^1.0.0", "@effect-rx/rx": "^0.33.8", "@effect-rx/rx-react": "^0.30.11", - "effect": "^3.2.8" + "effect": "^3.6.5" }, "devDependencies": { "@types/react": "^18.2.66", diff --git a/packages/core/types/package.json b/packages/core/types/package.json index 3c1b325..49e291d 100644 --- a/packages/core/types/package.json +++ b/packages/core/types/package.json @@ -9,7 +9,7 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@effect/schema": "^0.67.18", - "effect": "^3.5.8" + "@effect/schema": "^0.71.1", + "effect": "^3.6.5" } } \ No newline at end of file diff --git a/packages/core/types/src/model/app-config.ts b/packages/core/types/src/model/app-config.ts index 2293616..f9e701b 100644 --- a/packages/core/types/src/model/app-config.ts +++ b/packages/core/types/src/model/app-config.ts @@ -12,13 +12,13 @@ export const AppConfigSchema = Schema.Struct({ /** * The client ID of the application registered in Azure AD. */ - clientId: Schema.String.pipe(Schema.nonEmpty()), + clientId: Schema.String.pipe(Schema.nonEmptyString()), /** * The redirect URI of the application registered in Azure AD. */ redirectUri: Schema.String.pipe( - Schema.nonEmpty(), + Schema.nonEmptyString(), Schema.filter( (url) => url.startsWith("http://") || url.startsWith("https://"), ), diff --git a/packages/core/types/src/model/authentication.ts b/packages/core/types/src/model/authentication.ts index 8626a89..1de1667 100644 --- a/packages/core/types/src/model/authentication.ts +++ b/packages/core/types/src/model/authentication.ts @@ -8,7 +8,7 @@ export const AuthenticationInfoSchema = S.Struct({ /** * Token that can be used to authenticate the user. */ - accessToken: S.String.pipe(S.nonEmpty()), + accessToken: S.String.pipe(S.nonEmptyString()), /** * Date in which the token expires. diff --git a/packages/core/types/src/services/index.ts b/packages/core/types/src/services/index.ts index 3ce358f..1b6499a 100644 --- a/packages/core/types/src/services/index.ts +++ b/packages/core/types/src/services/index.ts @@ -9,3 +9,4 @@ export * from "./media-player"; export * from "./media-provider"; export * from "./player"; export * from "./provider-status"; +export * from "./workflows"; diff --git a/packages/core/types/src/services/workflows/add-provider.workflow.ts b/packages/core/types/src/services/workflows/add-provider.workflow.ts new file mode 100644 index 0000000..3f724c5 --- /dev/null +++ b/packages/core/types/src/services/workflows/add-provider.workflow.ts @@ -0,0 +1,31 @@ +import { Effect } from "effect"; +import type { + ProviderMetadata, + FolderMetadata, + AuthenticationError, +} from "../../model"; +import type { FileBasedProviderError } from "../media-provider"; + +/** + * Empty record used to represent the absence of data, either input or output. + */ +export type Empty = Record; + +/** + * Workflow that orchestrates the process of adding a new provider to the application. + */ +export type IAddProviderWorkflow = { + readonly loadProvider: (metadata: ProviderMetadata) => Effect.Effect; + readonly connectToProvider: () => Effect.Effect< + FolderMetadata[], + AuthenticationError | FileBasedProviderError + >; + readonly selectRoot: (rootFolder: FolderMetadata) => Effect.Effect; +}; + +/** + * Tag to identify the operations that can be performed by the AddProviderWorkflow. + */ +export class AddProviderWorkflow extends Effect.Tag( + "@echo/services-add-provider-fsm/AddProviderWorkflow", +)() {} diff --git a/packages/core/types/src/services/workflows/index.ts b/packages/core/types/src/services/workflows/index.ts new file mode 100644 index 0000000..65690cc --- /dev/null +++ b/packages/core/types/src/services/workflows/index.ts @@ -0,0 +1 @@ +export * from "./add-provider.workflow"; diff --git a/packages/infrastructure/broadcast-channel/package.json b/packages/infrastructure/broadcast-channel/package.json index cbf973e..5e7224cf 100644 --- a/packages/infrastructure/broadcast-channel/package.json +++ b/packages/infrastructure/broadcast-channel/package.json @@ -10,6 +10,6 @@ }, "dependencies": { "@echo/core-types": "^1.0.0", - "effect": "^3.5.8" + "effect": "^3.6.5" } } \ No newline at end of file diff --git a/packages/infrastructure/browser-crypto/package.json b/packages/infrastructure/browser-crypto/package.json index 12d1078..09d6a50 100644 --- a/packages/infrastructure/browser-crypto/package.json +++ b/packages/infrastructure/browser-crypto/package.json @@ -10,6 +10,6 @@ }, "dependencies": { "@echo/core-types": "^1.0.0", - "effect": "^3.5.8" + "effect": "^3.6.5" } } \ No newline at end of file diff --git a/packages/infrastructure/dexie-database/package.json b/packages/infrastructure/dexie-database/package.json index b67559d..81e1d01 100644 --- a/packages/infrastructure/dexie-database/package.json +++ b/packages/infrastructure/dexie-database/package.json @@ -12,6 +12,6 @@ "@echo/core-strings": "^1.0.0", "@echo/core-types": "^1.0.0", "dexie": "^4.0.7", - "effect": "^3.5.8" + "effect": "^3.6.5" } } \ No newline at end of file diff --git a/packages/infrastructure/html-audio-media-player/package.json b/packages/infrastructure/html-audio-media-player/package.json index 25aea3b..7aeae88 100644 --- a/packages/infrastructure/html-audio-media-player/package.json +++ b/packages/infrastructure/html-audio-media-player/package.json @@ -10,6 +10,6 @@ }, "dependencies": { "@echo/core-types": "^1.0.0", - "effect": "^3.2.8" + "effect": "^3.6.5" } } \ No newline at end of file diff --git a/packages/infrastructure/mmb-metadata-provider/package.json b/packages/infrastructure/mmb-metadata-provider/package.json index 90a6c4b..a81c4c1 100644 --- a/packages/infrastructure/mmb-metadata-provider/package.json +++ b/packages/infrastructure/mmb-metadata-provider/package.json @@ -11,7 +11,7 @@ "dependencies": { "@echo/core-types": "^1.0.0", "buffer": "^6.0.3", - "effect": "^3.5.8", + "effect": "^3.6.5", "music-metadata": "^10.0.0", "process": "^0.11.10" } diff --git a/packages/infrastructure/onedrive-provider/package.json b/packages/infrastructure/onedrive-provider/package.json index e56a0dd..47093e9 100644 --- a/packages/infrastructure/onedrive-provider/package.json +++ b/packages/infrastructure/onedrive-provider/package.json @@ -13,7 +13,7 @@ "@echo/core-dates": "^1.0.0", "@echo/core-types": "^1.0.0", "@microsoft/microsoft-graph-client": "^3.0.7", - "effect": "^3.5.8" + "effect": "^3.6.5" }, "devDependencies": { "@microsoft/microsoft-graph-types": "^2.40.0" diff --git a/packages/services/active-media-provider-cache/package.json b/packages/services/active-media-provider-cache/package.json index b957af7..b1e1583 100644 --- a/packages/services/active-media-provider-cache/package.json +++ b/packages/services/active-media-provider-cache/package.json @@ -10,6 +10,6 @@ }, "dependencies": { "@echo/core-types": "^1.0.0", - "effect": "^3.2.8" + "effect": "^3.6.5" } } \ No newline at end of file diff --git a/packages/services/add-provider-workflow/index.ts b/packages/services/add-provider-workflow/index.ts new file mode 100644 index 0000000..d6c44e5 --- /dev/null +++ b/packages/services/add-provider-workflow/index.ts @@ -0,0 +1 @@ +export { AddProviderWorkflowLive } from "./src/add-provider.machine"; diff --git a/packages/services/add-provider-workflow/package.json b/packages/services/add-provider-workflow/package.json new file mode 100644 index 0000000..8b229d6 --- /dev/null +++ b/packages/services/add-provider-workflow/package.json @@ -0,0 +1,17 @@ +{ + "name": "@echo/services-add-provider-workflow", + "private": true, + "version": "1.0.0", + "description": "Contains the implementation of the add provider workflow using a state machine", + "main": "index.js", + "scripts": { + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@echo/core-types": "^1.0.0", + "@echo/services-bootstrap": "^1.0.0", + "@effect/experimental": "^0.23.4", + "effect": "^3.6.5" + } +} \ No newline at end of file diff --git a/packages/services/add-provider-workflow/src/add-provider.machine.ts b/packages/services/add-provider-workflow/src/add-provider.machine.ts new file mode 100644 index 0000000..718f57a --- /dev/null +++ b/packages/services/add-provider-workflow/src/add-provider.machine.ts @@ -0,0 +1,186 @@ +import { Effect, Layer, Request, Schedule } from "effect"; +import * as Machine from "@effect/experimental/Machine"; +import { + ActiveMediaProviderCache, + AddProviderWorkflow, + MediaProviderMainThreadBroadcastChannel, + type Authentication, + type AuthenticationError, + type AuthenticationInfo, + type Empty, + type FileBasedProviderError, + type FolderMetadata, + type MediaPlayerFactory, + type MediaProviderFactory, + type ProviderMetadata, +} from "@echo/core-types"; +import { + LazyLoadedProvider, + LazyLoadedMediaPlayer, +} from "@echo/services-bootstrap"; + +class LoadProvider extends Request.TaggedClass("LoadProvider")< + Empty, + never, + { + readonly metadata: ProviderMetadata; + } +> {} + +class ConnectToProvider extends Request.TaggedClass("ConnectToProvider")< + FolderMetadata[], // List of folders on the root of the provider. + AuthenticationError | FileBasedProviderError, + Empty +> {} + +class SelectRoot extends Request.TaggedClass("SelectRoot")< + Empty, + never, + { + readonly rootFolder: FolderMetadata; + } +> {} + +type MachineState = + | { _tag: "Idle" } + | { + _tag: "WaitingForConnection"; + loadedProvider: { + metadata: ProviderMetadata; + authentication: Authentication; + createMediaProvider: MediaProviderFactory["createMediaProvider"]; + createMediaPlayer: MediaPlayerFactory["createMediaPlayer"]; + }; + } + | { + _tag: "WaitingForRoot"; + authInfo: AuthenticationInfo; + providerMetadata: ProviderMetadata; + } + | { _tag: "Done" }; + +export const addProviderWorkflow = Machine.makeWith()( + (_, previousState) => + Effect.gen(function* () { + const state = previousState ?? { _tag: "Idle" }; + + const activeMediaProviderCache = yield* ActiveMediaProviderCache; + + const providerLazyLoader = yield* LazyLoadedProvider; + const mediaPlayerLazyLoader = yield* LazyLoadedMediaPlayer; + + const broadcastChannel = yield* MediaProviderMainThreadBroadcastChannel; + + return Machine.procedures.make(state).pipe( + /* + Requires: Idle state. + Outputs: WaitingForConnection state with provider and media player factories. + */ + Machine.procedures.add()( + "LoadProvider", + ({ state, request }) => + Effect.gen(function* () { + if (state._tag !== "Idle") { + return [{}, state]; + } + + const providerFactory = yield* providerLazyLoader.load( + request.metadata, + ); + const mediaPlayerFactory = yield* mediaPlayerLazyLoader.load( + request.metadata, + ); + + return [ + {}, + { + _tag: "WaitingForConnection" as const, + loadedProvider: { + ...providerFactory, + ...mediaPlayerFactory, + }, + }, + ]; + }), + ), + + /* + Requires: WaitingForConnection state. + Outputs: WaitingForRoot state with provider connected, added to cache + and returns root folder. + */ + Machine.procedures.add()( + "ConnectToProvider", + ({ state }) => + Effect.gen(function* () { + if (state._tag !== "WaitingForConnection") { + return [[], state]; + } + + const authInfo = + yield* state.loadedProvider.authentication.connect; + const mediaProvider = + state.loadedProvider.createMediaProvider(authInfo); + const mediaPlayer = + yield* state.loadedProvider.createMediaPlayer(authInfo); + + // Cache the provider and the player so that it can be used + // later on by other services without going through the initialization + // process again. + yield* activeMediaProviderCache.add( + state.loadedProvider.metadata, + mediaProvider, + mediaPlayer, + ); + + const rootFolder = yield* mediaProvider.listRoot; + + return [ + rootFolder, + { + _tag: "WaitingForRoot" as const, + authInfo, + providerMetadata: state.loadedProvider.metadata, + }, + ]; + }), + ), + + /* + Requires: WaitingForRoot state. + Outputs: Done state, with started media provider in worker thread. + */ + Machine.procedures.add()( + "SelectRoot", + ({ state, request }) => + Effect.gen(function* () { + if (state._tag !== "WaitingForRoot") { + return [{}, state]; + } + + yield* broadcastChannel.send("start", { + _tag: "file-based", + metadata: state.providerMetadata, + rootFolder: request.rootFolder, + authInfo: state.authInfo, + }); + + return [{}, { _tag: "Done" as const }]; + }), + ), + ); + }), +).pipe(Machine.retry(Schedule.forever)); + +export const AddProviderWorkflowLive = Layer.scoped( + AddProviderWorkflow, + Effect.gen(function* () { + const actor = yield* Machine.boot(addProviderWorkflow); + + return { + loadProvider: (metadata) => actor.send(new LoadProvider({ metadata })), + connectToProvider: () => actor.send(new ConnectToProvider({})), + selectRoot: (rootFolder) => actor.send(new SelectRoot({ rootFolder })), + }; + }), +); diff --git a/packages/services/add-provider-workflow/src/vite-env.d.ts b/packages/services/add-provider-workflow/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/packages/services/add-provider-workflow/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/packages/services/add-provider-workflow/tsconfig.json b/packages/services/add-provider-workflow/tsconfig.json new file mode 100644 index 0000000..6953ff5 --- /dev/null +++ b/packages/services/add-provider-workflow/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../../tsconfig.json", + "include": [ + "src", + "index.ts" + ] +} \ No newline at end of file diff --git a/packages/services/bootstrap-services/package.json b/packages/services/bootstrap-services/package.json index 5fa0e1e..55027ab 100644 --- a/packages/services/bootstrap-services/package.json +++ b/packages/services/bootstrap-services/package.json @@ -13,6 +13,6 @@ "@echo/services-bootstrap": "^1.0.0", "@echo/services-active-media-provider-cache": "^1.0.0", "@echo/services-media-provider-status": "^1.0.0", - "effect": "^3.2.8" + "effect": "^3.6.5" } } \ No newline at end of file diff --git a/packages/services/bootstrap/index.ts b/packages/services/bootstrap/index.ts index 311ec34..9a4e72a 100644 --- a/packages/services/bootstrap/index.ts +++ b/packages/services/bootstrap/index.ts @@ -1,2 +1,6 @@ export { MainLive, WorkerLive } from "./src/layers"; -export { LazyLoadedProvider, initializeWorkers } from "./src/loaders"; +export { + LazyLoadedProvider, + initializeWorkers, + LazyLoadedMediaPlayer, +} from "./src/loaders"; diff --git a/packages/services/bootstrap/package.json b/packages/services/bootstrap/package.json index 8880e04..0340ce4 100644 --- a/packages/services/bootstrap/package.json +++ b/packages/services/bootstrap/package.json @@ -17,6 +17,6 @@ "@echo/infrastructure-html-audio-media-player": "^1.0.0", "@echo/infrastructure-onedrive-provider": "^1.0.0", "@echo/workers-media-provider": "^1.0.0", - "effect": "^3.5.8" + "effect": "^3.6.5" } } \ No newline at end of file diff --git a/packages/services/library/package.json b/packages/services/library/package.json index da0c3c8..0ec28ae 100644 --- a/packages/services/library/package.json +++ b/packages/services/library/package.json @@ -10,6 +10,6 @@ }, "dependencies": { "@echo/core-types": "^1.0.0", - "effect": "^3.5.8" + "effect": "^3.6.5" } } \ No newline at end of file diff --git a/packages/services/media-provider-status/package.json b/packages/services/media-provider-status/package.json index 4c961b5..d361ccc 100644 --- a/packages/services/media-provider-status/package.json +++ b/packages/services/media-provider-status/package.json @@ -10,6 +10,6 @@ }, "dependencies": { "@echo/core-types": "^1.0.0", - "effect": "^3.2.8" + "effect": "^3.6.5" } } \ No newline at end of file diff --git a/packages/services/player/package.json b/packages/services/player/package.json index bf10035..6e9b219 100644 --- a/packages/services/player/package.json +++ b/packages/services/player/package.json @@ -10,6 +10,6 @@ }, "dependencies": { "@echo/core-types": "^1.0.0", - "effect": "^3.5.8" + "effect": "^3.6.5" } } \ No newline at end of file diff --git a/packages/web/package.json b/packages/web/package.json index 9075ba3..e68b712 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -18,7 +18,7 @@ "@echo/services-bootstrap": "^1.0.0", "@effect-rx/rx": "0.33.8", "@effect-rx/rx-react": "0.30.11", - "effect": "^3.5.8" + "effect": "^3.6.5" }, "devDependencies": { "@types/react": "^18.2.66", diff --git a/packages/workers/media-provider/package.json b/packages/workers/media-provider/package.json index c43bd51..667c2c2 100644 --- a/packages/workers/media-provider/package.json +++ b/packages/workers/media-provider/package.json @@ -15,7 +15,7 @@ "@echo/infrastructure-broadcast-channel": "^1.0.0", "@echo/infrastructure-browser-crypto": "^1.0.0", "@echo/services-bootstrap": "^1.0.0", - "@effect/schema": "^0.67.18", - "effect": "^3.5.8" + "@effect/schema": "^0.71.1", + "effect": "^3.6.5" } } \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 66b1872..97dc103 100644 --- a/yarn.lock +++ b/yarn.lock @@ -33,12 +33,19 @@ resolved "https://registry.yarnpkg.com/@effect-rx/rx/-/rx-0.33.8.tgz#90b4076ea29750bc641c6adb1e878fbacc34ba0c" integrity sha512-dZZW2BbXNRcvNB37tdjWzCZQpz6D+xPaZcaFusQImvwMzMNhqzVHQa9a8V7r8+fZrgzY1nJpM2HypdfGSsjAng== -"@effect/schema@^0.67.18": - version "0.67.18" - resolved "https://registry.yarnpkg.com/@effect/schema/-/schema-0.67.18.tgz#1045ec45134488415b22832006e7b72c59395503" - integrity sha512-jvi5Vvl6jA/n6MhVupTubcxQhMUEpelitlkykiBvXKKBvotyKZ1Clw+shdhLFrFfjGM0g3Yv/L+7m8RbCiTqLg== +"@effect/experimental@^0.23.4": + version "0.23.4" + resolved "https://registry.yarnpkg.com/@effect/experimental/-/experimental-0.23.4.tgz#b44e6d6ba71a467b1978db8309c2c3ace9cb6221" + integrity sha512-zxSeuTYQLXQPRpIzWyPUt/Opxi3jvrO7gAF0EVMZd5yOkwrnSA8HObBbYnxQv3Q8k/4d18xfQVbK8HliDIOF9w== dependencies: - fast-check "^3.17.2" + msgpackr "^1.10.2" + +"@effect/schema@^0.71.1": + version "0.71.1" + resolved "https://registry.yarnpkg.com/@effect/schema/-/schema-0.71.1.tgz#4d344b3c44b2490fb6d6698439956a25ae18ea0f" + integrity sha512-XvFttkuBUL3s4ofZ+OVE4Pagb4wsPG8laSS8iO5lVI9Yt1zIM49uxlYIA2BJ45jjS3MdplUepC0NilotKnjU2A== + dependencies: + fast-check "^3.21.0" "@esbuild/aix-ppc64@0.20.2": version "0.20.2" @@ -236,6 +243,36 @@ resolved "https://registry.yarnpkg.com/@microsoft/microsoft-graph-types/-/microsoft-graph-types-2.40.0.tgz#65f51600ab45ace97d7b1368c47f9e0f835fddca" integrity sha512-1fcPVrB/NkbNcGNfCy+Cgnvwxt6/sbIEEFgZHFBJ670zYLegENYJF8qMo7x3LqBjWX2/Eneq5BVVRCLTmlJN+g== +"@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz#9edec61b22c3082018a79f6d1c30289ddf3d9d11" + integrity sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw== + +"@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz#33677a275204898ad8acbf62734fc4dc0b6a4855" + integrity sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw== + +"@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz#19edf7cdc2e7063ee328403c1d895a86dd28f4bb" + integrity sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg== + +"@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz#94fb0543ba2e28766c3fc439cabbe0440ae70159" + integrity sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw== + +"@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz#4a0609ab5fe44d07c9c60a11e4484d3c38bbd6e3" + integrity sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg== + +"@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz#0aa5502d547b57abfc4ac492de68e2006e417242" + integrity sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -1041,6 +1078,11 @@ detect-file@^1.0.0: resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" integrity sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q== +detect-libc@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== + dexie@^4.0.7: version "4.0.7" resolved "https://registry.yarnpkg.com/dexie/-/dexie-4.0.7.tgz#c92e5032245fc075de58c636238a82ee3ff9fedb" @@ -1075,10 +1117,10 @@ dot-case@^3.0.4: no-case "^3.0.4" tslib "^2.0.3" -effect@^3.2.8, effect@^3.5.8: - version "3.5.8" - resolved "https://registry.yarnpkg.com/effect/-/effect-3.5.8.tgz#63098d38f538facd4d8b0ca8b81717395c33f694" - integrity sha512-gGrRH3BgsUrfOXx4vbD4puRS+/IyK7JiERhuKnjVYurTVDj3J+lPI7raJB9/AAKr59SGEiV7+Sy59/Q/Vfo5mQ== +effect@^3.6.5: + version "3.6.5" + resolved "https://registry.yarnpkg.com/effect/-/effect-3.6.5.tgz#be177847e69273ea9ed95bebe03bd672c5af474b" + integrity sha512-NhopZTAKljaAlR0CEroOAJJngdqg7bzlnWcDrCwh4d2WNVohVbBtUS4SGqLt8tUy7IFsTWATYiUtmhDG+YELjA== emoji-regex@^10.3.0: version "10.3.0" @@ -1411,10 +1453,10 @@ external-editor@^3.1.0: iconv-lite "^0.4.24" tmp "^0.0.33" -fast-check@^3.17.2: - version "3.19.0" - resolved "https://registry.yarnpkg.com/fast-check/-/fast-check-3.19.0.tgz#6a0b7cabc3aa82bc00967332de216c5452ff7ea5" - integrity sha512-CO2JX/8/PT9bDGO1iXa5h5ey1skaKI1dvecERyhH4pp3PGjwd3KIjMAXEg79Ps9nclsdt4oPbfqiAnLU0EwrAQ== +fast-check@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/fast-check/-/fast-check-3.21.0.tgz#f9957cb4bc81b8529ae560ff5f772d9c147fc21c" + integrity sha512-QpmbiqRFRZ+SIlBJh6xi5d/PgXciUc/xWKc4Vi2RWEHHIRx6oM3f0fWNna++zP9VB5HUBTObUK9gTKQP3vVcrQ== dependencies: pure-rand "^6.1.0" @@ -2279,6 +2321,27 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +msgpackr-extract@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz#e9d87023de39ce714872f9e9504e3c1996d61012" + integrity sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA== + dependencies: + node-gyp-build-optional-packages "5.2.2" + optionalDependencies: + "@msgpackr-extract/msgpackr-extract-darwin-arm64" "3.0.3" + "@msgpackr-extract/msgpackr-extract-darwin-x64" "3.0.3" + "@msgpackr-extract/msgpackr-extract-linux-arm" "3.0.3" + "@msgpackr-extract/msgpackr-extract-linux-arm64" "3.0.3" + "@msgpackr-extract/msgpackr-extract-linux-x64" "3.0.3" + "@msgpackr-extract/msgpackr-extract-win32-x64" "3.0.3" + +msgpackr@^1.10.2: + version "1.11.0" + resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.11.0.tgz#8321d52333048cadc749f56385e3231e65337091" + integrity sha512-I8qXuuALqJe5laEBYoFykChhSXLikZmUhccjGsPuSJ/7uPip2TJ7lwdIQwWSAi0jGZDXv4WOP8Qg65QZRuXxXw== + optionalDependencies: + msgpackr-extract "^3.0.2" + music-metadata@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/music-metadata/-/music-metadata-10.0.0.tgz#10ea1d6998e5cc5463d2024c7d40ecb19869567e" @@ -2321,6 +2384,13 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" +node-gyp-build-optional-packages@5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz#522f50c2d53134d7f3a76cd7255de4ab6c96a3a4" + integrity sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw== + dependencies: + detect-libc "^2.0.1" + node-plop@^0.32.0: version "0.32.0" resolved "https://registry.yarnpkg.com/node-plop/-/node-plop-0.32.0.tgz#ec9952c3a8f7e47733a9e7b96b006d05369a5624"