{
    "domain": "Profiler",
    "types": [
        {
            "id": "ProfileHeader",
            "type": "object",
            "description": "Profile header.",
            "properties": [
                { "name": "typeId", "type": "string", "enum": ["CPU", "CSS", "HEAP"], "description": "Profile type name." },
                { "name": "title", "type": "string", "description": "Profile title." },
                { "name": "uid", "type": "integer", "description": "Unique identifier of the profile." },
                { "name": "maxJSObjectId", "type": "integer", "optional": true, "description": "Last seen JS object Id." }
            ]
        },
        {
            "id": "CPUProfileNode",
            "type": "object",
            "description": "CPU Profile node. Holds callsite information, execution statistics and child nodes.",
            "properties": [
                { "name": "functionName", "type": "string", "description": "Function name." },
                { "name": "url", "type": "string", "description": "URL." },
                { "name": "lineNumber", "type": "integer", "description": "Line number." },
                { "name": "totalTime", "type": "number", "description": "Total execution time." },
                { "name": "selfTime", "type": "number", "description": "Self time." },
                { "name": "numberOfCalls", "type": "integer", "description": "Number of calls." },
                { "name": "callUID", "type": "number", "description": "Call UID." },
                { "name": "children", "type": "array", "items": { "$ref": "CPUProfileNode" }, "description": "Child nodes." },
                { "name": "id", "optional": true, "type": "integer", "description": "Unique id of the node." }
            ]
        },
        {
            "id": "CPUProfile",
            "type": "object",
            "description": "Profile.",
            "properties": [
                { "name": "head", "$ref": "CPUProfileNode", "optional": true },
                { "name": "idleTime", "type": "number", "optional": true },
                { "name": "samples", "optional": true, "type": "array", "items": { "type": "integer" }, "description": "Ids of samples top nodes." }
            ]
        },
        {
            "id": "HeapSnapshotObjectId",
            "type": "string",
            "description": "Heap snashot object id."
        }
    ],
    "commands": [
        {
            "name": "isSampling",
            "returns": [
                { "name": "result", "type": "boolean" }
            ]
        },
        {
            "name": "hasHeapProfiler",
            "returns": [
                { "name": "result", "type": "boolean" }
            ]
        },
        {
            "name": "enable"
        },
        {
            "name": "disable"
        },
        {
            "name": "start"
        },
        {
            "name": "stop"
        },
        {
            "name": "getProfileHeaders",
            "returns": [
                { "name": "headers", "type": "array", "items": { "$ref": "ProfileHeader"} }
            ]
        },
        {
            "name": "getCPUProfile",
            "parameters": [
                { "name": "uid", "type": "integer" }
            ],
            "returns": [
                { "name": "profile", "$ref": "CPUProfile" }
            ]
        },
        {
            "name": "getHeapSnapshot",
            "parameters": [
                { "name": "uid", "type": "integer" }
            ]
        },
        {
            "name": "removeProfile",
            "parameters": [
                { "name": "type", "type": "string" },
                { "name": "uid", "type": "integer" }
            ]
        },
        {
            "name": "clearProfiles"
        },
        {
            "name": "takeHeapSnapshot",
            "parameters": [
                { "name": "reportProgress", "type": "boolean", "optional": true, "description": "If true 'reportHeapSnapshotProgress' events will be generated while snapshot is being taken." }
            ]
        },
        {
            "name": "collectGarbage"
        },
        {
            "name": "getObjectByHeapObjectId",
            "parameters": [
                { "name": "objectId", "$ref": "HeapSnapshotObjectId" },
                { "name": "objectGroup", "type": "string", "optional": true, "description": "Symbolic group name that can be used to release multiple objects." }
            ],
            "returns": [
                { "name": "result", "$ref": "Runtime.RemoteObject", "description": "Evaluation result." }
            ]
        },
        {
            "name": "getHeapObjectId",
            "parameters": [
                { "name": "objectId", "$ref": "Runtime.RemoteObjectId", "description": "Identifier of the object to get heap object id for." }
            ],
            "returns": [
                { "name": "heapSnapshotObjectId", "$ref": "HeapSnapshotObjectId", "description": "Id of the heap snapshot object corresponding to the passed remote object id." }
            ]
        }
    ],
    "events": [
        {
            "name": "addProfileHeader",
            "parameters": [
                { "name": "header", "$ref": "ProfileHeader" }
            ]
        },
        {
            "name": "addHeapSnapshotChunk",
            "parameters": [
                { "name": "uid", "type": "integer" },
                { "name": "chunk", "type": "string" }
            ]
        },
        {
            "name": "finishHeapSnapshot",
            "parameters": [
                { "name": "uid", "type": "integer" }
            ]
        },
        {
            "name": "setRecordingProfile",
            "parameters": [
                { "name": "isProfiling", "type": "boolean" }
            ]
        },
        {
            "name": "resetProfiles"
        },
        {
            "name": "reportHeapSnapshotProgress",
            "parameters": [
                { "name": "done", "type": "integer" },
                { "name": "total", "type": "integer" }
            ]
        }
    ]
}
