diff --git a/dwds/CHANGELOG.md b/dwds/CHANGELOG.md index 0caf7ade4..dde53b645 100644 --- a/dwds/CHANGELOG.md +++ b/dwds/CHANGELOG.md @@ -2,6 +2,8 @@ - Add global functions to the injected client for `dart.developer.postEvent` and `dart.developer.registerExtension`. +- Register new service extension `ext.dwds.emitEvent` so clients can emit + events. This is intended to be used for analytics. ## 11.0.2 diff --git a/dwds/lib/src/dwds_vm_client.dart b/dwds/lib/src/dwds_vm_client.dart index 4a27d8d49..6e93fc647 100644 --- a/dwds/lib/src/dwds_vm_client.dart +++ b/dwds/lib/src/dwds_vm_client.dart @@ -11,6 +11,7 @@ import 'package:logging/logging.dart'; import 'package:vm_service/vm_service.dart'; import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart'; +import 'events.dart'; import 'services/chrome_proxy_service.dart' show ChromeProxyService; import 'services/debug_service.dart'; @@ -153,6 +154,13 @@ class DwdsVmClient { }); await client.registerService('ext.dwds.screenshot', 'DWDS'); + client.registerServiceCallback('ext.dwds.emitEvent', (event) async { + emitEvent(DwdsEvent( + event['type'] as String, event['payload'] as Map)); + return {'result': Success().toJson()}; + }); + await client.registerService('ext.dwds.emitEvent', 'DWDS'); + client.registerServiceCallback('_yieldControlToDDS', (request) async { final ddsUri = request['uri'] as String; if (ddsUri == null) { diff --git a/dwds/test/events_test.dart b/dwds/test/events_test.dart index c47fe0736..ddca84326 100644 --- a/dwds/test/events_test.dart +++ b/dwds/test/events_test.dart @@ -63,6 +63,20 @@ void main() { bootstrap = isolate.rootLib; }); + test('can emit event through service extension', () async { + expect( + context.testServer.dwds.events, + emits(predicate((DwdsEvent event) => + event.type == 'foo-event' && event.payload['data'] == 1234))); + + var response = await context.debugConnection.vmService + .callServiceExtension('ext.dwds.emitEvent', args: { + 'type': 'foo-event', + 'payload': {'data': 1234}, + }); + expect(response.type, 'Success'); + }); + test('emits EVALUATE events on evaluation success', () async { var expression = "helloString('world')"; expect(