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
- Use 'data' for received messages
- Use 'error' for stream errors and 'end' for stream completion
- 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
- Remember the mapping: Node 'message' -> k6 'data'; there is no 'close' event
- Register 'error' on every stream so failures surface instead of halting the VU silently
- Keep event names in constants instead of inline strings
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
- empty gRPC client
- not a gRPC client
- unknown browser event: %q, must be %q
- incorrect event %q, %q is the only event supported
- invalid GRPC Stream's client: %w
AI-assisted analysis of grafana/k6@93accf6570 (2026-08-15).
Data as JSON: /api/errors/53c34d05e4059dbd.
Report an issue: GitHub.