| /* | |
| * Licensed to the Apache Software Foundation (ASF) under one | |
| * or more contributor license agreements. See the NOTICE file | |
| * distributed with this work for additional information | |
| * regarding copyright ownership. The ASF licenses this file | |
| * to you under the Apache License, Version 2.0 (the | |
| * "License"); you may not use this file except in compliance | |
| * with the License. You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, | |
| * software distributed under the License is distributed on an | |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| * KIND, either express or implied. See the License for the | |
| * specific language governing permissions and limitations | |
| * under the License. | |
| */ | |
| import assert from 'node:assert/strict'; | |
| import { performance } from 'node:perf_hooks'; | |
| import { | |
| canonicalRuntimeResources, | |
| createRuntimeResourcePage, | |
| runtimeResourceRevision, | |
| } from '../../packages/runtime-host/dist/server/runtime-resource-projection.js'; | |
| import { | |
| decodeRuntimeResourceQueryResult, | |
| decodeHostFrame, | |
| encodeProtocolMessage, | |
| RUNTIME_RESOURCE_RESULT_MAX_BYTES, | |
| } from '../../packages/runtime-host/dist/protocol/index.js'; | |
| import { report, summarize } from './report.mjs'; | |
| const rows = []; | |
| const stringify = JSON.stringify; | |
| function workload(resources, countEncoding = false, duplicate = false, validate = true) { | |
| let calls = 0, | |
| encodedBytes = 0, | |
| wireBytes = 0; | |
| const seen = []; | |
| let canonical; | |
| if (countEncoding) | |
| JSON.stringify = function (...args) { | |
| const encoded = Reflect.apply(stringify, JSON, args); | |
| calls++; | |
| encodedBytes += Buffer.byteLength(encoded ?? '', 'utf8'); | |
| return encoded; | |
| }; | |
| try { | |
| canonical = canonicalRuntimeResources(resources); | |
| const revision = runtimeResourceRevision(canonical); | |
| let cursor = 0; | |
| do { | |
| const page = createRuntimeResourcePage('session-1', revision, canonical, cursor); | |
| if (duplicate) createRuntimeResourcePage('session-1', revision, canonical, cursor); | |
| // This is the existing final wire encoder; assertions run outside the counter. | |
| const bytes = encodeProtocolMessage({ | |
| operation: 'runtime.resource.query', | |
| requestId: 'perf', | |
| ok: true, | |
| result: page, | |
| }); | |
| wireBytes += bytes.length; | |
| seen.push({ page, bytes }); | |
| const next = page.nextCursor === null ? null : Number(page.nextCursor); | |
| assert( | |
| next === null || (Number.isSafeInteger(next) && next > cursor && next < resources.length), | |
| ); | |
| cursor = next; | |
| } while (cursor !== null); | |
| } finally { | |
| JSON.stringify = stringify; | |
| } | |
| const actual = []; | |
| for (const { page, bytes } of seen) { | |
| const decoded = decodeRuntimeResourceQueryResult(decodeHostFrame(JSON.parse(bytes)).result); | |
| if (validate) { | |
| assert(Buffer.byteLength(stringify(page), 'utf8') <= RUNTIME_RESOURCE_RESULT_MAX_BYTES); | |
| assert.deepEqual(decoded, page); | |
| actual.push(...page.resources); | |
| } | |
| } | |
| if (validate) { | |
| assert.deepEqual( | |
| actual.map((r) => r.result.ref), | |
| [...resources] | |
| .sort((a, b) => a.result.ref.localeCompare(b.result.ref)) | |
| .map((r) => r.result.ref), | |
| ); | |
| assert(actual.every((r) => r.result.cmd.includes('δΈζπ'))); | |
| assert.deepEqual(actual, canonical); | |
| } | |
| return { calls, encodedBytes, wireBytes, pages: seen.length }; | |
| } | |
| for (const payload of [32, 8192]) { | |
| for (const size of [8, 32, 128]) { | |
| const resources = Array.from({ length: size }, (_, i) => ({ | |
| sessionId: 'session-1', | |
| ownership: { kind: 'local' }, | |
| sourceTurnId: 'turn-1', | |
| sourceToolCallId: 'call-' + i, | |
| result: { | |
| kind: 'shell_run', | |
| ref: 'maka://runtime/background-tasks/shell-' + i, | |
| mode: 'pipes', | |
| status: 'running', | |
| cwd: '/workspace', | |
| cmd: 'δΈζπ' + 'x'.repeat(payload), | |
| startedAt: 1, | |
| updatedAt: 1, | |
| revision: 1, | |
| }, | |
| })); | |
| const counts = workload(resources, true); | |
| const negative = workload(resources, true, true); | |
| assert(negative.encodedBytes > counts.encodedBytes, 'Duplicate page work must be detectable'); | |
| const samples = []; | |
| for (let i = 0; i < 11; i++) { | |
| const start = performance.now(); | |
| workload(resources, false, false, false); | |
| if (i) samples.push(performance.now() - start); | |
| } | |
| const scenario = 'runtime-resource/' + size + 'x' + payload; | |
| rows.push({ scenario, metric: 'warm-projection-codec-ms', ...summarize(samples) }); | |
| for (const metric of ['calls', 'encodedBytes', 'wireBytes', 'pages']) | |
| rows.push({ scenario, metric, ...summarize([counts[metric]]) }); | |
| rows.push({ | |
| scenario, | |
| metric: 'negative-control-encodedBytes', | |
| ...summarize([negative.encodedBytes]), | |
| }); | |
| } | |
| } | |
| await report( | |
| 'protocol', | |
| { | |
| fixture: 'runtime-resource-v1', | |
| repetitions: 10, | |
| warmup: 1, | |
| conditions: | |
| 'Synthetic in-process production projection + wire encoding/decoding; no disk/network. Fresh objects per scale, warm process. Correctness assertions run before timing; the cursor progress guard remains timed.', | |
| limits: | |
| 'JSON.stringify instrumentation counts UTF-8 output work separately from timing; not allocations, SQLite I/O or whole Host latency. Includes canonicalization, revision and decoder work. Negative control duplicates production page call only in harness.', | |
| }, | |
| rows, | |
| ); |