diff --git a/packages/core/src/runtime/actor.ts b/packages/core/src/runtime/actor.ts index acd6b67..6c013eb 100644 --- a/packages/core/src/runtime/actor.ts +++ b/packages/core/src/runtime/actor.ts @@ -304,6 +304,13 @@ export class Turn { if (facet.actor.exitReason !== null) return; if (!facet.isLive) return; } + if (!facet.actor.space.isRunning()) { + facet.actor.space.queueTask({ + perform() { Turn.for(facet, f, zombieTurn); }, + describe() { return { type: 'externalTurn' } }, + }); + return; + } const t = new Turn(facet); try { const saved = Turn.active; diff --git a/packages/core/src/runtime/space.ts b/packages/core/src/runtime/space.ts index dee9a07..576470b 100644 --- a/packages/core/src/runtime/space.ts +++ b/packages/core/src/runtime/space.ts @@ -55,6 +55,10 @@ export class ActorSpace { this.inboundAssertions.delete(handle); } + isRunning() { + return this.state === ActorSpaceState.RUNNING; + } + shutdown(reason: Exclude) { if (this.state === ActorSpaceState.TERMINATED) return; this.state = ActorSpaceState.TERMINATED; diff --git a/packages/core/src/runtime/task.ts b/packages/core/src/runtime/task.ts index 6ab4b2c..84f9fef 100644 --- a/packages/core/src/runtime/task.ts +++ b/packages/core/src/runtime/task.ts @@ -15,6 +15,7 @@ export interface StructuredTask { export type TaskDescription = | { type: 'bootActor', detail: q.OptionalAny } | { type: 'turn', tasks: TaskAction[] } + | { type: 'externalTurn' } ; export type TaskAction = { targetFacet: Facet, action: ActionDescription };