|  | // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | part of dart._vmservice; | 
|  |  | 
|  | typedef void ClientServiceHandle(Message? response); | 
|  |  | 
|  | // A service client. | 
|  | abstract class Client { | 
|  | final VMService service; | 
|  | final bool sendEvents; | 
|  |  | 
|  | static int _idCounter = 0; | 
|  | final int _id = ++_idCounter; | 
|  |  | 
|  | String get defaultClientName => 'client$_id'; | 
|  |  | 
|  | String get name => _name; | 
|  | set name(String? n) => _name = (n ?? defaultClientName); | 
|  | late String _name; | 
|  |  | 
|  | /// A set streamIds which describes the streams the client is connected to | 
|  | final streams = <String>{}; | 
|  |  | 
|  | /// Services registered and their aliases | 
|  | /// key: service | 
|  | /// value: alias | 
|  | final services = <String, String>{}; | 
|  |  | 
|  | /// Callbacks registered for service invocations set to the client | 
|  | /// key: RPC id used for the request | 
|  | /// value: callback that should be invoked | 
|  | final serviceHandles = <String, ClientServiceHandle>{}; | 
|  |  | 
|  | Client(this.service, {this.sendEvents = true}) { | 
|  | _name = defaultClientName; | 
|  | service._addClient(this); | 
|  | } | 
|  |  | 
|  | // Disconnects the client. | 
|  | disconnect(); | 
|  |  | 
|  | /// When implementing, call [close] when the network connection closes. | 
|  | void close() => service._removeClient(this); | 
|  |  | 
|  | /// Call to process a request. Response will be posted with 'seq'. | 
|  | void onRequest(Message message) => | 
|  | // In JSON-RPC 2.0 messages with and id are Request and must be answered | 
|  | // http://www.jsonrpc.org/specification#notification | 
|  | service.routeRequest(service, message).then(post); | 
|  |  | 
|  | void onResponse(Message message) => service.routeResponse(message); | 
|  |  | 
|  | /// Call to process a notification. Response will not be posted. | 
|  | void onNotification(Message message) => | 
|  | // In JSON-RPC 2.0 messages without an id are Notification | 
|  | // and should not be answered | 
|  | // http://www.jsonrpc.org/specification#notification | 
|  | service.routeRequest(service, message); | 
|  |  | 
|  | // Sends a result to the client. Implemented in subclasses. | 
|  | // | 
|  | // Null can be passed as response to a JSON-RPC notification to close the | 
|  | // connection. | 
|  | void post(Response? result); | 
|  |  | 
|  | Map<String, dynamic> toJson() => {}; | 
|  | } |