@graftland/plugin-remote 0.3.1 → 0.3.2
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/Auth.d.ts +2 -2
- package/dist/Auth.d.ts.map +1 -1
- package/dist/Auth.js.map +1 -1
- package/dist/{Bootstrap-Dr6sX7el.js → Bootstrap-H9gDsgsC.js} +2 -2
- package/dist/{Contract-DL2mHvaT.js → Contract-DsJtisvL.js} +2 -2
- package/dist/Contract.js +1 -1
- package/dist/{Errors-BMKmu5Y7.js → Errors-DYhsGZcZ.js} +3 -1
- package/dist/Errors.d.ts +7 -0
- package/dist/Errors.d.ts.map +1 -1
- package/dist/Errors.js +3 -1
- package/dist/Errors.js.map +1 -1
- package/dist/{FailureGroup-BcH0XOBi.js → FailureGroup-BgT73AaR.js} +14 -4
- package/dist/{Framing-zaYdOJnT.js → Framing-G9eSaeLb.js} +1 -1
- package/dist/{Graft-CVyueNOf.js → Graft-B71CPA2Y.js} +20 -16
- package/dist/{Packages-JNL34JpS.js → Packages-AgoCGotL.js} +23 -26
- package/dist/{Peer-BT7eAGmh.js → Peer-DXeVrGBh.js} +5 -5
- package/dist/{ProcessObservation-DEGrEMfP.js → ProcessObservation-gLgGirYv.js} +1 -1
- package/dist/{ServeLifecycle-CJM0gG5B.js → ServeLifecycle-Bd1FPJ6e.js} +1 -1
- package/dist/Transport.d.ts +2 -2
- package/dist/Transport.d.ts.map +1 -1
- package/dist/Transport.js.map +1 -1
- package/dist/bin.js +48 -47
- package/dist/bin.js.map +1 -1
- package/dist/{childRuntime-An0HsIzl.js → childRuntime-Bm3iSg_N.js} +29 -26
- package/dist/{connectionEnded-DCpFCjMX.js → connectionEnded-BwcxQ7W8.js} +4 -4
- package/dist/{entry-B89sepMU.js → entry-psOpX3Bj.js} +72 -35
- package/dist/host/auth/bearer.js +1 -1
- package/dist/host/auth/jwt.js +1 -1
- package/dist/host/auth/mtls.js +2 -2
- package/dist/host/auth/none.js +1 -1
- package/dist/host/command.js +4 -4
- package/dist/host/local.js +3 -3
- package/dist/host/unix.js +3 -3
- package/dist/host/websocket.js +3 -3
- package/dist/host/worker.js +4 -5
- package/dist/{importer-Bk6U_sn4.js → importer-Cvf88eAY.js} +5 -8
- package/dist/index.js +9 -9
- package/dist/index.js.map +1 -1
- package/dist/internal/Certificates.js +4 -4
- package/dist/internal/Certificates.js.map +1 -1
- package/dist/internal/FailureGroup.js +3 -2
- package/dist/internal/FailureGroup.js.map +1 -1
- package/dist/internal/assembly.js +9 -2
- package/dist/internal/assembly.js.map +1 -1
- package/dist/internal/auth/mtls.js +1 -1
- package/dist/internal/auth/mtls.js.map +1 -1
- package/dist/internal/child.js +20 -17
- package/dist/internal/child.js.map +1 -1
- package/dist/internal/childRuntime.js +4 -4
- package/dist/internal/childRuntime.js.map +1 -1
- package/dist/internal/directTransport.d.ts +1 -1
- package/dist/internal/entry.d.ts.map +1 -1
- package/dist/internal/entry.js +1 -1
- package/dist/internal/entry.js.map +1 -1
- package/dist/internal/execution.js +40 -5
- package/dist/internal/execution.js.map +1 -1
- package/dist/internal/host/runner.js +7 -6
- package/dist/internal/host/runner.js.map +1 -1
- package/dist/internal/host.js +5 -5
- package/dist/internal/host.js.map +1 -1
- package/dist/internal/port.js +5 -5
- package/dist/internal/port.js.map +1 -1
- package/dist/internal/release.js +1 -1
- package/dist/internal/release.js.map +1 -1
- package/dist/internal/runner/Connection.d.ts +1 -1
- package/dist/internal/runner/Connection.js +4 -4
- package/dist/internal/runner/Connection.js.map +1 -1
- package/dist/internal/runner/Execution.js +3 -3
- package/dist/internal/runner/Execution.js.map +1 -1
- package/dist/internal/runner/Framing.js +1 -1
- package/dist/internal/runner/Framing.js.map +1 -1
- package/dist/internal/runner/Local.js +1 -1
- package/dist/internal/runner/Local.js.map +1 -1
- package/dist/internal/runner/Lock.js +1 -1
- package/dist/internal/runner/Lock.js.map +1 -1
- package/dist/internal/runner/Packages.d.ts +1 -1
- package/dist/internal/runner/Packages.js +22 -25
- package/dist/internal/runner/Packages.js.map +1 -1
- package/dist/internal/runner/Processes.js +7 -9
- package/dist/internal/runner/Processes.js.map +1 -1
- package/dist/internal/runner/Store.js +3 -3
- package/dist/internal/runner/Store.js.map +1 -1
- package/dist/internal/runner/Supervisor.js +46 -47
- package/dist/internal/runner/Supervisor.js.map +1 -1
- package/dist/internal/runner/accept.js +3 -3
- package/dist/internal/runner/accept.js.map +1 -1
- package/dist/internal/runner/model.js +1 -1
- package/dist/internal/runner/model.js.map +1 -1
- package/dist/internal/serve.js +1 -1
- package/dist/internal/serve.js.map +1 -1
- package/dist/internal/supervisorPlugin.js +1 -1
- package/dist/internal/watchdogMain.js +5 -5
- package/dist/internal/watchdogMain.js.map +1 -1
- package/dist/internal/websocketServer.js +3 -1
- package/dist/internal/websocketServer.js.map +1 -1
- package/dist/internal/workerMain.js +3 -3
- package/dist/{port-DSVUY8Bq.js → port--3x2zJ4D.js} +8 -8
- package/dist/{release-BY4Mlluy.js → release-DfZPuIcK.js} +1 -1
- package/dist/runner/auth/bearer.js +2 -2
- package/dist/runner/auth/jwt.js +4 -4
- package/dist/runner/auth/jwt.js.map +1 -1
- package/dist/runner/auth/mtls.js +3 -3
- package/dist/runner/auth/none.js +1 -1
- package/dist/runner/index.js +5 -5
- package/dist/runner/stdio.js +3 -3
- package/dist/runner/unix.js +3 -3
- package/dist/runner/websocket.js +4 -4
- package/dist/{socketChannel-C_ppdSzz.js → socketChannel-CJvL2DiB.js} +2 -2
- package/dist/{supervisorPlugin-CivhM7x5.js → supervisorPlugin-t6Z6PrhD.js} +72 -76
- package/dist/{token-Cc_1CTbE.js → token-CYBNNlhS.js} +1 -1
- package/dist/{tokenCredentials-CI6mMRRd.js → tokenCredentials-CbCuk-Rt.js} +3 -3
- package/dist/{websocketServer-D2Hk7wsA.js → websocketServer-NQhODlEt.js} +5 -3
- package/dist/{workerChannel-cmLc13vm.js → workerChannel-C8hhBJzA.js} +1 -1
- package/package.json +3 -3
- package/src/Auth.ts +9 -2
- package/src/Errors.ts +8 -0
- package/src/Transport.ts +6 -2
- package/src/bin.ts +28 -30
- package/src/index.ts +5 -3
- package/src/internal/Certificates.ts +10 -13
- package/src/internal/FailureGroup.ts +128 -121
- package/src/internal/assembly.ts +19 -10
- package/src/internal/auth/mtls.ts +19 -20
- package/src/internal/child.ts +248 -239
- package/src/internal/childRuntime.ts +81 -80
- package/src/internal/entry.ts +10 -11
- package/src/internal/execution.ts +69 -12
- package/src/internal/host/runner.ts +153 -153
- package/src/internal/host.ts +116 -120
- package/src/internal/port.ts +100 -103
- package/src/internal/release.ts +3 -2
- package/src/internal/runner/Connection.ts +52 -60
- package/src/internal/runner/Execution.ts +163 -164
- package/src/internal/runner/Framing.ts +9 -10
- package/src/internal/runner/Local.ts +26 -27
- package/src/internal/runner/Lock.ts +23 -25
- package/src/internal/runner/Packages.ts +67 -70
- package/src/internal/runner/Processes.ts +89 -92
- package/src/internal/runner/Store.ts +110 -114
- package/src/internal/runner/Supervisor.ts +392 -405
- package/src/internal/runner/accept.ts +76 -84
- package/src/internal/runner/model.ts +20 -21
- package/src/internal/serve.ts +15 -13
- package/src/internal/watchdogMain.ts +16 -11
- package/src/internal/websocketServer.ts +18 -3
- package/src/runner/auth/jwt.ts +10 -6
- package/dist/cleanup-CXLa1Wd9.js +0 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FailureGroup.js","names":["Release.close","Release.ReleaseInterrupted","close"],"sources":["../../src/internal/FailureGroup.ts"],"sourcesContent":["import {\n\tArray,\n\tCause,\n\tFiber,\n\tData,\n\tDeferred,\n\tEffect,\n\tExit,\n\tFiberSet,\n\tRef,\n\tScope,\n\tSchema,\n\tTxRef,\n} from \"effect\"\nimport * as Release from \"./release\"\n\ntype State<E> = Data.TaggedEnum<{\n\tOpen: {}\n\tFailed: { readonly cause: Cause.Cause<E> }\n\tClosed: {}\n}>\ninterface StateDefinition extends Data.TaggedEnum.WithGenerics<1> {\n\treadonly taggedEnum: State<this[\"A\"]>\n}\nconst State = Data.taggedEnum<StateDefinition>()\nexport interface FailureGroup<E> {\n\treadonly await: Effect.Effect<never, E>\n\treadonly check: Effect.Effect<void, E>\n\treadonly cause: Effect.Effect<Cause.Cause<E>>\n\treadonly run: <A, R>(\n\t\teffect: Effect.Effect<A, E, R>,\n\t) => Effect.Effect<Fiber.Fiber<A, E>, never, R>\n\treadonly fail: (error: E) => Effect.Effect<void>\n\treadonly failCause: (cause: Cause.Cause<E>) => Effect.Effect<void>\n\treadonly race: <A, E2, R>(\n\t\teffect: Effect.Effect<A, E2, R>,\n\t) => Effect.Effect<A, E | E2, R>\n\treadonly runtime: <R>() => Effect.Effect<\n\t\t(effect: Effect.Effect<unknown, E, R>) => Fiber.Fiber<unknown, E>,\n\t\tnever,\n\t\tR\n\t>\n\treadonly close: Effect.Effect<void, E>\n}\n\n/** One owner for first failure, transaction wakeups, and interruption of sibling work. */\nexport const make = <E>(): Effect.
|
|
1
|
+
{"version":3,"file":"FailureGroup.js","names":["Release.close","Release.ReleaseInterrupted","close"],"sources":["../../src/internal/FailureGroup.ts"],"sourcesContent":["import {\n\tArray,\n\tCause,\n\tFiber,\n\tData,\n\tDeferred,\n\tEffect,\n\tExit,\n\tFiberSet,\n\tRef,\n\tScope,\n\tSchema,\n\tTxRef,\n} from \"effect\"\nimport * as Release from \"./release\"\nimport { cleanupCause } from \"./cleanup\"\n\ntype State<E> = Data.TaggedEnum<{\n\tOpen: {}\n\tFailed: { readonly cause: Cause.Cause<E> }\n\tClosed: {}\n}>\ninterface StateDefinition extends Data.TaggedEnum.WithGenerics<1> {\n\treadonly taggedEnum: State<this[\"A\"]>\n}\nconst State = Data.taggedEnum<StateDefinition>()\nexport interface FailureGroup<E> {\n\treadonly await: Effect.Effect<never, E>\n\treadonly check: Effect.Effect<void, E>\n\treadonly cause: Effect.Effect<Cause.Cause<E>>\n\treadonly run: <A, R>(\n\t\teffect: Effect.Effect<A, E, R>,\n\t) => Effect.Effect<Fiber.Fiber<A, E>, never, R>\n\treadonly fail: (error: E) => Effect.Effect<void>\n\treadonly failCause: (cause: Cause.Cause<E>) => Effect.Effect<void>\n\treadonly race: <A, E2, R>(\n\t\teffect: Effect.Effect<A, E2, R>,\n\t) => Effect.Effect<A, E | E2, R>\n\treadonly runtime: <R>() => Effect.Effect<\n\t\t(effect: Effect.Effect<unknown, E, R>) => Fiber.Fiber<unknown, E>,\n\t\tnever,\n\t\tR\n\t>\n\treadonly close: Effect.Effect<void, E>\n}\n\n/** One owner for first failure, transaction wakeups, and interruption of sibling work. */\nexport const make = Effect.fnUntraced(function* <E>(): Effect.fn.Return<\n\tFailureGroup<E>,\n\tnever,\n\tScope.Scope\n> {\n\tconst fibers = yield* FiberSet.make<unknown, E>()\n\tconst state = yield* TxRef.make<State<E>>(State.Open())\n\tconst failures = yield* Ref.make<Cause.Cause<E>>(Cause.empty)\n\tconst cleanup = yield* Ref.make<Cause.Cause<E>>(Cause.empty)\n\tconst check = TxRef.get(state).pipe(\n\t\tEffect.flatMap((s) =>\n\t\t\ts._tag === \"Failed\"\n\t\t\t\t? Effect.failCause(s.cause)\n\t\t\t\t: s._tag === \"Closed\"\n\t\t\t\t\t? Effect.interrupt\n\t\t\t\t\t: Effect.void,\n\t\t),\n\t)\n\tconst publish = (cause: Cause.Cause<E>) =>\n\t\tTxRef.update(state, (s): State<E> =>\n\t\t\ts._tag === \"Open\" ? State.Failed({ cause }) : s,\n\t\t)\n\n\tconst observe = <A, R>(effect: Effect.Effect<A, E, R>) =>\n\t\tEffect.uninterruptibleMask((restore) =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst scope = yield* Scope.make()\n\t\t\t\t// The owned child makes cancellation explicit, even when a stream closes an internal scope.\n\t\t\t\tconst ownerId = yield* Effect.withFiber((self) =>\n\t\t\t\t\tEffect.succeed(self.id),\n\t\t\t\t)\n\t\t\t\tconst worker = yield* Effect.forkIn(\n\t\t\t\t\trestore(Scope.provide(scope)(effect)),\n\t\t\t\t\tscope,\n\t\t\t\t)\n\t\t\t\tconst waiting = yield* Effect.exit(restore(Fiber.await(worker)))\n\t\t\t\tif (Exit.isFailure(waiting)) yield* Fiber.interrupt(worker)\n\t\t\t\tconst body = yield* Fiber.await(worker)\n\t\t\t\tconst closed = yield* Effect.exit(Release.close(scope, body))\n\t\t\t\t// Forwarding this exact cancellation from a finalizer is indistinguishable from acknowledging it.\n\t\t\t\tconst expected =\n\t\t\t\t\tExit.isFailure(waiting) &&\n\t\t\t\t\tExit.isFailure(body) &&\n\t\t\t\t\tArray.every(\n\t\t\t\t\t\tbody.cause.reasons,\n\t\t\t\t\t\t(reason) =>\n\t\t\t\t\t\t\treason._tag === \"Interrupt\" && reason.fiberId === ownerId,\n\t\t\t\t\t)\n\t\t\t\tconst bodyCause =\n\t\t\t\t\tExit.isFailure(body) && !expected ? body.cause : Cause.empty\n\t\t\t\t// Release.close marks independent interruptions; an unmarked one is pending cancellation.\n\t\t\t\tconst releaseCause =\n\t\t\t\t\tExit.isFailure(closed) && !Cause.hasInterruptsOnly(closed.cause)\n\t\t\t\t\t\t? closed.cause\n\t\t\t\t\t\t: Cause.empty\n\t\t\t\tconst failure = Cause.combine(bodyCause, releaseCause)\n\t\t\t\t// Body cleanup may carry either an interruption or a release defect from an inner group.\n\t\t\t\tconst closing = Cause.combine(\n\t\t\t\t\tCause.hasInterrupts(bodyCause) ||\n\t\t\t\t\t\tArray.some(\n\t\t\t\t\t\t\tbodyCause.reasons,\n\t\t\t\t\t\t\t(reason) =>\n\t\t\t\t\t\t\t\treason._tag === \"Die\" &&\n\t\t\t\t\t\t\t\tSchema.is(Release.ReleaseInterrupted)(reason.defect),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t? bodyCause\n\t\t\t\t\t\t: Cause.empty,\n\t\t\t\t\treleaseCause,\n\t\t\t\t)\n\t\t\t\tyield* Ref.update(cleanup, (cause) => Cause.combine(cause, closing))\n\t\t\t\tif (failure.reasons.length > 0) {\n\t\t\t\t\tyield* Ref.update(failures, (cause) => Cause.combine(cause, failure))\n\t\t\t\t\tyield* publish(failure)\n\t\t\t\t\tyield* Deferred.failCause(fibers.deferred, failure)\n\t\t\t\t}\n\t\t\t\tif (Exit.isFailure(closed))\n\t\t\t\t\treturn yield* Effect.failCause(\n\t\t\t\t\t\tExit.isFailure(body)\n\t\t\t\t\t\t\t? Cause.combine(body.cause, closed.cause)\n\t\t\t\t\t\t\t: closed.cause,\n\t\t\t\t\t)\n\t\t\t\tif (Exit.isFailure(waiting) && Exit.isSuccess(body))\n\t\t\t\t\treturn yield* Effect.failCause(waiting.cause)\n\t\t\t\treturn yield* body\n\t\t\t}),\n\t\t)\n\tyield* FiberSet.join(fibers).pipe(\n\t\tEffect.catchCause((cause) =>\n\t\t\tpublish(cause).pipe(\n\t\t\t\tEffect.andThen(FiberSet.clear(fibers)),\n\t\t\t\tEffect.uninterruptible,\n\t\t\t),\n\t\t),\n\t\tEffect.forkScoped,\n\t)\n\tconst failure = Effect.tx(check.pipe(Effect.andThen(Effect.txRetry)))\n\tconst failCause = (cause: Cause.Cause<E>) =>\n\t\t// This is an explicit failure report, not cancellation of an owned worker.\n\t\tFiberSet.run(fibers, observe(Effect.failCause(cause))).pipe(Effect.asVoid)\n\tconst close = TxRef.update(state, (s) =>\n\t\ts._tag === \"Open\" ? State.Closed() : s,\n\t).pipe(\n\t\tEffect.andThen(FiberSet.clear(fibers)),\n\t\tEffect.andThen(Ref.get(cleanup)),\n\t\tEffect.flatMap((cause) =>\n\t\t\tcause.reasons.length > 0 ? Effect.failCause(cause) : Effect.void,\n\t\t),\n\t\tEffect.uninterruptible,\n\t)\n\t// Operational failure is delivered by await; release must also deliver sibling cleanup failures.\n\t// Every sibling failure and interruption survives as a defect; orDie would keep only the first failure.\n\tyield* Effect.addFinalizer(() =>\n\t\tclose.pipe(\n\t\t\tEffect.catchCause((cause) => Effect.failCause(cleanupCause(cause))),\n\t\t),\n\t)\n\treturn {\n\t\tawait: failure,\n\t\tcheck,\n\t\tcause: Ref.get(failures),\n\t\truntime: <R>() =>\n\t\t\tFiberSet.runtime(fibers)<R>().pipe(\n\t\t\t\tEffect.map(\n\t\t\t\t\t(run) => (effect: Effect.Effect<unknown, E, R>) =>\n\t\t\t\t\t\trun(check.pipe(Effect.andThen(observe(effect)))),\n\t\t\t\t),\n\t\t\t),\n\t\trun: (effect) =>\n\t\t\tFiberSet.run(fibers, check.pipe(Effect.andThen(observe(effect)))),\n\t\tfail: (error) => failCause(Cause.fail(error)),\n\t\tfailCause,\n\t\trace: (effect) =>\n\t\t\tcheck.pipe(Effect.andThen(Effect.raceFirst(effect, failure))),\n\t\tclose,\n\t}\n})\n"],"mappings":"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"}
|
|
@@ -29,6 +29,13 @@ var CapabilityCombinationError = class extends Schema.TaggedError()("CapabilityC
|
|
|
29
29
|
}
|
|
30
30
|
};
|
|
31
31
|
var CapabilityFailed = class extends Schema.TaggedError()("CapabilityFailed", { cause: Schema.Cause(Schema.Unknown, Schema.Unknown) }) {};
|
|
32
|
+
/** Every failure class assembly raises; host error classification reads this list. */
|
|
33
|
+
const errors = [
|
|
34
|
+
ListenerConfigError,
|
|
35
|
+
CapabilityContractError,
|
|
36
|
+
CapabilityCombinationError,
|
|
37
|
+
CapabilityFailed
|
|
38
|
+
];
|
|
32
39
|
const definition = Schema.declare(Plugin.isPlugin);
|
|
33
40
|
/** Entries resolve capability modules before assembling their private providers. */
|
|
34
41
|
const Invocation = Schema.Struct({
|
|
@@ -94,7 +101,7 @@ const compatible = (properties, kind) => {
|
|
|
94
101
|
const kind = (auth) => auth._tag === "Mtls" ? "Certificate" : auth._tag === "Header" ? "Authorization" : "None";
|
|
95
102
|
const warn = (properties, credentials, side) => Effect.all([properties.network && !properties.encrypted ? Effect.logWarning(credentials === "Authorization" ? `${properties.protocol}:// ${side === "host" ? "connection" : "listener"} is unencrypted; credentials are transmitted in plaintext` : `${properties.protocol}:// ${side === "host" ? "connection" : "listener"} is unencrypted`) : Effect.void, side === "runner" && properties.network && credentials === "None" ? Effect.logWarning("WebSocket listener has no authentication") : Effect.void], { discard: true });
|
|
96
103
|
const directAuth = (properties, explicit) => explicit && (properties.protocol === "stdio" || properties.protocol === "command") ? Effect.fail(CapabilityCombinationError.make({ detail: `${properties.protocol} transports do not accept auth` })) : Effect.void;
|
|
97
|
-
const connectWith =
|
|
104
|
+
const connectWith = Effect.fnUntraced(function* (explicitAuth = false) {
|
|
98
105
|
const connector = yield* Connector;
|
|
99
106
|
const credentials = yield* Credentials;
|
|
100
107
|
yield* directAuth(connector.properties, explicitAuth);
|
|
@@ -133,6 +140,6 @@ const makeListenerConsumer = (prepare = () => Effect.void, ready = Effect.void)
|
|
|
133
140
|
});
|
|
134
141
|
const listenerConsumer = makeListenerConsumer();
|
|
135
142
|
connectWith();
|
|
136
|
-
export { CapabilityCombinationError, CapabilityContractError, CapabilityFailed, Invocation, ListenerConfigError, accept, compatible, connectWith, directAuth, host, listenerConsumer, makeListenerConsumer, runner };
|
|
143
|
+
export { CapabilityCombinationError, CapabilityContractError, CapabilityFailed, Invocation, ListenerConfigError, accept, compatible, connectWith, directAuth, errors, host, listenerConsumer, makeListenerConsumer, runner };
|
|
137
144
|
|
|
138
145
|
//# sourceMappingURL=assembly.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assembly.js","names":[],"sources":["../../src/internal/assembly.ts"],"sourcesContent":["import { findSubtree, isSubtreeActive } from \"./forkTree\"\nimport { Peer } from \"./Peer\"\nimport { Graft, Plugin, type Fork } from \"@graftland/graft\"\nimport {\n\tArray,\n\tContext,\n\tDeferred,\n\tEffect,\n\tFiber,\n\tOption,\n\tSchema,\n\tStream,\n} from \"effect\"\nimport {\n\tAuthenticator,\n\tCredentials,\n\ttype AuthenticatorApi,\n\ttype CredentialsApi,\n} from \"../Auth\"\nimport {\n\tConnector,\n\tListener,\n\ttype Accept,\n\ttype Properties,\n\ttype Session,\n} from \"../Transport\"\nimport { AuthenticationFailed } from \"../Errors\"\nimport { Supervisor } from \"./Supervisor\"\nimport { follow } from \"./follow\"\nimport { connectionEnded, closedNormally } from \"./runner/connectionEnded\"\nimport { ServeLifecycle } from \"./ServeLifecycle\"\n\nexport class ListenerConfigError extends Schema.TaggedError<\n\tListenerConfigError,\n\t{ readonly brand: unique symbol }\n>()(\"ListenerConfigError\", { detail: Schema.String }) {\n\toverride get message() {\n\t\treturn this.detail\n\t}\n}\n\nexport class CapabilityContractError extends Schema.TaggedError<\n\tCapabilityContractError,\n\t{ readonly brand: unique symbol }\n>()(\"CapabilityContractError\", { plugin: Schema.String, key: Schema.String }) {\n\toverride get message() {\n\t\treturn `Capability ${this.plugin} became active without providing ${this.key}`\n\t}\n}\nexport class CapabilityCombinationError extends Schema.TaggedError<\n\tCapabilityCombinationError,\n\t{ readonly brand: unique symbol }\n>()(\"CapabilityCombinationError\", { detail: Schema.String }) {\n\toverride get message() {\n\t\treturn this.detail\n\t}\n}\n\nexport class CapabilityFailed extends Schema.TaggedError<\n\tCapabilityFailed,\n\t{ readonly brand: unique symbol }\n>()(\"CapabilityFailed\", {\n\tcause: Schema.Cause(Schema.Unknown, Schema.Unknown),\n}) {}\n\nconst definition = Schema.declare(Plugin.isPlugin)\n/** Entries resolve capability modules before assembling their private providers. */\nexport const Invocation = Schema.Struct({\n\tplugin: definition,\n\tconfig: Schema.Unknown,\n})\nconst Input = Schema.Struct({\n\ttransport: Invocation,\n\tauth: Invocation,\n\tconsumer: definition,\n\tinput: Schema.optionalKey(Schema.Unknown),\n})\nexport type Input = typeof Input.Type\n\nconst failure = (tree: Fork.ForkTree): Effect.Effect<void, CapabilityFailed> =>\n\ttree.state._tag === \"Failed\"\n\t\t? Effect.fail(CapabilityFailed.make({ cause: tree.state.cause }))\n\t\t: Effect.forEach(tree.children, failure, { discard: true })\n\nconst probe = (name: string, key: Context.Key<unknown, unknown>) =>\n\tPlugin.make({\n\t\tname: \"remote-capability-contract\",\n\t\tinject: [Plugin.optional(key)],\n\t\tapply: Effect.fnUntraced(function* () {\n\t\t\tconst value = yield* Effect.serviceOption(key)\n\t\t\tif (Option.isNone(value))\n\t\t\t\treturn yield* CapabilityContractError.make({\n\t\t\t\t\tplugin: name,\n\t\t\t\t\tkey: key.key,\n\t\t\t\t})\n\t\t}),\n\t})\n\n/** Resolve the key in a fresh consumer after the provider subtree settles.\n * An optional consumer started earlier could still hold a pre-publication snapshot.\n */\nconst watch = (provider: Fork.Fork, key: Context.Key<unknown, unknown>) =>\n\tPlugin.fork(\n\t\tGraft.forks.pipe(\n\t\t\tStream.map((trees) => findSubtree(trees, provider.id)),\n\t\t\tStream.filter(Option.isSome),\n\t\t\tStream.map((tree) => tree.value),\n\t\t\tStream.tap(failure),\n\t\t\tStream.map((tree) => ({\n\t\t\t\tname: tree.name,\n\t\t\t\tactive: isSubtreeActive(tree),\n\t\t\t})),\n\t\t\tStream.changesWith((left, right) => left.active === right.active),\n\t\t\tStream.filter((tree) => tree.active),\n\t\t\tStream.runForEach((tree) =>\n\t\t\t\tEffect.scoped(\n\t\t\t\t\tGraft.plugin(probe(tree.name, key)).pipe(\n\t\t\t\t\t\tEffect.flatMap((fork) => fork.await),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t),\n\t)\n\nconst assembly = (\n\tkeys: readonly [Context.Key<unknown, unknown>, Context.Key<unknown, unknown>],\n) =>\n\tPlugin.make({\n\t\tname: \"remote-assembly\",\n\t\tconfig: Input,\n\t\tapply: Effect.fnUntraced(function* (input) {\n\t\t\tyield* Effect.forEach(\n\t\t\t\t[\n\t\t\t\t\t{ invocation: input.transport, key: keys[0] },\n\t\t\t\t\t{ invocation: input.auth, key: keys[1] },\n\t\t\t\t],\n\t\t\t\tEffect.fnUntraced(function* ({ invocation, key }) {\n\t\t\t\t\tconst provider = yield* Graft.plugin(\n\t\t\t\t\t\tinvocation.plugin,\n\t\t\t\t\t\tinvocation.config,\n\t\t\t\t\t)\n\t\t\t\t\tyield* watch(provider, key)\n\t\t\t\t}),\n\t\t\t)\n\t\t\tconst consumer = yield* Graft.plugin(input.consumer, input.input)\n\t\t\t// Capability publication can leave a transient Pending snapshot; business dependencies may remain Pending.\n\t\t\tyield* consumer.state.pipe(\n\t\t\t\tStream.filter(\n\t\t\t\t\t(state) =>\n\t\t\t\t\t\tstate._tag !== \"Loading\" &&\n\t\t\t\t\t\t(state._tag !== \"Pending\" ||\n\t\t\t\t\t\t\t!Array.some(keys, (key) =>\n\t\t\t\t\t\t\t\tArray.contains(state.missing, key.key),\n\t\t\t\t\t\t\t)),\n\t\t\t\t),\n\t\t\t\tStream.runHead,\n\t\t\t)\n\t\t\tyield* follow(consumer, (cause) =>\n\t\t\t\tEffect.fail(CapabilityFailed.make({ cause })),\n\t\t\t)\n\t\t}),\n\t})\nconst hostAssembly = assembly([Connector, Credentials])\nconst runnerAssembly = assembly([Listener, Authenticator])\n\nexport const host = (input: Input) =>\n\tGraft.plugin(hostAssembly, input, { isolate: [Connector, Credentials] })\nexport const runner = (\n\tinput: Omit<Input, \"consumer\">,\n\tconsumer = listenerConsumer,\n) =>\n\tGraft.plugin(\n\t\trunnerAssembly,\n\t\t{ ...input, consumer },\n\t\t{ isolate: [Listener, Authenticator] },\n\t)\n\nexport const compatible = (\n\tproperties: Properties,\n\tkind: CredentialsApi[\"kind\"],\n): Effect.Effect<void, CapabilityCombinationError> => {\n\tif (\n\t\tkind === \"Certificate\" &&\n\t\t(properties.protocol !== \"wss\" ||\n\t\t\t!properties.encrypted ||\n\t\t\t!Array.contains(properties.carries, \"certificate\"))\n\t)\n\t\treturn Effect.fail(\n\t\t\tCapabilityCombinationError.make({\n\t\t\t\tdetail: \"Mutual TLS requires encrypted wss with certificate evidence\",\n\t\t\t}),\n\t\t)\n\tif (kind === \"Authorization\" && !Array.contains(properties.carries, \"header\"))\n\t\treturn Effect.fail(\n\t\t\tCapabilityCombinationError.make({\n\t\t\t\tdetail: \"This transport cannot carry Authorization headers\",\n\t\t\t}),\n\t\t)\n\treturn Effect.void\n}\nconst kind = (auth: AuthenticatorApi): CredentialsApi[\"kind\"] =>\n\tauth._tag === \"Mtls\"\n\t\t? \"Certificate\"\n\t\t: auth._tag === \"Header\"\n\t\t\t? \"Authorization\"\n\t\t\t: \"None\"\nconst warn = (\n\tproperties: Properties,\n\tcredentials: CredentialsApi[\"kind\"],\n\tside: \"host\" | \"runner\",\n) =>\n\tEffect.all(\n\t\t[\n\t\t\tproperties.network && !properties.encrypted\n\t\t\t\t? Effect.logWarning(\n\t\t\t\t\t\tcredentials === \"Authorization\"\n\t\t\t\t\t\t\t? `${properties.protocol}:// ${side === \"host\" ? \"connection\" : \"listener\"} is unencrypted; credentials are transmitted in plaintext`\n\t\t\t\t\t\t\t: `${properties.protocol}:// ${side === \"host\" ? \"connection\" : \"listener\"} is unencrypted`,\n\t\t\t\t\t)\n\t\t\t\t: Effect.void,\n\t\t\tside === \"runner\" && properties.network && credentials === \"None\"\n\t\t\t\t? Effect.logWarning(\"WebSocket listener has no authentication\")\n\t\t\t\t: Effect.void,\n\t\t],\n\t\t{ discard: true },\n\t)\n\nexport const directAuth = (properties: Properties, explicit: boolean) =>\n\texplicit &&\n\t(properties.protocol === \"stdio\" || properties.protocol === \"command\")\n\t\t? Effect.fail(\n\t\t\t\tCapabilityCombinationError.make({\n\t\t\t\t\tdetail: `${properties.protocol} transports do not accept auth`,\n\t\t\t\t}),\n\t\t\t)\n\t\t: Effect.void\n\nexport const connectWith = (explicitAuth = false) =>\n\tEffect.gen(function* () {\n\t\tconst connector = yield* Connector\n\t\tconst credentials = yield* Credentials\n\t\tyield* directAuth(connector.properties, explicitAuth)\n\t\tyield* compatible(connector.properties, credentials.kind)\n\t\tyield* warn(connector.properties, credentials.kind, \"host\")\n\t\tconst prepared = yield* credentials.read\n\t\treturn yield* connector.connect(prepared)\n\t})\n\nexport const accept =\n\t(\n\t\tauth: AuthenticatorApi,\n\t\tproperties: Properties,\n\t\tsession: (identity: string) => Session,\n\t): Accept =>\n\t(handshake) => {\n\t\tconst identity =\n\t\t\tauth._tag === \"Header\"\n\t\t\t\t? auth.authenticate(handshake.authorization)\n\t\t\t\t: auth._tag === \"Mtls\"\n\t\t\t\t\t? Option.match(handshake.certificate, {\n\t\t\t\t\t\t\tonNone: () =>\n\t\t\t\t\t\t\t\tEffect.fail(AuthenticationFailed.make({ reason: \"missing\" })),\n\t\t\t\t\t\t\tonSome: auth.authenticate,\n\t\t\t\t\t\t})\n\t\t\t\t\t: (properties.network\n\t\t\t\t\t\t\t? Effect.logWarning(\"WebSocket connection has no authentication\")\n\t\t\t\t\t\t\t: Effect.void\n\t\t\t\t\t\t).pipe(Effect.as(auth.identity))\n\t\treturn identity.pipe(Effect.map(session))\n\t}\n\nexport const makeListenerConsumer = (\n\tprepare: (\n\t\tproperties: Properties,\n\t\tauth: AuthenticatorApi,\n\t) => Effect.Effect<void, CapabilityCombinationError> = () => Effect.void,\n\tready: Effect.Effect<void> = Effect.void,\n) =>\n\tPlugin.make({\n\t\tname: \"remote-listener-consumer\",\n\t\tinject: [\n\t\t\tListener,\n\t\t\tAuthenticator,\n\t\t\tSupervisor,\n\t\t\tPlugin.optional(ServeLifecycle),\n\t\t],\n\t\tapply: Effect.fnUntraced(function* () {\n\t\t\tconst listener = yield* Listener\n\t\t\tconst auth = yield* Authenticator\n\t\t\tconst supervisor = yield* Supervisor\n\t\t\tconst lifecycle = yield* Effect.serviceOption(ServeLifecycle)\n\t\t\tyield* prepare(listener.properties, auth)\n\t\t\tyield* compatible(listener.properties, kind(auth)).pipe(\n\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\tListenerConfigError.make({ detail: error.detail }),\n\t\t\t\t),\n\t\t\t)\n\t\t\tyield* warn(listener.properties, kind(auth), \"runner\")\n\t\t\tconst serving = yield* listener.bind(\n\t\t\t\tauth._tag === \"Mtls\" ? Option.some(auth.tls) : Option.none(),\n\t\t\t)\n\t\t\tconst running = yield* Plugin.fork(\n\t\t\t\tserving\n\t\t\t\t\t.serve(\n\t\t\t\t\t\taccept(\n\t\t\t\t\t\t\tauth,\n\t\t\t\t\t\t\tlistener.properties,\n\t\t\t\t\t\t\t(identity) => (channel) =>\n\t\t\t\t\t\t\t\tsupervisor.accept(channel).pipe(\n\t\t\t\t\t\t\t\t\tEffect.catchCause((cause) =>\n\t\t\t\t\t\t\t\t\t\tlistener.properties.protocol === \"stdio\"\n\t\t\t\t\t\t\t\t\t\t\t? closedNormally(cause)\n\t\t\t\t\t\t\t\t\t\t\t\t? Effect.void\n\t\t\t\t\t\t\t\t\t\t\t\t: Effect.failCause(cause)\n\t\t\t\t\t\t\t\t\t\t\t: connectionEnded(cause),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tEffect.provideService(Peer, identity),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t\t.pipe(\n\t\t\t\t\t\tEffect.onExit((exit) =>\n\t\t\t\t\t\t\tlistener.properties.protocol === \"stdio\" &&\n\t\t\t\t\t\t\tOption.isSome(lifecycle)\n\t\t\t\t\t\t\t\t? Deferred.done(lifecycle.value.ended, exit)\n\t\t\t\t\t\t\t\t: Effect.void,\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t)\n\t\t\tyield* serving.ready.pipe(Effect.raceFirst(Fiber.join(running)))\n\t\t\tyield* ready\n\t\t}),\n\t})\n\nexport const listenerConsumer = makeListenerConsumer()\n\nexport const connect = connectWith()\n"],"mappings":";;;;;;;;;;;;AAgCA,IAAa,sBAAb,cAAyC,OAAO,YAG9C,CAAC,CAAC,uBAAuB,EAAE,QAAQ,OAAO,OAAO,CAAC,CAAC,CAAC;CACrD,IAAa,UAAU;EACtB,OAAO,KAAK;CACb;AACD;AAEA,IAAa,0BAAb,cAA6C,OAAO,YAGlD,CAAC,CAAC,2BAA2B;CAAE,QAAQ,OAAO;CAAQ,KAAK,OAAO;AAAO,CAAC,CAAC,CAAC;CAC7E,IAAa,UAAU;EACtB,OAAO,cAAc,KAAK,OAAO,mCAAmC,KAAK;CAC1E;AACD;AACA,IAAa,6BAAb,cAAgD,OAAO,YAGrD,CAAC,CAAC,8BAA8B,EAAE,QAAQ,OAAO,OAAO,CAAC,CAAC,CAAC;CAC5D,IAAa,UAAU;EACtB,OAAO,KAAK;CACb;AACD;AAEA,IAAa,mBAAb,cAAsC,OAAO,YAG3C,CAAC,CAAC,oBAAoB,EACvB,OAAO,OAAO,MAAM,OAAO,SAAS,OAAO,OAAO,EACnD,CAAC,CAAC,CAAC,CAAC;AAEJ,MAAM,aAAa,OAAO,QAAQ,OAAO,QAAQ;;AAEjD,MAAa,aAAa,OAAO,OAAO;CACvC,QAAQ;CACR,QAAQ,OAAO;AAChB,CAAC;AACD,MAAM,QAAQ,OAAO,OAAO;CAC3B,WAAW;CACX,MAAM;CACN,UAAU;CACV,OAAO,OAAO,YAAY,OAAO,OAAO;AACzC,CAAC;AAGD,MAAM,WAAW,SAChB,KAAK,MAAM,SAAS,WACjB,OAAO,KAAK,iBAAiB,KAAK,EAAE,OAAO,KAAK,MAAM,MAAM,CAAC,CAAC,IAC9D,OAAO,QAAQ,KAAK,UAAU,SAAS,EAAE,SAAS,KAAK,CAAC;AAE5D,MAAM,SAAS,MAAc,QAC5B,OAAO,KAAK;CACX,MAAM;CACN,QAAQ,CAAC,OAAO,SAAS,GAAG,CAAC;CAC7B,OAAO,OAAO,WAAW,aAAa;EACrC,MAAM,QAAQ,OAAO,OAAO,cAAc,GAAG;EAC7C,IAAI,OAAO,OAAO,KAAK,GACtB,OAAO,OAAO,wBAAwB,KAAK;GAC1C,QAAQ;GACR,KAAK,IAAI;EACV,CAAC;CACH,CAAC;AACF,CAAC;;;;AAKF,MAAM,SAAS,UAAqB,QACnC,OAAO,KACN,MAAM,MAAM,KACX,OAAO,KAAK,UAAU,YAAY,OAAO,SAAS,EAAE,CAAC,GACrD,OAAO,OAAO,OAAO,MAAM,GAC3B,OAAO,KAAK,SAAS,KAAK,KAAK,GAC/B,OAAO,IAAI,OAAO,GAClB,OAAO,KAAK,UAAU;CACrB,MAAM,KAAK;CACX,QAAQ,gBAAgB,IAAI;AAC7B,EAAE,GACF,OAAO,aAAa,MAAM,UAAU,KAAK,WAAW,MAAM,MAAM,GAChE,OAAO,QAAQ,SAAS,KAAK,MAAM,GACnC,OAAO,YAAY,SAClB,OAAO,OACN,MAAM,OAAO,MAAM,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC,KACnC,OAAO,SAAS,SAAS,KAAK,KAAK,CACpC,CACD,CACD,CACD,CACD;AAED,MAAM,YACL,SAEA,OAAO,KAAK;CACX,MAAM;CACN,QAAQ;CACR,OAAO,OAAO,WAAW,WAAW,OAAO;EAC1C,OAAO,OAAO,QACb,CACC;GAAE,YAAY,MAAM;GAAW,KAAK,KAAK;EAAG,GAC5C;GAAE,YAAY,MAAM;GAAM,KAAK,KAAK;EAAG,CACxC,GACA,OAAO,WAAW,WAAW,EAAE,YAAY,OAAO;GACjD,MAAM,WAAW,OAAO,MAAM,OAC7B,WAAW,QACX,WAAW,MACZ;GACA,OAAO,MAAM,UAAU,GAAG;EAC3B,CAAC,CACF;EACA,MAAM,WAAW,OAAO,MAAM,OAAO,MAAM,UAAU,MAAM,KAAK;EAEhE,OAAO,SAAS,MAAM,KACrB,OAAO,QACL,UACA,MAAM,SAAS,cACd,MAAM,SAAS,aACf,CAAC,MAAM,KAAK,OAAO,QAClB,MAAM,SAAS,MAAM,SAAS,IAAI,GAAG,CACtC,EACH,GACA,OAAO,OACR;EACA,OAAO,OAAO,WAAW,UACxB,OAAO,KAAK,iBAAiB,KAAK,EAAE,MAAM,CAAC,CAAC,CAC7C;CACD,CAAC;AACF,CAAC;AACF,MAAM,eAAe,SAAS,CAAC,WAAW,WAAW,CAAC;AACtD,MAAM,iBAAiB,SAAS,CAAC,UAAU,aAAa,CAAC;AAEzD,MAAa,QAAQ,UACpB,MAAM,OAAO,cAAc,OAAO,EAAE,SAAS,CAAC,WAAW,WAAW,EAAE,CAAC;AACxE,MAAa,UACZ,OACA,WAAW,qBAEX,MAAM,OACL,gBACA;CAAE,GAAG;CAAO;AAAS,GACrB,EAAE,SAAS,CAAC,UAAU,aAAa,EAAE,CACtC;AAED,MAAa,cACZ,YACA,SACqD;CACrD,IACC,SAAS,kBACR,WAAW,aAAa,SACxB,CAAC,WAAW,aACZ,CAAC,MAAM,SAAS,WAAW,SAAS,aAAa,IAElD,OAAO,OAAO,KACb,2BAA2B,KAAK,EAC/B,QAAQ,8DACT,CAAC,CACF;CACD,IAAI,SAAS,mBAAmB,CAAC,MAAM,SAAS,WAAW,SAAS,QAAQ,GAC3E,OAAO,OAAO,KACb,2BAA2B,KAAK,EAC/B,QAAQ,oDACT,CAAC,CACF;CACD,OAAO,OAAO;AACf;AACA,MAAM,QAAQ,SACb,KAAK,SAAS,SACX,gBACA,KAAK,SAAS,WACb,kBACA;AACL,MAAM,QACL,YACA,aACA,SAEA,OAAO,IACN,CACC,WAAW,WAAW,CAAC,WAAW,YAC/B,OAAO,WACP,gBAAgB,kBACb,GAAG,WAAW,SAAS,MAAM,SAAS,SAAS,eAAe,WAAW,6DACzE,GAAG,WAAW,SAAS,MAAM,SAAS,SAAS,eAAe,WAAW,gBAC7E,IACC,OAAO,MACV,SAAS,YAAY,WAAW,WAAW,gBAAgB,SACxD,OAAO,WAAW,0CAA0C,IAC5D,OAAO,IACX,GACA,EAAE,SAAS,KAAK,CACjB;AAED,MAAa,cAAc,YAAwB,aAClD,aACC,WAAW,aAAa,WAAW,WAAW,aAAa,aACzD,OAAO,KACP,2BAA2B,KAAK,EAC/B,QAAQ,GAAG,WAAW,SAAS,gCAChC,CAAC,CACF,IACC,OAAO;AAEX,MAAa,eAAe,eAAe,UAC1C,OAAO,IAAI,aAAa;CACvB,MAAM,YAAY,OAAO;CACzB,MAAM,cAAc,OAAO;CAC3B,OAAO,WAAW,UAAU,YAAY,YAAY;CACpD,OAAO,WAAW,UAAU,YAAY,YAAY,IAAI;CACxD,OAAO,KAAK,UAAU,YAAY,YAAY,MAAM,MAAM;CAC1D,MAAM,WAAW,OAAO,YAAY;CACpC,OAAO,OAAO,UAAU,QAAQ,QAAQ;AACzC,CAAC;AAEF,MAAa,UAEX,MACA,YACA,aAEA,cAAc;CAcd,QAZC,KAAK,SAAS,WACX,KAAK,aAAa,UAAU,aAAa,IACzC,KAAK,SAAS,SACb,OAAO,MAAM,UAAU,aAAa;EACpC,cACC,OAAO,KAAK,qBAAqB,KAAK,EAAE,QAAQ,UAAU,CAAC,CAAC;EAC7D,QAAQ,KAAK;CACd,CAAC,KACC,WAAW,UACV,OAAO,WAAW,4CAA4C,IAC9D,OAAO,KAAA,CACR,KAAK,OAAO,GAAG,KAAK,QAAQ,CAAC,EAAA,CACnB,KAAK,OAAO,IAAI,OAAO,CAAC;AACzC;AAED,MAAa,wBACZ,gBAG6D,OAAO,MACpE,QAA6B,OAAO,SAEpC,OAAO,KAAK;CACX,MAAM;CACN,QAAQ;EACP;EACA;EACA;EACA,OAAO,SAAS,cAAc;CAC/B;CACA,OAAO,OAAO,WAAW,aAAa;EACrC,MAAM,WAAW,OAAO;EACxB,MAAM,OAAO,OAAO;EACpB,MAAM,aAAa,OAAO;EAC1B,MAAM,YAAY,OAAO,OAAO,cAAc,cAAc;EAC5D,OAAO,QAAQ,SAAS,YAAY,IAAI;EACxC,OAAO,WAAW,SAAS,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,KAClD,OAAO,UAAU,UAChB,oBAAoB,KAAK,EAAE,QAAQ,MAAM,OAAO,CAAC,CAClD,CACD;EACA,OAAO,KAAK,SAAS,YAAY,KAAK,IAAI,GAAG,QAAQ;EACrD,MAAM,UAAU,OAAO,SAAS,KAC/B,KAAK,SAAS,SAAS,OAAO,KAAK,KAAK,GAAG,IAAI,OAAO,KAAK,CAC5D;EACA,MAAM,UAAU,OAAO,OAAO,KAC7B,QACE,MACA,OACC,MACA,SAAS,aACR,cAAc,YACd,WAAW,OAAO,OAAO,CAAC,CAAC,KAC1B,OAAO,YAAY,UAClB,SAAS,WAAW,aAAa,UAC9B,eAAe,KAAK,IACnB,OAAO,OACP,OAAO,UAAU,KAAK,IACvB,gBAAgB,KAAK,CACzB,GACA,OAAO,eAAe,MAAM,QAAQ,CACrC,CACF,CACD,CAAC,CACA,KACA,OAAO,QAAQ,SACd,SAAS,WAAW,aAAa,WACjC,OAAO,OAAO,SAAS,IACpB,SAAS,KAAK,UAAU,MAAM,OAAO,IAAI,IACzC,OAAO,IACX,CACD,CACF;EACA,OAAO,QAAQ,MAAM,KAAK,OAAO,UAAU,MAAM,KAAK,OAAO,CAAC,CAAC;EAC/D,OAAO;CACR,CAAC;AACF,CAAC;AAEF,MAAa,mBAAmB,qBAAqB;AAE9B,YAAY"}
|
|
1
|
+
{"version":3,"file":"assembly.js","names":[],"sources":["../../src/internal/assembly.ts"],"sourcesContent":["import { findSubtree, isSubtreeActive } from \"./forkTree\"\nimport { Peer } from \"./Peer\"\nimport { Graft, Plugin, type Fork } from \"@graftland/graft\"\nimport {\n\tArray,\n\tContext,\n\tDeferred,\n\tEffect,\n\tFiber,\n\tOption,\n\tSchema,\n\tStream,\n} from \"effect\"\nimport {\n\tAuthenticator,\n\tCredentials,\n\ttype AuthenticatorApi,\n\ttype CredentialsApi,\n} from \"../Auth\"\nimport {\n\tConnector,\n\tListener,\n\ttype Accept,\n\ttype Properties,\n\ttype Session,\n} from \"../Transport\"\nimport { AuthenticationFailed } from \"../Errors\"\nimport { Supervisor } from \"./Supervisor\"\nimport { follow } from \"./follow\"\nimport { connectionEnded, closedNormally } from \"./runner/connectionEnded\"\nimport { ServeLifecycle } from \"./ServeLifecycle\"\n\nexport class ListenerConfigError extends Schema.TaggedError<\n\tListenerConfigError,\n\t{ readonly brand: unique symbol }\n>()(\"ListenerConfigError\", { detail: Schema.String }) {\n\toverride get message() {\n\t\treturn this.detail\n\t}\n}\n\nexport class CapabilityContractError extends Schema.TaggedError<\n\tCapabilityContractError,\n\t{ readonly brand: unique symbol }\n>()(\"CapabilityContractError\", { plugin: Schema.String, key: Schema.String }) {\n\toverride get message() {\n\t\treturn `Capability ${this.plugin} became active without providing ${this.key}`\n\t}\n}\nexport class CapabilityCombinationError extends Schema.TaggedError<\n\tCapabilityCombinationError,\n\t{ readonly brand: unique symbol }\n>()(\"CapabilityCombinationError\", { detail: Schema.String }) {\n\toverride get message() {\n\t\treturn this.detail\n\t}\n}\n\nexport class CapabilityFailed extends Schema.TaggedError<\n\tCapabilityFailed,\n\t{ readonly brand: unique symbol }\n>()(\"CapabilityFailed\", {\n\tcause: Schema.Cause(Schema.Unknown, Schema.Unknown),\n}) {}\n\n/** Every failure class assembly raises; host error classification reads this list. */\nexport const errors = [\n\tListenerConfigError,\n\tCapabilityContractError,\n\tCapabilityCombinationError,\n\tCapabilityFailed,\n] as const\n\nconst definition = Schema.declare(Plugin.isPlugin)\n/** Entries resolve capability modules before assembling their private providers. */\nexport const Invocation = Schema.Struct({\n\tplugin: definition,\n\tconfig: Schema.Unknown,\n})\nconst Input = Schema.Struct({\n\ttransport: Invocation,\n\tauth: Invocation,\n\tconsumer: definition,\n\tinput: Schema.optionalKey(Schema.Unknown),\n})\nexport type Input = typeof Input.Type\n\nconst failure = (tree: Fork.ForkTree): Effect.Effect<void, CapabilityFailed> =>\n\ttree.state._tag === \"Failed\"\n\t\t? Effect.fail(CapabilityFailed.make({ cause: tree.state.cause }))\n\t\t: Effect.forEach(tree.children, failure, { discard: true })\n\nconst probe = (name: string, key: Context.Key<unknown, unknown>) =>\n\tPlugin.make({\n\t\tname: \"remote-capability-contract\",\n\t\tinject: [Plugin.optional(key)],\n\t\tapply: Effect.fnUntraced(function* () {\n\t\t\tconst value = yield* Effect.serviceOption(key)\n\t\t\tif (Option.isNone(value))\n\t\t\t\treturn yield* CapabilityContractError.make({\n\t\t\t\t\tplugin: name,\n\t\t\t\t\tkey: key.key,\n\t\t\t\t})\n\t\t}),\n\t})\n\n/** Resolve the key in a fresh consumer after the provider subtree settles.\n * An optional consumer started earlier could still hold a pre-publication snapshot.\n */\nconst watch = (provider: Fork.Fork, key: Context.Key<unknown, unknown>) =>\n\tPlugin.fork(\n\t\tGraft.forks.pipe(\n\t\t\tStream.map((trees) => findSubtree(trees, provider.id)),\n\t\t\tStream.filter(Option.isSome),\n\t\t\tStream.map((tree) => tree.value),\n\t\t\tStream.tap(failure),\n\t\t\tStream.map((tree) => ({\n\t\t\t\tname: tree.name,\n\t\t\t\tactive: isSubtreeActive(tree),\n\t\t\t})),\n\t\t\tStream.changesWith((left, right) => left.active === right.active),\n\t\t\tStream.filter((tree) => tree.active),\n\t\t\tStream.runForEach((tree) =>\n\t\t\t\tEffect.scoped(\n\t\t\t\t\tGraft.plugin(probe(tree.name, key)).pipe(\n\t\t\t\t\t\tEffect.flatMap((fork) => fork.await),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t),\n\t)\n\nconst assembly = (\n\tkeys: readonly [Context.Key<unknown, unknown>, Context.Key<unknown, unknown>],\n) =>\n\tPlugin.make({\n\t\tname: \"remote-assembly\",\n\t\tconfig: Input,\n\t\tapply: Effect.fnUntraced(function* (input) {\n\t\t\tyield* Effect.forEach(\n\t\t\t\t[\n\t\t\t\t\t{ invocation: input.transport, key: keys[0] },\n\t\t\t\t\t{ invocation: input.auth, key: keys[1] },\n\t\t\t\t],\n\t\t\t\tEffect.fnUntraced(function* ({ invocation, key }) {\n\t\t\t\t\tconst provider = yield* Graft.plugin(\n\t\t\t\t\t\tinvocation.plugin,\n\t\t\t\t\t\tinvocation.config,\n\t\t\t\t\t)\n\t\t\t\t\tyield* watch(provider, key)\n\t\t\t\t}),\n\t\t\t)\n\t\t\tconst consumer = yield* Graft.plugin(input.consumer, input.input)\n\t\t\t// Capability publication can leave a transient Pending snapshot; business dependencies may remain Pending.\n\t\t\tyield* consumer.state.pipe(\n\t\t\t\tStream.filter(\n\t\t\t\t\t(state) =>\n\t\t\t\t\t\tstate._tag !== \"Loading\" &&\n\t\t\t\t\t\t(state._tag !== \"Pending\" ||\n\t\t\t\t\t\t\t!Array.some(keys, (key) =>\n\t\t\t\t\t\t\t\tArray.contains(state.missing, key.key),\n\t\t\t\t\t\t\t)),\n\t\t\t\t),\n\t\t\t\tStream.runHead,\n\t\t\t)\n\t\t\tyield* follow(consumer, (cause) =>\n\t\t\t\tEffect.fail(CapabilityFailed.make({ cause })),\n\t\t\t)\n\t\t}),\n\t})\nconst hostAssembly = assembly([Connector, Credentials])\nconst runnerAssembly = assembly([Listener, Authenticator])\n\nexport const host = (input: Input) =>\n\tGraft.plugin(hostAssembly, input, { isolate: [Connector, Credentials] })\nexport const runner = (\n\tinput: Omit<Input, \"consumer\">,\n\tconsumer = listenerConsumer,\n) =>\n\tGraft.plugin(\n\t\trunnerAssembly,\n\t\t{ ...input, consumer },\n\t\t{ isolate: [Listener, Authenticator] },\n\t)\n\nexport const compatible = (\n\tproperties: Properties,\n\tkind: CredentialsApi[\"kind\"],\n): Effect.Effect<void, CapabilityCombinationError> => {\n\tif (\n\t\tkind === \"Certificate\" &&\n\t\t(properties.protocol !== \"wss\" ||\n\t\t\t!properties.encrypted ||\n\t\t\t!Array.contains(properties.carries, \"certificate\"))\n\t)\n\t\treturn Effect.fail(\n\t\t\tCapabilityCombinationError.make({\n\t\t\t\tdetail: \"Mutual TLS requires encrypted wss with certificate evidence\",\n\t\t\t}),\n\t\t)\n\tif (kind === \"Authorization\" && !Array.contains(properties.carries, \"header\"))\n\t\treturn Effect.fail(\n\t\t\tCapabilityCombinationError.make({\n\t\t\t\tdetail: \"This transport cannot carry Authorization headers\",\n\t\t\t}),\n\t\t)\n\treturn Effect.void\n}\nconst kind = (auth: AuthenticatorApi): CredentialsApi[\"kind\"] =>\n\tauth._tag === \"Mtls\"\n\t\t? \"Certificate\"\n\t\t: auth._tag === \"Header\"\n\t\t\t? \"Authorization\"\n\t\t\t: \"None\"\nconst warn = (\n\tproperties: Properties,\n\tcredentials: CredentialsApi[\"kind\"],\n\tside: \"host\" | \"runner\",\n) =>\n\tEffect.all(\n\t\t[\n\t\t\tproperties.network && !properties.encrypted\n\t\t\t\t? Effect.logWarning(\n\t\t\t\t\t\tcredentials === \"Authorization\"\n\t\t\t\t\t\t\t? `${properties.protocol}:// ${side === \"host\" ? \"connection\" : \"listener\"} is unencrypted; credentials are transmitted in plaintext`\n\t\t\t\t\t\t\t: `${properties.protocol}:// ${side === \"host\" ? \"connection\" : \"listener\"} is unencrypted`,\n\t\t\t\t\t)\n\t\t\t\t: Effect.void,\n\t\t\tside === \"runner\" && properties.network && credentials === \"None\"\n\t\t\t\t? Effect.logWarning(\"WebSocket listener has no authentication\")\n\t\t\t\t: Effect.void,\n\t\t],\n\t\t{ discard: true },\n\t)\n\nexport const directAuth = (properties: Properties, explicit: boolean) =>\n\texplicit &&\n\t(properties.protocol === \"stdio\" || properties.protocol === \"command\")\n\t\t? Effect.fail(\n\t\t\t\tCapabilityCombinationError.make({\n\t\t\t\t\tdetail: `${properties.protocol} transports do not accept auth`,\n\t\t\t\t}),\n\t\t\t)\n\t\t: Effect.void\n\nexport const connectWith = Effect.fnUntraced(function* (\n\texplicitAuth: boolean = false,\n) {\n\tconst connector = yield* Connector\n\tconst credentials = yield* Credentials\n\tyield* directAuth(connector.properties, explicitAuth)\n\tyield* compatible(connector.properties, credentials.kind)\n\tyield* warn(connector.properties, credentials.kind, \"host\")\n\tconst prepared = yield* credentials.read\n\treturn yield* connector.connect(prepared)\n})\n\nexport const accept =\n\t(\n\t\tauth: AuthenticatorApi,\n\t\tproperties: Properties,\n\t\tsession: (identity: string) => Session,\n\t): Accept =>\n\t(handshake) => {\n\t\tconst identity =\n\t\t\tauth._tag === \"Header\"\n\t\t\t\t? auth.authenticate(handshake.authorization)\n\t\t\t\t: auth._tag === \"Mtls\"\n\t\t\t\t\t? Option.match(handshake.certificate, {\n\t\t\t\t\t\t\tonNone: () =>\n\t\t\t\t\t\t\t\tEffect.fail(AuthenticationFailed.make({ reason: \"missing\" })),\n\t\t\t\t\t\t\tonSome: auth.authenticate,\n\t\t\t\t\t\t})\n\t\t\t\t\t: (properties.network\n\t\t\t\t\t\t\t? Effect.logWarning(\"WebSocket connection has no authentication\")\n\t\t\t\t\t\t\t: Effect.void\n\t\t\t\t\t\t).pipe(Effect.as(auth.identity))\n\t\treturn identity.pipe(Effect.map(session))\n\t}\n\nexport const makeListenerConsumer = (\n\tprepare: (\n\t\tproperties: Properties,\n\t\tauth: AuthenticatorApi,\n\t) => Effect.Effect<void, CapabilityCombinationError> = () => Effect.void,\n\tready: Effect.Effect<void> = Effect.void,\n) =>\n\tPlugin.make({\n\t\tname: \"remote-listener-consumer\",\n\t\tinject: [\n\t\t\tListener,\n\t\t\tAuthenticator,\n\t\t\tSupervisor,\n\t\t\tPlugin.optional(ServeLifecycle),\n\t\t],\n\t\tapply: Effect.fnUntraced(function* () {\n\t\t\tconst listener = yield* Listener\n\t\t\tconst auth = yield* Authenticator\n\t\t\tconst supervisor = yield* Supervisor\n\t\t\tconst lifecycle = yield* Effect.serviceOption(ServeLifecycle)\n\t\t\tyield* prepare(listener.properties, auth)\n\t\t\tyield* compatible(listener.properties, kind(auth)).pipe(\n\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\tListenerConfigError.make({ detail: error.detail }),\n\t\t\t\t),\n\t\t\t)\n\t\t\tyield* warn(listener.properties, kind(auth), \"runner\")\n\t\t\tconst serving = yield* listener.bind(\n\t\t\t\tauth._tag === \"Mtls\" ? Option.some(auth.tls) : Option.none(),\n\t\t\t)\n\t\t\tconst running = yield* Plugin.fork(\n\t\t\t\tserving\n\t\t\t\t\t.serve(\n\t\t\t\t\t\taccept(\n\t\t\t\t\t\t\tauth,\n\t\t\t\t\t\t\tlistener.properties,\n\t\t\t\t\t\t\t(identity) => (channel) =>\n\t\t\t\t\t\t\t\tsupervisor.accept(channel).pipe(\n\t\t\t\t\t\t\t\t\tEffect.catchCause((cause) =>\n\t\t\t\t\t\t\t\t\t\tlistener.properties.protocol === \"stdio\"\n\t\t\t\t\t\t\t\t\t\t\t? closedNormally(cause)\n\t\t\t\t\t\t\t\t\t\t\t\t? Effect.void\n\t\t\t\t\t\t\t\t\t\t\t\t: Effect.failCause(cause)\n\t\t\t\t\t\t\t\t\t\t\t: connectionEnded(cause),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tEffect.provideService(Peer, identity),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t\t.pipe(\n\t\t\t\t\t\tEffect.onExit((exit) =>\n\t\t\t\t\t\t\tlistener.properties.protocol === \"stdio\" &&\n\t\t\t\t\t\t\tOption.isSome(lifecycle)\n\t\t\t\t\t\t\t\t? Deferred.done(lifecycle.value.ended, exit)\n\t\t\t\t\t\t\t\t: Effect.void,\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t)\n\t\t\tyield* serving.ready.pipe(Effect.raceFirst(Fiber.join(running)))\n\t\t\tyield* ready\n\t\t}),\n\t})\n\nexport const listenerConsumer = makeListenerConsumer()\n\nexport const connect = connectWith()\n"],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ const uriValue = (field) => {
|
|
|
9
9
|
}))) : Effect.succeed(value);
|
|
10
10
|
};
|
|
11
11
|
/** Read exactly one graft URI from Node's plain or JSON-quoted SAN representation. */
|
|
12
|
-
const identityFromSubjectAltName =
|
|
12
|
+
const identityFromSubjectAltName = Effect.fnUntraced(function* (san) {
|
|
13
13
|
const values = yield* Effect.forEach(Array.filter(String.split(san ?? "", ", "), String.startsWith("URI:")), uriValue);
|
|
14
14
|
const uris = Array.filter(values, String.startsWith("graft://"));
|
|
15
15
|
const [uri] = uris;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mtls.js","names":[],"sources":["../../../src/internal/auth/mtls.ts"],"sourcesContent":["import { Array, Cause, Effect, Schema, String } from \"effect\"\nimport { AuthenticationFailed } from \"../../Errors\"\n\n// Node JSON-quotes SAN values containing separators, escaping commas inside the value.\nconst uriValue = (field: string) => {\n\tconst value = String.slice(4)(field)\n\treturn String.startsWith('\"')(value)\n\t\t? Schema.decodeEffect(Schema.fromJsonString(Schema.String))(value).pipe(\n\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\tAuthenticationFailed.make({\n\t\t\t\t\t\treason: \"invalid\",\n\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t)\n\t\t: Effect.succeed(value)\n}\n\n/** Read exactly one graft URI from Node's plain or JSON-quoted SAN representation. */\nexport const identityFromSubjectAltName = (\n\tsan: string | undefined,\n): Effect.
|
|
1
|
+
{"version":3,"file":"mtls.js","names":[],"sources":["../../../src/internal/auth/mtls.ts"],"sourcesContent":["import { Array, Cause, Effect, Schema, String } from \"effect\"\nimport { AuthenticationFailed } from \"../../Errors\"\n\n// Node JSON-quotes SAN values containing separators, escaping commas inside the value.\nconst uriValue = (field: string) => {\n\tconst value = String.slice(4)(field)\n\treturn String.startsWith('\"')(value)\n\t\t? Schema.decodeEffect(Schema.fromJsonString(Schema.String))(value).pipe(\n\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\tAuthenticationFailed.make({\n\t\t\t\t\t\treason: \"invalid\",\n\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t)\n\t\t: Effect.succeed(value)\n}\n\n/** Read exactly one graft URI from Node's plain or JSON-quoted SAN representation. */\nexport const identityFromSubjectAltName = Effect.fnUntraced(function* (\n\tsan: string | undefined,\n): Effect.fn.Return<string, AuthenticationFailed> {\n\tconst values = yield* Effect.forEach(\n\t\tArray.filter(String.split(san ?? \"\", \", \"), String.startsWith(\"URI:\")),\n\t\turiValue,\n\t)\n\tconst uris = Array.filter(values, String.startsWith(\"graft://\"))\n\tconst [uri] = uris\n\treturn yield* uris.length === 1 && uri !== undefined\n\t\t? Effect.succeed(uri)\n\t\t: Effect.fail(\n\t\t\t\tAuthenticationFailed.make({\n\t\t\t\t\treason: \"invalid\",\n\t\t\t\t\tcause: Cause.fail(\n\t\t\t\t\t\t\"The peer certificate must contain exactly one graft SAN URI\",\n\t\t\t\t\t),\n\t\t\t\t}),\n\t\t\t)\n})\n"],"mappings":";;;AAIA,MAAM,YAAY,UAAkB;CACnC,MAAM,QAAQ,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK;CACnC,OAAO,OAAO,WAAW,IAAG,CAAC,CAAC,KAAK,IAChC,OAAO,aAAa,OAAO,eAAe,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KACjE,OAAO,UAAU,UAChB,qBAAqB,KAAK;EACzB,QAAQ;EACR,OAAO,MAAM,KAAK,KAAK;CACxB,CAAC,CACF,CACD,IACC,OAAO,QAAQ,KAAK;AACxB;;AAGA,MAAa,6BAA6B,OAAO,WAAW,WAC3D,KACiD;CACjD,MAAM,SAAS,OAAO,OAAO,QAC5B,MAAM,OAAO,OAAO,MAAM,OAAO,IAAI,IAAI,GAAG,OAAO,WAAW,MAAM,CAAC,GACrE,QACD;CACA,MAAM,OAAO,MAAM,OAAO,QAAQ,OAAO,WAAW,UAAU,CAAC;CAC/D,MAAM,CAAC,OAAO;CACd,OAAO,OAAO,KAAK,WAAW,KAAK,QAAQ,KAAA,IACxC,OAAO,QAAQ,GAAG,IAClB,OAAO,KACP,qBAAqB,KAAK;EACzB,QAAQ;EACR,OAAO,MAAM,KACZ,6DACD;CACD,CAAC,CACF;AACH,CAAC"}
|
package/dist/internal/child.js
CHANGED
|
@@ -6,7 +6,7 @@ import { Array, Cause, Data, Deferred, Effect, Exit, Fiber, Logger, MutableRef,
|
|
|
6
6
|
// src/internal/child.ts
|
|
7
7
|
const ChildEvent = Data.taggedEnum();
|
|
8
8
|
/** Queue data; serialization belongs to the RPC consumer, outside synchronous logger callbacks. */
|
|
9
|
-
const telemetry =
|
|
9
|
+
const telemetry = Effect.fnUntraced(function* (contract) {
|
|
10
10
|
const events = yield* Queue.bounded(2);
|
|
11
11
|
const logs = yield* Queue.dropping(128);
|
|
12
12
|
const dropped = MutableRef.make(0);
|
|
@@ -41,31 +41,32 @@ const telemetry = (contract) => Effect.gen(function* () {
|
|
|
41
41
|
});
|
|
42
42
|
const Lifecycle = Data.taggedEnum();
|
|
43
43
|
const runningOf = (state) => state._tag === "Running" ? Option.some(state.running) : state._tag === "Withdrawing" || state._tag === "Disposing" ? state.running : Option.none();
|
|
44
|
-
const cleanup =
|
|
44
|
+
const cleanup = Effect.fnUntraced(function* (running, retired) {
|
|
45
45
|
const pluginExit = yield* Effect.exit(running.fork.dispose);
|
|
46
46
|
const bridgeExit = yield* Effect.exit(running.bridge.dispose);
|
|
47
47
|
yield* Fiber.join(running.observation);
|
|
48
48
|
const failed = yield* Ref.get(running.observedFailure);
|
|
49
49
|
return Array.reduce([bridgeExit, pluginExit], retired ? failed : Cause.empty, (cause, exit) => Exit.isFailure(exit) ? Cause.combine(cause, Cause.fromReasons(Array.flatMap(exit.cause.reasons, (reason) => reason._tag === "Fail" ? reason.error.cause.reasons : [reason]))) : cause);
|
|
50
50
|
});
|
|
51
|
-
const lifecycle = (contract, peer, identity, telemetry)
|
|
51
|
+
const lifecycle = Effect.fnUntraced(function* (contract, peer, identity, telemetry) {
|
|
52
52
|
const scope = yield* Effect.scope;
|
|
53
53
|
const instanceScope = yield* Scope.fork(scope);
|
|
54
54
|
const releaseExports = yield* Deferred.make();
|
|
55
55
|
const state = yield* SynchronizedRef.make(Lifecycle.Idle());
|
|
56
|
-
const
|
|
56
|
+
const disposing = (current) => Lifecycle.Disposing({ running: runningOf(current) });
|
|
57
|
+
const release = SynchronizedRef.update(state, disposing).pipe(Effect.andThen(Deferred.succeed(releaseExports, void 0)));
|
|
57
58
|
const exportBridge = Graft.plugin(Plugin.make({
|
|
58
59
|
name: `${contract.name}/exports`,
|
|
59
60
|
inject: Array.map(contract.provides, (service) => service.key),
|
|
60
|
-
apply:
|
|
61
|
+
apply: Effect.fnUntraced(function* () {
|
|
61
62
|
for (const service of contract.provides) yield* service.serve(peer).pipe(Effect.tapCause((cause) => Cause.hasInterruptsOnly(cause) ? Effect.void : Queue.offer(telemetry.events, ChildEvent.Failed({ cause }))), Effect.forkScoped);
|
|
62
|
-
yield* Effect.addFinalizer(
|
|
63
|
+
yield* Effect.addFinalizer(Effect.fnUntraced(function* () {
|
|
63
64
|
if (yield* SynchronizedRef.modify(state, (current) => current._tag === "Disposing" ? [false, current] : [true, Lifecycle.Withdrawing({ running: runningOf(current) })])) yield* Queue.offer(telemetry.events, ChildEvent.Withdrawing());
|
|
64
65
|
yield* Deferred.await(releaseExports);
|
|
65
66
|
}));
|
|
66
67
|
})
|
|
67
68
|
})).pipe(Scope.provide(instanceScope));
|
|
68
|
-
const start =
|
|
69
|
+
const start = Effect.fnUntraced(function* (input) {
|
|
69
70
|
for (const service of contract.inject) yield* service.publish(peer).pipe(Scope.provide(scope), Effect.mapError((error) => ActivationFailed.make({
|
|
70
71
|
detail: "Publishing imported services failed",
|
|
71
72
|
cause: Cause.fail(error)
|
|
@@ -86,7 +87,7 @@ const lifecycle = (contract, peer, identity, telemetry) => Effect.gen(function*
|
|
|
86
87
|
observation
|
|
87
88
|
};
|
|
88
89
|
});
|
|
89
|
-
const awaitActive =
|
|
90
|
+
const awaitActive = Effect.fnUntraced(function* (running) {
|
|
90
91
|
const first = yield* running.fork.state.pipe(Stream.filter((state) => state._tag !== "Loading"), Stream.runHead);
|
|
91
92
|
if (Option.isNone(first)) return yield* ActivationFailed.make({ detail: "The remote fork disappeared during startup" });
|
|
92
93
|
if (first.value._tag === "Failed") return yield* Effect.fail(contract.normalizeCause(first.value.cause));
|
|
@@ -99,17 +100,19 @@ const lifecycle = (contract, peer, identity, telemetry) => Effect.gen(function*
|
|
|
99
100
|
});
|
|
100
101
|
if (Option.isNone(exported) || exported.value._tag !== "Active") return yield* ActivationFailed.make({ detail: "The remote export bridge stopped during startup" });
|
|
101
102
|
});
|
|
102
|
-
const load = (input) => Effect.gen(function* () {
|
|
103
|
-
yield* SynchronizedRef.updateEffect(state, (current) => current._tag === "Idle" ? Effect.succeed(Lifecycle.Loading()) : Effect.fail(AlreadyLoaded.make({})));
|
|
104
|
-
const running = yield* start(input);
|
|
105
|
-
yield* SynchronizedRef.update(state, (current) => current._tag === "Withdrawing" ? Lifecycle.Withdrawing({ running: Option.some(running) }) : current._tag === "Disposing" ? Lifecycle.Disposing({ running: Option.some(running) }) : Lifecycle.Running({ running }));
|
|
106
|
-
yield* awaitActive(running);
|
|
107
|
-
}).pipe(Effect.mapError((error) => Cause.isCause(error) ? error : contract.normalizeCause(Cause.fail(error))));
|
|
108
103
|
return {
|
|
109
|
-
load
|
|
104
|
+
load: Effect.fnUntraced(function* (input) {
|
|
105
|
+
yield* SynchronizedRef.updateEffect(state, (current) => current._tag === "Idle" ? Effect.succeed(Lifecycle.Loading()) : Effect.fail(AlreadyLoaded.make({})));
|
|
106
|
+
const running = yield* start(input);
|
|
107
|
+
if (yield* SynchronizedRef.modify(state, (current) => current._tag === "Withdrawing" ? [false, Lifecycle.Withdrawing({ running: Option.some(running) })] : current._tag === "Disposing" ? [true, Lifecycle.Disposing({ running: Option.some(running) })] : [false, Lifecycle.Running({ running })])) {
|
|
108
|
+
const cause = yield* cleanup(running, false);
|
|
109
|
+
return yield* Effect.fail(Cause.combine(Cause.fail(ActivationFailed.make({ detail: "The execution was disposed during load" })), cause));
|
|
110
|
+
}
|
|
111
|
+
yield* awaitActive(running);
|
|
112
|
+
}, Effect.mapError((error) => contract.normalizeCause(Cause.isCause(error) ? error : Cause.fail(error)))),
|
|
110
113
|
dispose: Effect.gen(function* () {
|
|
111
|
-
const previous = yield* SynchronizedRef.
|
|
112
|
-
yield*
|
|
114
|
+
const previous = yield* SynchronizedRef.getAndUpdate(state, disposing);
|
|
115
|
+
yield* Deferred.succeed(releaseExports, void 0);
|
|
113
116
|
const current = runningOf(previous);
|
|
114
117
|
const retired = previous._tag === "Withdrawing";
|
|
115
118
|
const cause = Option.isSome(current) ? yield* cleanup(current.value, retired) : Cause.empty;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"child.js","names":[],"sources":["../../src/internal/child.ts"],"sourcesContent":["import { loadModule } from \"./loadModule\"\nimport { AlreadyLoaded, ActivationFailed } from \"./childErrors\"\nimport { Graft, Plugin, type Fork } from \"@graftland/graft\"\nimport {\n\tArray,\n\tCause,\n\tData,\n\tDeferred,\n\tEffect,\n\tExit,\n\tFiber,\n\tLogger,\n\tMutableRef,\n\tOption,\n\tQueue,\n\tRef,\n\tReferences,\n\tScope,\n\tStream,\n\tSynchronizedRef,\n} from \"effect\"\nimport type { Schema } from \"effect\"\nimport { type RunnerContract } from \"./contract\"\nimport { Instance, type Identity } from \"../Instance\"\nimport type * as Port from \"./port\"\nimport type { Event, Log, LogEvent } from \"./control\"\n\ntype Peer = Port.Port\ntype ChildEvent = Data.TaggedEnum<{\n\tFailed: { readonly cause: Cause.Cause<unknown> }\n\tWithdrawing: {}\n\tStopped: {}\n}>\nconst ChildEvent = Data.taggedEnum<ChildEvent>()\ntype LogEntry = Omit<typeof Log.Type, \"cause\"> & {\n\treadonly cause: Cause.Cause<unknown>\n}\n\n/** Queue data; serialization belongs to the RPC consumer, outside synchronous logger callbacks. */\nexport const telemetry = (contract: RunnerContract) =>\n\tEffect.gen(function* () {\n\t\tconst events = yield* Queue.bounded<ChildEvent>(2)\n\t\tconst logs = yield* Queue.dropping<LogEntry, Cause.Done>(128)\n\t\tconst dropped = MutableRef.make(0)\n\t\tconst encode = (cause: Cause.Cause<unknown>) =>\n\t\t\tcontract.encodeCause(cause).pipe(Effect.orDie)\n\t\tconst logger = Logger.make((entry) => {\n\t\t\t// Logger callbacks are synchronous; a dropping offer and loss counter cannot suspend.\n\t\t\tconst accepted = Queue.offerUnsafe(logs, {\n\t\t\t\tlevel: entry.logLevel,\n\t\t\t\tmessage: entry.message,\n\t\t\t\tcause: entry.cause,\n\t\t\t\tannotations: entry.fiber.getRef(References.CurrentLogAnnotations),\n\t\t\t})\n\t\t\tif (!accepted) MutableRef.increment(dropped)\n\t\t})\n\t\treturn {\n\t\t\tevents,\n\t\t\tlogs,\n\t\t\tlogger,\n\t\t\teventStream: Stream.fromQueue(events).pipe(\n\t\t\t\tStream.mapEffect((event): Effect.Effect<typeof Event.Type> =>\n\t\t\t\t\tevent._tag === \"Failed\"\n\t\t\t\t\t\t? encode(event.cause).pipe(\n\t\t\t\t\t\t\t\tEffect.map(\n\t\t\t\t\t\t\t\t\t(cause) =>\n\t\t\t\t\t\t\t\t\t\t({\n\t\t\t\t\t\t\t\t\t\t\t_tag: \"Failed\",\n\t\t\t\t\t\t\t\t\t\t\tcause,\n\t\t\t\t\t\t\t\t\t\t}) satisfies typeof Event.Type,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: Effect.succeed(event),\n\t\t\t\t),\n\t\t\t),\n\t\t\tlogStream: Stream.fromQueue(logs).pipe(\n\t\t\t\tStream.mapEffect((entry) =>\n\t\t\t\t\tencode(entry.cause).pipe(\n\t\t\t\t\t\tEffect.map((cause): typeof LogEvent.Type => ({\n\t\t\t\t\t\t\t_tag: \"Log\",\n\t\t\t\t\t\t\tentry: { ...entry, cause },\n\t\t\t\t\t\t\tdropped: MutableRef.get(dropped),\n\t\t\t\t\t\t})),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\tStream.concat(\n\t\t\t\t\tStream.sync((): typeof LogEvent.Type => ({\n\t\t\t\t\t\t_tag: \"LogsEnded\",\n\t\t\t\t\t\tdropped: MutableRef.get(dropped),\n\t\t\t\t\t})),\n\t\t\t\t),\n\t\t\t),\n\t\t}\n\t})\ntype Telemetry = Effect.Success<ReturnType<typeof telemetry>>\ninterface Running {\n\treadonly fork: Pick<Fork.Fork<never, unknown>, \"dispose\" | \"state\">\n\treadonly bridge: Pick<Fork.Fork<never, never>, \"dispose\" | \"state\">\n\treadonly observation: Fiber.Fiber<void>\n\treadonly observedFailure: Ref.Ref<Cause.Cause<unknown>>\n}\ntype Lifecycle = Data.TaggedEnum<{\n\tIdle: {}\n\tLoading: {}\n\tRunning: { readonly running: Running }\n\tWithdrawing: { readonly running: Option.Option<Running> }\n\tDisposing: { readonly running: Option.Option<Running> }\n}>\nconst Lifecycle = Data.taggedEnum<Lifecycle>()\nconst runningOf = (state: Lifecycle): Option.Option<Running> =>\n\tstate._tag === \"Running\"\n\t\t? Option.some(state.running)\n\t\t: state._tag === \"Withdrawing\" || state._tag === \"Disposing\"\n\t\t\t? state.running\n\t\t\t: Option.none()\n\nconst cleanup = (running: Running, retired: boolean) =>\n\tEffect.gen(function* () {\n\t\tconst pluginExit = yield* Effect.exit(running.fork.dispose)\n\t\tconst bridgeExit = yield* Effect.exit(running.bridge.dispose)\n\t\tyield* Fiber.join(running.observation)\n\t\tconst failed = yield* Ref.get(running.observedFailure)\n\t\treturn Array.reduce(\n\t\t\t[bridgeExit, pluginExit],\n\t\t\tretired ? failed : Cause.empty,\n\t\t\t(cause, exit) =>\n\t\t\t\tExit.isFailure(exit)\n\t\t\t\t\t? Cause.combine(\n\t\t\t\t\t\t\tcause,\n\t\t\t\t\t\t\tCause.fromReasons(\n\t\t\t\t\t\t\t\tArray.flatMap(exit.cause.reasons, (reason) =>\n\t\t\t\t\t\t\t\t\treason._tag === \"Fail\"\n\t\t\t\t\t\t\t\t\t\t? reason.error.cause.reasons\n\t\t\t\t\t\t\t\t\t\t: [reason],\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t: cause,\n\t\t)\n\t})\n\nexport const lifecycle = (\n\tcontract: RunnerContract,\n\tpeer: Peer,\n\tidentity: typeof Identity.Type,\n\ttelemetry: Telemetry,\n) =>\n\tEffect.gen(function* () {\n\t\tconst scope = yield* Effect.scope\n\t\tconst instanceScope = yield* Scope.fork(scope)\n\t\tconst releaseExports = yield* Deferred.make<void>()\n\t\tconst state = yield* SynchronizedRef.make<Lifecycle>(Lifecycle.Idle())\n\t\t// This gate represents host consumers draining, not a second lifecycle state.\n\t\tconst release = SynchronizedRef.update(state, (current) =>\n\t\t\tLifecycle.Disposing({ running: runningOf(current) }),\n\t\t).pipe(Effect.andThen(Deferred.succeed(releaseExports, undefined)))\n\n\t\tconst exportBridge = Graft.plugin(\n\t\t\tPlugin.make({\n\t\t\t\tname: `${contract.name}/exports`,\n\t\t\t\tinject: Array.map(contract.provides, (service) => service.key),\n\t\t\t\tapply: () =>\n\t\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t\tfor (const service of contract.provides)\n\t\t\t\t\t\t\tyield* service.serve(peer).pipe(\n\t\t\t\t\t\t\t\tEffect.tapCause((cause) =>\n\t\t\t\t\t\t\t\t\tCause.hasInterruptsOnly(cause)\n\t\t\t\t\t\t\t\t\t\t? Effect.void\n\t\t\t\t\t\t\t\t\t\t: Queue.offer(\n\t\t\t\t\t\t\t\t\t\t\t\ttelemetry.events,\n\t\t\t\t\t\t\t\t\t\t\t\tChildEvent.Failed({ cause }),\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\tEffect.forkScoped,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\tyield* Effect.addFinalizer(() =>\n\t\t\t\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t\t\t\tconst withdrawing = yield* SynchronizedRef.modify(\n\t\t\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\t\t\t(current) =>\n\t\t\t\t\t\t\t\t\t\tcurrent._tag === \"Disposing\"\n\t\t\t\t\t\t\t\t\t\t\t? [false, current]\n\t\t\t\t\t\t\t\t\t\t\t: [\n\t\t\t\t\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t\t\t\t\t\tLifecycle.Withdrawing({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trunning: runningOf(current),\n\t\t\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tif (withdrawing)\n\t\t\t\t\t\t\t\t\tyield* Queue.offer(telemetry.events, ChildEvent.Withdrawing())\n\t\t\t\t\t\t\t\tyield* Deferred.await(releaseExports)\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\t}),\n\t\t\t}),\n\t\t).pipe(Scope.provide(instanceScope))\n\n\t\tconst start = (input: Schema.Json) =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\t// Imported clients outlive Load and remain available during plugin cleanup.\n\t\t\t\tfor (const service of contract.inject)\n\t\t\t\t\tyield* service.publish(peer).pipe(\n\t\t\t\t\t\tScope.provide(scope),\n\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\tActivationFailed.make({\n\t\t\t\t\t\t\t\tdetail: \"Publishing imported services failed\",\n\t\t\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\tconst module = yield* loadModule(contract.module)\n\t\t\t\tconst plugin = Plugin.fromModule(module)\n\t\t\t\tif (Option.isNone(plugin))\n\t\t\t\t\treturn yield* ActivationFailed.make({\n\t\t\t\t\t\tdetail: \"The implementation module exports no plugin\",\n\t\t\t\t\t})\n\t\t\t\tconst fork = yield* Graft.plugin(\n\t\t\t\t\t{ ...plugin.value, retry: undefined },\n\t\t\t\t\tinput,\n\t\t\t\t).pipe(\n\t\t\t\t\tEffect.provideService(Instance, identity),\n\t\t\t\t\tScope.provide(instanceScope),\n\t\t\t\t)\n\t\t\t\tconst observedFailure = yield* Ref.make<Cause.Cause<unknown>>(\n\t\t\t\t\tCause.empty,\n\t\t\t\t)\n\t\t\t\tconst observation = yield* fork.state.pipe(\n\t\t\t\t\tStream.runForEach((state) =>\n\t\t\t\t\t\tstate._tag === \"Failed\"\n\t\t\t\t\t\t\t? Ref.set(observedFailure, state.cause)\n\t\t\t\t\t\t\t: Effect.void,\n\t\t\t\t\t),\n\t\t\t\t\tEffect.forkIn(instanceScope),\n\t\t\t\t)\n\t\t\t\tconst bridge = yield* exportBridge\n\t\t\t\treturn { fork, bridge, observedFailure, observation } satisfies Running\n\t\t\t})\n\t\tconst awaitActive = (running: Running) =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst first = yield* running.fork.state.pipe(\n\t\t\t\t\tStream.filter((state) => state._tag !== \"Loading\"),\n\t\t\t\t\tStream.runHead,\n\t\t\t\t)\n\t\t\t\tif (Option.isNone(first))\n\t\t\t\t\treturn yield* ActivationFailed.make({\n\t\t\t\t\t\tdetail: \"The remote fork disappeared during startup\",\n\t\t\t\t\t})\n\t\t\t\tif (first.value._tag === \"Failed\")\n\t\t\t\t\treturn yield* Effect.fail(contract.normalizeCause(first.value.cause))\n\t\t\t\tif (first.value._tag !== \"Active\")\n\t\t\t\t\treturn yield* ActivationFailed.make({\n\t\t\t\t\t\tdetail:\n\t\t\t\t\t\t\t\"The remote plugin did not become active; check its declared dependencies\",\n\t\t\t\t\t})\n\t\t\t\tyield* running.fork.state.pipe(\n\t\t\t\t\tStream.runForEach((state) =>\n\t\t\t\t\t\tstate._tag === \"Failed\"\n\t\t\t\t\t\t\t? Queue.offer(\n\t\t\t\t\t\t\t\t\ttelemetry.events,\n\t\t\t\t\t\t\t\t\tChildEvent.Failed({ cause: state.cause }),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: Effect.void,\n\t\t\t\t\t),\n\t\t\t\t\tEffect.forkIn(instanceScope),\n\t\t\t\t)\n\t\t\t\tconst exported = yield* running.bridge.state.pipe(\n\t\t\t\t\tStream.filter(\n\t\t\t\t\t\t(state) =>\n\t\t\t\t\t\t\tstate._tag === \"Active\" ||\n\t\t\t\t\t\t\tstate._tag === \"Failed\" ||\n\t\t\t\t\t\t\tstate._tag === \"Disposed\",\n\t\t\t\t\t),\n\t\t\t\t\tStream.runHead,\n\t\t\t\t)\n\t\t\t\tif (Option.isSome(exported) && exported.value._tag === \"Failed\")\n\t\t\t\t\treturn yield* ActivationFailed.make({\n\t\t\t\t\t\tdetail: \"The remote export bridge failed during startup\",\n\t\t\t\t\t\tcause: exported.value.cause,\n\t\t\t\t\t})\n\t\t\t\tif (Option.isNone(exported) || exported.value._tag !== \"Active\")\n\t\t\t\t\treturn yield* ActivationFailed.make({\n\t\t\t\t\t\tdetail: \"The remote export bridge stopped during startup\",\n\t\t\t\t\t})\n\t\t\t})\n\t\tconst load = (input: Schema.Json) =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tyield* SynchronizedRef.updateEffect(state, (current) =>\n\t\t\t\t\tcurrent._tag === \"Idle\"\n\t\t\t\t\t\t? Effect.succeed(Lifecycle.Loading())\n\t\t\t\t\t\t: Effect.fail(AlreadyLoaded.make({})),\n\t\t\t\t)\n\t\t\t\tconst running = yield* start(input)\n\t\t\t\tyield* SynchronizedRef.update(state, (current) =>\n\t\t\t\t\tcurrent._tag === \"Withdrawing\"\n\t\t\t\t\t\t? Lifecycle.Withdrawing({ running: Option.some(running) })\n\t\t\t\t\t\t: current._tag === \"Disposing\"\n\t\t\t\t\t\t\t? Lifecycle.Disposing({ running: Option.some(running) })\n\t\t\t\t\t\t\t: Lifecycle.Running({ running }),\n\t\t\t\t)\n\t\t\t\tyield* awaitActive(running)\n\t\t\t}).pipe(\n\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\tCause.isCause(error)\n\t\t\t\t\t\t? error\n\t\t\t\t\t\t: contract.normalizeCause(Cause.fail(error)),\n\t\t\t\t),\n\t\t\t)\n\t\tconst dispose = Effect.gen(function* () {\n\t\t\tconst previous = yield* SynchronizedRef.get(state)\n\t\t\tyield* release\n\t\t\tconst current = runningOf(previous)\n\t\t\tconst retired = previous._tag === \"Withdrawing\"\n\t\t\tconst cause = Option.isSome(current)\n\t\t\t\t? yield* cleanup(current.value, retired)\n\t\t\t\t: Cause.empty\n\t\t\tyield* Queue.offer(telemetry.events, ChildEvent.Stopped())\n\t\t\tyield* Queue.end(telemetry.logs)\n\t\t\tif (cause.reasons.length > 0)\n\t\t\t\treturn yield* Effect.fail(contract.normalizeCause(cause))\n\t\t})\n\t\treturn { load, dispose, release }\n\t})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"child.js","names":[],"sources":["../../src/internal/child.ts"],"sourcesContent":["import { loadModule } from \"./loadModule\"\nimport { AlreadyLoaded, ActivationFailed } from \"./childErrors\"\nimport { Graft, Plugin, type Fork } from \"@graftland/graft\"\nimport {\n\tArray,\n\tCause,\n\tData,\n\tDeferred,\n\tEffect,\n\tExit,\n\tFiber,\n\tLogger,\n\tMutableRef,\n\tOption,\n\tQueue,\n\tRef,\n\tReferences,\n\tScope,\n\tStream,\n\tSynchronizedRef,\n} from \"effect\"\nimport type { Schema } from \"effect\"\nimport { type RunnerContract } from \"./contract\"\nimport { Instance, type Identity } from \"../Instance\"\nimport type * as Port from \"./port\"\nimport type { Event, Log, LogEvent } from \"./control\"\n\ntype Peer = Port.Port\ntype ChildEvent = Data.TaggedEnum<{\n\tFailed: { readonly cause: Cause.Cause<unknown> }\n\tWithdrawing: {}\n\tStopped: {}\n}>\nconst ChildEvent = Data.taggedEnum<ChildEvent>()\ntype LogEntry = Omit<typeof Log.Type, \"cause\"> & {\n\treadonly cause: Cause.Cause<unknown>\n}\n\n/** Queue data; serialization belongs to the RPC consumer, outside synchronous logger callbacks. */\nexport const telemetry = Effect.fnUntraced(function* (\n\tcontract: RunnerContract,\n) {\n\tconst events = yield* Queue.bounded<ChildEvent>(2)\n\tconst logs = yield* Queue.dropping<LogEntry, Cause.Done>(128)\n\tconst dropped = MutableRef.make(0)\n\tconst encode = (cause: Cause.Cause<unknown>) =>\n\t\tcontract.encodeCause(cause).pipe(Effect.orDie)\n\tconst logger = Logger.make((entry) => {\n\t\t// Logger callbacks are synchronous; a dropping offer and loss counter cannot suspend.\n\t\tconst accepted = Queue.offerUnsafe(logs, {\n\t\t\tlevel: entry.logLevel,\n\t\t\tmessage: entry.message,\n\t\t\tcause: entry.cause,\n\t\t\tannotations: entry.fiber.getRef(References.CurrentLogAnnotations),\n\t\t})\n\t\tif (!accepted) MutableRef.increment(dropped)\n\t})\n\treturn {\n\t\tevents,\n\t\tlogs,\n\t\tlogger,\n\t\teventStream: Stream.fromQueue(events).pipe(\n\t\t\tStream.mapEffect((event): Effect.Effect<typeof Event.Type> =>\n\t\t\t\tevent._tag === \"Failed\"\n\t\t\t\t\t? encode(event.cause).pipe(\n\t\t\t\t\t\t\tEffect.map(\n\t\t\t\t\t\t\t\t(cause) =>\n\t\t\t\t\t\t\t\t\t({\n\t\t\t\t\t\t\t\t\t\t_tag: \"Failed\",\n\t\t\t\t\t\t\t\t\t\tcause,\n\t\t\t\t\t\t\t\t\t}) satisfies typeof Event.Type,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t: Effect.succeed(event),\n\t\t\t),\n\t\t),\n\t\tlogStream: Stream.fromQueue(logs).pipe(\n\t\t\tStream.mapEffect((entry) =>\n\t\t\t\tencode(entry.cause).pipe(\n\t\t\t\t\tEffect.map((cause): typeof LogEvent.Type => ({\n\t\t\t\t\t\t_tag: \"Log\",\n\t\t\t\t\t\tentry: { ...entry, cause },\n\t\t\t\t\t\tdropped: MutableRef.get(dropped),\n\t\t\t\t\t})),\n\t\t\t\t),\n\t\t\t),\n\t\t\tStream.concat(\n\t\t\t\tStream.sync((): typeof LogEvent.Type => ({\n\t\t\t\t\t_tag: \"LogsEnded\",\n\t\t\t\t\tdropped: MutableRef.get(dropped),\n\t\t\t\t})),\n\t\t\t),\n\t\t),\n\t}\n})\ntype Telemetry = Effect.Success<ReturnType<typeof telemetry>>\ninterface Running {\n\treadonly fork: Pick<Fork.Fork<never, unknown>, \"dispose\" | \"state\">\n\treadonly bridge: Pick<Fork.Fork<never, never>, \"dispose\" | \"state\">\n\treadonly observation: Fiber.Fiber<void>\n\treadonly observedFailure: Ref.Ref<Cause.Cause<unknown>>\n}\ntype Lifecycle = Data.TaggedEnum<{\n\tIdle: {}\n\tLoading: {}\n\tRunning: { readonly running: Running }\n\tWithdrawing: { readonly running: Option.Option<Running> }\n\tDisposing: { readonly running: Option.Option<Running> }\n}>\nconst Lifecycle = Data.taggedEnum<Lifecycle>()\nconst runningOf = (state: Lifecycle): Option.Option<Running> =>\n\tstate._tag === \"Running\"\n\t\t? Option.some(state.running)\n\t\t: state._tag === \"Withdrawing\" || state._tag === \"Disposing\"\n\t\t\t? state.running\n\t\t\t: Option.none()\n\nconst cleanup = Effect.fnUntraced(function* (\n\trunning: Running,\n\tretired: boolean,\n) {\n\tconst pluginExit = yield* Effect.exit(running.fork.dispose)\n\tconst bridgeExit = yield* Effect.exit(running.bridge.dispose)\n\tyield* Fiber.join(running.observation)\n\tconst failed = yield* Ref.get(running.observedFailure)\n\treturn Array.reduce(\n\t\t[bridgeExit, pluginExit],\n\t\tretired ? failed : Cause.empty,\n\t\t(cause, exit) =>\n\t\t\tExit.isFailure(exit)\n\t\t\t\t? Cause.combine(\n\t\t\t\t\t\tcause,\n\t\t\t\t\t\tCause.fromReasons(\n\t\t\t\t\t\t\tArray.flatMap(exit.cause.reasons, (reason) =>\n\t\t\t\t\t\t\t\treason._tag === \"Fail\" ? reason.error.cause.reasons : [reason],\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t: cause,\n\t)\n})\n\nexport const lifecycle = Effect.fnUntraced(function* (\n\tcontract: RunnerContract,\n\tpeer: Peer,\n\tidentity: typeof Identity.Type,\n\ttelemetry: Telemetry,\n) {\n\tconst scope = yield* Effect.scope\n\tconst instanceScope = yield* Scope.fork(scope)\n\tconst releaseExports = yield* Deferred.make<void>()\n\tconst state = yield* SynchronizedRef.make<Lifecycle>(Lifecycle.Idle())\n\t// This gate represents host consumers draining, not a second lifecycle state.\n\tconst disposing = (current: Lifecycle) =>\n\t\tLifecycle.Disposing({ running: runningOf(current) })\n\tconst release = SynchronizedRef.update(state, disposing).pipe(\n\t\tEffect.andThen(Deferred.succeed(releaseExports, undefined)),\n\t)\n\n\tconst exportBridge = Graft.plugin(\n\t\tPlugin.make({\n\t\t\tname: `${contract.name}/exports`,\n\t\t\tinject: Array.map(contract.provides, (service) => service.key),\n\t\t\tapply: Effect.fnUntraced(function* () {\n\t\t\t\tfor (const service of contract.provides)\n\t\t\t\t\tyield* service.serve(peer).pipe(\n\t\t\t\t\t\tEffect.tapCause((cause) =>\n\t\t\t\t\t\t\tCause.hasInterruptsOnly(cause)\n\t\t\t\t\t\t\t\t? Effect.void\n\t\t\t\t\t\t\t\t: Queue.offer(telemetry.events, ChildEvent.Failed({ cause })),\n\t\t\t\t\t\t),\n\t\t\t\t\t\tEffect.forkScoped,\n\t\t\t\t\t)\n\t\t\t\tyield* Effect.addFinalizer(\n\t\t\t\t\tEffect.fnUntraced(function* () {\n\t\t\t\t\t\tconst withdrawing = yield* SynchronizedRef.modify(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\t(current) =>\n\t\t\t\t\t\t\t\tcurrent._tag === \"Disposing\"\n\t\t\t\t\t\t\t\t\t? [false, current]\n\t\t\t\t\t\t\t\t\t: [\n\t\t\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t\t\t\tLifecycle.Withdrawing({\n\t\t\t\t\t\t\t\t\t\t\t\trunning: runningOf(current),\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t)\n\t\t\t\t\t\tif (withdrawing)\n\t\t\t\t\t\t\tyield* Queue.offer(telemetry.events, ChildEvent.Withdrawing())\n\t\t\t\t\t\tyield* Deferred.await(releaseExports)\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}),\n\t\t}),\n\t).pipe(Scope.provide(instanceScope))\n\n\tconst start = Effect.fnUntraced(function* (input: Schema.Json) {\n\t\t// Imported clients outlive Load and remain available during plugin cleanup.\n\t\tfor (const service of contract.inject)\n\t\t\tyield* service.publish(peer).pipe(\n\t\t\t\tScope.provide(scope),\n\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\tActivationFailed.make({\n\t\t\t\t\t\tdetail: \"Publishing imported services failed\",\n\t\t\t\t\t\tcause: Cause.fail(error),\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t)\n\t\tconst module = yield* loadModule(contract.module)\n\t\tconst plugin = Plugin.fromModule(module)\n\t\tif (Option.isNone(plugin))\n\t\t\treturn yield* ActivationFailed.make({\n\t\t\t\tdetail: \"The implementation module exports no plugin\",\n\t\t\t})\n\t\tconst fork = yield* Graft.plugin(\n\t\t\t{ ...plugin.value, retry: undefined },\n\t\t\tinput,\n\t\t).pipe(\n\t\t\tEffect.provideService(Instance, identity),\n\t\t\tScope.provide(instanceScope),\n\t\t)\n\t\tconst observedFailure = yield* Ref.make<Cause.Cause<unknown>>(Cause.empty)\n\t\tconst observation = yield* fork.state.pipe(\n\t\t\tStream.runForEach((state) =>\n\t\t\t\tstate._tag === \"Failed\"\n\t\t\t\t\t? Ref.set(observedFailure, state.cause)\n\t\t\t\t\t: Effect.void,\n\t\t\t),\n\t\t\tEffect.forkIn(instanceScope),\n\t\t)\n\t\tconst bridge = yield* exportBridge\n\t\treturn { fork, bridge, observedFailure, observation } satisfies Running\n\t})\n\tconst awaitActive = Effect.fnUntraced(function* (running: Running) {\n\t\tconst first = yield* running.fork.state.pipe(\n\t\t\tStream.filter((state) => state._tag !== \"Loading\"),\n\t\t\tStream.runHead,\n\t\t)\n\t\tif (Option.isNone(first))\n\t\t\treturn yield* ActivationFailed.make({\n\t\t\t\tdetail: \"The remote fork disappeared during startup\",\n\t\t\t})\n\t\tif (first.value._tag === \"Failed\")\n\t\t\treturn yield* Effect.fail(contract.normalizeCause(first.value.cause))\n\t\tif (first.value._tag !== \"Active\")\n\t\t\treturn yield* ActivationFailed.make({\n\t\t\t\tdetail:\n\t\t\t\t\t\"The remote plugin did not become active; check its declared dependencies\",\n\t\t\t})\n\t\tyield* running.fork.state.pipe(\n\t\t\tStream.runForEach((state) =>\n\t\t\t\tstate._tag === \"Failed\"\n\t\t\t\t\t? Queue.offer(\n\t\t\t\t\t\t\ttelemetry.events,\n\t\t\t\t\t\t\tChildEvent.Failed({ cause: state.cause }),\n\t\t\t\t\t\t)\n\t\t\t\t\t: Effect.void,\n\t\t\t),\n\t\t\tEffect.forkIn(instanceScope),\n\t\t)\n\t\tconst exported = yield* running.bridge.state.pipe(\n\t\t\tStream.filter(\n\t\t\t\t(state) =>\n\t\t\t\t\tstate._tag === \"Active\" ||\n\t\t\t\t\tstate._tag === \"Failed\" ||\n\t\t\t\t\tstate._tag === \"Disposed\",\n\t\t\t),\n\t\t\tStream.runHead,\n\t\t)\n\t\tif (Option.isSome(exported) && exported.value._tag === \"Failed\")\n\t\t\treturn yield* ActivationFailed.make({\n\t\t\t\tdetail: \"The remote export bridge failed during startup\",\n\t\t\t\tcause: exported.value.cause,\n\t\t\t})\n\t\tif (Option.isNone(exported) || exported.value._tag !== \"Active\")\n\t\t\treturn yield* ActivationFailed.make({\n\t\t\t\tdetail: \"The remote export bridge stopped during startup\",\n\t\t\t})\n\t})\n\tconst load = Effect.fnUntraced(\n\t\tfunction* (input: Schema.Json) {\n\t\t\tyield* SynchronizedRef.updateEffect(state, (current) =>\n\t\t\t\tcurrent._tag === \"Idle\"\n\t\t\t\t\t? Effect.succeed(Lifecycle.Loading())\n\t\t\t\t\t: Effect.fail(AlreadyLoaded.make({})),\n\t\t\t)\n\t\t\tconst running = yield* start(input)\n\t\t\tconst disposed = yield* SynchronizedRef.modify(\n\t\t\t\tstate,\n\t\t\t\t(current): readonly [boolean, Lifecycle] =>\n\t\t\t\t\tcurrent._tag === \"Withdrawing\"\n\t\t\t\t\t\t? [false, Lifecycle.Withdrawing({ running: Option.some(running) })]\n\t\t\t\t\t\t: current._tag === \"Disposing\"\n\t\t\t\t\t\t\t? [true, Lifecycle.Disposing({ running: Option.some(running) })]\n\t\t\t\t\t\t\t: [false, Lifecycle.Running({ running })],\n\t\t\t)\n\t\t\t// Dispose saw Loading and found nothing to stop; this load owns the cleanup.\n\t\t\tif (disposed) {\n\t\t\t\tconst cause = yield* cleanup(running, false)\n\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\tCause.combine(\n\t\t\t\t\t\tCause.fail(\n\t\t\t\t\t\t\tActivationFailed.make({\n\t\t\t\t\t\t\t\tdetail: \"The execution was disposed during load\",\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t\tcause,\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\t\t\tyield* awaitActive(running)\n\t\t},\n\t\tEffect.mapError((error) =>\n\t\t\tcontract.normalizeCause(Cause.isCause(error) ? error : Cause.fail(error)),\n\t\t),\n\t)\n\tconst dispose = Effect.gen(function* () {\n\t\t// One transition, so a concurrent Load or export withdrawal cannot slip between read and write.\n\t\tconst previous = yield* SynchronizedRef.getAndUpdate(state, disposing)\n\t\tyield* Deferred.succeed(releaseExports, undefined)\n\t\tconst current = runningOf(previous)\n\t\tconst retired = previous._tag === \"Withdrawing\"\n\t\tconst cause = Option.isSome(current)\n\t\t\t? yield* cleanup(current.value, retired)\n\t\t\t: Cause.empty\n\t\tyield* Queue.offer(telemetry.events, ChildEvent.Stopped())\n\t\tyield* Queue.end(telemetry.logs)\n\t\tif (cause.reasons.length > 0)\n\t\t\treturn yield* Effect.fail(contract.normalizeCause(cause))\n\t})\n\treturn { load, dispose, release }\n})\n"],"mappings":"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"}
|
|
@@ -14,13 +14,13 @@ import { Effect, Logger, Option } from "effect";
|
|
|
14
14
|
import { RpcServer } from "effect/rpc";
|
|
15
15
|
// src/internal/childRuntime.ts
|
|
16
16
|
/** Import a contract in the runner installation; importing this module performs no I/O. */
|
|
17
|
-
const load =
|
|
17
|
+
const load = Effect.fnUntraced(function* (specifier) {
|
|
18
18
|
const module = yield* loadModule(specifier);
|
|
19
19
|
const contract = fromModule(module);
|
|
20
20
|
if (Option.isNone(contract)) return yield* ContractNotFound.make({ module: specifier });
|
|
21
21
|
return contract.value;
|
|
22
22
|
});
|
|
23
|
-
const connect = (contract, channel$1, session, bootstrap)
|
|
23
|
+
const connect = Effect.fnUntraced(function* (contract, channel$1, session, bootstrap) {
|
|
24
24
|
const mux = bootstrap === void 0 ? void 0 : yield* make$1(channel$1);
|
|
25
25
|
return yield* make(mux === void 0 ? channel$1 : channel(mux, 1), {
|
|
26
26
|
session,
|
|
@@ -33,7 +33,7 @@ const connect = (contract, channel$1, session, bootstrap) => Effect.gen(function
|
|
|
33
33
|
});
|
|
34
34
|
});
|
|
35
35
|
/** One execution unit; the executable supplies the platform and Graft services. */
|
|
36
|
-
const run = (descriptor, channel, session = "local", bootstrap, stop = Effect.never)
|
|
36
|
+
const run = Effect.fnUntraced(function* (descriptor, channel, session = "local", bootstrap, stop = Effect.never) {
|
|
37
37
|
const contract = prepare(descriptor);
|
|
38
38
|
const telemetry$1 = yield* telemetry(contract);
|
|
39
39
|
const loggers = yield* Logger.CurrentLoggers;
|
|
@@ -55,7 +55,7 @@ const run = (descriptor, channel, session = "local", bootstrap, stop = Effect.ne
|
|
|
55
55
|
cause: error.cause
|
|
56
56
|
}))), stop).pipe(Effect.ensuring(instance.release));
|
|
57
57
|
}).pipe(Effect.provideService(Logger.CurrentLoggers, /* @__PURE__ */ new Set([...loggers, telemetry$1.logger])));
|
|
58
|
-
})
|
|
58
|
+
}, Effect.scoped);
|
|
59
59
|
export { load, run };
|
|
60
60
|
|
|
61
61
|
//# sourceMappingURL=childRuntime.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"childRuntime.js","names":["Multiplex.make","channel","Port.make","Wire.channel","Services.endpoints","telemetry","Child.telemetry","Child.lifecycle"],"sources":["../../src/internal/childRuntime.ts"],"sourcesContent":["import { loadModule } from \"./loadModule\"\nimport { ContractNotFound } from \"./childErrors\"\nimport type { Graft } from \"@graftland/graft\"\nimport { Effect, Logger, Option } from \"effect\"\nimport { RpcServer } from \"effect/rpc\"\nimport { fromModule, type RunnerContract } from \"../Contract\"\nimport * as Port from \"./port\"\nimport { prepare, type RunnerContract as PreparedContract } from \"./contract\"\nimport * as Services from \"./services\"\nimport * as Child from \"./child\"\nimport * as Multiplex from \"./runner/Multiplex\"\nimport * as Wire from \"./runner/Wire\"\nimport type { Bootstrap } from \"./runner/Bootstrap\"\nimport { ExecutionError } from \"./runner/model\"\nimport { closedNormally } from \"./runner/connectionEnded\"\nimport { endpoint } from \"./control\"\n\n/** Import a contract in the runner installation; importing this module performs no I/O. */\nexport const load =
|
|
1
|
+
{"version":3,"file":"childRuntime.js","names":["Multiplex.make","channel","Port.make","Wire.channel","Services.endpoints","telemetry","Child.telemetry","Child.lifecycle"],"sources":["../../src/internal/childRuntime.ts"],"sourcesContent":["import { loadModule } from \"./loadModule\"\nimport { ContractNotFound } from \"./childErrors\"\nimport type { Graft } from \"@graftland/graft\"\nimport { Effect, Logger, Option } from \"effect\"\nimport { RpcServer } from \"effect/rpc\"\nimport { fromModule, type RunnerContract } from \"../Contract\"\nimport * as Port from \"./port\"\nimport { prepare, type RunnerContract as PreparedContract } from \"./contract\"\nimport * as Services from \"./services\"\nimport * as Child from \"./child\"\nimport * as Multiplex from \"./runner/Multiplex\"\nimport * as Wire from \"./runner/Wire\"\nimport type { Bootstrap } from \"./runner/Bootstrap\"\nimport { ExecutionError } from \"./runner/model\"\nimport { closedNormally } from \"./runner/connectionEnded\"\nimport { endpoint } from \"./control\"\n\n/** Import a contract in the runner installation; importing this module performs no I/O. */\nexport const load = Effect.fnUntraced(function* (specifier: string) {\n\tconst module = yield* loadModule(specifier)\n\tconst contract = fromModule(module)\n\tif (Option.isNone(contract))\n\t\treturn yield* ContractNotFound.make({ module: specifier })\n\treturn contract.value\n})\n\nconst connect = Effect.fnUntraced(function* (\n\tcontract: PreparedContract,\n\tchannel: Port.Channel,\n\tsession: string,\n\tbootstrap: Bootstrap | undefined,\n) {\n\tconst mux =\n\t\tbootstrap === undefined ? undefined : yield* Multiplex.make(channel)\n\treturn yield* Port.make(mux === undefined ? channel : Wire.channel(mux, 1), {\n\t\tsession,\n\t\tserve: {\n\t\t\t...Services.endpoints(contract.provides),\n\t\t\t[endpoint]: contract.control,\n\t\t},\n\t\tcall: Services.endpoints(contract.inject),\n\t\t...(bootstrap === undefined ? {} : { limits: bootstrap.limits }),\n\t})\n})\n\n/** One execution unit; the executable supplies the platform and Graft services. */\nexport const run: (\n\tdescriptor: RunnerContract,\n\tchannel: Port.Channel,\n\tsession?: string,\n\tbootstrap?: Bootstrap,\n\tstop?: Effect.Effect<unknown, ExecutionError>,\n) => Effect.Effect<void, ExecutionError, Graft.Graft> = Effect.fnUntraced(\n\tfunction* (\n\t\tdescriptor: RunnerContract,\n\t\tchannel: Port.Channel,\n\t\tsession: string = \"local\",\n\t\tbootstrap?: Bootstrap,\n\t\tstop: Effect.Effect<unknown, ExecutionError> = Effect.never,\n\t) {\n\t\tconst contract = prepare(descriptor)\n\t\tconst telemetry = yield* Child.telemetry(contract)\n\t\tconst loggers = yield* Logger.CurrentLoggers\n\t\tyield* Effect.gen(function* () {\n\t\t\tconst peer = yield* connect(contract, channel, session, bootstrap)\n\t\t\tconst instance = yield* Child.lifecycle(\n\t\t\t\tcontract,\n\t\t\t\tpeer,\n\t\t\t\tbootstrap?.identity ?? { id: session, generation: 1 },\n\t\t\t\ttelemetry,\n\t\t\t)\n\t\t\tconst handlers = yield* contract.control.toHandlers({\n\t\t\t\tLoad: ({ input }) => instance.load(input),\n\t\t\t\tDispose: () => instance.dispose,\n\t\t\t\tEvents: () => telemetry.eventStream,\n\t\t\t\tLogs: () => telemetry.logStream,\n\t\t\t})\n\t\t\tyield* RpcServer.make(contract.control, {\n\t\t\t\tdisableFatalDefects: true,\n\t\t\t}).pipe(\n\t\t\t\tEffect.provideContext(handlers),\n\t\t\t\tEffect.provideService(\n\t\t\t\t\tRpcServer.Protocol,\n\t\t\t\t\tpeer.serverProtocol(endpoint),\n\t\t\t\t),\n\t\t\t\tEffect.forkScoped,\n\t\t\t)\n\t\t\tyield* Effect.raceFirst(\n\t\t\t\tpeer.await.pipe(\n\t\t\t\t\tEffect.catchIf(\n\t\t\t\t\t\t(error) => closedNormally(error.cause),\n\t\t\t\t\t\t() => Effect.void,\n\t\t\t\t\t),\n\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\tExecutionError.make({\n\t\t\t\t\t\t\tdetail: \"Child transport failed\",\n\t\t\t\t\t\t\tcause: error.cause,\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\tstop,\n\t\t\t).pipe(\n\t\t\t\t// Release exports before closing the instance scope, including on interruption.\n\t\t\t\tEffect.ensuring(instance.release),\n\t\t\t)\n\t\t}).pipe(\n\t\t\tEffect.provideService(\n\t\t\t\tLogger.CurrentLoggers,\n\t\t\t\tnew Set([...loggers, telemetry.logger]),\n\t\t\t),\n\t\t)\n\t},\n\tEffect.scoped,\n)\n"],"mappings":";;;;;;;;;;;;;;;;AAkBA,MAAa,OAAO,OAAO,WAAW,WAAW,WAAmB;CACnE,MAAM,SAAS,OAAO,WAAW,SAAS;CAC1C,MAAM,WAAW,WAAW,MAAM;CAClC,IAAI,OAAO,OAAO,QAAQ,GACzB,OAAO,OAAO,iBAAiB,KAAK,EAAE,QAAQ,UAAU,CAAC;CAC1D,OAAO,SAAS;AACjB,CAAC;AAED,MAAM,UAAU,OAAO,WAAW,WACjC,UACA,WACA,SACA,WACC;CACD,MAAM,MACL,cAAc,KAAA,IAAY,KAAA,IAAY,OAAOA,OAAeC,SAAO;CACpE,OAAO,OAAOC,KAAU,QAAQ,KAAA,IAAYD,YAAUE,QAAa,KAAK,CAAC,GAAG;EAC3E;EACA,OAAO;GACN,GAAGC,UAAmB,SAAS,QAAQ;IACtC,WAAW,SAAS;EACtB;EACA,MAAMA,UAAmB,SAAS,MAAM;EACxC,GAAI,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ,UAAU,OAAO;CAC/D,CAAC;AACF,CAAC;;AAGD,MAAa,MAM2C,OAAO,WAC9D,WACC,YACA,SACA,UAAkB,SAClB,WACA,OAA+C,OAAO,OACrD;CACD,MAAM,WAAW,QAAQ,UAAU;CACnC,MAAMC,cAAY,OAAOC,UAAgB,QAAQ;CACjD,MAAM,UAAU,OAAO,OAAO;CAC9B,OAAO,OAAO,IAAI,aAAa;EAC9B,MAAM,OAAO,OAAO,QAAQ,UAAU,SAAS,SAAS,SAAS;EACjE,MAAM,WAAW,OAAOC,UACvB,UACA,MACA,WAAW,YAAY;GAAE,IAAI;GAAS,YAAY;EAAE,GACpDF,WACD;EACA,MAAM,WAAW,OAAO,SAAS,QAAQ,WAAW;GACnD,OAAO,EAAE,YAAY,SAAS,KAAK,KAAK;GACxC,eAAe,SAAS;GACxB,cAAcA,YAAU;GACxB,YAAYA,YAAU;EACvB,CAAC;EACD,OAAO,UAAU,KAAK,SAAS,SAAS,EACvC,qBAAqB,KACtB,CAAC,CAAC,CAAC,KACF,OAAO,eAAe,QAAQ,GAC9B,OAAO,eACN,UAAU,UACV,KAAK,eAAe,QAAQ,CAC7B,GACA,OAAO,UACR;EACA,OAAO,OAAO,UACb,KAAK,MAAM,KACV,OAAO,SACL,UAAU,eAAe,MAAM,KAAK,SAC/B,OAAO,IACd,GACA,OAAO,UAAU,UAChB,eAAe,KAAK;GACnB,QAAQ;GACR,OAAO,MAAM;EACd,CAAC,CACF,CACD,GACA,IACD,CAAC,CAAC,KAED,OAAO,SAAS,SAAS,OAAO,CACjC;CACD,CAAC,CAAC,CAAC,KACF,OAAO,eACN,OAAO,gCACP,IAAI,IAAI,CAAC,GAAG,SAASA,YAAU,MAAM,CAAC,CACvC,CACD;AACD,GACA,OAAO,MACR"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entry.d.ts","names":[],"sources":["../../src/internal/entry.ts"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"entry.d.ts","names":[],"sources":["../../src/internal/entry.ts"],"mappings":";;;;;;qBAuQa"}
|
package/dist/internal/entry.js
CHANGED
|
@@ -31,7 +31,7 @@ const resolve = Effect.fnUntraced(function* (reference, field) {
|
|
|
31
31
|
const directory = path.resolve(Option.getOrElse(source, () => "."));
|
|
32
32
|
const resolver = yield* Option.match(existing, {
|
|
33
33
|
onSome: Effect.succeed,
|
|
34
|
-
onNone:
|
|
34
|
+
onNone: Effect.fnUntraced(function* () {
|
|
35
35
|
const importer = yield* make(directory);
|
|
36
36
|
return yield* ModuleResolver.make({
|
|
37
37
|
base: directory,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entry.js","names":["EntryError","Importer.make","Contract.fromModule","Configuration.hostTransport","Configuration.authentication","Assembly.host","Configuration.Host"],"sources":["../../src/internal/entry.ts"],"sourcesContent":["import { Graft, Plugin, type Fork } from \"@graftland/graft\"\nimport { ConfigDirectory, Entry, ModuleResolver } from \"@graftland/loader\"\nimport {\n\tCause,\n\tEffect,\n\tOption,\n\tPath,\n\tSchema,\n\tReferences,\n\tScope,\n\tString,\n} from \"effect\"\nimport { ChildProcessSpawner } from \"effect/process\"\nimport * as Contract from \"../Contract\"\nimport { MissingInstance, RemoteEntryError as EntryError } from \"../Errors\"\nimport { LocalTransport, WorkerTransport } from \"./directTransport\"\nimport * as Configuration from \"./entryConfig\"\nimport * as Assembly from \"./assembly\"\nimport { executionPlugin } from \"./execution\"\nimport { follow } from \"./follow\"\nimport { children } from \"./cleanup\"\nimport { resolveEntry } from \"./runner/Packages\"\nimport type { LocalTarget, WorkerTarget } from \"./runner/Connection\"\nimport type { ExecutionOptions } from \"./execution\"\nimport * as Importer from \"./importer\"\nimport { SecureRandom } from \"effect/crypto\"\n\nexport const boundary = Effect.fnUntraced(function* (field: string) {\n\tconst entry = yield* Entry.CurrentId\n\tconst directory = yield* ConfigDirectory\n\treturn (cause: Cause.Cause<unknown>) =>\n\t\tEffect.fail(EntryError.make({ entry, directory, field, cause }))\n})\nexport const resolve = Effect.fnUntraced(function* (\n\treference: Configuration.Reference,\n\tfield: string,\n) {\n\tconst existing = yield* Effect.serviceOption(ModuleResolver.ModuleResolver)\n\tconst path = yield* Path.Path\n\tconst source = yield* ConfigDirectory\n\tconst directory = path.resolve(Option.getOrElse(source, () => \".\"))\n\tconst resolver = yield* Option.match(existing, {\n\t\tonSome: Effect.succeed,\n\t\tonNone: () =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst importer = yield* Importer.make(directory)\n\t\t\t\treturn yield* ModuleResolver.make({\n\t\t\t\t\tbase: directory,\n\t\t\t\t\timporter: (specifier) =>\n\t\t\t\t\t\tString.startsWith(\"@graftland/plugin-remote/\")(specifier)\n\t\t\t\t\t\t\t? import(specifier)\n\t\t\t\t\t\t\t: importer(specifier),\n\t\t\t\t})\n\t\t\t}),\n\t})\n\tconst fail = yield* boundary(field)\n\tconst plugin = yield* resolver\n\t\t.resolve(reference.name)\n\t\t.pipe(Effect.catchCause(fail))\n\treturn { plugin, config: reference.config }\n})\nexport const loadContract = Effect.fnUntraced(function* (specifier: string) {\n\tconst resolver = yield* ModuleResolver.ModuleResolver\n\tconst fail = yield* boundary(\"contract\")\n\treturn yield* resolver.importModule(specifier).pipe(\n\t\tEffect.flatMap((module) =>\n\t\t\tEffect.fromOption(Contract.fromModule(module), () =>\n\t\t\t\tModuleResolver.ModuleInvalid.make({\n\t\t\t\t\tspecifier,\n\t\t\t\t\tcause: \"Expected a default or named remote contract\",\n\t\t\t\t}),\n\t\t\t),\n\t\t),\n\t\tEffect.catchCause(fail),\n\t)\n})\n\n/** Direct execution installs only its execution capability in a private realm. */\nexport const direct = (\n\tprovider: Plugin.Plugin,\n\tconsumer: Plugin.Plugin,\n\tinput: Schema.Json,\n\tkey: typeof LocalTransport | typeof WorkerTransport,\n): Effect.Effect<Fork.Fork<never, unknown>, never, Graft.Graft | Scope.Scope> =>\n\tGraft.plugin(\n\t\tPlugin.make({\n\t\t\tname: \"remote-direct\",\n\t\t\tapply: Effect.fnUntraced(function* () {\n\t\t\t\tconst capability = yield* Graft.plugin(provider)\n\t\t\t\tyield* follow(capability, (cause) =>\n\t\t\t\t\tEffect.fail(Assembly.CapabilityFailed.make({ cause })),\n\t\t\t\t)\n\t\t\t\tconst execution = yield* Graft.plugin(consumer, input)\n\t\t\t\tyield* follow(execution, (cause) =>\n\t\t\t\t\tEffect.fail(Assembly.CapabilityFailed.make({ cause })),\n\t\t\t\t)\n\t\t\t}),\n\t\t}),\n\t\tundefined,\n\t\t{ isolate: [key] },\n\t)\n\ntype Annotations = Readonly<Record<string, unknown>>\nconst directTarget = Effect.fnUntraced(function* <\n\tS extends Schema.Top & {\n\t\treadonly Encoded: Schema.Json\n\t\treadonly DecodingServices: never\n\t\treadonly EncodingServices: never\n\t},\n\tE extends Schema.Top & {\n\t\treadonly DecodingServices: never\n\t\treadonly EncodingServices: never\n\t},\n>(\n\tcontract: Contract.Contract<S, E>,\n\tinput: typeof Configuration.Host.Type,\n\tselected: LocalTarget | WorkerTarget,\n\tannotations: Annotations,\n\toptions: ExecutionOptions,\n) {\n\tconst path = yield* Path.Path\n\tconst source = yield* ConfigDirectory\n\tconst directory = path.resolve(Option.getOrElse(source, () => \".\"))\n\tconst module = String.startsWith(\"file:\")(input.contract)\n\t\t? input.contract\n\t\t: yield* resolveEntry(directory, input.contract)\n\tconst capability = yield* resolve(\n\t\t{\n\t\t\tname:\n\t\t\t\tselected._tag === \"Local\"\n\t\t\t\t\t? \"@graftland/plugin-remote/host/local\"\n\t\t\t\t\t: \"@graftland/plugin-remote/host/worker\",\n\t\t},\n\t\t\"connect\",\n\t)\n\treturn yield* direct(\n\t\tcapability.plugin,\n\t\texecutionPlugin(\n\t\t\tcontract,\n\t\t\t{ ...options, contractModule: module },\n\t\t\tselected,\n\t\t\tannotations,\n\t\t),\n\t\tinput.config,\n\t\tselected._tag === \"Local\" ? LocalTransport : WorkerTransport,\n\t)\n})\nconst runnerTarget = Effect.fnUntraced(function* <\n\tS extends Schema.Top & {\n\t\treadonly Encoded: Schema.Json\n\t\treadonly DecodingServices: never\n\t\treadonly EncodingServices: never\n\t},\n\tE extends Schema.Top & {\n\t\treadonly DecodingServices: never\n\t\treadonly EncodingServices: never\n\t},\n>(\n\tcontract: Contract.Contract<S, E>,\n\tinput: typeof Configuration.Host.Type,\n\ttarget: Exclude<\n\t\tConfiguration.Connect,\n\t\t{ readonly local: object } | { readonly worker: object }\n\t>,\n\tannotations: Annotations,\n\toptions: ExecutionOptions,\n\tauthOverride: typeof Assembly.Invocation.Type | undefined,\n) {\n\tconst instance =\n\t\ttarget.instance === undefined\n\t\t\t? yield* Entry.CurrentId\n\t\t\t: Option.some(target.instance)\n\tif (Option.isNone(instance)) return yield* MissingInstance.make({})\n\tconst transport = yield* resolve(\n\t\tConfiguration.hostTransport(target),\n\t\t\"connect.transport\",\n\t)\n\tconst auth =\n\t\tauthOverride ??\n\t\t(yield* resolve(\n\t\t\tConfiguration.authentication(\"host\", target.auth),\n\t\t\t\"connect.auth\",\n\t\t))\n\tconst consumer = executionPlugin(\n\t\tcontract,\n\t\toptions,\n\t\t{\n\t\t\t_tag: \"Connector\",\n\t\t\texplicitAuth: target.auth !== undefined,\n\t\t\tinstance: instance.value,\n\t\t\t...(target.lease === undefined ? {} : { lease: target.lease }),\n\t\t\t...(target.margin === undefined ? {} : { margin: target.margin }),\n\t\t\t...(target.expect === undefined ? {} : { expect: target.expect }),\n\t\t},\n\t\tannotations,\n\t)\n\treturn yield* Assembly.host({\n\t\ttransport,\n\t\tauth,\n\t\tconsumer,\n\t\tinput: input.config,\n\t})\n})\n\nexport const launch = Effect.fnUntraced(function* <\n\tS extends Schema.Top & {\n\t\treadonly Encoded: Schema.Json\n\t\treadonly DecodingServices: never\n\t\treadonly EncodingServices: never\n\t},\n\tE extends Schema.Top & {\n\t\treadonly DecodingServices: never\n\t\treadonly EncodingServices: never\n\t},\n>(\n\tcontract: Contract.Contract<S, E>,\n\tinput: typeof Configuration.Host.Type,\n\toptions: ExecutionOptions,\n\tauthOverride?: typeof Assembly.Invocation.Type,\n) {\n\tconst annotations = yield* References.CurrentLogAnnotations\n\tconst connect = input.connect\n\tconst scope = yield* children\n\treturn yield* Effect.gen(function* () {\n\t\tif (connect.local !== undefined)\n\t\t\treturn yield* directTarget(\n\t\t\t\tcontract,\n\t\t\t\tinput,\n\t\t\t\t{ _tag: \"Local\", ...connect.local },\n\t\t\t\tannotations,\n\t\t\t\toptions,\n\t\t\t)\n\t\tif (connect.worker !== undefined)\n\t\t\treturn yield* directTarget(\n\t\t\t\tcontract,\n\t\t\t\tinput,\n\t\t\t\t{ _tag: \"Worker\", ...connect.worker },\n\t\t\t\tannotations,\n\t\t\t\toptions,\n\t\t\t)\n\t\treturn yield* runnerTarget(\n\t\t\tcontract,\n\t\t\tinput,\n\t\t\tconnect,\n\t\t\tannotations,\n\t\t\toptions,\n\t\t\tauthOverride,\n\t\t)\n\t}).pipe(Scope.provide(scope))\n})\nconst load = Effect.fnUntraced(function* (\n\tinput: typeof Configuration.Host.Type,\n) {\n\tconst contract = yield* loadContract(input.contract)\n\tconst failConfig = yield* boundary(\"config\")\n\tyield* Schema.decodeEffect(contract.config)(input.config).pipe(\n\t\tEffect.catchCause(failConfig),\n\t)\n\tconst failConnect = yield* boundary(\"connect\")\n\tconst fork = yield* launch(contract, input, {\n\t\tcontractModule: input.contract,\n\t}).pipe(Effect.catchCause(failConnect))\n\tyield* follow(fork, failConnect)\n})\nexport const host = Plugin.make({\n\tname: \"remote\",\n\tconfig: Configuration.Host,\n\tinject: [\n\t\tSecureRandom.SecureRandom,\n\t\tModuleResolver.ModuleResolver,\n\t\tPath.Path,\n\t\tChildProcessSpawner.ChildProcessSpawner,\n\t],\n\tapply: load,\n})\n"],"mappings":";;;;;;;;;;;;;;;;AA2BA,MAAa,WAAW,OAAO,WAAW,WAAW,OAAe;CACnE,MAAM,QAAQ,OAAO,MAAM;CAC3B,MAAM,YAAY,OAAO;CACzB,QAAQ,UACP,OAAO,KAAKA,iBAAW,KAAK;EAAE;EAAO;EAAW;EAAO;CAAM,CAAC,CAAC;AACjE,CAAC;AACD,MAAa,UAAU,OAAO,WAAW,WACxC,WACA,OACC;CACD,MAAM,WAAW,OAAO,OAAO,cAAc,eAAe,cAAc;CAC1E,MAAM,OAAO,OAAO,KAAK;CACzB,MAAM,SAAS,OAAO;CACtB,MAAM,YAAY,KAAK,QAAQ,OAAO,UAAU,cAAc,GAAG,CAAC;CAClE,MAAM,WAAW,OAAO,OAAO,MAAM,UAAU;EAC9C,QAAQ,OAAO;EACf,cACC,OAAO,IAAI,aAAa;GACvB,MAAM,WAAW,OAAOC,KAAc,SAAS;GAC/C,OAAO,OAAO,eAAe,KAAK;IACjC,MAAM;IACN,WAAW,cACV,OAAO,WAAW,2BAA2B,CAAC,CAAC,SAAS,IACrD,OAAO,aACP,SAAS,SAAS;GACvB,CAAC;EACF,CAAC;CACH,CAAC;CACD,MAAM,OAAO,OAAO,SAAS,KAAK;CAIlC,OAAO;EAAE,QAAA,OAHa,SACpB,QAAQ,UAAU,IAAI,CAAC,CACvB,KAAK,OAAO,WAAW,IAAI,CAAC;EACb,QAAQ,UAAU;CAAO;AAC3C,CAAC;AACD,MAAa,eAAe,OAAO,WAAW,WAAW,WAAmB;CAC3E,MAAM,WAAW,OAAO,eAAe;CACvC,MAAM,OAAO,OAAO,SAAS,UAAU;CACvC,OAAO,OAAO,SAAS,aAAa,SAAS,CAAC,CAAC,KAC9C,OAAO,SAAS,WACf,OAAO,WAAWC,WAAoB,MAAM,SAC3C,eAAe,cAAc,KAAK;EACjC;EACA,OAAO;CACR,CAAC,CACF,CACD,GACA,OAAO,WAAW,IAAI,CACvB;AACD,CAAC;;AAGD,MAAa,UACZ,UACA,UACA,OACA,QAEA,MAAM,OACL,OAAO,KAAK;CACX,MAAM;CACN,OAAO,OAAO,WAAW,aAAa;EACrC,MAAM,aAAa,OAAO,MAAM,OAAO,QAAQ;EAC/C,OAAO,OAAO,aAAa,UAC1B,OAAO,KAAA,iBAA+B,KAAK,EAAE,MAAM,CAAC,CAAC,CACtD;EACA,MAAM,YAAY,OAAO,MAAM,OAAO,UAAU,KAAK;EACrD,OAAO,OAAO,YAAY,UACzB,OAAO,KAAA,iBAA+B,KAAK,EAAE,MAAM,CAAC,CAAC,CACtD;CACD,CAAC;AACF,CAAC,GACD,KAAA,GACA,EAAE,SAAS,CAAC,GAAG,EAAE,CAClB;AAGD,MAAM,eAAe,OAAO,WAAW,WAWtC,UACA,OACA,UACA,aACA,SACC;CACD,MAAM,OAAO,OAAO,KAAK;CACzB,MAAM,SAAS,OAAO;CACtB,MAAM,YAAY,KAAK,QAAQ,OAAO,UAAU,cAAc,GAAG,CAAC;CAClE,MAAM,SAAS,OAAO,WAAW,OAAO,CAAC,CAAC,MAAM,QAAQ,IACrD,MAAM,WACN,OAAO,aAAa,WAAW,MAAM,QAAQ;CAChD,MAAM,aAAa,OAAO,QACzB,EACC,MACC,SAAS,SAAS,UACf,wCACA,uCACL,GACA,SACD;CACA,OAAO,OAAO,OACb,WAAW,QACX,gBACC,UACA;EAAE,GAAG;EAAS,gBAAgB;CAAO,GACrC,UACA,WACD,GACA,MAAM,QACN,SAAS,SAAS,UAAU,iBAAiB,eAC9C;AACD,CAAC;AACD,MAAM,eAAe,OAAO,WAAW,WAWtC,UACA,OACA,QAIA,aACA,SACA,cACC;CACD,MAAM,WACL,OAAO,aAAa,KAAA,IACjB,OAAO,MAAM,YACb,OAAO,KAAK,OAAO,QAAQ;CAC/B,IAAI,OAAO,OAAO,QAAQ,GAAG,OAAO,OAAO,gBAAgB,KAAK,CAAC,CAAC;CAClE,MAAM,YAAY,OAAO,QACxBC,cAA4B,MAAM,GAClC,mBACD;CACA,MAAM,OACL,iBACC,OAAO,QACPC,eAA6B,QAAQ,OAAO,IAAI,GAChD,cACD;CACD,MAAM,WAAW,gBAChB,UACA,SACA;EACC,MAAM;EACN,cAAc,OAAO,SAAS,KAAA;EAC9B,UAAU,SAAS;EACnB,GAAI,OAAO,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,OAAO,MAAM;EAC5D,GAAI,OAAO,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ,OAAO,OAAO;EAC/D,GAAI,OAAO,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ,OAAO,OAAO;CAChE,GACA,WACD;CACA,OAAO,OAAOC,OAAc;EAC3B;EACA;EACA;EACA,OAAO,MAAM;CACd,CAAC;AACF,CAAC;AAED,MAAa,SAAS,OAAO,WAAW,WAWvC,UACA,OACA,SACA,cACC;CACD,MAAM,cAAc,OAAO,WAAW;CACtC,MAAM,UAAU,MAAM;CACtB,MAAM,QAAQ,OAAO;CACrB,OAAO,OAAO,OAAO,IAAI,aAAa;EACrC,IAAI,QAAQ,UAAU,KAAA,GACrB,OAAO,OAAO,aACb,UACA,OACA;GAAE,MAAM;GAAS,GAAG,QAAQ;EAAM,GAClC,aACA,OACD;EACD,IAAI,QAAQ,WAAW,KAAA,GACtB,OAAO,OAAO,aACb,UACA,OACA;GAAE,MAAM;GAAU,GAAG,QAAQ;EAAO,GACpC,aACA,OACD;EACD,OAAO,OAAO,aACb,UACA,OACA,SACA,aACA,SACA,YACD;CACD,CAAC,CAAC,CAAC,KAAK,MAAM,QAAQ,KAAK,CAAC;AAC7B,CAAC;AACD,MAAM,OAAO,OAAO,WAAW,WAC9B,OACC;CACD,MAAM,WAAW,OAAO,aAAa,MAAM,QAAQ;CACnD,MAAM,aAAa,OAAO,SAAS,QAAQ;CAC3C,OAAO,OAAO,aAAa,SAAS,MAAM,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,KACzD,OAAO,WAAW,UAAU,CAC7B;CACA,MAAM,cAAc,OAAO,SAAS,SAAS;CAC7C,MAAM,OAAO,OAAO,OAAO,UAAU,OAAO,EAC3C,gBAAgB,MAAM,SACvB,CAAC,CAAC,CAAC,KAAK,OAAO,WAAW,WAAW,CAAC;CACtC,OAAO,OAAO,MAAM,WAAW;AAChC,CAAC;AACD,MAAa,OAAO,OAAO,KAAK;CAC/B,MAAM;CACN,QAAQC;CACR,QAAQ;EACP,aAAa;EACb,eAAe;EACf,KAAK;EACL,oBAAoB;CACrB;CACA,OAAO;AACR,CAAC"}
|
|
1
|
+
{"version":3,"file":"entry.js","names":["EntryError","Importer.make","Contract.fromModule","Configuration.hostTransport","Configuration.authentication","Assembly.host","Configuration.Host"],"sources":["../../src/internal/entry.ts"],"sourcesContent":["import { Graft, Plugin, type Fork } from \"@graftland/graft\"\nimport { ConfigDirectory, Entry, ModuleResolver } from \"@graftland/loader\"\nimport {\n\tCause,\n\tEffect,\n\tOption,\n\tPath,\n\tSchema,\n\tReferences,\n\tScope,\n\tString,\n} from \"effect\"\nimport { ChildProcessSpawner } from \"effect/process\"\nimport * as Contract from \"../Contract\"\nimport { MissingInstance, RemoteEntryError as EntryError } from \"../Errors\"\nimport { LocalTransport, WorkerTransport } from \"./directTransport\"\nimport * as Configuration from \"./entryConfig\"\nimport * as Assembly from \"./assembly\"\nimport { executionPlugin } from \"./execution\"\nimport { follow } from \"./follow\"\nimport { children } from \"./cleanup\"\nimport { resolveEntry } from \"./runner/Packages\"\nimport type { LocalTarget, WorkerTarget } from \"./runner/Connection\"\nimport type { ExecutionOptions } from \"./execution\"\nimport * as Importer from \"./importer\"\nimport { SecureRandom } from \"effect/crypto\"\n\nexport const boundary = Effect.fnUntraced(function* (field: string) {\n\tconst entry = yield* Entry.CurrentId\n\tconst directory = yield* ConfigDirectory\n\treturn (cause: Cause.Cause<unknown>) =>\n\t\tEffect.fail(EntryError.make({ entry, directory, field, cause }))\n})\nexport const resolve = Effect.fnUntraced(function* (\n\treference: Configuration.Reference,\n\tfield: string,\n) {\n\tconst existing = yield* Effect.serviceOption(ModuleResolver.ModuleResolver)\n\tconst path = yield* Path.Path\n\tconst source = yield* ConfigDirectory\n\tconst directory = path.resolve(Option.getOrElse(source, () => \".\"))\n\tconst resolver = yield* Option.match(existing, {\n\t\tonSome: Effect.succeed,\n\t\tonNone: Effect.fnUntraced(function* () {\n\t\t\tconst importer = yield* Importer.make(directory)\n\t\t\treturn yield* ModuleResolver.make({\n\t\t\t\tbase: directory,\n\t\t\t\timporter: (specifier) =>\n\t\t\t\t\tString.startsWith(\"@graftland/plugin-remote/\")(specifier)\n\t\t\t\t\t\t? import(specifier)\n\t\t\t\t\t\t: importer(specifier),\n\t\t\t})\n\t\t}),\n\t})\n\tconst fail = yield* boundary(field)\n\tconst plugin = yield* resolver\n\t\t.resolve(reference.name)\n\t\t.pipe(Effect.catchCause(fail))\n\treturn { plugin, config: reference.config }\n})\nexport const loadContract = Effect.fnUntraced(function* (specifier: string) {\n\tconst resolver = yield* ModuleResolver.ModuleResolver\n\tconst fail = yield* boundary(\"contract\")\n\treturn yield* resolver.importModule(specifier).pipe(\n\t\tEffect.flatMap((module) =>\n\t\t\tEffect.fromOption(Contract.fromModule(module), () =>\n\t\t\t\tModuleResolver.ModuleInvalid.make({\n\t\t\t\t\tspecifier,\n\t\t\t\t\tcause: \"Expected a default or named remote contract\",\n\t\t\t\t}),\n\t\t\t),\n\t\t),\n\t\tEffect.catchCause(fail),\n\t)\n})\n\n/** Direct execution installs only its execution capability in a private realm. */\nexport const direct = (\n\tprovider: Plugin.Plugin,\n\tconsumer: Plugin.Plugin,\n\tinput: Schema.Json,\n\tkey: typeof LocalTransport | typeof WorkerTransport,\n): Effect.Effect<Fork.Fork<never, unknown>, never, Graft.Graft | Scope.Scope> =>\n\tGraft.plugin(\n\t\tPlugin.make({\n\t\t\tname: \"remote-direct\",\n\t\t\tapply: Effect.fnUntraced(function* () {\n\t\t\t\tconst capability = yield* Graft.plugin(provider)\n\t\t\t\tyield* follow(capability, (cause) =>\n\t\t\t\t\tEffect.fail(Assembly.CapabilityFailed.make({ cause })),\n\t\t\t\t)\n\t\t\t\tconst execution = yield* Graft.plugin(consumer, input)\n\t\t\t\tyield* follow(execution, (cause) =>\n\t\t\t\t\tEffect.fail(Assembly.CapabilityFailed.make({ cause })),\n\t\t\t\t)\n\t\t\t}),\n\t\t}),\n\t\tundefined,\n\t\t{ isolate: [key] },\n\t)\n\ntype Annotations = Readonly<Record<string, unknown>>\nconst directTarget = Effect.fnUntraced(function* <\n\tS extends Schema.Top & {\n\t\treadonly Encoded: Schema.Json\n\t\treadonly DecodingServices: never\n\t\treadonly EncodingServices: never\n\t},\n\tE extends Schema.Top & {\n\t\treadonly DecodingServices: never\n\t\treadonly EncodingServices: never\n\t},\n>(\n\tcontract: Contract.Contract<S, E>,\n\tinput: typeof Configuration.Host.Type,\n\tselected: LocalTarget | WorkerTarget,\n\tannotations: Annotations,\n\toptions: ExecutionOptions,\n) {\n\tconst path = yield* Path.Path\n\tconst source = yield* ConfigDirectory\n\tconst directory = path.resolve(Option.getOrElse(source, () => \".\"))\n\tconst module = String.startsWith(\"file:\")(input.contract)\n\t\t? input.contract\n\t\t: yield* resolveEntry(directory, input.contract)\n\tconst capability = yield* resolve(\n\t\t{\n\t\t\tname:\n\t\t\t\tselected._tag === \"Local\"\n\t\t\t\t\t? \"@graftland/plugin-remote/host/local\"\n\t\t\t\t\t: \"@graftland/plugin-remote/host/worker\",\n\t\t},\n\t\t\"connect\",\n\t)\n\treturn yield* direct(\n\t\tcapability.plugin,\n\t\texecutionPlugin(\n\t\t\tcontract,\n\t\t\t{ ...options, contractModule: module },\n\t\t\tselected,\n\t\t\tannotations,\n\t\t),\n\t\tinput.config,\n\t\tselected._tag === \"Local\" ? LocalTransport : WorkerTransport,\n\t)\n})\nconst runnerTarget = Effect.fnUntraced(function* <\n\tS extends Schema.Top & {\n\t\treadonly Encoded: Schema.Json\n\t\treadonly DecodingServices: never\n\t\treadonly EncodingServices: never\n\t},\n\tE extends Schema.Top & {\n\t\treadonly DecodingServices: never\n\t\treadonly EncodingServices: never\n\t},\n>(\n\tcontract: Contract.Contract<S, E>,\n\tinput: typeof Configuration.Host.Type,\n\ttarget: Exclude<\n\t\tConfiguration.Connect,\n\t\t{ readonly local: object } | { readonly worker: object }\n\t>,\n\tannotations: Annotations,\n\toptions: ExecutionOptions,\n\tauthOverride: typeof Assembly.Invocation.Type | undefined,\n) {\n\tconst instance =\n\t\ttarget.instance === undefined\n\t\t\t? yield* Entry.CurrentId\n\t\t\t: Option.some(target.instance)\n\tif (Option.isNone(instance)) return yield* MissingInstance.make({})\n\tconst transport = yield* resolve(\n\t\tConfiguration.hostTransport(target),\n\t\t\"connect.transport\",\n\t)\n\tconst auth =\n\t\tauthOverride ??\n\t\t(yield* resolve(\n\t\t\tConfiguration.authentication(\"host\", target.auth),\n\t\t\t\"connect.auth\",\n\t\t))\n\tconst consumer = executionPlugin(\n\t\tcontract,\n\t\toptions,\n\t\t{\n\t\t\t_tag: \"Connector\",\n\t\t\texplicitAuth: target.auth !== undefined,\n\t\t\tinstance: instance.value,\n\t\t\t...(target.lease === undefined ? {} : { lease: target.lease }),\n\t\t\t...(target.margin === undefined ? {} : { margin: target.margin }),\n\t\t\t...(target.expect === undefined ? {} : { expect: target.expect }),\n\t\t},\n\t\tannotations,\n\t)\n\treturn yield* Assembly.host({\n\t\ttransport,\n\t\tauth,\n\t\tconsumer,\n\t\tinput: input.config,\n\t})\n})\n\nexport const launch = Effect.fnUntraced(function* <\n\tS extends Schema.Top & {\n\t\treadonly Encoded: Schema.Json\n\t\treadonly DecodingServices: never\n\t\treadonly EncodingServices: never\n\t},\n\tE extends Schema.Top & {\n\t\treadonly DecodingServices: never\n\t\treadonly EncodingServices: never\n\t},\n>(\n\tcontract: Contract.Contract<S, E>,\n\tinput: typeof Configuration.Host.Type,\n\toptions: ExecutionOptions,\n\tauthOverride?: typeof Assembly.Invocation.Type,\n) {\n\tconst annotations = yield* References.CurrentLogAnnotations\n\tconst connect = input.connect\n\tconst scope = yield* children\n\treturn yield* Effect.gen(function* () {\n\t\tif (connect.local !== undefined)\n\t\t\treturn yield* directTarget(\n\t\t\t\tcontract,\n\t\t\t\tinput,\n\t\t\t\t{ _tag: \"Local\", ...connect.local },\n\t\t\t\tannotations,\n\t\t\t\toptions,\n\t\t\t)\n\t\tif (connect.worker !== undefined)\n\t\t\treturn yield* directTarget(\n\t\t\t\tcontract,\n\t\t\t\tinput,\n\t\t\t\t{ _tag: \"Worker\", ...connect.worker },\n\t\t\t\tannotations,\n\t\t\t\toptions,\n\t\t\t)\n\t\treturn yield* runnerTarget(\n\t\t\tcontract,\n\t\t\tinput,\n\t\t\tconnect,\n\t\t\tannotations,\n\t\t\toptions,\n\t\t\tauthOverride,\n\t\t)\n\t}).pipe(Scope.provide(scope))\n})\nconst load = Effect.fnUntraced(function* (\n\tinput: typeof Configuration.Host.Type,\n) {\n\tconst contract = yield* loadContract(input.contract)\n\tconst failConfig = yield* boundary(\"config\")\n\tyield* Schema.decodeEffect(contract.config)(input.config).pipe(\n\t\tEffect.catchCause(failConfig),\n\t)\n\tconst failConnect = yield* boundary(\"connect\")\n\tconst fork = yield* launch(contract, input, {\n\t\tcontractModule: input.contract,\n\t}).pipe(Effect.catchCause(failConnect))\n\tyield* follow(fork, failConnect)\n})\nexport const host = Plugin.make({\n\tname: \"remote\",\n\tconfig: Configuration.Host,\n\tinject: [\n\t\tSecureRandom.SecureRandom,\n\t\tModuleResolver.ModuleResolver,\n\t\tPath.Path,\n\t\tChildProcessSpawner.ChildProcessSpawner,\n\t],\n\tapply: load,\n})\n"],"mappings":"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"}
|
|
@@ -4,13 +4,18 @@ import { Credentials } from "../Auth.js";
|
|
|
4
4
|
import { acquire } from "./runner/Connection.js";
|
|
5
5
|
import { endpoints } from "./services.js";
|
|
6
6
|
import { dispose, initialize, load } from "./host.js";
|
|
7
|
-
import { MissingInstance, RemoteError, RemoteWithdrawn } from "../Errors.js";
|
|
7
|
+
import { AuthenticationFailed, CredentialsError, LocalTerminationTimeout, MissingInstance, ProcessExited, RemoteEntryError, RemoteError, RemoteWithdrawn, TransportError } from "../Errors.js";
|
|
8
|
+
import { ActivationFailed, AlreadyLoaded, ContractNotFound, ModuleImportFailed } from "./childErrors.js";
|
|
9
|
+
import { errors } from "./assembly.js";
|
|
10
|
+
import { ExecutionError, LeaseExpired, PackageError, RemoteTerminationUnconfirmed, RunnerClosing, SessionAccessDenied, SessionConflict, SessionStopped, StaleSession, StateDirectoryLocked, StateStorageError, TerminationUnconfirmed } from "./runner/model.js";
|
|
11
|
+
import { ReleaseInterrupted } from "./release.js";
|
|
8
12
|
import { UndeclaredFailure } from "../Contract.js";
|
|
9
13
|
import { endpoint } from "./control.js";
|
|
10
14
|
import { prepare } from "./contract.js";
|
|
11
15
|
import { Plugin } from "@graftland/graft";
|
|
12
|
-
import { Array, Cause, Effect, Fiber, Schema, Scope } from "effect";
|
|
16
|
+
import { Array, Cause, Effect, Fiber, PlatformError, Schema, Scope } from "effect";
|
|
13
17
|
import { SecureRandom } from "effect/crypto";
|
|
18
|
+
import { RpcClientError } from "effect/rpc";
|
|
14
19
|
// src/internal/execution.ts
|
|
15
20
|
const dependencies = (target) => target._tag === "Connector" ? [Connector, Credentials] : target._tag === "Local" ? [LocalTransport] : [WorkerTransport];
|
|
16
21
|
/** One owned execution per activation, with explicitly mapped services. */
|
|
@@ -22,7 +27,7 @@ const executionPlugin = (contract, options, configured, annotations = {}) => Plu
|
|
|
22
27
|
...Array.map(contract.inject, (service) => service.key)
|
|
23
28
|
],
|
|
24
29
|
config: Schema.toEncoded(contract.config),
|
|
25
|
-
apply:
|
|
30
|
+
apply: Effect.fnUntraced(function* (input) {
|
|
26
31
|
const prepared = prepare(contract);
|
|
27
32
|
const session = yield* (yield* SecureRandom.SecureRandom).uuidV4();
|
|
28
33
|
const active = yield* acquire(configured, options.contractModule, {
|
|
@@ -37,9 +42,39 @@ const executionPlugin = (contract, options, configured, annotations = {}) => Plu
|
|
|
37
42
|
for (const service of contract.provides) yield* service.publish(active.connection.transport).pipe(Scope.provide(active.connection.resources));
|
|
38
43
|
yield* Plugin.fork(Effect.raceFirst(Fiber.join(active.events), active.remoteFailure.await).pipe(Effect.mapError((error) => publicError(contract.error, error))));
|
|
39
44
|
return () => Effect.succeed(false);
|
|
40
|
-
}
|
|
45
|
+
}, Effect.annotateLogs(annotations), Effect.mapError((error) => publicError(contract.error, error)))
|
|
41
46
|
});
|
|
42
|
-
|
|
47
|
+
/** Failures raised by the host machinery; a permissive declared schema must not claim them. */
|
|
48
|
+
const internalErrors = [
|
|
49
|
+
ProcessExited,
|
|
50
|
+
TransportError,
|
|
51
|
+
LocalTerminationTimeout,
|
|
52
|
+
CredentialsError,
|
|
53
|
+
AuthenticationFailed,
|
|
54
|
+
RemoteEntryError,
|
|
55
|
+
AlreadyLoaded,
|
|
56
|
+
ContractNotFound,
|
|
57
|
+
ModuleImportFailed,
|
|
58
|
+
ActivationFailed,
|
|
59
|
+
PackageError,
|
|
60
|
+
SessionAccessDenied,
|
|
61
|
+
StaleSession,
|
|
62
|
+
LeaseExpired,
|
|
63
|
+
SessionStopped,
|
|
64
|
+
SessionConflict,
|
|
65
|
+
StateStorageError,
|
|
66
|
+
ExecutionError,
|
|
67
|
+
TerminationUnconfirmed,
|
|
68
|
+
RunnerClosing,
|
|
69
|
+
StateDirectoryLocked,
|
|
70
|
+
RemoteTerminationUnconfirmed,
|
|
71
|
+
ReleaseInterrupted,
|
|
72
|
+
RpcClientError.RpcClientError,
|
|
73
|
+
...errors
|
|
74
|
+
];
|
|
75
|
+
const isInternal = (error) => Schema.isSchemaError(error) || PlatformError.isPlatformError(error) || Array.some(internalErrors, (Class) => error instanceof Class);
|
|
76
|
+
const isPublic = (error) => Schema.is(UndeclaredFailure)(error) || Schema.is(RemoteWithdrawn)(error) || Schema.is(RemoteError)(error) || Schema.is(MissingInstance)(error);
|
|
77
|
+
const publicError = (declared, error) => isPublic(error) ? error : !isInternal(error) && Schema.is(declared)(error) ? error : RemoteError.make({ cause: Cause.fail(error) });
|
|
43
78
|
export { executionPlugin, publicError };
|
|
44
79
|
|
|
45
80
|
//# sourceMappingURL=execution.js.map
|