| # Dart VM Service Protocol Extension 4.0 |
| |
| This protocol describes service extensions that are made available through |
| the Dart core libraries, but are not part of the core |
| [Dart VM Service Protocol](service.md). Service extension methods are |
| invoked by prepending the service extension name (e.g., |
| "ext.dart.libraryName") to the RPC to be invoked. For example, the |
| `getSocketProfile` RPC exposed through dart:io can be executed by invoking |
| `ext.dart.io.getSocketProfile`. |
| |
| ## dart:io Extensions |
| |
| This section describes _version 4.0_ of the dart:io service protocol extensions. |
| |
| ### getVersion |
| |
| ``` |
| Version getVersion(string isolateId) |
| ``` |
| |
| The _getVersion_ RPC returns the available version of the dart:io service protocol extensions. |
| |
| See [Version](#version). |
| |
| ### socketProfilingEnabled |
| |
| ``` |
| SocketProfilingState socketProfilingEnabled(string isolateId, bool enabled [optional]) |
| ``` |
| |
| The _socketProfilingEnabled_ RPC is used to enable/disable the socket profiler |
| and query its current state. If `enabled` is provided, the profiler state will |
| be updated to reflect the value of `enabled`. |
| |
| If the state of the socket profiler is changed, a `SocketProfilingStateChange` |
| event will be sent on the `Extension` stream. |
| |
| See [SocketProfilingState](#socketprofilingstate). |
| |
| ### clearSocketProfile |
| |
| ``` |
| Success clearSocketProfile(string isolateId) |
| ``` |
| |
| Removes all statistics associated with prior and current sockets. |
| |
| See [Success](#success). |
| |
| ### getSocketProfile |
| |
| ``` |
| SocketProfile getSocketProfile(string isolateId) |
| ``` |
| |
| The _getSocketProfile_ RPC is used to retrieve socket statistics collected by the socket profiler. |
| Only samples collected after socket profiling was enabled by calling [socketProfilingEnabled](#socketProfilingEnabled) |
| or after the last call to [clearSocketProfile](#clearsocketprofile) will be reported. |
| |
| ### getOpenFileById |
| |
| ``` |
| OpenFile getOpenFileById(string isolateId, int id); |
| ``` |
| |
| The _getOpenFileById_ RPC is used to retrieve information about files currently |
| opened by `dart:io` from a given isolate. |
| |
| See [getOpenFiles](#getopenfiles) and [File](#file). |
| |
| ### getOpenFiles |
| |
| ``` |
| FileList getOpenFiles(string isolateId); |
| ``` |
| |
| The _getOpenFiles_ RPC is used to retrieve the list of files currently opened |
| files by `dart:io` from a given isolate. |
| |
| See [FileList](#filelist) and [File](#file). |
| |
| ### getSpawnedProcessById |
| |
| ``` |
| SpawnedProcess getSpawnedProcessById(string isolateId, int id); |
| ``` |
| |
| The _getSpawnedProcessById_ RPC is used to retrieve information about a process spawned |
| by `dart:io` from a given isolate. |
| |
| See [getSpawnedProcesses](#getspawnedprocesses) and [SpawnedProcess](#spawnedprocess). |
| |
| ### getSpawnedProcesses |
| |
| ``` |
| SpawnedProcessList getSpawnedProcesses(string isolateId); |
| ``` |
| |
| The _getSpawnedProcesses_ RPC is used to retrieve the list of processed opened by |
| `dart:io` from a given isolate. |
| |
| See [SpawnedProcessList](#spawnedprocesslist) and [SpawnedProcess](#spawnedprocess). |
| |
| ### httpEnableTimelineLogging |
| |
| ``` |
| HttpTimelineLoggingState httpEnableTimelineLogging(string isolateId, bool enabled [optional]) |
| ``` |
| |
| The _httpEnableTimelineLogging_ RPC is used to set and inspect the value of |
| `HttpClient.enableTimelineLogging`, which determines if HTTP client requests |
| should be logged to the timeline. If `enabled` is provided, the state of |
| `HttpClient.enableTimelineLogging` will be updated to the value of `enabled`. |
| |
| If the value of `HttpClient.enableTimelineLogging` is changed, a |
| `HttpTimelineLoggingStateChange` event will be sent on the `Extension` stream. |
| |
| See [HttpTimelineLoggingState](#httptimelineloggingstate). |
| |
| ### getHttpProfile |
| |
| ``` |
| HttpProfile getHttpProfile(string isolateId, int updatedSince [optional]) |
| ``` |
| |
| The `getHttpProfile` RPC is used to retrieve HTTP profiling information |
| for requests made via `dart:io`'s `HttpClient`. |
| |
| The returned `HttpProfile` will only include requests issued after |
| `httpTimelineLogging` has been enabled or after the last |
| `clearHttpProfile` invocation. |
| |
| If `updatedSince` is provided, only requests started or updated since the |
| specified time will be reported. The specified time must be represented in |
| microseconds since the "Unix epoch". |
| |
| See [HttpProfile](#httpprofile). |
| |
| ### getHttpProfileRequest |
| |
| ``` |
| HttpProfileRequest getHttpProfileRequest(string isolateId, int id) |
| ``` |
| |
| The `getHttpProfileRequest` RPC is used to retrieve an instance of `HttpProfileRequest`, |
| which includes request and response body data. |
| |
| See [HttpProfileRequest](#httprofilerequest). |
| |
| ### clearHttpProfile |
| |
| ``` |
| Success clearHttpProfile(string isolateId) |
| ``` |
| |
| The `clearHttpProfile` RPC is used to clear previously recorded HTTP |
| requests from the HTTP profiler state. Requests still in-flight after |
| clearing the profiler state will be ignored by the profiler. |
| |
| See [Success](#success). |
| |
| ## Public Types |
| |
| ### OpenFile |
| |
| ``` |
| class @OpenFile extends Response { |
| // The unique ID associated with this file. |
| int id; |
| |
| // The path of the file. |
| string name; |
| } |
| ``` |
| |
| _@OpenFile_ is a reference to an _OpenFile_. |
| |
| ``` |
| class OpenFile extends Response { |
| // The unique ID associated with this file. |
| int id; |
| |
| // The path of the file. |
| string name; |
| |
| // The total number of bytes read from this file. |
| int readBytes; |
| |
| // The total number of bytes written to this file. |
| int writeBytes; |
| |
| // The number of reads made from this file. |
| int readCount; |
| |
| // The number of writes made to this file. |
| int writeCount; |
| |
| // The time at which this file was last read by this process in milliseconds |
| // since epoch. |
| int lastReadTime; |
| |
| // The time at which this file was last written to by this process in |
| // milliseconds since epoch. |
| int lastWriteTime; |
| } |
| ``` |
| |
| A _OpenFile_ contains information about reads and writes to a currently opened file. |
| |
| ### OpenFileList |
| |
| ``` |
| class OpenFileList extends Response { |
| // A list of all files opened through dart:io. |
| @OpenFile[] files; |
| } |
| ``` |
| |
| ### HttpTimelineLoggingState |
| |
| ``` |
| class HttpTimelineLoggingState extends Response { |
| // Whether Http timeline logging is enabled. |
| bool enabled; |
| } |
| ``` |
| |
| See [httpEnableTimelineLogging](#httpenabletimelinelogging). |
| |
| ### HttpProfile |
| |
| ``` |
| class HttpProfile extends Response { |
| // The time at which this HTTP profile was built, represented as microseconds |
| // since the "Unix epoch". |
| int timestamp; |
| |
| // The set of recorded HTTP requests. |
| @HttpProfileRequest[] requests; |
| } |
| ``` |
| |
| A collection of HTTP request data collected by the profiler. |
| |
| See [getHttpProfile](#gethttpprofile). |
| |
| ### HttpProfileRequest |
| |
| ``` |
| class @HttpProfileRequest extends Response { |
| // The ID associated with this request. |
| // |
| // If the ID does not start with the prefix "from_package/", then there |
| // will be a corresponding timeline event with the same ID. |
| string id; |
| |
| // The ID of the isolate this request was issued from. |
| string isolateId; |
| |
| // The HTTP request method associated with this request. |
| string method; |
| |
| // The URI to which this HTTP request was sent. |
| string uri; |
| |
| // Events related to this HTTP request. |
| // |
| // Events which occurred before encountering an error will be reported. |
| HttpProfileRequestEvent[] events; |
| |
| // The time at which this request was initiated, represented as microseconds |
| // since the "Unix epoch". |
| int startTime; |
| |
| // The time at which this request was completed, represented as microseconds |
| // since the "Unix epoch". |
| int endTime [optional]; |
| |
| // Details about the request. |
| // |
| // Will not be provided if the initial request has not yet completed. |
| HttpProfileRequestData request [optional]; |
| |
| // Details about the response. |
| // |
| // Will not be provided if the request has not yet been responded to. |
| HttpProfileResponseData response [optional]; |
| } |
| ``` |
| |
| ``` |
| class HttpProfileRequest extends @HttpProfileRequest { |
| // The body sent as part of this request. |
| // |
| // Data written to a request body before encountering an error will be |
| // reported. |
| int[] requestBody [optional]; |
| |
| // The body received in response to the request. |
| int[] responseBody [optional]; |
| } |
| ``` |
| |
| Profiling information for a single HTTP request. |
| |
| See [HttpProfile](#httpprofile). |
| |
| ### HttpProfileRequestData |
| |
| ``` |
| class HttpProfileRequestData { |
| // Information about the client connection. |
| map<string, dynamic> connectionInfo [optional]; |
| |
| // The content length of the request, in bytes. |
| int contentLength [optional]; |
| |
| // Cookies presented to the server (in the 'cookie' header). |
| string[] cookies [optional]; |
| |
| // The error associated with the failed request. |
| string error [optional]; |
| |
| // Whether automatic redirect following was enabled for the request. |
| bool followRedirects [optional]; |
| |
| // The client request headers. |
| map<string, dynamic> headers [optional]; |
| |
| // The maximum number of redirects allowed during the request. |
| int maxRedirects [optional]; |
| |
| // The requested persistent connection state. |
| bool persistentConnection [optional]; |
| |
| // Proxy authentication details for this request. |
| HttpProfileProxyData proxyDetails [optional]; |
| } |
| ``` |
| |
| Information sent as part of the initial HTTP request. If `error` is present, |
| the other properties will be null. |
| |
| See [HttpProfileRequest](#httpprofilerequest). |
| |
| ### HttpProfileResponseData |
| |
| ``` |
| class HttpProfileResponseData { |
| // The series of redirects this connection has been through. |
| // |
| // The list will be empty if no redirects were followed. Redirects will be |
| // updated both in the case of an automatic and a manual redirect. |
| map<string, dynamic>[] redirects; |
| |
| // Cookies set by the server (from the 'set-cookie' header). |
| string[] cookies [optional]; |
| |
| // Information about the client connection. |
| map<string, dynamic> connectionInfo [optional]; |
| |
| // The client response headers. |
| map<string, dynamic> headers [optional]; |
| |
| // The compression state of the response. |
| // |
| // This specifies whether the response bytes were compressed when they were |
| // received across the wire and whether callers will receive compressed or |
| // uncompressed bytes when they listed to this response's byte stream. |
| string compressionState [optional]; |
| |
| // The reason phrase associated with the status code. |
| string reasonPhrase [optional]; |
| |
| // Whether the status code is one of the normal redirect codes. |
| bool isRedirect [optional]; |
| |
| // The persistent connection state returned by the server. |
| bool persistentConnection [optional]; |
| |
| // The content length of the response body, in bytes. |
| // |
| // Returns -1 if the size of the response body is not known in advance. |
| int contentLength [optional]; |
| |
| // The status code. |
| int statusCode [optional]; |
| |
| // The time at which the initial response was received, represented as |
| // microseconds since the "Unix epoch". |
| int startTime [optional]; |
| |
| // The time at which the response was completed, represented as |
| // microseconds since the "Unix epoch". |
| int endTime [optional]; |
| |
| // The error associated with the failed request. |
| string error [optional]; |
| } |
| ``` |
| |
| Information received in response to an initial HTTP request. |
| |
| See [HttpProfileRequest](#httpprofilerequest). |
| |
| ### HttpProfileProxyData |
| |
| ``` |
| class HttpProfileProxyData { |
| string host [optional]; |
| string username [optional]; |
| bool isDirect [optional]; |
| int port [optional]; |
| } |
| ``` |
| |
| Proxy authentication details associated with an HTTP request. |
| |
| See [HttpProfileRequestData](#httpprofilerequestdata). |
| |
| ### HttpProfileRequestEvent |
| |
| ``` |
| class HttpProfileRequestEvent { |
| // The title of the recorded event. |
| string event; |
| |
| // The time at which the event occurred, represented as microseconds since |
| // the "Unix epoch". |
| int timestamp; |
| |
| // Any arguments recorded for the event. |
| map<string, dynamic> arguments [optional]; |
| } |
| ``` |
| |
| Describes an event related to an HTTP request. |
| |
| See [HttpProfileRequestData](#httpprofilerequestdata). |
| |
| ### SocketProfilingState |
| |
| ``` |
| class SocketProfilingState extends Response { |
| // Whether socket profiling is enabled. |
| bool enabled; |
| } |
| ``` |
| |
| See [socketProfilingEnabled](#socketProfilingEnabled). |
| |
| ### SpawnedProcess |
| |
| ``` |
| class @SpawnedProcess { |
| // The unique ID associated with this process. |
| int id; |
| |
| // The name of the executable. |
| string name; |
| } |
| ``` |
| |
| _@SpawnedProcess_ is a reference to a _SpawnedProcess_. |
| |
| ``` |
| class SpawnedProcess extends Response { |
| // The unique ID associated with this process. |
| int id; |
| |
| // The name of the executable. |
| string name; |
| |
| // The process ID associated with the process. |
| int pid; |
| |
| // The time the process was started in milliseconds since epoch. |
| int startedAt; |
| |
| // The list of arguments provided to the process at launch. |
| string[] arguments; |
| |
| // The working directory of the process at launch. |
| string workingDirectory; |
| } |
| ``` |
| |
| A _Process_ contains startup information of a spawned process. |
| |
| ### SpawnedProcessList |
| |
| ``` |
| class SpawnedProcessList extends Response { |
| // A list of processes spawned through dart:io on a given isolate. |
| @SpawnedProcess[] processes; |
| } |
| ``` |
| |
| ### Response |
| |
| ``` |
| class Response { |
| // Every response returned by the VM Service has the |
| // type property. This allows the client distinguish |
| // between different kinds of responses. |
| string type; |
| } |
| ``` |
| |
| ### SocketProfile |
| |
| ``` |
| class SocketProfile extends Response { |
| // List of socket statistics |
| SocketStatistic[] sockets; |
| } |
| ``` |
| |
| A _SocketProfile_ provides information about statistics of sockets. |
| See [getSocketProfile](#getSocketProfile) and |
| [SocketStatistic](#SocketStatistic). |
| |
| ### SocketStatistic |
| |
| ``` |
| class SocketStatistic { |
| // The unique ID associated with this socket. |
| int id; |
| |
| // The time, in microseconds, that this socket was created. |
| int startTime; |
| |
| // The time, in microseconds, that this socket was closed. |
| int endTime [optional]; |
| |
| // The time, in microseconds, that this socket was last read from. |
| int lastReadTime [optional]; |
| |
| // The time, in microseconds, that this socket was last written to. |
| int lastWriteTime [optional]; |
| |
| // The address of socket. |
| string address; |
| |
| // The port of socket. |
| int port; |
| |
| // The type of socket. The value is `tcp` or `udp`. |
| string socketType; |
| |
| // The number of bytes read from this socket. |
| int readBytes; |
| |
| // The number of bytes written to this socket. |
| int writeBytes; |
| } |
| ``` |
| |
| See [SocketProfile](#SocketProfile) and [getSocketProfile](#getSocketProfile). |
| |
| ### Success |
| |
| ``` |
| class Success extends Response { |
| } |
| ``` |
| |
| The _Success_ type is used to indicate that an operation completed successfully. |
| |
| ### Version |
| |
| ``` |
| class Version extends Response { |
| // The major version number is incremented when the protocol is changed |
| // in a potentially incompatible way. |
| int major; |
| |
| // The minor version number is incremented when the protocol is changed |
| // in a backwards compatible way. |
| int minor; |
| } |
| ``` |
| |
| ## Revision History |
| version | comments |
| ------- | -------- |
| 1.0 | Initial revision. |
| 1.1 | Added `lastReadTime` and `lastWriteTime` properties to `SocketStatistic`. |
| 1.2 | Added `getOpenFiles`, `getOpenFileById`, `getSpawnedProcesses`, and `getSpawnedProcessById` RPCs and added `OpenFile` and `SpawnedProcess` objects. |
| 1.3 | Added `httpEnableTimelineLogging` RPC and `HttpTimelineLoggingStateChange` event, deprecated `getHttpEnableTimelineLogging` and `setHttpEnableTimelineLogging`. |
| 1.4 | Updated `httpEnableTimelineLogging` parameter `enable` to `enabled`. `enable` will continue to be accepted. |
| 1.5 | Added `socketProfilingEnabled` RPC and `SocketProfilingStateChanged` event, deprecated `startSocketProfiling` and `pauseSocketProfiling`. |
| 1.6 | Added `isSocketProfilingAvailable`, `isHttpTimelineLoggingAvailable`, `isHttpProfilingAvailable`, removed deprecated RPCs `startSocketProfiling`, |
| `pauseSocketProfiling`, `getHttpEnableTimelineLogging`, and `setHttpEnableTimelineLogging`. |
| 2.0 | Changed the type of the `id` property of `@HttpProfileRequestRef` and |
| `HttpProfileRequestRef` from `int` to `String`. Changed the type of |
| `SocketStatistic.id` from `int` to `String`. Changed the type of the `id` |
| parameter of `getHttpProfileRequest` from `int` to `String`. Changed the name of |
| the `enable` parameter of `httpEnableTimelineLogging` to `enabled`. |
| 3.0 | Added `isSocketProfilingAvailable`, `isHttpTimelineLoggingAvailable`, |
| and `isHttpProfilingAvailable` methods. Removed deprecated |
| `startSocketProfiling`, `pauseSocketProfiling`, `getHttpEnableTimelineLogging`, |
| and `setHttpEnableTimelineLogging` methods. |
| 4.0 | Made the `updatedSince` parameter of `getHttpProfile` require the time to |
| be represented in microseconds since the "Unix epoch" instead of as a timestamp |
| on the monotonic clock used by the timeline. Made the `timestamp` property of |
| `HttpProfile` represent time in microseconds since the "Unix epoch" instead of |
| as a timestamp on the monotonic clock used by the timeline. Added `events` |
| property to `@HttpProfileRequest` and `HttpProfileRequest`. Made the `startTime` |
| and `endTime` properties of `@HttpProfileRequest` and `HttpProfileRequest` |
| represent time in microseconds since the "Unix epoch" instead of as timestamps |
| on the monotonic clock used by the timeline. Removed the `events` and `method` |
| properties from `HttpProfileRequestData`. Made the `cookies` property of |
| `HttpProfileRequestData` optional. Made the `startTime` and `endTime` properties |
| of `HttpProfileResponseData` represent time in microseconds since the "Unix |
| epoch" instead of as timestamps on the monotonic clock used by the timeline. |
| Made the `cookies`, `headers`, `compressionState`, `reasonPhrase`, `isRedirect`, |
| `persistentConnection`, `contentLength`, `statusCode`, and `startTime` |
| properties of `HttpProfileResponseData` optional. Made the `isDirect` property |
| of `HttpProfileProxyData` optional. Made the `timestamp` property of |
| `HttpProfileRequestEvent` represent time in microseconds since the "Unix epoch" |
| instead of as a timestamp on the monotonic clock used by the timeline. |