@openmixer/plugin-qualify 0.0.0-stage → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +674 -0
- package/README.md +203 -2
- package/bin/plugin-qualify.mjs +77 -0
- package/dist/clap-loader.d.ts +147 -0
- package/dist/clap-loader.js +252 -0
- package/dist/clap-loader.js.map +1 -0
- package/dist/clap-qualify.d.ts +126 -0
- package/dist/clap-qualify.js +272 -0
- package/dist/clap-qualify.js.map +1 -0
- package/dist/host-profiles.d.ts +42 -0
- package/dist/host-profiles.js +106 -0
- package/dist/host-profiles.js.map +1 -0
- package/dist/hosting-codes.d.ts +62 -0
- package/dist/hosting-codes.js +72 -0
- package/dist/hosting-codes.js.map +1 -0
- package/dist/hosting-suitability.d.ts +354 -0
- package/dist/hosting-suitability.js +654 -0
- package/dist/hosting-suitability.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/loader.d.ts +26 -0
- package/dist/loader.js +9 -0
- package/dist/loader.js.map +1 -0
- package/dist/lv2-loader.d.ts +7 -0
- package/dist/lv2-loader.js +50 -0
- package/dist/lv2-loader.js.map +1 -0
- package/dist/measurement/cli.d.ts +168 -0
- package/dist/measurement/cli.js +353 -0
- package/dist/measurement/cli.js.map +1 -0
- package/dist/measurement/fixtures.d.ts +23 -0
- package/dist/measurement/fixtures.js +129 -0
- package/dist/measurement/fixtures.js.map +1 -0
- package/dist/measurement/format.d.ts +483 -0
- package/dist/measurement/format.js +627 -0
- package/dist/measurement/format.js.map +1 -0
- package/dist/measurement/guards.d.ts +33 -0
- package/dist/measurement/guards.js +61 -0
- package/dist/measurement/guards.js.map +1 -0
- package/dist/measurement/index.d.ts +36 -0
- package/dist/measurement/index.js +39 -0
- package/dist/measurement/index.js.map +1 -0
- package/dist/measurement/merge.d.ts +143 -0
- package/dist/measurement/merge.js +315 -0
- package/dist/measurement/merge.js.map +1 -0
- package/dist/measurement/plan.d.ts +127 -0
- package/dist/measurement/plan.js +141 -0
- package/dist/measurement/plan.js.map +1 -0
- package/dist/measurement/probe-json.d.ts +61 -0
- package/dist/measurement/probe-json.js +253 -0
- package/dist/measurement/probe-json.js.map +1 -0
- package/dist/measurement/provenance.d.ts +91 -0
- package/dist/measurement/provenance.js +173 -0
- package/dist/measurement/provenance.js.map +1 -0
- package/dist/measurement/sweep-jsonl.d.ts +40 -0
- package/dist/measurement/sweep-jsonl.js +154 -0
- package/dist/measurement/sweep-jsonl.js.map +1 -0
- package/dist/measurement/vocabulary.d.ts +125 -0
- package/dist/measurement/vocabulary.js +217 -0
- package/dist/measurement/vocabulary.js.map +1 -0
- package/dist/qualify-cli.d.ts +83 -0
- package/dist/qualify-cli.js +224 -0
- package/dist/qualify-cli.js.map +1 -0
- package/dist/qualify-declarations.d.ts +98 -0
- package/dist/qualify-declarations.js +76 -0
- package/dist/qualify-declarations.js.map +1 -0
- package/dist/qualify-options.d.ts +22 -0
- package/dist/qualify-options.js +36 -0
- package/dist/qualify-options.js.map +1 -0
- package/dist/rating.d.ts +32 -0
- package/dist/rating.js +30 -0
- package/dist/rating.js.map +1 -0
- package/dist/tool-paths.d.ts +12 -0
- package/dist/tool-paths.js +29 -0
- package/dist/tool-paths.js.map +1 -0
- package/fixtures/clap-scan/controls.json +8 -0
- package/fixtures/clap-scan/fake.json +16 -0
- package/fixtures/clap-scan/mixed.json +18 -0
- package/fixtures/zero-path.lv2/manifest.ttl +3 -0
- package/fixtures/zero-path.lv2/zero-path.c +85 -0
- package/fixtures/zero-path.lv2/zero-path.ttl +21 -0
- package/package.json +91 -3
- package/src/clap-loader.ts +393 -0
- package/src/clap-qualify.ts +387 -0
- package/src/host-profiles.ts +122 -0
- package/src/hosting-codes.ts +71 -0
- package/src/hosting-suitability.ts +982 -0
- package/src/index.ts +19 -0
- package/src/loader.ts +30 -0
- package/src/lv2-loader.ts +50 -0
- package/src/measurement/cli.ts +458 -0
- package/src/measurement/fixtures.ts +141 -0
- package/src/measurement/format.ts +1064 -0
- package/src/measurement/guards.ts +64 -0
- package/src/measurement/index.ts +39 -0
- package/src/measurement/merge.ts +434 -0
- package/src/measurement/plan.ts +219 -0
- package/src/measurement/probe-json.ts +271 -0
- package/src/measurement/provenance.ts +220 -0
- package/src/measurement/sweep-jsonl.ts +173 -0
- package/src/measurement/vocabulary.ts +298 -0
- package/src/qualify-cli.ts +277 -0
- package/src/qualify-declarations.ts +117 -0
- package/src/qualify-options.ts +49 -0
- package/src/rating.ts +53 -0
- package/src/tool-paths.ts +32 -0
- package/tools/_declarations.py +21 -0
- package/tools/benchmark.py +2462 -0
- package/tools/gen-python-declarations.d.mts +4 -0
- package/tools/gen-python-declarations.mjs +92 -0
- package/tools/hosting-sweep.mjs +51 -0
- package/tools/lv2-measure.mjs +204 -0
- package/tools/lv2_presets.py +132 -0
- package/tools/scan.py +432 -0
|
@@ -0,0 +1,627 @@
|
|
|
1
|
+
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
2
|
+
// Copyright (C) 2026 Pau Aliagas <linuxnow@gmail.com>
|
|
3
|
+
/**
|
|
4
|
+
* **The LV2 plugin measurement interchange format** — one measurement run, on one
|
|
5
|
+
* machine, in one document.
|
|
6
|
+
*
|
|
7
|
+
* `lv2:latency` is a declared port and it is often wrong: the 958-plugin sweep behind
|
|
8
|
+
* `data/catalog.json` found 57 declared-vs-measured mismatches. Measured figures exist in
|
|
9
|
+
* several projects and are shared by none of them, because there is no shape to share them
|
|
10
|
+
* in. This is that shape. The schema is the deliverable; the prober is replaceable.
|
|
11
|
+
*
|
|
12
|
+
* ## The three rules the format exists to enforce
|
|
13
|
+
*
|
|
14
|
+
* 1. **A figure carries the conditions it was taken under.** {@link MeasurementRun} is not
|
|
15
|
+
* optional metadata and is not a footer — it is the document's other half. A cost
|
|
16
|
+
* figure without its host, governor, block and stimulus is a decoration; a latency
|
|
17
|
+
* figure without the plugin's version is a trap, because the next release moves the FFT
|
|
18
|
+
* window and the number silently becomes a lie.
|
|
19
|
+
* 2. **Unknown is a value.** A plugin that could not be measured carries a REASON from a
|
|
20
|
+
* controlled vocabulary ({@link ./vocabulary.ts}) and no number at all. Nothing in this
|
|
21
|
+
* format has a default: an absent field means "not determined", never zero and never
|
|
22
|
+
* false. Readers here return `undefined` rather than inventing.
|
|
23
|
+
* 3. **Per rate, always.** Latency does not scale one way and cost does not scale at all
|
|
24
|
+
* predictably — 19 plugins in the reference sweep fit neither scaling law, and 48 cost
|
|
25
|
+
* figures grow with the SQUARE of the rate. A single-rate document is a claim about one
|
|
26
|
+
* rate and the format will not let it pretend otherwise: every figure lives under an
|
|
27
|
+
* explicit rate key.
|
|
28
|
+
*
|
|
29
|
+
* ## Version strategy
|
|
30
|
+
*
|
|
31
|
+
* `formatVersion` is `"<major>.<minor>"`.
|
|
32
|
+
*
|
|
33
|
+
* - **major** changes when a reader written for the previous major would MISREAD a
|
|
34
|
+
* document: a field removed, renamed, re-scaled, or given a new meaning. A reader that
|
|
35
|
+
* meets a higher major must refuse the document ({@link readMeasurementDocument} does),
|
|
36
|
+
* because the alternative is silently consuming figures it has misunderstood.
|
|
37
|
+
* - **minor** changes are additive only: new optional fields, new vocabulary terms. A
|
|
38
|
+
* reader at minor N reads minor N+1 fine, ignoring what it does not know — and is TOLD
|
|
39
|
+
* it is doing so ({@link MeasurementReadResult.forwardMinor}), so a UI can say "this
|
|
40
|
+
* document was written by a newer tool" instead of quietly dropping data.
|
|
41
|
+
*
|
|
42
|
+
* Unknown fields are preserved nowhere and that is deliberate: a reader that round-trips
|
|
43
|
+
* fields it does not understand invites a consumer to depend on them. Re-emit from the
|
|
44
|
+
* original document, never from a parse.
|
|
45
|
+
*/
|
|
46
|
+
import { booleanValue, finiteNumber, isRecord, mapArray, nonEmptyString, optional, positiveNumber, } from "./guards.js";
|
|
47
|
+
import { HOST_ISOLATIONS, HOST_LATENCY_HANDLING, MEASUREMENT_DIMENSIONS, VERDICT_RATINGS, readDimension, } from "./vocabulary.js";
|
|
48
|
+
/** The `format` discriminator every document carries. Never absent, never anything else. */
|
|
49
|
+
export const MEASUREMENT_FORMAT_ID = "lv2-plugin-measurements";
|
|
50
|
+
/** The major this build writes and is guaranteed to understand. */
|
|
51
|
+
export const MEASUREMENT_FORMAT_MAJOR = 1;
|
|
52
|
+
/** The minor this build writes. Additive-only within {@link MEASUREMENT_FORMAT_MAJOR}.
|
|
53
|
+
* `1.1` added the three hosting dimensions — {@link StabilityMeasurement},
|
|
54
|
+
* {@link RtSafetyMeasurement}, {@link FeaturesMeasurement} — which a 1.0 reader skips. */
|
|
55
|
+
export const MEASUREMENT_FORMAT_MINOR = 2;
|
|
56
|
+
/** The version string this build writes, e.g. `"1.0"`. */
|
|
57
|
+
export const MEASUREMENT_FORMAT_VERSION = `${MEASUREMENT_FORMAT_MAJOR}.${MEASUREMENT_FORMAT_MINOR}`;
|
|
58
|
+
/**
|
|
59
|
+
* Parse a `"<major>.<minor>"` version, or `undefined` when it is not one.
|
|
60
|
+
*
|
|
61
|
+
* Deliberately strict — two non-negative integers and nothing else. A version we cannot
|
|
62
|
+
* parse is a document we cannot claim to understand, and guessing at `"1"` or `"1.0.0"`
|
|
63
|
+
* would be exactly the sloppiness a version field exists to prevent.
|
|
64
|
+
*/
|
|
65
|
+
export function parseFormatVersion(value) {
|
|
66
|
+
const text = nonEmptyString(value);
|
|
67
|
+
if (text === undefined)
|
|
68
|
+
return undefined;
|
|
69
|
+
const match = /^(\d+)\.(\d+)$/.exec(text);
|
|
70
|
+
if (match === null)
|
|
71
|
+
return undefined;
|
|
72
|
+
const major = Number(match[1]);
|
|
73
|
+
const minor = Number(match[2]);
|
|
74
|
+
if (!Number.isSafeInteger(major) || !Number.isSafeInteger(minor))
|
|
75
|
+
return undefined;
|
|
76
|
+
return { major, minor };
|
|
77
|
+
}
|
|
78
|
+
const isStringList = (v) => Array.isArray(v) && v.every((x) => typeof x === "string" && x !== "");
|
|
79
|
+
const isPositive = (v) => typeof v === "number" && Number.isFinite(v) && v > 0;
|
|
80
|
+
/**
|
|
81
|
+
* Read a host profile — a document's, or a project's own file. Every field is required and
|
|
82
|
+
* typed; a missing or mistyped one is refused by name, and a host the reader was not told about
|
|
83
|
+
* is never filled in from a default.
|
|
84
|
+
*/
|
|
85
|
+
export function readHostProfile(value) {
|
|
86
|
+
if (!isRecord(value))
|
|
87
|
+
return { ok: false, problem: "a host profile is a JSON object" };
|
|
88
|
+
const { id, lv2Features, clapExtensions, instruments, cost, latency, isolation } = value;
|
|
89
|
+
if (typeof id !== "string" || id === "")
|
|
90
|
+
return { ok: false, problem: "id: a non-empty string" };
|
|
91
|
+
if (!isStringList(lv2Features))
|
|
92
|
+
return { ok: false, problem: "lv2Features: a list of feature URIs" };
|
|
93
|
+
if (clapExtensions !== null && !isStringList(clapExtensions)) {
|
|
94
|
+
return { ok: false, problem: "clapExtensions: a list of extension ids, or null for no CLAP" };
|
|
95
|
+
}
|
|
96
|
+
if (typeof instruments !== "boolean")
|
|
97
|
+
return { ok: false, problem: "instruments: true or false" };
|
|
98
|
+
if (!isRecord(cost) || !isPositive(cost.coreFractionCeiling) || !isPositive(cost.rate) || !isPositive(cost.quantum)) {
|
|
99
|
+
return { ok: false, problem: "cost: { coreFractionCeiling, rate, quantum }, each a positive number" };
|
|
100
|
+
}
|
|
101
|
+
if (!Number.isInteger(cost.rate) || !Number.isInteger(cost.quantum)) {
|
|
102
|
+
return { ok: false, problem: "cost: rate and quantum are integers" };
|
|
103
|
+
}
|
|
104
|
+
if (!HOST_LATENCY_HANDLING.includes(latency)) {
|
|
105
|
+
return { ok: false, problem: `latency: one of ${HOST_LATENCY_HANDLING.join(", ")}` };
|
|
106
|
+
}
|
|
107
|
+
if (!HOST_ISOLATIONS.includes(isolation)) {
|
|
108
|
+
return { ok: false, problem: `isolation: one of ${HOST_ISOLATIONS.join(", ")}` };
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
ok: true,
|
|
112
|
+
profile: {
|
|
113
|
+
id,
|
|
114
|
+
lv2Features,
|
|
115
|
+
clapExtensions,
|
|
116
|
+
instruments,
|
|
117
|
+
cost: { coreFractionCeiling: cost.coreFractionCeiling, rate: cost.rate, quantum: cost.quantum },
|
|
118
|
+
latency: latency,
|
|
119
|
+
isolation: isolation,
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/** A verdict as written, or `undefined`: its host must be declared, `qualified` must be its rating's. */
|
|
124
|
+
function readVerdict(value, hosts) {
|
|
125
|
+
if (!isRecord(value))
|
|
126
|
+
return undefined;
|
|
127
|
+
const uri = nonEmptyString(value.uri);
|
|
128
|
+
const host = nonEmptyString(value.host);
|
|
129
|
+
const rating = VERDICT_RATINGS.includes(value.rating) ? value.rating : undefined;
|
|
130
|
+
if (uri === undefined || host === undefined || !hosts.has(host) || rating === undefined)
|
|
131
|
+
return undefined;
|
|
132
|
+
if (value.qualified !== (rating === "suitable"))
|
|
133
|
+
return undefined;
|
|
134
|
+
if (value.deciding !== undefined && nonEmptyString(value.deciding) === undefined)
|
|
135
|
+
return undefined;
|
|
136
|
+
return { uri, host, rating, qualified: rating === "suitable", ...optional("deciding", nonEmptyString(value.deciding)) };
|
|
137
|
+
}
|
|
138
|
+
function readToolchain(value) {
|
|
139
|
+
if (!isRecord(value))
|
|
140
|
+
return undefined;
|
|
141
|
+
const out = {};
|
|
142
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
143
|
+
const text = nonEmptyString(entry);
|
|
144
|
+
if (text !== undefined)
|
|
145
|
+
out[key] = text;
|
|
146
|
+
}
|
|
147
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
148
|
+
}
|
|
149
|
+
function readHost(value) {
|
|
150
|
+
if (!isRecord(value))
|
|
151
|
+
return undefined;
|
|
152
|
+
const hostname = nonEmptyString(value.hostname);
|
|
153
|
+
const realtimePriority = booleanValue(value.realtimePriority);
|
|
154
|
+
const memoryLocked = booleanValue(value.memoryLocked);
|
|
155
|
+
if (hostname === undefined || realtimePriority === undefined || memoryLocked === undefined) {
|
|
156
|
+
return undefined;
|
|
157
|
+
}
|
|
158
|
+
return {
|
|
159
|
+
hostname,
|
|
160
|
+
realtimePriority,
|
|
161
|
+
memoryLocked,
|
|
162
|
+
...optional("kernel", nonEmptyString(value.kernel)),
|
|
163
|
+
...optional("os", nonEmptyString(value.os)),
|
|
164
|
+
...optional("cpuModel", nonEmptyString(value.cpuModel)),
|
|
165
|
+
...optional("cpuCount", finiteNumber(value.cpuCount)),
|
|
166
|
+
...optional("pinnedCpu", finiteNumber(value.pinnedCpu)),
|
|
167
|
+
...optional("pinnedCpuKind", nonEmptyString(value.pinnedCpuKind)),
|
|
168
|
+
...optional("pinnedCpuMaxKHz", finiteNumber(value.pinnedCpuMaxKHz)),
|
|
169
|
+
...optional("governor", nonEmptyString(value.governor)),
|
|
170
|
+
...optional("turboEnabled", booleanValue(value.turboEnabled)),
|
|
171
|
+
...optional("toolchain", readToolchain(value.toolchain)),
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
function readLatencyMethod(value) {
|
|
175
|
+
if (!isRecord(value))
|
|
176
|
+
return undefined;
|
|
177
|
+
const method = nonEmptyString(value.method);
|
|
178
|
+
const blockFrames = positiveNumber(value.blockFrames);
|
|
179
|
+
const stimulus = nonEmptyString(value.stimulus);
|
|
180
|
+
const paramSweep = booleanValue(value.paramSweep);
|
|
181
|
+
if (method === undefined || blockFrames === undefined || stimulus === undefined || paramSweep === undefined) {
|
|
182
|
+
return undefined;
|
|
183
|
+
}
|
|
184
|
+
return { method, blockFrames, stimulus, paramSweep };
|
|
185
|
+
}
|
|
186
|
+
function readCostMethod(value) {
|
|
187
|
+
if (!isRecord(value))
|
|
188
|
+
return undefined;
|
|
189
|
+
const method = nonEmptyString(value.method);
|
|
190
|
+
const blockFrames = positiveNumber(value.blockFrames);
|
|
191
|
+
const warmupBlocks = finiteNumber(value.warmupBlocks);
|
|
192
|
+
const percentile = finiteNumber(value.percentile);
|
|
193
|
+
const stimulus = nonEmptyString(value.stimulus);
|
|
194
|
+
const controls = nonEmptyString(value.controls);
|
|
195
|
+
if (method === undefined ||
|
|
196
|
+
blockFrames === undefined ||
|
|
197
|
+
warmupBlocks === undefined ||
|
|
198
|
+
percentile === undefined ||
|
|
199
|
+
stimulus === undefined ||
|
|
200
|
+
controls === undefined) {
|
|
201
|
+
return undefined;
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
method,
|
|
205
|
+
blockFrames,
|
|
206
|
+
warmupBlocks,
|
|
207
|
+
percentile,
|
|
208
|
+
stimulus,
|
|
209
|
+
controls,
|
|
210
|
+
...optional("minTimedBlocks", finiteNumber(value.minTimedBlocks)),
|
|
211
|
+
...optional("maxTimedBlocks", finiteNumber(value.maxTimedBlocks)),
|
|
212
|
+
...optional("targetSecondsPerPlugin", finiteNumber(value.targetSecondsPerPlugin)),
|
|
213
|
+
...optional("timingFloorNsPerBlock", finiteNumber(value.timingFloorNsPerBlock)),
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
function readRun(value) {
|
|
217
|
+
if (!isRecord(value))
|
|
218
|
+
return undefined;
|
|
219
|
+
const id = nonEmptyString(value.id);
|
|
220
|
+
const measuredAt = nonEmptyString(value.measuredAt);
|
|
221
|
+
const host = readHost(value.host);
|
|
222
|
+
const note = nonEmptyString(value.note);
|
|
223
|
+
const relativeRankingOnly = booleanValue(value.relativeRankingOnly);
|
|
224
|
+
const dimensions = mapArray(value.dimensions, readDimension);
|
|
225
|
+
const rates = mapArray(value.rates, positiveNumber);
|
|
226
|
+
const tool = isRecord(value.tool)
|
|
227
|
+
? { name: nonEmptyString(value.tool.name), version: nonEmptyString(value.tool.version) }
|
|
228
|
+
: undefined;
|
|
229
|
+
if (id === undefined ||
|
|
230
|
+
measuredAt === undefined ||
|
|
231
|
+
host === undefined ||
|
|
232
|
+
note === undefined ||
|
|
233
|
+
relativeRankingOnly === undefined ||
|
|
234
|
+
dimensions === undefined ||
|
|
235
|
+
rates === undefined ||
|
|
236
|
+
tool?.name === undefined ||
|
|
237
|
+
tool.version === undefined) {
|
|
238
|
+
return undefined;
|
|
239
|
+
}
|
|
240
|
+
const method = isRecord(value.method) ? value.method : {};
|
|
241
|
+
return {
|
|
242
|
+
id,
|
|
243
|
+
measuredAt,
|
|
244
|
+
dimensions,
|
|
245
|
+
rates: [...rates].sort((a, b) => a - b),
|
|
246
|
+
tool: { name: tool.name, version: tool.version },
|
|
247
|
+
host,
|
|
248
|
+
method: {
|
|
249
|
+
...optional("latency", readLatencyMethod(method.latency)),
|
|
250
|
+
...optional("cost", readCostMethod(method.cost)),
|
|
251
|
+
},
|
|
252
|
+
relativeRankingOnly,
|
|
253
|
+
note,
|
|
254
|
+
...optional("elapsedSeconds", finiteNumber(value.elapsedSeconds)),
|
|
255
|
+
...optional("label", nonEmptyString(value.label)),
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
function readTopology(value) {
|
|
259
|
+
if (!isRecord(value))
|
|
260
|
+
return undefined;
|
|
261
|
+
const audioInputs = finiteNumber(value.audioInputs);
|
|
262
|
+
const audioOutputs = finiteNumber(value.audioOutputs);
|
|
263
|
+
if (audioInputs === undefined || audioOutputs === undefined)
|
|
264
|
+
return undefined;
|
|
265
|
+
return {
|
|
266
|
+
audioInputs,
|
|
267
|
+
audioOutputs,
|
|
268
|
+
...optional("midiInputs", finiteNumber(value.midiInputs)),
|
|
269
|
+
...optional("controlInputs", finiteNumber(value.controlInputs)),
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Read a `{ "48000": {...} }` rate map, keeping only entries whose KEY is a positive
|
|
274
|
+
* integer rate and whose value the item reader accepted. A rate key that is not a number
|
|
275
|
+
* is not a rate, and silently keeping it would let `"default"` masquerade as one.
|
|
276
|
+
*/
|
|
277
|
+
function readRateMap(value, read) {
|
|
278
|
+
if (!isRecord(value))
|
|
279
|
+
return {};
|
|
280
|
+
const out = {};
|
|
281
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
282
|
+
const rate = positiveNumber(Number(key));
|
|
283
|
+
if (rate === undefined || !Number.isInteger(rate))
|
|
284
|
+
continue;
|
|
285
|
+
const parsed = read(entry);
|
|
286
|
+
if (parsed !== undefined)
|
|
287
|
+
out[String(rate)] = parsed;
|
|
288
|
+
}
|
|
289
|
+
return out;
|
|
290
|
+
}
|
|
291
|
+
function readLatencyAtRate(value) {
|
|
292
|
+
if (!isRecord(value))
|
|
293
|
+
return undefined;
|
|
294
|
+
const frames = finiteNumber(value.frames);
|
|
295
|
+
const ms = finiteNumber(value.ms);
|
|
296
|
+
if (frames === undefined || ms === undefined)
|
|
297
|
+
return undefined;
|
|
298
|
+
return {
|
|
299
|
+
frames,
|
|
300
|
+
ms,
|
|
301
|
+
...optional("stimulus", nonEmptyString(value.stimulus)),
|
|
302
|
+
...optional("excludedReason", nonEmptyString(value.excludedReason)),
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
function readSweepControls(value) {
|
|
306
|
+
if (!isRecord(value))
|
|
307
|
+
return {};
|
|
308
|
+
const out = {};
|
|
309
|
+
for (const [symbol, entry] of Object.entries(value)) {
|
|
310
|
+
if (!isRecord(entry))
|
|
311
|
+
continue;
|
|
312
|
+
const minFrames = finiteNumber(entry.minFrames);
|
|
313
|
+
const maxFrames = finiteNumber(entry.maxFrames);
|
|
314
|
+
if (minFrames === undefined || maxFrames === undefined)
|
|
315
|
+
continue;
|
|
316
|
+
out[symbol] = { minFrames, maxFrames };
|
|
317
|
+
}
|
|
318
|
+
return out;
|
|
319
|
+
}
|
|
320
|
+
function readParamSweep(value) {
|
|
321
|
+
if (!isRecord(value))
|
|
322
|
+
return undefined;
|
|
323
|
+
const rate = positiveNumber(value.rate);
|
|
324
|
+
const defaultFrames = finiteNumber(value.defaultFrames);
|
|
325
|
+
const minFrames = finiteNumber(value.minFrames);
|
|
326
|
+
const maxFrames = finiteNumber(value.maxFrames);
|
|
327
|
+
if (rate === undefined || defaultFrames === undefined || minFrames === undefined || maxFrames === undefined) {
|
|
328
|
+
return undefined;
|
|
329
|
+
}
|
|
330
|
+
return { rate, defaultFrames, minFrames, maxFrames, controls: readSweepControls(value.controls) };
|
|
331
|
+
}
|
|
332
|
+
function readLatency(value) {
|
|
333
|
+
if (!isRecord(value))
|
|
334
|
+
return undefined;
|
|
335
|
+
const perRate = readRateMap(value.perRate, readLatencyAtRate);
|
|
336
|
+
return {
|
|
337
|
+
perRate,
|
|
338
|
+
...optional("scalingClass", nonEmptyString(value.scalingClass)),
|
|
339
|
+
...optional("scalingNote", nonEmptyString(value.scalingNote)),
|
|
340
|
+
...optional("declaredPortSymbol", nonEmptyString(value.declaredPortSymbol)),
|
|
341
|
+
...optional("declaredFrames", finiteNumber(value.declaredFrames)),
|
|
342
|
+
...optional("declaredMismatch", booleanValue(value.declaredMismatch)),
|
|
343
|
+
...optional("paramSweep", readParamSweep(value.paramSweep)),
|
|
344
|
+
...optional("unmeasuredReason", nonEmptyString(value.unmeasuredReason)),
|
|
345
|
+
...optional("unmeasuredDetail", nonEmptyString(value.unmeasuredDetail)),
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
function readCostAtRate(value) {
|
|
349
|
+
if (!isRecord(value))
|
|
350
|
+
return undefined;
|
|
351
|
+
const nsPerSampleMedian = finiteNumber(value.nsPerSampleMedian);
|
|
352
|
+
const nsPerSamplePercentile = finiteNumber(value.nsPerSamplePercentile);
|
|
353
|
+
const blocks = finiteNumber(value.blocks);
|
|
354
|
+
const blockFrames = positiveNumber(value.blockFrames);
|
|
355
|
+
if (nsPerSampleMedian === undefined ||
|
|
356
|
+
nsPerSamplePercentile === undefined ||
|
|
357
|
+
blocks === undefined ||
|
|
358
|
+
blockFrames === undefined) {
|
|
359
|
+
return undefined;
|
|
360
|
+
}
|
|
361
|
+
return {
|
|
362
|
+
nsPerSampleMedian,
|
|
363
|
+
nsPerSamplePercentile,
|
|
364
|
+
blocks,
|
|
365
|
+
blockFrames,
|
|
366
|
+
...optional("nsPerSampleMin", finiteNumber(value.nsPerSampleMin)),
|
|
367
|
+
...optional("nsPerSampleMax", finiteNumber(value.nsPerSampleMax)),
|
|
368
|
+
...optional("warmupNsPerSampleMedian", finiteNumber(value.warmupNsPerSampleMedian)),
|
|
369
|
+
...optional("silentOutput", booleanValue(value.silentOutput)),
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
function readCost(value) {
|
|
373
|
+
if (!isRecord(value))
|
|
374
|
+
return undefined;
|
|
375
|
+
return {
|
|
376
|
+
perRate: readRateMap(value.perRate, readCostAtRate),
|
|
377
|
+
...optional("unmeasuredReason", nonEmptyString(value.unmeasuredReason)),
|
|
378
|
+
...optional("unmeasuredDetail", nonEmptyString(value.unmeasuredDetail)),
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
function reasonOf(value) {
|
|
382
|
+
return {
|
|
383
|
+
...optional("unmeasuredReason", nonEmptyString(value.unmeasuredReason)),
|
|
384
|
+
...optional("unmeasuredDetail", nonEmptyString(value.unmeasuredDetail)),
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
/** A lifecycle reading, or `undefined` unless all three counts are there. */
|
|
388
|
+
export function readLifecycle(value) {
|
|
389
|
+
if (!isRecord(value))
|
|
390
|
+
return undefined;
|
|
391
|
+
const cycles = finiteNumber(value.cycles);
|
|
392
|
+
const instantiated = finiteNumber(value.instantiated);
|
|
393
|
+
const failed = finiteNumber(value.failed);
|
|
394
|
+
if (cycles === undefined || instantiated === undefined || failed === undefined)
|
|
395
|
+
return undefined;
|
|
396
|
+
return { cycles, instantiated, failed };
|
|
397
|
+
}
|
|
398
|
+
/** A thread reading, or `undefined` without its before/after pair. */
|
|
399
|
+
export function readThreads(value) {
|
|
400
|
+
if (!isRecord(value))
|
|
401
|
+
return undefined;
|
|
402
|
+
const before = finiteNumber(value.before);
|
|
403
|
+
const afterFirstInstantiate = finiteNumber(value.afterFirstInstantiate);
|
|
404
|
+
if (before === undefined || afterFirstInstantiate === undefined)
|
|
405
|
+
return undefined;
|
|
406
|
+
return {
|
|
407
|
+
before,
|
|
408
|
+
afterFirstInstantiate,
|
|
409
|
+
...optional("afterAllFreed", finiteNumber(value.afterAllFreed)),
|
|
410
|
+
...optional("leaked", finiteNumber(value.leaked)),
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
function readCrash(value) {
|
|
414
|
+
if (!isRecord(value))
|
|
415
|
+
return undefined;
|
|
416
|
+
return {
|
|
417
|
+
...optional("signal", nonEmptyString(value.signal)),
|
|
418
|
+
...optional("topFrame", nonEmptyString(value.topFrame)),
|
|
419
|
+
...optional("sanitizer", nonEmptyString(value.sanitizer)),
|
|
420
|
+
...optional("frameObject", nonEmptyString(value.frameObject)),
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
/** One soak rate. Every field optional: a rate that died carries `died` and nothing else. */
|
|
424
|
+
export function readSoakAtRate(value) {
|
|
425
|
+
if (!isRecord(value))
|
|
426
|
+
return undefined;
|
|
427
|
+
return {
|
|
428
|
+
...optional("died", booleanValue(value.died)),
|
|
429
|
+
...optional("instantiated", booleanValue(value.instantiated)),
|
|
430
|
+
...optional("seconds", finiteNumber(value.seconds)),
|
|
431
|
+
...optional("blockFrames", positiveNumber(value.blockFrames)),
|
|
432
|
+
...optional("windows", finiteNumber(value.windows)),
|
|
433
|
+
...optional("nonFiniteWindows", finiteNumber(value.nonFiniteWindows)),
|
|
434
|
+
...optional("silentWindows", finiteNumber(value.silentWindows)),
|
|
435
|
+
...optional("firstRmsDbfs", finiteNumber(value.firstRmsDbfs)),
|
|
436
|
+
...optional("lastRmsDbfs", finiteNumber(value.lastRmsDbfs)),
|
|
437
|
+
...optional("minRmsDbfs", finiteNumber(value.minRmsDbfs)),
|
|
438
|
+
...optional("rssStartKb", finiteNumber(value.rssStartKb)),
|
|
439
|
+
...optional("rssMaxKb", finiteNumber(value.rssMaxKb)),
|
|
440
|
+
...optional("rssGrowthKb", finiteNumber(value.rssGrowthKb)),
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
function readSoak(value) {
|
|
444
|
+
if (!isRecord(value))
|
|
445
|
+
return undefined;
|
|
446
|
+
const sweptParams = booleanValue(value.sweptParams);
|
|
447
|
+
if (sweptParams === undefined)
|
|
448
|
+
return undefined;
|
|
449
|
+
return { sweptParams, perRate: readRateMap(value.perRate, readSoakAtRate) };
|
|
450
|
+
}
|
|
451
|
+
function readStability(value) {
|
|
452
|
+
if (!isRecord(value))
|
|
453
|
+
return undefined;
|
|
454
|
+
return {
|
|
455
|
+
...optional("lifecycle", readLifecycle(value.lifecycle)),
|
|
456
|
+
...optional("threads", readThreads(value.threads)),
|
|
457
|
+
...optional("crashes", mapArray(value.crashes, readCrash)),
|
|
458
|
+
...optional("soak", readSoak(value.soak)),
|
|
459
|
+
...reasonOf(value),
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
function readRtSafety(value) {
|
|
463
|
+
if (!isRecord(value))
|
|
464
|
+
return undefined;
|
|
465
|
+
return {
|
|
466
|
+
...optional("rate", positiveNumber(value.rate)),
|
|
467
|
+
...optional("blockFrames", positiveNumber(value.blockFrames)),
|
|
468
|
+
...optional("blocks", finiteNumber(value.blocks)),
|
|
469
|
+
...optional("repeats", finiteNumber(value.repeats)),
|
|
470
|
+
...optional("interposer", booleanValue(value.interposer)),
|
|
471
|
+
...optional("swept", booleanValue(value.swept)),
|
|
472
|
+
...optional("sweepApplicable", booleanValue(value.sweepApplicable)),
|
|
473
|
+
...optional("allocationsInRun", finiteNumber(value.allocationsInRun)),
|
|
474
|
+
...optional("allocationsMin", finiteNumber(value.allocationsMin)),
|
|
475
|
+
...optional("locksInRun", finiteNumber(value.locksInRun)),
|
|
476
|
+
...optional("syscallsInRun", finiteNumber(value.syscallsInRun)),
|
|
477
|
+
...optional("variable", booleanValue(value.variable)),
|
|
478
|
+
...reasonOf(value),
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
function readFeatures(value) {
|
|
482
|
+
if (!isRecord(value))
|
|
483
|
+
return undefined;
|
|
484
|
+
return {
|
|
485
|
+
...optional("required", mapArray(value.required, nonEmptyString)),
|
|
486
|
+
...optional("optional", mapArray(value.optional, nonEmptyString)),
|
|
487
|
+
...optional("cvPorts", finiteNumber(value.cvPorts)),
|
|
488
|
+
...reasonOf(value),
|
|
489
|
+
};
|
|
490
|
+
}
|
|
491
|
+
function readPlugin(value) {
|
|
492
|
+
if (!isRecord(value))
|
|
493
|
+
return undefined;
|
|
494
|
+
const uri = nonEmptyString(value.uri);
|
|
495
|
+
const topology = readTopology(value.topology);
|
|
496
|
+
if (uri === undefined || topology === undefined)
|
|
497
|
+
return undefined;
|
|
498
|
+
return {
|
|
499
|
+
uri,
|
|
500
|
+
topology,
|
|
501
|
+
...optional("name", nonEmptyString(value.name)),
|
|
502
|
+
...optional("version", nonEmptyString(value.version)),
|
|
503
|
+
...optional("bundle", nonEmptyString(value.bundle)),
|
|
504
|
+
...optional("lv2Class", nonEmptyString(value.lv2Class)),
|
|
505
|
+
...optional("latency", readLatency(value.latency)),
|
|
506
|
+
...optional("cost", readCost(value.cost)),
|
|
507
|
+
...optional("stability", readStability(value.stability)),
|
|
508
|
+
...optional("rtSafety", readRtSafety(value.rtSafety)),
|
|
509
|
+
...optional("features", readFeatures(value.features)),
|
|
510
|
+
};
|
|
511
|
+
}
|
|
512
|
+
/**
|
|
513
|
+
* Read an untrusted value — a parsed JSON file, a wire frame — as a measurement document.
|
|
514
|
+
*
|
|
515
|
+
* Never throws and never casts: every field is validated on the way in and the result is
|
|
516
|
+
* built from the pieces that passed. A document whose major exceeds this build's is
|
|
517
|
+
* REFUSED rather than partially read, because a major bump means a field this reader
|
|
518
|
+
* recognises no longer means what it thinks.
|
|
519
|
+
*/
|
|
520
|
+
export function readMeasurementDocument(value) {
|
|
521
|
+
if (!isRecord(value)) {
|
|
522
|
+
return { ok: false, problem: "not-an-object", detail: "expected a JSON object" };
|
|
523
|
+
}
|
|
524
|
+
if (value.format !== MEASUREMENT_FORMAT_ID) {
|
|
525
|
+
return {
|
|
526
|
+
ok: false,
|
|
527
|
+
problem: "wrong-format",
|
|
528
|
+
detail: `expected format "${MEASUREMENT_FORMAT_ID}"`,
|
|
529
|
+
...optional("found", nonEmptyString(value.format)),
|
|
530
|
+
};
|
|
531
|
+
}
|
|
532
|
+
const version = parseFormatVersion(value.formatVersion);
|
|
533
|
+
if (version === undefined) {
|
|
534
|
+
return {
|
|
535
|
+
ok: false,
|
|
536
|
+
problem: "bad-version",
|
|
537
|
+
detail: 'formatVersion must be "<major>.<minor>"',
|
|
538
|
+
...optional("found", nonEmptyString(value.formatVersion)),
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
if (version.major > MEASUREMENT_FORMAT_MAJOR) {
|
|
542
|
+
return {
|
|
543
|
+
ok: false,
|
|
544
|
+
problem: "future-major",
|
|
545
|
+
detail: `this build understands major ${MEASUREMENT_FORMAT_MAJOR}; reading a newer major would misinterpret it`,
|
|
546
|
+
found: `${version.major}.${version.minor}`,
|
|
547
|
+
};
|
|
548
|
+
}
|
|
549
|
+
const run = readRun(value.run);
|
|
550
|
+
if (run === undefined) {
|
|
551
|
+
return {
|
|
552
|
+
ok: false,
|
|
553
|
+
problem: "missing-run",
|
|
554
|
+
detail: "run provenance is mandatory: a figure without its conditions is not comparable",
|
|
555
|
+
};
|
|
556
|
+
}
|
|
557
|
+
if (!Array.isArray(value.plugins)) {
|
|
558
|
+
return { ok: false, problem: "missing-plugins", detail: "plugins must be an array" };
|
|
559
|
+
}
|
|
560
|
+
const plugins = value.plugins.flatMap((entry) => {
|
|
561
|
+
const plugin = readPlugin(entry);
|
|
562
|
+
return plugin === undefined ? [] : [plugin];
|
|
563
|
+
});
|
|
564
|
+
const judged = readJudged(value);
|
|
565
|
+
const document = {
|
|
566
|
+
format: MEASUREMENT_FORMAT_ID,
|
|
567
|
+
formatVersion: `${version.major}.${version.minor}`,
|
|
568
|
+
run,
|
|
569
|
+
plugins,
|
|
570
|
+
...(judged === undefined ? {} : { hostProfiles: judged.hostProfiles, verdicts: judged.verdicts }),
|
|
571
|
+
};
|
|
572
|
+
return {
|
|
573
|
+
ok: true,
|
|
574
|
+
document,
|
|
575
|
+
version,
|
|
576
|
+
droppedPlugins: value.plugins.length - plugins.length,
|
|
577
|
+
...(judged === undefined ? {} : { droppedVerdicts: judged.dropped }),
|
|
578
|
+
...(version.major === MEASUREMENT_FORMAT_MAJOR && version.minor > MEASUREMENT_FORMAT_MINOR
|
|
579
|
+
? { forwardMinor: true }
|
|
580
|
+
: {}),
|
|
581
|
+
};
|
|
582
|
+
}
|
|
583
|
+
/** The v1.2 pair, when the document carries either list; a malformed entry is dropped and counted. */
|
|
584
|
+
function readJudged(value) {
|
|
585
|
+
if (value.hostProfiles === undefined && value.verdicts === undefined)
|
|
586
|
+
return undefined;
|
|
587
|
+
const rawProfiles = Array.isArray(value.hostProfiles) ? value.hostProfiles : [];
|
|
588
|
+
const rawVerdicts = Array.isArray(value.verdicts) ? value.verdicts : [];
|
|
589
|
+
const hostProfiles = rawProfiles.flatMap((p) => {
|
|
590
|
+
const r = readHostProfile(p);
|
|
591
|
+
return r.ok ? [r.profile] : [];
|
|
592
|
+
});
|
|
593
|
+
const hosts = new Set(hostProfiles.map((p) => p.id));
|
|
594
|
+
const verdicts = rawVerdicts.flatMap((v) => {
|
|
595
|
+
const r = readVerdict(v, hosts);
|
|
596
|
+
return r === undefined ? [] : [r];
|
|
597
|
+
});
|
|
598
|
+
return {
|
|
599
|
+
hostProfiles,
|
|
600
|
+
verdicts,
|
|
601
|
+
dropped: rawProfiles.length - hostProfiles.length + (rawVerdicts.length - verdicts.length),
|
|
602
|
+
};
|
|
603
|
+
}
|
|
604
|
+
/**
|
|
605
|
+
* Build a document at THIS build's version.
|
|
606
|
+
*
|
|
607
|
+
* The only supported way to create one: it stamps `format` and `formatVersion` so no call
|
|
608
|
+
* site can write a document claiming a version its content does not match, and it sorts
|
|
609
|
+
* plugins by URI so two runs over the same host produce a diffable file.
|
|
610
|
+
*/
|
|
611
|
+
export function buildMeasurementDocument(run, plugins, judged) {
|
|
612
|
+
return {
|
|
613
|
+
format: MEASUREMENT_FORMAT_ID,
|
|
614
|
+
formatVersion: MEASUREMENT_FORMAT_VERSION,
|
|
615
|
+
run,
|
|
616
|
+
plugins: [...plugins].sort((a, b) => (a.uri < b.uri ? -1 : a.uri > b.uri ? 1 : 0)),
|
|
617
|
+
...(judged === undefined ? {} : { hostProfiles: judged.hostProfiles, verdicts: judged.verdicts }),
|
|
618
|
+
};
|
|
619
|
+
}
|
|
620
|
+
/** Serialise a document: 2-space JSON with a trailing newline, stable across runs. */
|
|
621
|
+
export function serialiseMeasurementDocument(document) {
|
|
622
|
+
return `${JSON.stringify(document, null, 2)}\n`;
|
|
623
|
+
}
|
|
624
|
+
/** Every dimension a run may declare, in presentation order. Re-exported for consumers
|
|
625
|
+
* that need the list without reaching into the vocabulary module. */
|
|
626
|
+
export { MEASUREMENT_DIMENSIONS };
|
|
627
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/measurement/format.ts"],"names":[],"mappings":"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"}
|