postEvent function

void postEvent(
  1. String eventKind,
  2. Map eventData,
  3. {@Since('3.0 ') String stream = 'Extension'}
)

Post an event of eventKind with payload of eventData to the "Extension" event stream.

If extensionStreamHasListener is false, this method is a no-op. Override stream to set the destination stream that the event should be posted to. The stream may not start with an underscore or be a core VM Service stream.

Implementation

void postEvent(String eventKind, Map eventData,
    {@Since('3.0 ') String stream = 'Extension'}) {
  const destinationStreamKey = '__destinationStream';
  // Keep protected streams in sync with `streams_` in runtime/vm/service.cc
  // `Extension` is the only stream that should not be protected here.
  final protectedStreams = <String>[
    'VM',
    'Isolate',
    'Debug',
    'GC',
    '_Echo',
    'HeapSnapshot',
    'Logging',
    'Timeline',
    'Profiler',
  ];

  if (protectedStreams.contains(stream)) {
    throw ArgumentError.value(
        stream, 'stream', 'Cannot be a protected stream.');
  } else if (stream.startsWith('_')) {
    throw ArgumentError.value(
        stream, 'stream', 'Cannot start with an underscore.');
  }

  if (!extensionStreamHasListener) {
    return;
  }
  // TODO: When NNBD is complete, delete the following two lines.
  checkNotNullable(eventKind, 'eventKind');
  checkNotNullable(eventData, 'eventData');
  checkNotNullable(stream, 'stream');
  Map mutableEventData = Map.from(eventData); // Shallow copy.
  mutableEventData[destinationStreamKey] = stream;
  String eventDataAsString = json.encode(mutableEventData);
  _postEvent(eventKind, eventDataAsString);
}