grafana/k6 · error

unknown GRPC stream's event type: %s

Error message

unknown GRPC stream's event type: %s

What it means

stream.on(eventType, callback) accepts only the event types defined in listeners.go: 'data', 'error', 'end' and 'status'. eventListeners.add() looks the name up via getType(); anything else returns nil and the API throws "unknown GRPC stream's event type".

Source

Thrown at internal/js/modules/k6/grpc/listeners.go:66

	case eventData:
		return l.data
	case eventError:
		return l.error
	case eventStatus:
		return l.status
	case eventEnd:
		return l.end
	default:
		return nil
	}
}

// add adds a listener to the listeners
func (l *eventListeners) add(t string, f func(sobek.Value, sobek.Value) (sobek.Value, error)) error {
	list := l.getType(t)

	if list == nil {
		return fmt.Errorf("unknown GRPC stream's event type: %s", t)
	}

	list.add(f)

	return nil
}

// all returns all possible listeners for a certain event type or an empty array
func (l *eventListeners) all(t string) []func(sobek.Value, sobek.Value) (sobek.Value, error) {
	list := l.getType(t)

	if list == nil {
		return []func(sobek.Value, sobek.Value) (sobek.Value, error){}
	}

	return list.list
}

View on GitHub (pinned to 93accf6570)

Solutions

  1. Use 'data' for received messages
  2. Use 'error' for stream errors and 'end' for stream completion
  3. Use 'status' for status updates if needed; there is no 'message' or 'close' event

Example fix

// before
stream.on('message', (m) => console.log(m));
stream.on('close', () => console.log('done'));

// after
stream.on('data', (m) => console.log(m));
stream.on('end', () => console.log('done'));
Defensive patterns

Strategy: validation

Validate before calling

const STREAM_EVENTS = new Set(['data', 'error', 'end', 'status']);
function safeOn(stream, event, fn) {
  if (!STREAM_EVENTS.has(event)) {
    throw new Error(`unsupported stream event '${event}'; expected one of: ${[...STREAM_EVENTS].join(', ')}`);
  }
  return stream.on(event, fn);
}
safeOn(stream, 'data', (m) => console.log(m));

Type guard

function isStreamEvent(e) {
  return e === 'data' || e === 'error' || e === 'end' || e === 'status';
}

Prevention

When it happens

Trigger: stream.on('message', cb) (Node.js/EventEmitter habit; k6 uses 'data'); stream.on('close', cb) (not supported); capitalization typos like 'Data' or 'End'.

Common situations: Scripts ported from Node stream/socket code; authors expecting naming symmetric with grpcurl or browser EventSource; auto-completed wrong event names.

Related errors


AI-assisted analysis of grafana/k6@93accf6570 (2026-08-15). Data as JSON: /api/errors/53c34d05e4059dbd. Report an issue: GitHub.