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, nil

View on GitHub (pinned to 265b3a3dec)

Solutions

  1. Run scripts through the nuclei engine (CLI / lib/nuclei) which registers dialers per execution id
  2. Embedders: protocolstate.Init(&types.Options{ExecutionId: id, ...}) before execution; identical id under ctx key 'executionId'
  3. Verify the id end-to-end by logging it on both sides
  4. 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

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


AI-assisted analysis of projectdiscovery/nuclei@265b3a3dec (2026-08-15). Data as JSON: /api/errors/e45ca3289c5e9c86. Report an issue: GitHub.