projectdiscovery/nuclei · error
dialers not initialized for %s
Error message
dialers not initialized for %s
What it means
Thrown by the memoized POP3 detection (pop3.IsPOP3) when protocolstate.GetDialersWithId(executionId) returns nil — no dialer set exists for the executionId in the JS context. The POP3 banner grab needs a TCP connection through nuclei's per-execution fastdialer, which is created only by protocolstate.Init keyed on options.ExecutionId; without it the probe fails before dialing and the memoized error is returned to every subsequent call for that host:port.
Source
Thrown at pkg/js/libs/pop3/pop3.go:48
// IsPOP3 checks if a host is running a POP3 server.
// @example
// ```javascript
// const pop3 = require('nuclei/pop3');
// const isPOP3 = pop3.IsPOP3('acme.com', 110);
// log(toJSON(isPOP3));
// ```
func IsPOP3(ctx context.Context, host string, port int) (IsPOP3Response, error) {
executionId := ctx.Value("executionId").(string)
return memoizedisPoP3(ctx, executionId, host, port)
}
// @memo
func isPoP3(ctx context.Context, executionId string, host string, port int) (IsPOP3Response, error) {
resp := IsPOP3Response{}
dialer := protocolstate.GetDialersWithId(executionId)
if dialer == nil {
return IsPOP3Response{}, fmt.Errorf("dialers not initialized for %s", executionId)
}
timeout := 5 * time.Second
conn, err := dialer.Fastdialer.Dial(ctx, "tcp", net.JoinHostPort(host, strconv.Itoa(port)))
if err != nil {
return resp, err
}
defer func() {
_ = conn.Close()
}()
pop3Plugin := pop3.POP3Plugin{}
service, err := pop3Plugin.Run(conn, timeout, plugins.Target{Host: host})
if err != nil {
return resp, err
}
if service == nil {
return resp, nilView on GitHub (pinned to 265b3a3dec)
Solutions
- Run scripts through the nuclei engine (CLI / lib/nuclei) which registers dialers per execution id
- Embedders: protocolstate.Init(&types.Options{ExecutionId: id, ...}) before execution; identical id under ctx key 'executionId'
- Verify the id end-to-end by logging it on both sides
- In tests, initialize protocolstate once (TestMain) rather than mocking the dialer
Defensive patterns
Strategy: validation
Validate before calling
// Go embedder guard
if protocolstate.ShouldInit(executionId) {
_ = protocolstate.Init(&types.Options{ExecutionId: executionId})
} Try / catch
try { const r = pop3.IsPOP3(host, port); } catch (e) { if (String(e).includes('dialers not initialized')) { log('engine not initialized'); return; } throw e; } Prevention
- Execute pop3 probes within nuclei engine runs only
- Embedders: initialize dialers per execution id before scripts
- Note memoization: the failure is cached per host:port for the execution — fix init early
- Validate embedding setups with an engine-driven smoke template
When it happens
Trigger: Executing require('nuclei/pop3') code outside the nuclei engine: standalone goja, Go unit tests calling isPoP3 directly, custom SDK harnesses without engine setup, or an executionId mismatch between the ctx value and the Init-time id.
Common situations: Library embedding and testing; ported snippets in foreign runtimes; contexts reused after execution-id rotation or dialer rebuild on policy change.
Related errors
- dialers not initialized for %s
- dialers not initialized for %s
- dialers not initialized for %s
- dialers not initialized for %s
- headless mode (-headless) is required if -ho, -sb, -sc or -l
AI-assisted analysis of projectdiscovery/nuclei@265b3a3dec (2026-08-15).
Data as JSON: /api/errors/e45ca3289c5e9c86.
Report an issue: GitHub.