Skip to content

Commit d90a99d

Browse files
authoredMar 13, 2024··
add AbortSignal support to ManagedRuntime (#2293)
1 parent dd05faa commit d90a99d

File tree

4 files changed

+51
-33
lines changed

4 files changed

+51
-33
lines changed
 

‎.changeset/funny-rabbits-heal.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"effect": patch
3+
---
4+
5+
add AbortSignal support to ManagedRuntime

‎packages/effect/src/ManagedRuntime.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,9 @@ export interface ManagedRuntime<in R, out ER> extends Pipeable {
6363
* This method is effectful and should only be used at the edges of your
6464
* program.
6565
*/
66-
readonly runPromise: <A, E>(effect: Effect.Effect<A, E, R>) => Promise<A>
66+
readonly runPromise: <A, E>(effect: Effect.Effect<A, E, R>, options?: {
67+
readonly signal?: AbortSignal | undefined
68+
}) => Promise<A>
6769

6870
/**
6971
* Runs the `Effect`, returning a JavaScript `Promise` that will be resolved
@@ -72,7 +74,9 @@ export interface ManagedRuntime<in R, out ER> extends Pipeable {
7274
* This method is effectful and should only be used at the edges of your
7375
* program.
7476
*/
75-
readonly runPromiseExit: <A, E>(effect: Effect.Effect<A, E, R>) => Promise<Exit.Exit<A, ER | E>>
77+
readonly runPromiseExit: <A, E>(effect: Effect.Effect<A, E, R>, options?: {
78+
readonly signal?: AbortSignal | undefined
79+
}) => Promise<Exit.Exit<A, ER | E>>
7680

7781
/**
7882
* Dispose of the resources associated with the runtime.

‎packages/effect/src/internal/managedRuntime.ts

+10-6
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,12 @@ export const make = <R, ER>(
8888
internalRuntime.unsafeRunSyncEffect(provide(self, effect)) :
8989
internalRuntime.unsafeRunSync(self.cachedRuntime)(effect)
9090
},
91-
runPromiseExit<A, E>(effect: Effect.Effect<A, E, R>): Promise<Exit<A, E | ER>> {
91+
runPromiseExit<A, E>(effect: Effect.Effect<A, E, R>, options?: {
92+
readonly signal?: AbortSignal | undefined
93+
}): Promise<Exit<A, E | ER>> {
9294
return self.cachedRuntime === undefined ?
93-
internalRuntime.unsafeRunPromiseExitEffect(provide(self, effect)) :
94-
internalRuntime.unsafeRunPromiseExit(self.cachedRuntime)(effect)
95+
internalRuntime.unsafeRunPromiseExitEffect(provide(self, effect), options) :
96+
internalRuntime.unsafeRunPromiseExit(self.cachedRuntime)(effect, options)
9597
},
9698
runCallback<A, E>(
9799
effect: Effect.Effect<A, E, R>,
@@ -101,10 +103,12 @@ export const make = <R, ER>(
101103
internalRuntime.unsafeRunCallback(internalRuntime.defaultRuntime)(provide(self, effect), options) :
102104
internalRuntime.unsafeRunCallback(self.cachedRuntime)(effect, options)
103105
},
104-
runPromise<A, E>(effect: Effect.Effect<A, E, R>): Promise<A> {
106+
runPromise<A, E>(effect: Effect.Effect<A, E, R>, options?: {
107+
readonly signal?: AbortSignal | undefined
108+
}): Promise<A> {
105109
return self.cachedRuntime === undefined ?
106-
internalRuntime.unsafeRunPromiseEffect(provide(self, effect)) :
107-
internalRuntime.unsafeRunPromise(self.cachedRuntime)(effect)
110+
internalRuntime.unsafeRunPromiseEffect(provide(self, effect), options) :
111+
internalRuntime.unsafeRunPromise(self.cachedRuntime)(effect, options)
108112
}
109113
}
110114
return self

‎packages/effect/src/internal/runtime.ts

+30-25
Original file line numberDiff line numberDiff line change
@@ -258,9 +258,12 @@ export const unsafeRunSyncExit =
258258

259259
/** @internal */
260260
export const unsafeRunPromise = <R>(runtime: Runtime.Runtime<R>) =>
261-
<A, E>(effect: Effect.Effect<A, E, R>, options?: {
262-
readonly signal?: AbortSignal
263-
}): Promise<A> =>
261+
<A, E>(
262+
effect: Effect.Effect<A, E, R>,
263+
options?: {
264+
readonly signal?: AbortSignal | undefined
265+
} | undefined
266+
): Promise<A> =>
264267
unsafeRunPromiseExit(runtime)(effect, options).then((result) => {
265268
switch (result._tag) {
266269
case OpCodes.OP_SUCCESS: {
@@ -273,30 +276,32 @@ export const unsafeRunPromise = <R>(runtime: Runtime.Runtime<R>) =>
273276
})
274277

275278
/** @internal */
276-
export const unsafeRunPromiseExit =
277-
<R>(runtime: Runtime.Runtime<R>) =>
278-
<A, E>(effect: Effect.Effect<A, E, R>, options?: {
279-
readonly signal?: AbortSignal
280-
}): Promise<Exit.Exit<A, E>> =>
281-
new Promise((resolve) => {
282-
const op = fastPath(effect)
283-
if (op) {
284-
resolve(op)
285-
}
286-
const fiber = unsafeFork(runtime)(effect)
287-
fiber.addObserver((exit) => {
288-
resolve(exit)
289-
})
290-
if (options?.signal !== undefined) {
291-
if (options.signal.aborted) {
279+
export const unsafeRunPromiseExit = <R>(runtime: Runtime.Runtime<R>) =>
280+
<A, E>(
281+
effect: Effect.Effect<A, E, R>,
282+
options?: {
283+
readonly signal?: AbortSignal | undefined
284+
} | undefined
285+
): Promise<Exit.Exit<A, E>> =>
286+
new Promise((resolve) => {
287+
const op = fastPath(effect)
288+
if (op) {
289+
resolve(op)
290+
}
291+
const fiber = unsafeFork(runtime)(effect)
292+
fiber.addObserver((exit) => {
293+
resolve(exit)
294+
})
295+
if (options?.signal !== undefined) {
296+
if (options.signal.aborted) {
297+
fiber.unsafeInterruptAsFork(fiber.id())
298+
} else {
299+
options.signal.addEventListener("abort", () => {
292300
fiber.unsafeInterruptAsFork(fiber.id())
293-
} else {
294-
options.signal.addEventListener("abort", () => {
295-
fiber.unsafeInterruptAsFork(fiber.id())
296-
})
297-
}
301+
})
298302
}
299-
})
303+
}
304+
})
300305

301306
/** @internal */
302307
export class RuntimeImpl<in R> implements Runtime.Runtime<R> {

0 commit comments

Comments
 (0)
Please sign in to comment.