Worker-side nREPL server. Runs in the spawned JVM on the combined
project-first launch classpath and answers host requests on demand. Project
operations run on the clojure.main launch thread, so project code loads
exactly as the project's own runtime loads it — Skeptic adds no reader-Var
or loading machinery. Plan 2 Phase 1.5 adds the handle-table machinery: every Class
operand on the wire is an opaque handle (integer for bootstrap-interned
host-runtime classes; UUID-string for project classes). Worker is sole owner
of Class/forName, .isAssignableFrom, instance?, and class equality.
Phase 5 adds the analyzer ops. The analyzer-execution glue lives in
skeptic.worker.analyzer-clj / skeptic.worker.analyzer-cljs. No other
skeptic.* namespace is required from this server: Skeptic's own analysis
code and Plumatic Schema / Malli stay on the host (B3/B4).
nREPL is lazy-loaded inside start! from the worker JVM's single launch
classloader (project-cp first, worker jars second). The ns form does NOT
require any nrepl.* namespace at load time — projects pinning a different
nrepl win their version via first-occurrence on the launch cp. The
wrap-* dispatchers are let-bound inside start!, closing over locally
resolved nrepl.transport/send, nrepl.misc/response-for, and
nrepl.server/{start-server,unknown-op}. Descriptor metadata is dead
code under the explicit handler thread and has been removed.
Worker-side nREPL server. Runs in the spawned JVM on the combined
project-first launch classpath and answers host requests on demand. Project
operations run on the clojure.main launch thread, so project code loads
exactly as the project's own runtime loads it — Skeptic adds no reader-Var
or loading machinery. Plan 2 Phase 1.5 adds the handle-table machinery: every Class
operand on the wire is an opaque handle (integer for bootstrap-interned
host-runtime classes; UUID-string for project classes). Worker is sole owner
of `Class/forName`, `.isAssignableFrom`, `instance?`, and class equality.
Phase 5 adds the analyzer ops. The analyzer-execution glue lives in
`skeptic.worker.analyzer-clj` / `skeptic.worker.analyzer-cljs`. No other
`skeptic.*` namespace is required from this server: Skeptic's own analysis
code and Plumatic Schema / Malli stay on the host (B3/B4).
nREPL is lazy-loaded inside `start!` from the worker JVM's single launch
classloader (project-cp first, worker jars second). The ns form does NOT
require any nrepl.* namespace at load time — projects pinning a different
nrepl win their version via first-occurrence on the launch cp. The
`wrap-*` dispatchers are let-bound inside `start!`, closing over locally
resolved `nrepl.transport/send`, `nrepl.misc/response-for`, and
`nrepl.server/{start-server,unknown-op}`. Descriptor metadata is dead
code under the explicit handler thread and has been removed.(run-worker! announce-port!)Start the worker and run the project-operation loop on this thread — the
clojure.main launch thread the project's own boot set up, where lein's
prep, :global-vars, and :injections already ran. Project code loads
exactly as the project's own runtime loads it: Skeptic adds no reader-Var
machinery, so every registration mechanism behaves as it does under the
project's own clojure.main (observed in .scratch/reader-probes/).
nREPL handler threads enqueue project operations onto this thread's queue.
announce-port! is called with the bound port once the server is up: the
owned Lein subprocess writes a port-file, direct launch prints the stdout
handshake line.
Start the worker and run the project-operation loop on this thread — the `clojure.main` launch thread the project's own boot set up, where lein's prep, `:global-vars`, and `:injections` already ran. Project code loads exactly as the project's own runtime loads it: Skeptic adds no reader-Var machinery, so every registration mechanism behaves as it does under the project's own `clojure.main` (observed in `.scratch/reader-probes/`). nREPL handler threads enqueue project operations onto this thread's queue. `announce-port!` is called with the bound port once the server is up: the owned Lein subprocess writes a port-file, direct launch prints the stdout handshake line.
(start! request-shutdown!)Lazy-load nREPL, then start a server with an explicit handler chain. Every
nREPL Var (t/send, response-for, srv/start-server,
srv/unknown-op-equivalent) is resolved here from the worker JVM's launch
classloader (project-first) so a project pinning a different nrepl wins
via first-occurrence. Wrap-* dispatchers are let-bound inside this fn —
they close over locally resolved t-send and resp-for, never reference
a namespace-scoped alias. The shutdown callback is mandatory so a successful
shutdown reply always corresponds to an actual server stop request.
Lazy-load nREPL, then start a server with an explicit handler chain. Every nREPL Var (`t/send`, `response-for`, `srv/start-server`, `srv/unknown-op`-equivalent) is resolved here from the worker JVM's launch classloader (project-first) so a project pinning a different nrepl wins via first-occurrence. Wrap-* dispatchers are let-bound inside this fn — they close over locally resolved `t-send` and `resp-for`, never reference a namespace-scoped alias. The shutdown callback is mandatory so a successful shutdown reply always corresponds to an actual server stop request.
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |