Skip to content

Commit

Permalink
Migrate provider status to Rx
Browse files Browse the repository at this point in the history
  • Loading branch information
sleepyfran committed Jul 28, 2024
1 parent 65204f9 commit dc948f8
Show file tree
Hide file tree
Showing 20 changed files with 192 additions and 199 deletions.
1 change: 1 addition & 0 deletions packages/components/provider-status/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from "./src/ProviderStatus";
Original file line number Diff line number Diff line change
@@ -1,19 +1,21 @@
{
"name": "@echo/components-state",
"name": "@echo/components-provider-status",
"private": true,
"version": "1.0.0",
"scripts": {
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
"typecheck": "tsc --noEmit"
},
"dependencies": {
"@echo/components-effect-bridge": "^1.0.0",
"@echo/core-types": "^1.0.0",
"@echo/services-bootstrap": "^1.0.0",
"effect": "^3.5.8",
"jotai": "^2.8.3"
"@echo/services-media-provider-status": "^1.0.0",
"@effect-rx/rx": "^0.33.8",
"@effect-rx/rx-react": "^0.30.11",
"effect": "^3.2.8"
},
"devDependencies": {
"react": "^18.2.0"
"@types/react": "^18.2.66",
"@types/react-dom": "^18.2.22"
}
}
36 changes: 36 additions & 0 deletions packages/components/provider-status/src/ProviderStatus.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { MediaProviderStatusLive } from "@echo/services-media-provider-status";
import { MainLive } from "@echo/services-bootstrap";
import { Rx } from "@effect-rx/rx";
import { Layer, Match } from "effect";
import { useRxValue } from "@effect-rx/rx-react";
import { MediaProviderStatus } from "@echo/core-types";

const runtime = Rx.runtime(
MediaProviderStatusLive.pipe(Layer.provide(MainLive)),
);

const providerStatus = runtime.subscriptionRef(MediaProviderStatus.observe);

export const ProviderStatus = () => {
const status = useRxValue(providerStatus);

return Match.value(status).pipe(
Match.tag("Initial", () => <pre>Loading provider status...</pre>),
Match.tag("Success", ({ value: providerState }) => (
<div>
{[...providerState.entries()].map(([providerId, providerState]) => (
<div key={providerId}>
<h1>{providerId}</h1>
<pre>{JSON.stringify(providerState, null, 2)}</pre>
</div>
))}
</div>
)),
Match.tag("Failure", () => (
<div style={{ color: "red" }}>
Something went wrong observing the provider statuses.
</div>
)),
Match.exhaustive,
);
};
File renamed without changes.
1 change: 0 additions & 1 deletion packages/components/state/index.ts

This file was deleted.

95 changes: 0 additions & 95 deletions packages/components/state/src/provider.state.ts

This file was deleted.

1 change: 0 additions & 1 deletion packages/components/state/src/vite-env.d.ts

This file was deleted.

1 change: 1 addition & 0 deletions packages/core/types/src/services/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@ export * from "./library";
export * from "./metadata-provider";
export * from "./mediaProvider";
export * from "./player";
export * from "./provider-status";
26 changes: 26 additions & 0 deletions packages/core/types/src/services/provider-status.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { Effect, SubscriptionRef } from "effect";
import type { ProviderId, ProviderStatus } from "../model";

/**
* Defines the state of all currently active providers.
*/
export type StateByProvider = Map<ProviderId, ProviderStatus>;

/**
* Service that listen to the status of all providers and allows to observe
* changes to them.
*/
export type IMediaProviderStatus = {
/**
* Returns a subscription ref that holds the current status of a specific
* provider, while also allowing to observe changes to it.
*/
readonly observe: SubscriptionRef.SubscriptionRef<StateByProvider>;
};

/**
* Tag to identify the MediaProviderStatus service.
*/
export class MediaProviderStatus extends Effect.Tag(
"@echo/core-types/MediaProviderStatus",
)<MediaProviderStatus, IMediaProviderStatus>() {}
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ const createBroadcastChannel = <TSchema extends Schema>(
});
}),
registerResolver: (actionId, resolver) =>
Effect.fork(
Effect.forkDaemon(
Effect.gen(function* () {
const channel = yield* _broadcastChannel.get;

Expand Down
2 changes: 0 additions & 2 deletions packages/services/bootstrap/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@
"@echo/infrastructure-dexie-database": "^1.0.0",
"@echo/infrastructure-mmb-metadata-provider": "^1.0.0",
"@echo/infrastructure-onedrive-provider": "^1.0.0",
"@echo/services-library": "^1.0.0",
"@echo/services-player": "^1.0.0",
"@echo/workers-media-provider": "^1.0.0",
"effect": "^3.5.8"
}
Expand Down
4 changes: 0 additions & 4 deletions packages/services/bootstrap/src/layers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,9 @@ import {
} from "@echo/infrastructure-broadcast-channel";
import { BrowserCryptoLive } from "@echo/infrastructure-browser-crypto";
import { DexieDatabaseLive } from "@echo/infrastructure-dexie-database";
import { LibraryLive } from "@echo/services-library";
import { MmbMetadataProviderLive } from "@echo/infrastructure-mmb-metadata-provider";
import { LazyLoadedProviderLive } from "./loaders/provider";
import { AppConfigLive } from "./app-config";
import { PlayerLive } from "@echo/services-player";

/**
* Exports a layer that can provide all dependencies that are needed in the
Expand All @@ -18,9 +16,7 @@ import { PlayerLive } from "@echo/services-player";
export const MainLive = MediaProviderMainThreadBroadcastChannelLive.pipe(
Layer.provideMerge(MediaProviderWorkerBroadcastChannelLive),
Layer.provideMerge(BrowserCryptoLive),
Layer.provideMerge(PlayerLive),
Layer.provideMerge(LazyLoadedProviderLive),
Layer.provideMerge(LibraryLive),
Layer.provideMerge(DexieDatabaseLive),
Layer.provideMerge(AppConfigLive),
);
Expand Down
26 changes: 26 additions & 0 deletions packages/services/media-provider-status/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import {
MediaProviderStatus,
MediaProviderMainThreadBroadcastChannel,
type StateByProvider,
} from "@echo/core-types";
import { Effect, Layer, Ref, SubscriptionRef } from "effect";

export const MediaProviderStatusLive = Layer.effect(
MediaProviderStatus,
Effect.gen(function* () {
const stateByProviderRef = yield* SubscriptionRef.make<StateByProvider>(
new Map(),
);
const broadcastChannel = yield* MediaProviderMainThreadBroadcastChannel;

yield* broadcastChannel.registerResolver("reportStatus", (status) => {
return Ref.update(stateByProviderRef, (current) => {
return new Map(current).set(status.metadata.id, status.status);
});
});

return MediaProviderStatus.of({
observe: stateByProviderRef,
});
}),
);
15 changes: 15 additions & 0 deletions packages/services/media-provider-status/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"name": "@echo/services-media-provider-status",
"private": true,
"version": "1.0.0",
"description": "Contains the implementation for the MediaProviderStatus service",
"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",
"effect": "^3.2.8"
}
}
6 changes: 6 additions & 0 deletions packages/services/media-provider-status/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"extends": "../../../tsconfig.json",
"include": [
"index.ts"
]
}
1 change: 1 addition & 0 deletions packages/services/player/src/player.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ const PlayerLiveWithState = Layer.effect(
Player,
Effect.gen(function* () {
const state = yield* PlayerStateRef;
// TODO: Remove all this and switch to subscription ref.
const statePubSub = yield* PubSub.dropping<PlayerState>({
capacity: 1,
replay: 1,
Expand Down
5 changes: 2 additions & 3 deletions packages/web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,12 @@
},
"dependencies": {
"@echo/components-effect-bridge": "^1.0.0",
"@echo/components-state": "^1.0.0",
"@echo/components-provider-status": "^1.0.0",
"@echo/core-types": "^1.0.0",
"@echo/services-bootstrap": "^1.0.0",
"@effect-rx/rx": "0.33.8",
"@effect-rx/rx-react": "0.30.11",
"effect": "^3.5.8",
"jotai": "^2.8.3"
"effect": "^3.5.8"
},
"devDependencies": {
"@types/react": "^18.2.66",
Expand Down
Loading

0 comments on commit dc948f8

Please sign in to comment.