@livestore/utils 0.0.55-dev.1 → 0.0.55-dev.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo.json +1 -1
- package/dist/effect/BrowserChannel.d.ts +25 -0
- package/dist/effect/BrowserChannel.d.ts.map +1 -0
- package/dist/effect/BrowserChannel.js +32 -0
- package/dist/effect/BrowserChannel.js.map +1 -0
- package/dist/effect/Effect.d.ts +3 -1
- package/dist/effect/Effect.d.ts.map +1 -1
- package/dist/effect/Effect.js +2 -0
- package/dist/effect/Effect.js.map +1 -1
- package/dist/effect/Stream.d.ts +1 -0
- package/dist/effect/Stream.d.ts.map +1 -1
- package/dist/effect/Stream.js +1 -0
- package/dist/effect/Stream.js.map +1 -1
- package/dist/effect/SubscriptionRef.d.ts +2 -2
- package/dist/effect/SubscriptionRef.d.ts.map +1 -1
- package/dist/effect/SubscriptionRef.js +2 -3
- package/dist/effect/SubscriptionRef.js.map +1 -1
- package/dist/effect/index.d.ts +3 -6
- package/dist/effect/index.d.ts.map +1 -1
- package/dist/effect/index.js +3 -8
- package/dist/effect/index.js.map +1 -1
- package/package.json +14 -14
- package/src/effect/BrowserChannel.ts +90 -0
- package/src/effect/Effect.ts +9 -1
- package/src/effect/Stream.ts +5 -0
- package/src/effect/SubscriptionRef.ts +3 -11
- package/src/effect/index.ts +4 -8
- package/dist/effect/Schema.d.ts +0 -4
- package/dist/effect/Schema.d.ts.map +0 -1
- package/dist/effect/Schema.js +0 -15
- package/dist/effect/Schema.js.map +0 -1
- package/src/effect/browser-worker-tmp/BrowserWorker.ts +0 -26
- package/src/effect/browser-worker-tmp/BrowserWorkerRunner.ts +0 -14
- package/src/effect/browser-worker-tmp/internal/worker.ts +0 -71
- package/src/effect/browser-worker-tmp/internal/workerRunner.ts +0 -119
- package/src/effect/browser-worker-tmp/port-platform-runner.ts +0 -74
- package/src/effect/worker-tmp/Worker.ts +0 -374
- package/src/effect/worker-tmp/WorkerError.ts +0 -79
- package/src/effect/worker-tmp/WorkerRunner.ts +0 -181
- package/src/effect/worker-tmp/internal/worker.ts +0 -417
- package/src/effect/worker-tmp/internal/workerError.ts +0 -6
- package/src/effect/worker-tmp/internal/workerRunner.ts +0 -237
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
/* eslint-disable prefer-arrow/prefer-arrow-functions */
|
|
2
|
-
import * as Deferred from 'effect/Deferred'
|
|
3
|
-
import * as Effect from 'effect/Effect'
|
|
4
|
-
import * as Layer from 'effect/Layer'
|
|
5
|
-
import * as Queue from 'effect/Queue'
|
|
6
|
-
|
|
7
|
-
import * as Worker from '../../worker-tmp/Worker.js'
|
|
8
|
-
import { WorkerError } from '../../worker-tmp/WorkerError.js'
|
|
9
|
-
|
|
10
|
-
const platformWorkerImpl = Worker.PlatformWorker.of({
|
|
11
|
-
[Worker.PlatformWorkerTypeId]: Worker.PlatformWorkerTypeId,
|
|
12
|
-
spawn<I, O>(worker_: unknown) {
|
|
13
|
-
return Effect.gen(function* (_) {
|
|
14
|
-
const worker = worker_ as globalThis.SharedWorker | globalThis.Worker | MessagePort
|
|
15
|
-
let port: globalThis.Worker | MessagePort
|
|
16
|
-
if ('port' in worker) {
|
|
17
|
-
port = worker.port
|
|
18
|
-
} else {
|
|
19
|
-
port = worker
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
yield* _(Effect.addFinalizer(() => Effect.sync(() => port.postMessage([1]))))
|
|
23
|
-
|
|
24
|
-
const queue = yield* _(Queue.unbounded<Worker.BackingWorker.Message<O>>())
|
|
25
|
-
const latch = yield* Deferred.make<void>()
|
|
26
|
-
|
|
27
|
-
const fiber = yield* _(
|
|
28
|
-
Effect.async<never, WorkerError, never>((resume) => {
|
|
29
|
-
function onMessage(event: MessageEvent) {
|
|
30
|
-
queue.unsafeOffer((event as MessageEvent).data)
|
|
31
|
-
}
|
|
32
|
-
function onError(event: ErrorEvent) {
|
|
33
|
-
resume(new WorkerError({ reason: 'unknown', error: event.error ?? event.message }))
|
|
34
|
-
}
|
|
35
|
-
port.addEventListener('message', onMessage as any)
|
|
36
|
-
port.addEventListener('error', onError as any)
|
|
37
|
-
Deferred.unsafeDone(latch, Effect.void)
|
|
38
|
-
return Effect.sync(() => {
|
|
39
|
-
port.removeEventListener('message', onMessage as any)
|
|
40
|
-
port.removeEventListener('error', onError as any)
|
|
41
|
-
})
|
|
42
|
-
}),
|
|
43
|
-
Effect.interruptible,
|
|
44
|
-
Effect.forkScoped,
|
|
45
|
-
)
|
|
46
|
-
yield* Deferred.await(latch)
|
|
47
|
-
|
|
48
|
-
if ('start' in port) {
|
|
49
|
-
port.start()
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const send = (message: I, transfers?: ReadonlyArray<unknown>) =>
|
|
53
|
-
Effect.try({
|
|
54
|
-
try: () => port.postMessage([0, message], transfers as any),
|
|
55
|
-
catch: (error) => new WorkerError({ reason: 'send', error }),
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
return { fiber, queue, send }
|
|
59
|
-
})
|
|
60
|
-
},
|
|
61
|
-
})
|
|
62
|
-
|
|
63
|
-
/** @internal */
|
|
64
|
-
export const layerWorker = Layer.succeed(Worker.PlatformWorker, platformWorkerImpl)
|
|
65
|
-
|
|
66
|
-
/** @internal */
|
|
67
|
-
export const layerManager = Layer.provide(Worker.layerManager, layerWorker)
|
|
68
|
-
|
|
69
|
-
/** @internal */
|
|
70
|
-
export const layer = (spawn: (id: number) => globalThis.Worker | globalThis.SharedWorker | MessagePort) =>
|
|
71
|
-
Layer.merge(layerManager, Worker.layerSpawner(spawn))
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
/// <reference lib="webworker" />
|
|
2
|
-
/* eslint-disable prefer-arrow/prefer-arrow-functions */
|
|
3
|
-
import * as Cause from 'effect/Cause'
|
|
4
|
-
import * as Effect from 'effect/Effect'
|
|
5
|
-
import * as FiberSet from 'effect/FiberSet'
|
|
6
|
-
import { globalValue } from 'effect/GlobalValue'
|
|
7
|
-
import * as Layer from 'effect/Layer'
|
|
8
|
-
import * as Queue from 'effect/Queue'
|
|
9
|
-
import * as Schedule from 'effect/Schedule'
|
|
10
|
-
|
|
11
|
-
import { WorkerError } from '../../worker-tmp/WorkerError.js'
|
|
12
|
-
import * as WorkerRunner from '../../worker-tmp/WorkerRunner.js'
|
|
13
|
-
|
|
14
|
-
const cachedPorts = globalValue('@effect/platform-browser/Worker/cachedPorts', () => new Set<MessagePort>())
|
|
15
|
-
function globalHandleConnect(event: MessageEvent) {
|
|
16
|
-
cachedPorts.add((event as MessageEvent).ports[0]!)
|
|
17
|
-
}
|
|
18
|
-
if (typeof self !== 'undefined' && 'onconnect' in self) {
|
|
19
|
-
// @ts-expect-error TODO
|
|
20
|
-
self.addEventListener('connect', globalHandleConnect)
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const platformRunnerImpl = WorkerRunner.PlatformRunner.of({
|
|
24
|
-
[WorkerRunner.PlatformRunnerTypeId]: WorkerRunner.PlatformRunnerTypeId,
|
|
25
|
-
start<I, O>(shutdown: Effect.Effect<void>) {
|
|
26
|
-
return Effect.gen(function* () {
|
|
27
|
-
let currentPortId = 0
|
|
28
|
-
|
|
29
|
-
yield* Effect.addFinalizer(() => Effect.sync(() => self.close()))
|
|
30
|
-
|
|
31
|
-
const queue = yield* Queue.unbounded<readonly [portId: number, message: I]>()
|
|
32
|
-
const runFork = yield* FiberSet.makeRuntime<never>()
|
|
33
|
-
const ports = new Map<number, MessagePort>()
|
|
34
|
-
const send = (portId: number, message: O, transfer?: ReadonlyArray<unknown>) =>
|
|
35
|
-
Effect.sync(() => {
|
|
36
|
-
ports.get(portId)?.postMessage([1, message], {
|
|
37
|
-
transfer: transfer as any,
|
|
38
|
-
})
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
function handlePort(port: MessagePort, sharedWorker: boolean) {
|
|
42
|
-
const portId = currentPortId++
|
|
43
|
-
ports.set(portId, port)
|
|
44
|
-
|
|
45
|
-
Effect.async<never, WorkerError, never>((resume) => {
|
|
46
|
-
function onMessage(event: MessageEvent) {
|
|
47
|
-
const message = (event as MessageEvent).data as WorkerRunner.BackingRunner.Message<I>
|
|
48
|
-
if (message[0] === 0) {
|
|
49
|
-
queue.unsafeOffer([portId, message[1]])
|
|
50
|
-
} else if (sharedWorker && ports.size > 1) {
|
|
51
|
-
resume(Effect.interrupt)
|
|
52
|
-
} else {
|
|
53
|
-
Effect.runFork(shutdown)
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
function onMessageError(error: ErrorEvent) {
|
|
57
|
-
resume(new WorkerError({ reason: 'decode', error: error.error ?? error.message }))
|
|
58
|
-
}
|
|
59
|
-
function onError(error: ErrorEvent) {
|
|
60
|
-
resume(new WorkerError({ reason: 'unknown', error: error.error ?? error.message }))
|
|
61
|
-
}
|
|
62
|
-
port.addEventListener('message', onMessage as any)
|
|
63
|
-
port.addEventListener('messageerror', onMessageError as any)
|
|
64
|
-
port.addEventListener('error', onError as any)
|
|
65
|
-
|
|
66
|
-
// ready
|
|
67
|
-
if ('start' in port) {
|
|
68
|
-
port.start()
|
|
69
|
-
}
|
|
70
|
-
port.postMessage([0])
|
|
71
|
-
|
|
72
|
-
return Effect.sync(() => {
|
|
73
|
-
port.removeEventListener('message', onMessage as any)
|
|
74
|
-
port.removeEventListener('messageerror', onMessageError as any)
|
|
75
|
-
port.removeEventListener('error', onError as any)
|
|
76
|
-
})
|
|
77
|
-
}).pipe(
|
|
78
|
-
Effect.tapErrorCause((cause) => (Cause.isInterruptedOnly(cause) ? Effect.void : Effect.logDebug(cause))),
|
|
79
|
-
Effect.retry(Schedule.forever),
|
|
80
|
-
Effect.annotateLogs({
|
|
81
|
-
package: '@effect/platform-browser',
|
|
82
|
-
module: 'WorkerRunner',
|
|
83
|
-
}),
|
|
84
|
-
Effect.ensuring(
|
|
85
|
-
Effect.sync(() => {
|
|
86
|
-
ports.delete(portId)
|
|
87
|
-
}),
|
|
88
|
-
),
|
|
89
|
-
Effect.interruptible,
|
|
90
|
-
runFork,
|
|
91
|
-
)
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
if ('onconnect' in self) {
|
|
95
|
-
// @ts-expect-error TODO
|
|
96
|
-
self.addEventListener('connect', (event: MessageEvent) => {
|
|
97
|
-
const port = (event as MessageEvent).ports[0]
|
|
98
|
-
handlePort(port!, true)
|
|
99
|
-
})
|
|
100
|
-
yield* Effect.addFinalizer(() =>
|
|
101
|
-
Effect.sync(() => {
|
|
102
|
-
;(self as any).addEventListener('connect', globalHandleConnect)
|
|
103
|
-
}),
|
|
104
|
-
)
|
|
105
|
-
for (const port of cachedPorts) {
|
|
106
|
-
handlePort(port, true)
|
|
107
|
-
}
|
|
108
|
-
cachedPorts.clear()
|
|
109
|
-
} else {
|
|
110
|
-
handlePort(self as any, false)
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
return { queue, send }
|
|
114
|
-
})
|
|
115
|
-
},
|
|
116
|
-
})
|
|
117
|
-
|
|
118
|
-
/** @internal */
|
|
119
|
-
export const layer = Layer.succeed(WorkerRunner.PlatformRunner, platformRunnerImpl)
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { Deferred } from 'effect'
|
|
2
|
-
import * as Cause from 'effect/Cause'
|
|
3
|
-
import * as Effect from 'effect/Effect'
|
|
4
|
-
import * as Layer from 'effect/Layer'
|
|
5
|
-
import * as Queue from 'effect/Queue'
|
|
6
|
-
import * as Schedule from 'effect/Schedule'
|
|
7
|
-
|
|
8
|
-
import { WorkerError } from '../worker-tmp/WorkerError.js'
|
|
9
|
-
import * as Runner from '../worker-tmp/WorkerRunner.js'
|
|
10
|
-
|
|
11
|
-
const platformRunnerImpl = (port: MessagePort) =>
|
|
12
|
-
Runner.PlatformRunner.of({
|
|
13
|
-
[Runner.PlatformRunnerTypeId]: Runner.PlatformRunnerTypeId,
|
|
14
|
-
start: <I, O>(shutdown: Effect.Effect<void>) => {
|
|
15
|
-
return Effect.gen(function* () {
|
|
16
|
-
const queue = yield* Queue.unbounded<readonly [portId: number, message: I]>()
|
|
17
|
-
|
|
18
|
-
const latch = yield* Deferred.make<void>()
|
|
19
|
-
|
|
20
|
-
yield* Effect.async<never, WorkerError>((resume) => {
|
|
21
|
-
const onMessage = (msg: MessageEvent<Runner.BackingRunner.Message<I>>) => {
|
|
22
|
-
const message = msg.data
|
|
23
|
-
if (message[0] === 0) {
|
|
24
|
-
queue.unsafeOffer([0, message[1]])
|
|
25
|
-
} else {
|
|
26
|
-
Effect.runFork(shutdown)
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const onError = (error: any) => {
|
|
31
|
-
resume(new WorkerError({ reason: 'decode', error }))
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
port.addEventListener('message', onMessage)
|
|
35
|
-
port.addEventListener('messageerror', onError)
|
|
36
|
-
port.addEventListener('error', onError)
|
|
37
|
-
|
|
38
|
-
Deferred.unsafeDone(latch, Effect.void)
|
|
39
|
-
|
|
40
|
-
return Effect.sync(() => {
|
|
41
|
-
port.removeEventListener('message', onMessage as any)
|
|
42
|
-
port.removeEventListener('error', onError as any)
|
|
43
|
-
})
|
|
44
|
-
}).pipe(
|
|
45
|
-
Effect.tapErrorCause((cause) => (Cause.isInterruptedOnly(cause) ? Effect.void : Effect.logDebug(cause))),
|
|
46
|
-
Effect.retry(Schedule.forever),
|
|
47
|
-
Effect.annotateLogs({
|
|
48
|
-
package: '@livestore/utils/effect',
|
|
49
|
-
module: 'PortPlatformRunner',
|
|
50
|
-
}),
|
|
51
|
-
Effect.interruptible,
|
|
52
|
-
Effect.forkScoped,
|
|
53
|
-
)
|
|
54
|
-
|
|
55
|
-
yield* Deferred.await(latch)
|
|
56
|
-
|
|
57
|
-
port.start()
|
|
58
|
-
|
|
59
|
-
const send = (_portId: number, message: O, transfers?: ReadonlyArray<unknown>) =>
|
|
60
|
-
Effect.try({
|
|
61
|
-
try: () => port.postMessage([1, message], transfers as any),
|
|
62
|
-
catch: (error) => new WorkerError({ reason: 'send', error }),
|
|
63
|
-
}).pipe(Effect.catchTag('WorkerError', Effect.orDie))
|
|
64
|
-
|
|
65
|
-
// ready
|
|
66
|
-
port.postMessage([0])
|
|
67
|
-
|
|
68
|
-
return { queue, send }
|
|
69
|
-
})
|
|
70
|
-
},
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
/** @internal */
|
|
74
|
-
export const layerMessagePort = (port: MessagePort) => Layer.succeed(Runner.PlatformRunner, platformRunnerImpl(port))
|
|
@@ -1,374 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @since 1.0.0
|
|
3
|
-
*/
|
|
4
|
-
import type * as ParseResult from '@effect/schema/ParseResult'
|
|
5
|
-
import type * as Schema from '@effect/schema/Schema'
|
|
6
|
-
import type * as Serializable from '@effect/schema/Serializable'
|
|
7
|
-
import type * as Context from 'effect/Context'
|
|
8
|
-
import type * as Duration from 'effect/Duration'
|
|
9
|
-
import type * as Effect from 'effect/Effect'
|
|
10
|
-
import type * as Fiber from 'effect/Fiber'
|
|
11
|
-
import type { LazyArg } from 'effect/Function'
|
|
12
|
-
import type * as Layer from 'effect/Layer'
|
|
13
|
-
import type * as Option from 'effect/Option'
|
|
14
|
-
import type * as Pool from 'effect/Pool'
|
|
15
|
-
import type * as Queue from 'effect/Queue'
|
|
16
|
-
import type * as Scope from 'effect/Scope'
|
|
17
|
-
import type * as Stream from 'effect/Stream'
|
|
18
|
-
import type * as Tracer from 'effect/Tracer'
|
|
19
|
-
|
|
20
|
-
import * as internal from './internal/worker.js'
|
|
21
|
-
import type { WorkerError, WorkerErrorFrom } from './WorkerError.js'
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* @since 1.0.0
|
|
25
|
-
* @category models
|
|
26
|
-
*/
|
|
27
|
-
export interface BackingWorker<I, O> {
|
|
28
|
-
readonly fiber: Fiber.Fiber<never, WorkerError>
|
|
29
|
-
readonly send: (message: I, transfers?: ReadonlyArray<unknown>) => Effect.Effect<void, WorkerError>
|
|
30
|
-
readonly queue: Queue.Dequeue<BackingWorker.Message<O>>
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* @since 1.0.0
|
|
35
|
-
* @category models
|
|
36
|
-
*/
|
|
37
|
-
export declare namespace BackingWorker {
|
|
38
|
-
/**
|
|
39
|
-
* @since 1.0.0
|
|
40
|
-
* @category models
|
|
41
|
-
*/
|
|
42
|
-
export type Message<O> = readonly [ready: 0] | readonly [data: 1, O]
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* @since 1.0.0
|
|
47
|
-
* @category type ids
|
|
48
|
-
*/
|
|
49
|
-
export const PlatformWorkerTypeId: unique symbol = internal.PlatformWorkerTypeId
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* @since 1.0.0
|
|
53
|
-
* @category type ids
|
|
54
|
-
*/
|
|
55
|
-
export type PlatformWorkerTypeId = typeof PlatformWorkerTypeId
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* @since 1.0.0
|
|
59
|
-
* @category models
|
|
60
|
-
*/
|
|
61
|
-
export interface PlatformWorker {
|
|
62
|
-
readonly [PlatformWorkerTypeId]: PlatformWorkerTypeId
|
|
63
|
-
readonly spawn: <I, O>(worker: unknown) => Effect.Effect<BackingWorker<I, O>, WorkerError, Scope.Scope>
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* @since 1.0.0
|
|
68
|
-
* @category tags
|
|
69
|
-
*/
|
|
70
|
-
export const PlatformWorker: Context.Tag<PlatformWorker, PlatformWorker> = internal.PlatformWorker
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* @since 1.0.0
|
|
74
|
-
* @category models
|
|
75
|
-
*/
|
|
76
|
-
export interface Worker<I, O, E = never> {
|
|
77
|
-
readonly id: number
|
|
78
|
-
readonly execute: (message: I) => Stream.Stream<O, E | WorkerError>
|
|
79
|
-
readonly executeEffect: (message: I) => Effect.Effect<O, E | WorkerError>
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* @since 1.0.0
|
|
84
|
-
* @category models
|
|
85
|
-
*/
|
|
86
|
-
export interface Spawner {
|
|
87
|
-
readonly _: unique symbol
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* @since 1.0.0
|
|
92
|
-
* @category models
|
|
93
|
-
*/
|
|
94
|
-
export interface SpawnerFn<W = unknown> {
|
|
95
|
-
(id: number): W
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* @since 1.0.0
|
|
100
|
-
* @category models
|
|
101
|
-
*/
|
|
102
|
-
export declare namespace Worker {
|
|
103
|
-
/**
|
|
104
|
-
* @since 1.0.0
|
|
105
|
-
* @category models
|
|
106
|
-
*/
|
|
107
|
-
export interface Options<I> {
|
|
108
|
-
readonly encode?: ((message: I) => Effect.Effect<unknown, WorkerError>) | undefined
|
|
109
|
-
readonly transfers?: ((message: I) => ReadonlyArray<unknown>) | undefined
|
|
110
|
-
readonly queue?: WorkerQueue<I> | undefined
|
|
111
|
-
readonly initialMessage?: LazyArg<I> | undefined
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* @since 1.0.0
|
|
116
|
-
* @category models
|
|
117
|
-
*/
|
|
118
|
-
export type Request<I = unknown> =
|
|
119
|
-
| readonly [id: number, data: 0, I, trace: Span | undefined]
|
|
120
|
-
| readonly [id: number, interrupt: 1]
|
|
121
|
-
|
|
122
|
-
/**
|
|
123
|
-
* @since 1.0.0
|
|
124
|
-
* @category models
|
|
125
|
-
*/
|
|
126
|
-
export type Span = readonly [traceId: string, spanId: string, sampled: boolean]
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* @since 1.0.0
|
|
130
|
-
* @category models
|
|
131
|
-
*/
|
|
132
|
-
export type Response<E, O = unknown> =
|
|
133
|
-
| readonly [id: number, data: 0, ReadonlyArray<O>]
|
|
134
|
-
| readonly [id: number, end: 1]
|
|
135
|
-
| readonly [id: number, end: 1, ReadonlyArray<O>]
|
|
136
|
-
| readonly [id: number, error: 2, E]
|
|
137
|
-
| readonly [id: number, defect: 3, Schema.CauseEncoded<WorkerErrorFrom, unknown>]
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* @since 1.0.0
|
|
142
|
-
* @category models
|
|
143
|
-
*/
|
|
144
|
-
export interface WorkerPool<I, O, E = never> {
|
|
145
|
-
readonly backing: Pool.Pool<Worker<I, O, E>, WorkerError>
|
|
146
|
-
readonly broadcast: (message: I) => Effect.Effect<void, E | WorkerError>
|
|
147
|
-
readonly execute: (message: I) => Stream.Stream<O, E | WorkerError>
|
|
148
|
-
readonly executeEffect: (message: I) => Effect.Effect<O, E | WorkerError>
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* @since 1.0.0
|
|
153
|
-
* @category models
|
|
154
|
-
*/
|
|
155
|
-
export declare namespace WorkerPool {
|
|
156
|
-
/**
|
|
157
|
-
* @since 1.0.0
|
|
158
|
-
* @category models
|
|
159
|
-
*/
|
|
160
|
-
export type Options<I> = Worker.Options<I> &
|
|
161
|
-
(
|
|
162
|
-
| {
|
|
163
|
-
readonly onCreate?: (worker: Worker<I, unknown, unknown>) => Effect.Effect<void, WorkerError>
|
|
164
|
-
readonly size: number
|
|
165
|
-
readonly concurrency?: number | undefined
|
|
166
|
-
readonly targetUtilization?: number | undefined
|
|
167
|
-
}
|
|
168
|
-
| {
|
|
169
|
-
readonly onCreate?: (worker: Worker<I, unknown, unknown>) => Effect.Effect<void, WorkerError>
|
|
170
|
-
readonly minSize: number
|
|
171
|
-
readonly maxSize: number
|
|
172
|
-
readonly concurrency?: number | undefined
|
|
173
|
-
readonly targetUtilization?: number | undefined
|
|
174
|
-
readonly timeToLive: Duration.DurationInput
|
|
175
|
-
}
|
|
176
|
-
)
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* @category models
|
|
181
|
-
* @since 1.0.0
|
|
182
|
-
*/
|
|
183
|
-
export interface WorkerQueue<I> {
|
|
184
|
-
readonly offer: (id: number, item: I, span: Option.Option<Tracer.Span>) => Effect.Effect<void>
|
|
185
|
-
readonly take: Effect.Effect<readonly [id: number, item: I, span: Option.Option<Tracer.Span>]>
|
|
186
|
-
readonly shutdown: Effect.Effect<void>
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* @since 1.0.0
|
|
191
|
-
* @category type ids
|
|
192
|
-
*/
|
|
193
|
-
export const WorkerManagerTypeId: unique symbol = internal.WorkerManagerTypeId
|
|
194
|
-
|
|
195
|
-
/**
|
|
196
|
-
* @since 1.0.0
|
|
197
|
-
* @category type ids
|
|
198
|
-
*/
|
|
199
|
-
export type WorkerManagerTypeId = typeof WorkerManagerTypeId
|
|
200
|
-
|
|
201
|
-
/**
|
|
202
|
-
* @since 1.0.0
|
|
203
|
-
* @category models
|
|
204
|
-
*/
|
|
205
|
-
export interface WorkerManager {
|
|
206
|
-
readonly [WorkerManagerTypeId]: WorkerManagerTypeId
|
|
207
|
-
readonly spawn: <I, O, E>(
|
|
208
|
-
options: Worker.Options<I>,
|
|
209
|
-
) => Effect.Effect<Worker<I, O, E>, WorkerError, Scope.Scope | Spawner>
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
/**
|
|
213
|
-
* @since 1.0.0
|
|
214
|
-
* @category tags
|
|
215
|
-
*/
|
|
216
|
-
export const WorkerManager: Context.Tag<WorkerManager, WorkerManager> = internal.WorkerManager
|
|
217
|
-
|
|
218
|
-
/**
|
|
219
|
-
* @since 1.0.0
|
|
220
|
-
* @category constructors
|
|
221
|
-
*/
|
|
222
|
-
export const makeManager: Effect.Effect<WorkerManager, never, PlatformWorker> = internal.makeManager
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* @since 1.0.0
|
|
226
|
-
* @category layers
|
|
227
|
-
*/
|
|
228
|
-
export const layerManager: Layer.Layer<WorkerManager, never, PlatformWorker> = internal.layerManager
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* @since 1.0.0
|
|
232
|
-
* @category constructors
|
|
233
|
-
*/
|
|
234
|
-
export const makePool: <I, O, E>(
|
|
235
|
-
options: WorkerPool.Options<I>,
|
|
236
|
-
) => Effect.Effect<WorkerPool<I, O, E>, WorkerError, WorkerManager | Spawner | Scope.Scope> = internal.makePool
|
|
237
|
-
|
|
238
|
-
/**
|
|
239
|
-
* @since 1.0.0
|
|
240
|
-
* @category constructors
|
|
241
|
-
*/
|
|
242
|
-
export const makePoolLayer: <Tag, I, O, E>(
|
|
243
|
-
tag: Context.Tag<Tag, WorkerPool<I, O, E>>,
|
|
244
|
-
options: WorkerPool.Options<I>,
|
|
245
|
-
) => Layer.Layer<Tag, WorkerError, WorkerManager | Spawner> = internal.makePoolLayer
|
|
246
|
-
|
|
247
|
-
/**
|
|
248
|
-
* @since 1.0.0
|
|
249
|
-
* @category models
|
|
250
|
-
*/
|
|
251
|
-
export interface SerializedWorker<I extends Schema.TaggedRequest.All> {
|
|
252
|
-
readonly id: number
|
|
253
|
-
readonly execute: <Req extends I>(
|
|
254
|
-
message: Req,
|
|
255
|
-
) => Req extends Serializable.WithResult<infer A, infer _I, infer E, infer _EI, infer R>
|
|
256
|
-
? Stream.Stream<A, E | WorkerError | ParseResult.ParseError, R>
|
|
257
|
-
: never
|
|
258
|
-
readonly executeEffect: <Req extends I>(
|
|
259
|
-
message: Req,
|
|
260
|
-
) => Req extends Serializable.WithResult<infer A, infer _I, infer E, infer _EI, infer R>
|
|
261
|
-
? Effect.Effect<A, E | WorkerError | ParseResult.ParseError, R>
|
|
262
|
-
: never
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
/**
|
|
266
|
-
* @since 1.0.0
|
|
267
|
-
* @category models
|
|
268
|
-
*/
|
|
269
|
-
export declare namespace SerializedWorker {
|
|
270
|
-
/**
|
|
271
|
-
* @since 1.0.0
|
|
272
|
-
* @category models
|
|
273
|
-
*/
|
|
274
|
-
export type Options<I> =
|
|
275
|
-
Extract<I, { readonly _tag: 'InitialMessage' }> extends never
|
|
276
|
-
? BaseOptions<I> & {
|
|
277
|
-
readonly initialMessage?: LazyArg<I>
|
|
278
|
-
}
|
|
279
|
-
: BaseOptions<I> & {
|
|
280
|
-
readonly initialMessage: LazyArg<Extract<I, { readonly _tag: 'InitialMessage' }>>
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
/**
|
|
284
|
-
* @since 1.0.0
|
|
285
|
-
* @category models
|
|
286
|
-
*/
|
|
287
|
-
export interface BaseOptions<I> {
|
|
288
|
-
readonly queue?: WorkerQueue<I> | undefined
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
/**
|
|
293
|
-
* @since 1.0.0
|
|
294
|
-
* @category models
|
|
295
|
-
*/
|
|
296
|
-
export interface SerializedWorkerPool<I extends Schema.TaggedRequest.All> {
|
|
297
|
-
readonly backing: Pool.Pool<SerializedWorker<I>, WorkerError>
|
|
298
|
-
readonly broadcast: <Req extends I>(
|
|
299
|
-
message: Req,
|
|
300
|
-
) => Req extends Serializable.WithResult<infer _A, infer _I, infer E, infer _EI, infer R>
|
|
301
|
-
? Effect.Effect<void, E | WorkerError | ParseResult.ParseError, R>
|
|
302
|
-
: never
|
|
303
|
-
readonly execute: <Req extends I>(
|
|
304
|
-
message: Req,
|
|
305
|
-
) => Req extends Serializable.WithResult<infer A, infer _I, infer E, infer _EI, infer R>
|
|
306
|
-
? Stream.Stream<A, E | WorkerError | ParseResult.ParseError, R>
|
|
307
|
-
: never
|
|
308
|
-
readonly executeEffect: <Req extends I>(
|
|
309
|
-
message: Req,
|
|
310
|
-
) => Req extends Serializable.WithResult<infer A, infer _I, infer E, infer _EI, infer R>
|
|
311
|
-
? Effect.Effect<A, E | WorkerError | ParseResult.ParseError, R>
|
|
312
|
-
: never
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
/**
|
|
316
|
-
* @since 1.0.0
|
|
317
|
-
* @category models
|
|
318
|
-
*/
|
|
319
|
-
export declare namespace SerializedWorkerPool {
|
|
320
|
-
/**
|
|
321
|
-
* @since 1.0.0
|
|
322
|
-
* @category models
|
|
323
|
-
*/
|
|
324
|
-
export type Options<I> = SerializedWorker.Options<I> &
|
|
325
|
-
(
|
|
326
|
-
| {
|
|
327
|
-
readonly onCreate?: (worker: Worker<I, unknown, unknown>) => Effect.Effect<void, WorkerError>
|
|
328
|
-
readonly size: number
|
|
329
|
-
readonly concurrency?: number | undefined
|
|
330
|
-
readonly targetUtilization?: number | undefined
|
|
331
|
-
}
|
|
332
|
-
| {
|
|
333
|
-
readonly onCreate?: (worker: Worker<I, unknown, unknown>) => Effect.Effect<void, WorkerError>
|
|
334
|
-
readonly minSize: number
|
|
335
|
-
readonly maxSize: number
|
|
336
|
-
readonly concurrency?: number | undefined
|
|
337
|
-
readonly targetUtilization?: number | undefined
|
|
338
|
-
readonly timeToLive: Duration.DurationInput
|
|
339
|
-
}
|
|
340
|
-
)
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
/**
|
|
344
|
-
* @since 1.0.0
|
|
345
|
-
* @category constructors
|
|
346
|
-
*/
|
|
347
|
-
export const makeSerialized: <I extends Schema.TaggedRequest.All>(
|
|
348
|
-
options: SerializedWorker.Options<I>,
|
|
349
|
-
) => Effect.Effect<SerializedWorker<I>, WorkerError, WorkerManager | Spawner | Scope.Scope> = internal.makeSerialized
|
|
350
|
-
|
|
351
|
-
/**
|
|
352
|
-
* @since 1.0.0
|
|
353
|
-
* @category constructors
|
|
354
|
-
*/
|
|
355
|
-
export const makePoolSerialized: <I extends Schema.TaggedRequest.All>(
|
|
356
|
-
options: SerializedWorkerPool.Options<I>,
|
|
357
|
-
) => Effect.Effect<SerializedWorkerPool<I>, WorkerError, WorkerManager | Spawner | Scope.Scope> =
|
|
358
|
-
internal.makePoolSerialized
|
|
359
|
-
|
|
360
|
-
/**
|
|
361
|
-
* @since 1.0.0
|
|
362
|
-
* @category layers
|
|
363
|
-
*/
|
|
364
|
-
export const makePoolSerializedLayer: <Tag, I extends Schema.TaggedRequest.All>(
|
|
365
|
-
tag: Context.Tag<Tag, SerializedWorkerPool<I>>,
|
|
366
|
-
options: SerializedWorkerPool.Options<I>,
|
|
367
|
-
) => Layer.Layer<Tag, WorkerError, WorkerManager | Spawner> = internal.makePoolSerializedLayer
|
|
368
|
-
|
|
369
|
-
/**
|
|
370
|
-
* @since 1.0.0
|
|
371
|
-
* @category layers
|
|
372
|
-
*/
|
|
373
|
-
export const layerSpawner: <W = unknown>(spawner: SpawnerFn<W>) => Layer.Layer<Spawner, never, never> =
|
|
374
|
-
internal.layerSpawner
|