Skip to content
This repository has been archived by the owner on Jul 16, 2024. It is now read-only.

Commit

Permalink
add Layer support to SerializedWorker (#354)
Browse files Browse the repository at this point in the history
  • Loading branch information
tim-smart authored Dec 15, 2023
1 parent 1d323fe commit 190bc84
Show file tree
Hide file tree
Showing 14 changed files with 187 additions and 238 deletions.
8 changes: 8 additions & 0 deletions .changeset/eighty-hairs-fetch.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
"@effect/platform-browser": patch
"@effect/platform-node": patch
"@effect/platform-bun": patch
"@effect/platform": patch
---

add Layer support to SerializedWorker
19 changes: 2 additions & 17 deletions docs/platform-browser/WorkerRunner.ts.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,26 +70,11 @@ Added in v1.0.0
export declare const layerSerialized: <
I,
A extends Schema.TaggedRequest.Any,
Handlers extends {
readonly [K in A["_tag"]]: Extract<A, { readonly _tag: K }> extends Serializable.SerializableWithResult<
infer _IS,
infer S,
infer _IE,
infer E,
infer _IO,
infer O
>
? (_: S) => Stream.Stream<any, E, O> | Effect.Effect<any, E, O>
: never
}
Handlers extends Runner.SerializedRunner.Handlers<A>
>(
schema: Schema.Schema<I, A>,
handlers: Handlers
) => Layer.Layer<
ReturnType<Handlers[keyof Handlers]> extends Stream.Stream<infer R, infer _E, infer _A> ? R : never,
WorkerError,
never
>
) => Layer.Layer<Runner.SerializedRunner.HandlersContext<Handlers>, WorkerError, never>
```
Added in v1.0.0
19 changes: 2 additions & 17 deletions docs/platform-bun/WorkerRunner.ts.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,26 +70,11 @@ Added in v1.0.0
export declare const layerSerialized: <
I,
A extends Schema.TaggedRequest.Any,
Handlers extends {
readonly [K in A["_tag"]]: Extract<A, { readonly _tag: K }> extends Serializable.SerializableWithResult<
infer _IS,
infer S,
infer _IE,
infer E,
infer _IO,
infer O
>
? (_: S) => Stream.Stream<any, E, O> | Effect.Effect<any, E, O>
: never
}
Handlers extends Runner.SerializedRunner.Handlers<A>
>(
schema: Schema.Schema<I, A>,
handlers: Handlers
) => Layer.Layer<
ReturnType<Handlers[keyof Handlers]> extends Stream.Stream<infer R, infer _E, infer _A> ? R : never,
WorkerError,
never
>
) => Layer.Layer<Runner.SerializedRunner.HandlersContext<Handlers>, WorkerError, never>
```
Added in v1.0.0
19 changes: 2 additions & 17 deletions docs/platform-node/WorkerRunner.ts.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,26 +70,11 @@ Added in v1.0.0
export declare const layerSerialized: <
I,
A extends Schema.TaggedRequest.Any,
Handlers extends {
readonly [K in A["_tag"]]: Extract<A, { readonly _tag: K }> extends Serializable.SerializableWithResult<
infer _IS,
infer S,
infer _IE,
infer E,
infer _IO,
infer O
>
? (_: S) => Stream.Stream<any, E, O> | Effect.Effect<any, E, O>
: never
}
Handlers extends Runner.SerializedRunner.Handlers<A>
>(
schema: Schema.Schema<I, A>,
handlers: Handlers
) => Layer.Layer<
ReturnType<Handlers[keyof Handlers]> extends Stream.Stream<infer R, infer _E, infer _A> ? R : never,
WorkerError,
never
>
) => Layer.Layer<Runner.SerializedRunner.HandlersContext<Handlers>, WorkerError, never>
```
Added in v1.0.0
92 changes: 55 additions & 37 deletions docs/platform/WorkerRunner.ts.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ Added in v1.0.0
- [PlatformRunner (interface)](#platformrunner-interface)
- [Runner (namespace)](#runner-namespace)
- [Options (interface)](#options-interface)
- [SerializedRunner (namespace)](#serializedrunner-namespace)
- [Handlers (type alias)](#handlers-type-alias)
- [HandlersContext (type alias)](#handlerscontext-type-alias)
- [tags](#tags)
- [PlatformRunner](#platformrunner)
- [type ids](#type-ids)
Expand Down Expand Up @@ -56,28 +59,11 @@ Added in v1.0.0
export declare const makeSerialized: <
I,
A extends Schema.TaggedRequest.Any,
const Handlers extends {
readonly [K in A["_tag"]]: Extract<A, { readonly _tag: K }> extends Serializable.SerializableWithResult<
infer _IS,
infer S,
infer _IE,
infer E,
infer _IO,
infer O
>
? (_: S) => Stream.Stream<any, E, O> | Effect.Effect<any, E, O>
: never
}
const Handlers extends SerializedRunner.Handlers<A>
>(
schema: Schema.Schema<I, A>,
handlers: Handlers
) => Effect.Effect<
| PlatformRunner
| Scope.Scope
| (ReturnType<Handlers[keyof Handlers]> extends Stream.Stream<infer R, infer _E, infer _A> ? R : never),
WorkerError,
void
>
) => Effect.Effect<PlatformRunner | Scope.Scope | SerializedRunner.HandlersContext<Handlers>, WorkerError, void>
```
Added in v1.0.0
Expand Down Expand Up @@ -105,27 +91,11 @@ Added in v1.0.0
export declare const layerSerialized: <
I,
A extends Schema.TaggedRequest.Any,
const Handlers extends {
readonly [K in A["_tag"]]: Extract<A, { readonly _tag: K }> extends Serializable.SerializableWithResult<
infer _IS,
infer S,
infer _IE,
infer E,
infer _IO,
infer O
>
? (_: S) => Stream.Stream<any, E, O> | Effect.Effect<any, E, O>
: never
}
const Handlers extends SerializedRunner.Handlers<A>
>(
schema: Schema.Schema<I, A>,
handlers: Handlers
) => Layer.Layer<
| PlatformRunner
| (ReturnType<Handlers[keyof Handlers]> extends Stream.Stream<infer R, infer _E, infer _A> ? R : never),
WorkerError,
never
>
) => Layer.Layer<PlatformRunner | SerializedRunner.HandlersContext<Handlers>, WorkerError, never>
```
Added in v1.0.0
Expand Down Expand Up @@ -191,6 +161,54 @@ export interface Options<I, E, O> {

Added in v1.0.0

## SerializedRunner (namespace)

Added in v1.0.0

### Handlers (type alias)

**Signature**

```ts
export type Handlers<A extends Schema.TaggedRequest.Any> = {
readonly [K in A["_tag"]]: Extract<A, { readonly _tag: K }> extends Serializable.SerializableWithResult<
infer _IS,
infer S,
infer _IE,
infer E,
infer _IO,
infer O
>
? (
_: S
) => Stream.Stream<any, E, O> | Effect.Effect<any, E, O> | Layer.Layer<any, E, any> | Layer.Layer<any, E, never>
: never
}
```
Added in v1.0.0
### HandlersContext (type alias)
**Signature**
```ts
export type HandlersContext<Handlers extends Record<string, (...args: ReadonlyArray<any>) => any>> =
| Exclude<
{
[K in keyof Handlers]: ReturnType<Handlers[K]> extends Stream.Stream<infer R, infer _E, infer _A> ? R : never
}[keyof Handlers],
{
[K in keyof Handlers]: ReturnType<Handlers[K]> extends Layer.Layer<infer _R, infer _E, infer A> ? A : never
}[keyof Handlers]
>
| {
[K in keyof Handlers]: ReturnType<Handlers[K]> extends Layer.Layer<infer R, infer _E, infer _A> ? R : never
}[keyof Handlers]
```
Added in v1.0.0
# tags
## PlatformRunner
Expand Down
15 changes: 2 additions & 13 deletions packages/platform-browser/src/WorkerRunner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@
import type { WorkerError } from "@effect/platform/WorkerError"
import type * as Runner from "@effect/platform/WorkerRunner"
import type * as Schema from "@effect/schema/Schema"
import type * as Serializable from "@effect/schema/Serializable"
import type * as Effect from "effect/Effect"
import type * as Layer from "effect/Layer"
import type * as Stream from "effect/Stream"
import * as internal from "./internal/workerRunner.js"
Expand Down Expand Up @@ -39,17 +37,8 @@ export const layer: <I, R, E, O>(
export const layerSerialized: <
I,
A extends Schema.TaggedRequest.Any,
Handlers extends {
readonly [K in A["_tag"]]: Extract<A, { readonly _tag: K }> extends
Serializable.SerializableWithResult<infer _IS, infer S, infer _IE, infer E, infer _IO, infer O>
? (_: S) => Stream.Stream<any, E, O> | Effect.Effect<any, E, O> :
never
}
Handlers extends Runner.SerializedRunner.Handlers<A>
>(
schema: Schema.Schema<I, A>,
handlers: Handlers
) => Layer.Layer<
ReturnType<Handlers[keyof Handlers]> extends Stream.Stream<infer R, infer _E, infer _A> ? R : never,
WorkerError,
never
> = internal.layerSerialized
) => Layer.Layer<Runner.SerializedRunner.HandlersContext<Handlers>, WorkerError, never> = internal.layerSerialized
11 changes: 3 additions & 8 deletions packages/platform-browser/src/internal/workerRunner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@ import * as Runtime from "@effect/platform/Runtime"
import { WorkerError } from "@effect/platform/WorkerError"
import * as Runner from "@effect/platform/WorkerRunner"
import type * as Schema from "@effect/schema/Schema"
import type * as Serializable from "@effect/schema/Serializable"
import { Cause } from "effect"
import * as Effect from "effect/Effect"
import * as Layer from "effect/Layer"
import * as Queue from "effect/Queue"
import type * as Stream from "effect/Stream"
import type { WorkerRunner } from "../index.js"

const platformRunnerImpl = Runner.PlatformRunner.of({
[Runner.PlatformRunnerTypeId]: Runner.PlatformRunnerTypeId,
Expand Down Expand Up @@ -82,17 +82,12 @@ export const layer = <I, R, E, O>(
export const layerSerialized = <
I,
A extends Schema.TaggedRequest.Any,
Handlers extends {
readonly [K in A["_tag"]]: Extract<A, { readonly _tag: K }> extends
Serializable.SerializableWithResult<infer _IS, infer S, infer _IE, infer E, infer _IO, infer O>
? (_: S) => Stream.Stream<any, E, O> | Effect.Effect<any, E, O> :
never
}
Handlers extends WorkerRunner.SerializedRunner.Handlers<A>
>(
schema: Schema.Schema<I, A>,
handlers: Handlers
): Layer.Layer<
(ReturnType<Handlers[keyof Handlers]> extends Stream.Stream<infer R, infer _E, infer _A> ? R : never),
WorkerRunner.SerializedRunner.HandlersContext<Handlers>,
WorkerError,
never
> => Layer.provide(Runner.layerSerialized(schema, handlers), layerPlatform)
39 changes: 17 additions & 22 deletions packages/platform-browser/test/fixtures/serializedWorker.ts
Original file line number Diff line number Diff line change
@@ -1,28 +1,23 @@
import * as Runner from "@effect/platform-browser/WorkerRunner"
import { Effect, Layer, Stream } from "effect"
import { Context, Effect, Layer, Stream } from "effect"
import { Person, User, WorkerMessage } from "./schema.js"

const WorkerLive = Layer.scopedDiscard(
Effect.gen(function*(_) {
let name = "test"
interface Name {
readonly _: unique symbol
}
const Name = Context.Tag<Name, string>()

yield* _(
Runner.makeSerialized(WorkerMessage, {
GetPersonById: (req) =>
Stream.make(
new Person({ id: req.id, name: "test" }),
new Person({ id: req.id, name: "ing" })
),
GetUserById: (req) => Effect.succeed(new User({ id: req.id, name })),
SetName: (req) =>
Effect.sync(() => {
name = req.name
})
})
)
})
).pipe(
Layer.provide(Runner.layerPlatform)
)
const WorkerLive = Runner.layerSerialized(WorkerMessage, {
GetPersonById: (req) =>
Stream.make(
new Person({ id: req.id, name: "test" }),
new Person({ id: req.id, name: "ing" })
),
GetUserById: (req) => Effect.map(Name, (name) => new User({ id: req.id, name })),
SetName: (req) => Layer.succeed(Name, req.name)
})
.pipe(
Layer.provide(Runner.layerPlatform)
)

Effect.runFork(Layer.launch(WorkerLive))
15 changes: 2 additions & 13 deletions packages/platform-bun/src/WorkerRunner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@
import type { WorkerError } from "@effect/platform/WorkerError"
import type * as Runner from "@effect/platform/WorkerRunner"
import type * as Schema from "@effect/schema/Schema"
import type * as Serializable from "@effect/schema/Serializable"
import type * as Effect from "effect/Effect"
import type * as Layer from "effect/Layer"
import type * as Stream from "effect/Stream"
import * as internal from "./internal/workerRunner.js"
Expand Down Expand Up @@ -39,17 +37,8 @@ export const layer: <I, R, E, O>(
export const layerSerialized: <
I,
A extends Schema.TaggedRequest.Any,
Handlers extends {
readonly [K in A["_tag"]]: Extract<A, { readonly _tag: K }> extends
Serializable.SerializableWithResult<infer _IS, infer S, infer _IE, infer E, infer _IO, infer O>
? (_: S) => Stream.Stream<any, E, O> | Effect.Effect<any, E, O> :
never
}
Handlers extends Runner.SerializedRunner.Handlers<A>
>(
schema: Schema.Schema<I, A>,
handlers: Handlers
) => Layer.Layer<
ReturnType<Handlers[keyof Handlers]> extends Stream.Stream<infer R, infer _E, infer _A> ? R : never,
WorkerError,
never
> = internal.layerSerialized
) => Layer.Layer<Runner.SerializedRunner.HandlersContext<Handlers>, WorkerError, never> = internal.layerSerialized
10 changes: 2 additions & 8 deletions packages/platform-bun/src/internal/workerRunner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import * as Runtime from "@effect/platform/Runtime"
import { WorkerError } from "@effect/platform/WorkerError"
import * as Runner from "@effect/platform/WorkerRunner"
import type * as Schema from "@effect/schema/Schema"
import type * as Serializable from "@effect/schema/Serializable"
import * as Cause from "effect/Cause"
import * as Effect from "effect/Effect"
import * as Layer from "effect/Layer"
Expand Down Expand Up @@ -74,17 +73,12 @@ export const layer = <I, R, E, O>(
export const layerSerialized = <
I,
A extends Schema.TaggedRequest.Any,
Handlers extends {
readonly [K in A["_tag"]]: Extract<A, { readonly _tag: K }> extends
Serializable.SerializableWithResult<infer _IS, infer S, infer _IE, infer E, infer _IO, infer O>
? (_: S) => Stream.Stream<any, E, O> | Effect.Effect<any, E, O> :
never
}
Handlers extends Runner.SerializedRunner.Handlers<A>
>(
schema: Schema.Schema<I, A>,
handlers: Handlers
): Layer.Layer<
(ReturnType<Handlers[keyof Handlers]> extends Stream.Stream<infer R, infer _E, infer _A> ? R : never),
Runner.SerializedRunner.HandlersContext<Handlers>,
WorkerError,
never
> => Layer.provide(Runner.layerSerialized(schema, handlers), layerPlatform)
Loading

0 comments on commit 190bc84

Please sign in to comment.