@plasius/schema 1.2.18 → 1.3.1
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/README.md +207 -1
- package/THIRD_PARTY_NOTICES.md +75 -0
- package/dist/chunk-6FE4FLKF.js +254 -0
- package/dist/chunk-6FE4FLKF.js.map +1 -0
- package/dist/chunk-AG2NAPDC.js +117 -0
- package/dist/chunk-AG2NAPDC.js.map +1 -0
- package/dist/chunk-UQHPDQZX.js +2606 -0
- package/dist/chunk-UQHPDQZX.js.map +1 -0
- package/dist/feedback-diagnostics-BaniQAFS.d.cts +353 -0
- package/dist/feedback-diagnostics-CnsI0B9-.d.ts +353 -0
- package/dist/feedback-diagnostics-vocabulary.cjs +156 -0
- package/dist/feedback-diagnostics-vocabulary.cjs.map +1 -0
- package/dist/feedback-diagnostics-vocabulary.d.cts +70 -0
- package/dist/feedback-diagnostics-vocabulary.d.ts +70 -0
- package/dist/feedback-diagnostics-vocabulary.js +33 -0
- package/dist/feedback-diagnostics-vocabulary.js.map +1 -0
- package/dist/feedback-diagnostics.cjs +2696 -0
- package/dist/feedback-diagnostics.cjs.map +1 -0
- package/dist/feedback-diagnostics.d.cts +2 -0
- package/dist/feedback-diagnostics.d.ts +2 -0
- package/dist/feedback-diagnostics.js +39 -0
- package/dist/feedback-diagnostics.js.map +1 -0
- package/dist/feedback-unicode-profile.cjs +283 -0
- package/dist/feedback-unicode-profile.cjs.map +1 -0
- package/dist/feedback-unicode-profile.d.cts +28 -0
- package/dist/feedback-unicode-profile.d.ts +28 -0
- package/dist/feedback-unicode-profile.js +13 -0
- package/dist/feedback-unicode-profile.js.map +1 -0
- package/dist/index.cjs +2258 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +987 -286
- package/dist/index.d.ts +987 -286
- package/dist/index.js +1532 -2197
- package/dist/index.js.map +1 -1
- package/package.json +36 -12
- package/unicode/feedback-unicode-15.1.0-unassigned.json +13 -0
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
import { FeedbackGameDiagnostics } from './feedback-diagnostics-vocabulary.js';
|
|
2
|
+
|
|
3
|
+
type PIIClassification = "none" | "low" | "high";
|
|
4
|
+
type PIIAction = "encrypt" | "hash" | "clear" | "none";
|
|
5
|
+
type PIILogHandling = "redact" | "omit" | "pseudonym" | "plain";
|
|
6
|
+
interface PII {
|
|
7
|
+
classification: PIIClassification;
|
|
8
|
+
action: PIIAction;
|
|
9
|
+
logHandling?: PIILogHandling;
|
|
10
|
+
purpose?: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
interface ValidationIssueInput {
|
|
14
|
+
code: string;
|
|
15
|
+
message: string;
|
|
16
|
+
path?: string;
|
|
17
|
+
}
|
|
18
|
+
interface ValidationIssue {
|
|
19
|
+
path: string;
|
|
20
|
+
code: string;
|
|
21
|
+
message: string;
|
|
22
|
+
}
|
|
23
|
+
type FieldValidatorResult = boolean | string | ValidationIssueInput | ValidationIssueInput[];
|
|
24
|
+
type FieldValidator<T = unknown> = {
|
|
25
|
+
bivarianceHack(value: T): FieldValidatorResult;
|
|
26
|
+
}["bivarianceHack"];
|
|
27
|
+
|
|
28
|
+
type FieldType$1 = "string" | "number" | "boolean" | "object" | "array" | "ref";
|
|
29
|
+
|
|
30
|
+
type FieldExposure = "public" | "internal";
|
|
31
|
+
declare class FieldBuilder<TExternal = unknown, TInternal = TExternal> {
|
|
32
|
+
type: FieldType$1;
|
|
33
|
+
_type: TExternal;
|
|
34
|
+
_storageType: TInternal;
|
|
35
|
+
isSystem: boolean;
|
|
36
|
+
isImmutable: boolean;
|
|
37
|
+
isRequired: boolean;
|
|
38
|
+
_validator?: FieldValidator<TInternal>;
|
|
39
|
+
_description: string;
|
|
40
|
+
_version: string;
|
|
41
|
+
_default?: TInternal | (() => TInternal);
|
|
42
|
+
_upgrade?: (value: any, ctx: {
|
|
43
|
+
entityFrom: string;
|
|
44
|
+
entityTo: string;
|
|
45
|
+
fieldTo: string;
|
|
46
|
+
fieldName: string;
|
|
47
|
+
}) => {
|
|
48
|
+
ok: boolean;
|
|
49
|
+
value?: any;
|
|
50
|
+
error?: string;
|
|
51
|
+
};
|
|
52
|
+
_shape?: Record<string, FieldBuilder<any>>;
|
|
53
|
+
itemType?: FieldBuilder<any>;
|
|
54
|
+
refType?: string;
|
|
55
|
+
_pii: PII;
|
|
56
|
+
_exposure: FieldExposure;
|
|
57
|
+
enumValues?: readonly TInternal[];
|
|
58
|
+
constructor(type: FieldType$1, options?: {
|
|
59
|
+
shape?: Record<string, FieldBuilder<any>>;
|
|
60
|
+
itemType?: FieldBuilder<any>;
|
|
61
|
+
refType?: string;
|
|
62
|
+
});
|
|
63
|
+
immutable(): FieldBuilder<TExternal, TInternal>;
|
|
64
|
+
system(): FieldBuilder<TExternal, TInternal>;
|
|
65
|
+
exposure(exposure: FieldExposure): FieldBuilder<TExternal, TInternal>;
|
|
66
|
+
internal(): FieldBuilder<TExternal, TInternal>;
|
|
67
|
+
public(): FieldBuilder<TExternal, TInternal>;
|
|
68
|
+
required(): FieldBuilder<TExternal, TInternal>;
|
|
69
|
+
optional(): FieldBuilder<TExternal, TInternal>;
|
|
70
|
+
validator(fn: FieldValidator<TInternal>): FieldBuilder<TExternal, TInternal>;
|
|
71
|
+
description(desc: string): FieldBuilder<TExternal, TInternal>;
|
|
72
|
+
default(value: TInternal | (() => TInternal)): FieldBuilder<TExternal, TInternal>;
|
|
73
|
+
/**
|
|
74
|
+
* Configure an upgrader used when validating older entities against a newer schema.
|
|
75
|
+
* The upgrader receives the current field value and version context, and should
|
|
76
|
+
* return { ok: true, value } with the upgraded value, or { ok: false, error }.
|
|
77
|
+
*/
|
|
78
|
+
upgrade(fn: (value: any, ctx: {
|
|
79
|
+
entityFrom: string;
|
|
80
|
+
entityTo: string;
|
|
81
|
+
fieldTo: string;
|
|
82
|
+
fieldName: string;
|
|
83
|
+
}) => {
|
|
84
|
+
ok: boolean;
|
|
85
|
+
value?: any;
|
|
86
|
+
error?: string;
|
|
87
|
+
}): FieldBuilder<TExternal, TInternal>;
|
|
88
|
+
getDefault(): TInternal | undefined;
|
|
89
|
+
version(ver: string): FieldBuilder<TExternal, TInternal>;
|
|
90
|
+
PID(pii: PII): FieldBuilder<TExternal, TInternal>;
|
|
91
|
+
min(min: number): FieldBuilder<TExternal, TInternal>;
|
|
92
|
+
max(max: number): FieldBuilder<TExternal, TInternal>;
|
|
93
|
+
pattern(regex: RegExp): FieldBuilder<TExternal, TInternal>;
|
|
94
|
+
enum<const U extends readonly TInternal[]>(values: U): FieldBuilder<U[number]>;
|
|
95
|
+
/**
|
|
96
|
+
* Create a shallow clone with a different external type parameter.
|
|
97
|
+
* Note: shape and itemType are passed by reference (shallow). If you need
|
|
98
|
+
* deep isolation of nested FieldBuilders, clone them explicitly.
|
|
99
|
+
*/
|
|
100
|
+
as<U>(): FieldBuilder<U, TInternal>;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
type InferField<T> = T extends {
|
|
104
|
+
_type: infer U;
|
|
105
|
+
} ? U : T extends {
|
|
106
|
+
type: "string";
|
|
107
|
+
} ? string : T extends {
|
|
108
|
+
type: "number";
|
|
109
|
+
} ? number : T extends {
|
|
110
|
+
type: "boolean";
|
|
111
|
+
} ? boolean : T extends {
|
|
112
|
+
type: "array";
|
|
113
|
+
itemType: infer Item;
|
|
114
|
+
} ? InferField<Item>[] : T extends {
|
|
115
|
+
type: "object";
|
|
116
|
+
shape: infer Shape extends SchemaShape;
|
|
117
|
+
} ? InferFromShape<Shape> : unknown;
|
|
118
|
+
type IsOptional<T> = T extends {
|
|
119
|
+
isRequired: false;
|
|
120
|
+
} ? true : false;
|
|
121
|
+
type InferFromShape<S extends SchemaShape> = {
|
|
122
|
+
[K in keyof S]: IsOptional<S[K]> extends true ? InferField<S[K]> | undefined : InferField<S[K]>;
|
|
123
|
+
};
|
|
124
|
+
type InferFromSchema<T extends {
|
|
125
|
+
shape: SchemaShape;
|
|
126
|
+
}> = InferFromShape<T["shape"]>;
|
|
127
|
+
type IsSchema<T> = T extends {
|
|
128
|
+
shape: SchemaShape;
|
|
129
|
+
} ? true : false;
|
|
130
|
+
type Infer<T> = IsSchema<T> extends true ? InferFromSchema<T & {
|
|
131
|
+
shape: SchemaShape;
|
|
132
|
+
}> : InferFromShape<T & SchemaShape>;
|
|
133
|
+
|
|
134
|
+
type FieldTypeMap = {
|
|
135
|
+
string: string;
|
|
136
|
+
number: number;
|
|
137
|
+
boolean: boolean;
|
|
138
|
+
object: Record<string, unknown>;
|
|
139
|
+
"string[]": string[];
|
|
140
|
+
"number[]": number[];
|
|
141
|
+
"boolean[]": boolean[];
|
|
142
|
+
"object[]": Record<string, unknown>[];
|
|
143
|
+
ref: RefEntityId;
|
|
144
|
+
"ref[]": RefEntityId[];
|
|
145
|
+
};
|
|
146
|
+
type FieldType = keyof FieldTypeMap;
|
|
147
|
+
type PIIEnforcement = "strict" | "warn" | "none";
|
|
148
|
+
/** Supported unknown-field policies in backwards-compatible order. */
|
|
149
|
+
declare const SCHEMA_UNKNOWN_FIELDS_POLICIES: readonly ["strip", "reject"];
|
|
150
|
+
/** Controls whether fields outside a schema shape are stripped or rejected. */
|
|
151
|
+
type UnknownFieldsPolicy = (typeof SCHEMA_UNKNOWN_FIELDS_POLICIES)[number];
|
|
152
|
+
/** Supported schema-identity policies in backwards-compatible order. */
|
|
153
|
+
declare const SCHEMA_IDENTITY_POLICIES: readonly ["compatible", "exact"];
|
|
154
|
+
/** Controls exact enforcement of a schema's declared type and version. */
|
|
155
|
+
type SchemaIdentityPolicy = (typeof SCHEMA_IDENTITY_POLICIES)[number];
|
|
156
|
+
/** Result returned by a schema upgrade function. */
|
|
157
|
+
type SchemaUpgradeResult = {
|
|
158
|
+
ok: boolean;
|
|
159
|
+
/** Upgraded entity (must include all required fields for the new schema). */
|
|
160
|
+
value?: Record<string, any>;
|
|
161
|
+
/** Optional human-readable errors if upgrade fails. */
|
|
162
|
+
errors?: string[];
|
|
163
|
+
};
|
|
164
|
+
/**
|
|
165
|
+
* A function that upgrades an entity from an older schema version to a newer one.
|
|
166
|
+
* It should be **pure** and not mutate its arguments.
|
|
167
|
+
*/
|
|
168
|
+
type SchemaUpgradeFunction = (input: Record<string, any>, ctx: {
|
|
169
|
+
from: string;
|
|
170
|
+
to: string;
|
|
171
|
+
entityType: string;
|
|
172
|
+
/** Describe function for the target schema – useful for dynamic migrations. */
|
|
173
|
+
describe: () => {
|
|
174
|
+
entityType: string;
|
|
175
|
+
version: string;
|
|
176
|
+
shape: Record<string, any>;
|
|
177
|
+
};
|
|
178
|
+
log?: (msg: string) => void;
|
|
179
|
+
}) => SchemaUpgradeResult;
|
|
180
|
+
type SchemaUpgradeStep = {
|
|
181
|
+
/** The target version this step upgrades to (e.g., "1.1.0"). */
|
|
182
|
+
to: string;
|
|
183
|
+
/** The migration function that upgrades from the previous step's version to `to`. */
|
|
184
|
+
run: SchemaUpgradeFunction;
|
|
185
|
+
};
|
|
186
|
+
/**
|
|
187
|
+
* Schema-level upgrade specification can be either:
|
|
188
|
+
* - a single `SchemaUpgradeFunction` that handles any from->to, OR
|
|
189
|
+
* - an ordered array of steps, each targeting a specific `to` version, which
|
|
190
|
+
* will be applied sequentially to cascade from the oldest known version to the latest.
|
|
191
|
+
*/
|
|
192
|
+
type SchemaUpgradeSpec = SchemaUpgradeFunction | SchemaUpgradeStep[];
|
|
193
|
+
/**
|
|
194
|
+
* Presence-only metadata supplied to a schema-level validator.
|
|
195
|
+
*
|
|
196
|
+
* Raw input values are intentionally withheld. `wasProvided` distinguishes
|
|
197
|
+
* an omitted optional field from an explicitly supplied `null`/`undefined`.
|
|
198
|
+
*/
|
|
199
|
+
interface SchemaValidationContext {
|
|
200
|
+
readonly wasProvided: (fieldName: string) => boolean;
|
|
201
|
+
}
|
|
202
|
+
interface SchemaOptions {
|
|
203
|
+
version?: string;
|
|
204
|
+
table?: string;
|
|
205
|
+
schemaValidator?: (value: any, context?: SchemaValidationContext) => boolean;
|
|
206
|
+
piiEnforcement?: PIIEnforcement;
|
|
207
|
+
/**
|
|
208
|
+
* How validation handles properties not declared by the schema.
|
|
209
|
+
*
|
|
210
|
+
* `strip` preserves the historical behaviour. `reject` is intended for
|
|
211
|
+
* trust boundaries where silently accepting extra data would be unsafe.
|
|
212
|
+
*/
|
|
213
|
+
unknownFields?: UnknownFieldsPolicy;
|
|
214
|
+
/**
|
|
215
|
+
* `exact` rejects a mismatched `type` or `version` after any configured
|
|
216
|
+
* upgrade. The backwards-compatible default validates only their field
|
|
217
|
+
* shapes.
|
|
218
|
+
*/
|
|
219
|
+
identity?: SchemaIdentityPolicy;
|
|
220
|
+
schemaUpgrade?: SchemaUpgradeStep[] | SchemaUpgradeFunction | undefined;
|
|
221
|
+
}
|
|
222
|
+
interface SerializeOptions {
|
|
223
|
+
includeInternal?: boolean;
|
|
224
|
+
}
|
|
225
|
+
type SchemaShape = Record<string, FieldBuilder<any>>;
|
|
226
|
+
interface FieldDefinition<T = unknown> {
|
|
227
|
+
type: FieldType;
|
|
228
|
+
__valueType?: T;
|
|
229
|
+
optional?: boolean;
|
|
230
|
+
immutable?: boolean;
|
|
231
|
+
description?: string;
|
|
232
|
+
refType?: string;
|
|
233
|
+
version?: string;
|
|
234
|
+
deprecated?: boolean;
|
|
235
|
+
deprecatedVersion?: string;
|
|
236
|
+
system?: boolean;
|
|
237
|
+
autoValidate?: boolean;
|
|
238
|
+
refPolicy?: "eager" | "lazy";
|
|
239
|
+
enum?: string[];
|
|
240
|
+
_shape?: SchemaShape;
|
|
241
|
+
pii?: PII;
|
|
242
|
+
exposure?: FieldExposure;
|
|
243
|
+
validator?: FieldValidator<T>;
|
|
244
|
+
}
|
|
245
|
+
interface ValidateCompositionOptions {
|
|
246
|
+
resolveEntity: (type: string, id: string) => Promise<any | null>;
|
|
247
|
+
validatorContext?: {
|
|
248
|
+
visited: Set<string>;
|
|
249
|
+
};
|
|
250
|
+
maxDepth?: number;
|
|
251
|
+
log?: (msg: string) => void;
|
|
252
|
+
onlyFields?: string[];
|
|
253
|
+
}
|
|
254
|
+
interface Schema<T extends SchemaShape> {
|
|
255
|
+
_shape: T;
|
|
256
|
+
meta: {
|
|
257
|
+
entityType: string;
|
|
258
|
+
version: string;
|
|
259
|
+
};
|
|
260
|
+
schemaValidator: (entity: Infer<T>, context?: SchemaValidationContext) => boolean;
|
|
261
|
+
/**
|
|
262
|
+
* Runs the optional schema-level upgrade function once, without validating.
|
|
263
|
+
* Useful for offline migrations or testing migration logic.
|
|
264
|
+
*/
|
|
265
|
+
upgrade(input: Record<string, any>, log?: (msg: string) => void): {
|
|
266
|
+
ok: boolean;
|
|
267
|
+
value?: Record<string, any>;
|
|
268
|
+
errors?: string[];
|
|
269
|
+
};
|
|
270
|
+
validate: (input: unknown, existing?: Record<string, any>) => ValidationResult<Infer<T>>;
|
|
271
|
+
validateComposition: (entity: Infer<T>, options: ValidateCompositionOptions) => Promise<void>;
|
|
272
|
+
serialize: (input: Record<string, any>, options?: SerializeOptions) => Record<string, any>;
|
|
273
|
+
tableName?: () => string | undefined;
|
|
274
|
+
prepareForRead(stored: Record<string, any>, decryptFn: (value: string) => any | null): Record<string, any>;
|
|
275
|
+
prepareForStorage(input: Record<string, any>, encryptFn: (value: any) => string, hashFn: (value: any) => string): Record<string, any>;
|
|
276
|
+
sanitizeForLog(data: Record<string, any>, pseudonymFn: (value: any) => string): Record<string, any>;
|
|
277
|
+
getPiiAudit(): Array<{
|
|
278
|
+
field: string;
|
|
279
|
+
classification: PIIClassification;
|
|
280
|
+
action: PIIAction;
|
|
281
|
+
logHandling?: PIILogHandling;
|
|
282
|
+
purpose?: string;
|
|
283
|
+
}> | null;
|
|
284
|
+
scrubPiiForDelete(stored: Record<string, any>): Record<string, any>;
|
|
285
|
+
describe(): {
|
|
286
|
+
entityType: string;
|
|
287
|
+
version: string;
|
|
288
|
+
shape: Record<string, {
|
|
289
|
+
type: FieldType;
|
|
290
|
+
optional: boolean;
|
|
291
|
+
immutable: boolean;
|
|
292
|
+
description: string;
|
|
293
|
+
version: string;
|
|
294
|
+
deprecated: boolean;
|
|
295
|
+
deprecatedVersion: string | null;
|
|
296
|
+
system: boolean;
|
|
297
|
+
enum: string[] | null;
|
|
298
|
+
refType: string | null;
|
|
299
|
+
pii: PII | null;
|
|
300
|
+
exposure: FieldExposure;
|
|
301
|
+
}>;
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
type DeepReadonly<T> = {
|
|
305
|
+
readonly [K in keyof T]: T[K] extends object ? T[K] extends (...args: any[]) => any ? T[K] : DeepReadonly<T[K]> : T[K];
|
|
306
|
+
};
|
|
307
|
+
interface ValidationResult<T> {
|
|
308
|
+
valid: boolean;
|
|
309
|
+
value?: DeepReadonly<T>;
|
|
310
|
+
errors?: string[];
|
|
311
|
+
issues?: ValidationIssue[];
|
|
312
|
+
}
|
|
313
|
+
type RefEntityId<T extends string = string> = {
|
|
314
|
+
type: T;
|
|
315
|
+
id: string;
|
|
316
|
+
};
|
|
317
|
+
|
|
318
|
+
/** Bucketed, consented renderer diagnostics; it cannot express pixels or DOM. */
|
|
319
|
+
declare const FeedbackGameDiagnosticsSchema: Schema<{
|
|
320
|
+
surfaceId: FieldBuilder<"site.generator" | "site.gpu-demo", "site.generator" | "site.gpu-demo">;
|
|
321
|
+
consentConfirmed: FieldBuilder<boolean, boolean>;
|
|
322
|
+
provenanceContractId: FieldBuilder<"generator.renderer-diagnostics.v1" | "gpu-demo.renderer-diagnostics.v1", "generator.renderer-diagnostics.v1" | "gpu-demo.renderer-diagnostics.v1">;
|
|
323
|
+
renderer: FieldBuilder<"webgl2" | "webgpu" | "canvas2d" | "unknown", "webgl2" | "webgpu" | "canvas2d" | "unknown">;
|
|
324
|
+
backend: FieldBuilder<"unknown" | "browser" | "worker", "unknown" | "browser" | "worker">;
|
|
325
|
+
viewportBucket: FieldBuilder<"unknown" | "small-portrait" | "small-landscape" | "medium-portrait" | "medium-landscape" | "large-portrait" | "large-landscape", "unknown" | "small-portrait" | "small-landscape" | "medium-portrait" | "medium-landscape" | "large-portrait" | "large-landscape">;
|
|
326
|
+
frameRateBucket: FieldBuilder<"unknown" | "under-15" | "15-29" | "30-59" | "60-plus", "unknown" | "under-15" | "15-29" | "30-59" | "60-plus">;
|
|
327
|
+
frameTimeBucket: FieldBuilder<"unknown" | "under-17ms" | "17-33ms" | "34-66ms" | "over-66ms", "unknown" | "under-17ms" | "17-33ms" | "34-66ms" | "over-66ms">;
|
|
328
|
+
featureIds: FieldBuilder<unknown, unknown>;
|
|
329
|
+
counters: FieldBuilder<unknown, unknown>;
|
|
330
|
+
errorCodes: FieldBuilder<unknown, unknown>;
|
|
331
|
+
type?: FieldBuilder<"feedback-game-diagnostics", "feedback-game-diagnostics"> | undefined;
|
|
332
|
+
version?: FieldBuilder<"1.0.0", "1.0.0"> | undefined;
|
|
333
|
+
}>;
|
|
334
|
+
type FeedbackGameDiagnosticsValidationResult = {
|
|
335
|
+
readonly valid: true;
|
|
336
|
+
readonly value: FeedbackGameDiagnostics;
|
|
337
|
+
readonly errors?: never;
|
|
338
|
+
readonly issues?: never;
|
|
339
|
+
} | {
|
|
340
|
+
readonly valid: false;
|
|
341
|
+
readonly value?: never;
|
|
342
|
+
readonly errors: readonly string[];
|
|
343
|
+
readonly issues?: readonly ValidationIssue[];
|
|
344
|
+
};
|
|
345
|
+
/**
|
|
346
|
+
* Validate and clone diagnostics while preserving the correlated public type.
|
|
347
|
+
*
|
|
348
|
+
* `createSchema` intentionally exposes its generic inferred shape; this
|
|
349
|
+
* domain wrapper is the typed boundary consumers should use.
|
|
350
|
+
*/
|
|
351
|
+
declare const validateFeedbackGameDiagnostics: (input: unknown) => FeedbackGameDiagnosticsValidationResult;
|
|
352
|
+
|
|
353
|
+
export { type DeepReadonly as D, FieldBuilder as F, type Infer as I, type PIIEnforcement as P, type RefEntityId as R, type SchemaShape as S, type UnknownFieldsPolicy as U, type ValidationIssue as V, type SchemaOptions as a, type Schema as b, type FieldType as c, FeedbackGameDiagnosticsSchema as d, type FeedbackGameDiagnosticsValidationResult as e, type FieldDefinition as f, type FieldExposure as g, type FieldTypeMap as h, type FieldValidator as i, type FieldValidatorResult as j, SCHEMA_IDENTITY_POLICIES as k, SCHEMA_UNKNOWN_FIELDS_POLICIES as l, type SchemaIdentityPolicy as m, type SchemaUpgradeFunction as n, type SchemaUpgradeResult as o, type SchemaUpgradeSpec as p, type SchemaUpgradeStep as q, type SchemaValidationContext as r, type SerializeOptions as s, type ValidateCompositionOptions as t, type ValidationIssueInput as u, type ValidationResult as v, validateFeedbackGameDiagnostics as w };
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/feedback-diagnostics-vocabulary.ts
|
|
21
|
+
var feedback_diagnostics_vocabulary_exports = {};
|
|
22
|
+
__export(feedback_diagnostics_vocabulary_exports, {
|
|
23
|
+
FEEDBACK_BACKEND_BUCKETS: () => FEEDBACK_BACKEND_BUCKETS,
|
|
24
|
+
FEEDBACK_CONTRACT_VERSION: () => FEEDBACK_CONTRACT_VERSION,
|
|
25
|
+
FEEDBACK_FRAME_RATE_BUCKETS: () => FEEDBACK_FRAME_RATE_BUCKETS,
|
|
26
|
+
FEEDBACK_FRAME_TIME_BUCKETS: () => FEEDBACK_FRAME_TIME_BUCKETS,
|
|
27
|
+
FEEDBACK_GAME_COUNTER_CODES: () => FEEDBACK_GAME_COUNTER_CODES,
|
|
28
|
+
FEEDBACK_GAME_COUNTER_MAX_COUNT: () => FEEDBACK_GAME_COUNTER_MAX_COUNT,
|
|
29
|
+
FEEDBACK_GAME_COUNTER_MAX_ITEMS: () => FEEDBACK_GAME_COUNTER_MAX_ITEMS,
|
|
30
|
+
FEEDBACK_GAME_ERROR_CODES: () => FEEDBACK_GAME_ERROR_CODES,
|
|
31
|
+
FEEDBACK_GAME_FEATURE_IDS: () => FEEDBACK_GAME_FEATURE_IDS,
|
|
32
|
+
FEEDBACK_GAME_PROVENANCE_CONTRACTS: () => FEEDBACK_GAME_PROVENANCE_CONTRACTS,
|
|
33
|
+
FEEDBACK_GAME_PROVENANCE_CONTRACT_IDS: () => FEEDBACK_GAME_PROVENANCE_CONTRACT_IDS,
|
|
34
|
+
FEEDBACK_GAME_SURFACE_IDS: () => FEEDBACK_GAME_SURFACE_IDS,
|
|
35
|
+
FEEDBACK_RENDERER_BUCKETS: () => FEEDBACK_RENDERER_BUCKETS,
|
|
36
|
+
FEEDBACK_VIEWPORT_BUCKETS: () => FEEDBACK_VIEWPORT_BUCKETS
|
|
37
|
+
});
|
|
38
|
+
module.exports = __toCommonJS(feedback_diagnostics_vocabulary_exports);
|
|
39
|
+
|
|
40
|
+
// src/feedback-contract-version.ts
|
|
41
|
+
var FEEDBACK_CONTRACT_VERSION = "1.0.0";
|
|
42
|
+
|
|
43
|
+
// src/feedback-diagnostics-vocabulary.ts
|
|
44
|
+
var FEEDBACK_RENDERER_BUCKETS = [
|
|
45
|
+
"webgl2",
|
|
46
|
+
"webgpu",
|
|
47
|
+
"canvas2d",
|
|
48
|
+
"unknown"
|
|
49
|
+
];
|
|
50
|
+
var FEEDBACK_BACKEND_BUCKETS = [
|
|
51
|
+
"browser",
|
|
52
|
+
"worker",
|
|
53
|
+
"unknown"
|
|
54
|
+
];
|
|
55
|
+
var FEEDBACK_GAME_SURFACE_IDS = [
|
|
56
|
+
"site.generator",
|
|
57
|
+
"site.gpu-demo"
|
|
58
|
+
];
|
|
59
|
+
var FEEDBACK_GAME_PROVENANCE_CONTRACTS = [
|
|
60
|
+
{
|
|
61
|
+
surfaceId: "site.generator",
|
|
62
|
+
contractId: "generator.renderer-diagnostics.v1"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
surfaceId: "site.gpu-demo",
|
|
66
|
+
contractId: "gpu-demo.renderer-diagnostics.v1"
|
|
67
|
+
}
|
|
68
|
+
];
|
|
69
|
+
var FEEDBACK_GAME_PROVENANCE_CONTRACT_IDS = [
|
|
70
|
+
"generator.renderer-diagnostics.v1",
|
|
71
|
+
"gpu-demo.renderer-diagnostics.v1"
|
|
72
|
+
];
|
|
73
|
+
var FEEDBACK_GAME_FEATURE_IDS = [
|
|
74
|
+
"renderer.initialisation",
|
|
75
|
+
"renderer.frame-loop",
|
|
76
|
+
"renderer.asset-loading",
|
|
77
|
+
"renderer.input",
|
|
78
|
+
"renderer.scene-generation",
|
|
79
|
+
"renderer.post-processing"
|
|
80
|
+
];
|
|
81
|
+
var FEEDBACK_GAME_COUNTER_CODES = [
|
|
82
|
+
"frame-drop",
|
|
83
|
+
"device-loss",
|
|
84
|
+
"asset-load-failure",
|
|
85
|
+
"shader-failure",
|
|
86
|
+
"fallback-activation"
|
|
87
|
+
];
|
|
88
|
+
var FEEDBACK_GAME_COUNTER_MAX_ITEMS = 32;
|
|
89
|
+
var FEEDBACK_GAME_COUNTER_MAX_COUNT = 1e4;
|
|
90
|
+
var FEEDBACK_GAME_ERROR_CODES = [
|
|
91
|
+
"renderer.initialisation-failed",
|
|
92
|
+
"renderer.device-lost",
|
|
93
|
+
"renderer.asset-load-failed",
|
|
94
|
+
"renderer.frame-budget-exceeded",
|
|
95
|
+
"renderer.shader-failed",
|
|
96
|
+
"renderer.unknown"
|
|
97
|
+
];
|
|
98
|
+
var FEEDBACK_VIEWPORT_BUCKETS = [
|
|
99
|
+
"small-portrait",
|
|
100
|
+
"small-landscape",
|
|
101
|
+
"medium-portrait",
|
|
102
|
+
"medium-landscape",
|
|
103
|
+
"large-portrait",
|
|
104
|
+
"large-landscape",
|
|
105
|
+
"unknown"
|
|
106
|
+
];
|
|
107
|
+
var FEEDBACK_FRAME_RATE_BUCKETS = [
|
|
108
|
+
"under-15",
|
|
109
|
+
"15-29",
|
|
110
|
+
"30-59",
|
|
111
|
+
"60-plus",
|
|
112
|
+
"unknown"
|
|
113
|
+
];
|
|
114
|
+
var FEEDBACK_FRAME_TIME_BUCKETS = [
|
|
115
|
+
"under-17ms",
|
|
116
|
+
"17-33ms",
|
|
117
|
+
"34-66ms",
|
|
118
|
+
"over-66ms",
|
|
119
|
+
"unknown"
|
|
120
|
+
];
|
|
121
|
+
for (const vocabulary of [
|
|
122
|
+
FEEDBACK_RENDERER_BUCKETS,
|
|
123
|
+
FEEDBACK_BACKEND_BUCKETS,
|
|
124
|
+
FEEDBACK_GAME_SURFACE_IDS,
|
|
125
|
+
FEEDBACK_GAME_PROVENANCE_CONTRACTS,
|
|
126
|
+
FEEDBACK_GAME_PROVENANCE_CONTRACT_IDS,
|
|
127
|
+
FEEDBACK_GAME_FEATURE_IDS,
|
|
128
|
+
FEEDBACK_GAME_COUNTER_CODES,
|
|
129
|
+
FEEDBACK_GAME_ERROR_CODES,
|
|
130
|
+
FEEDBACK_VIEWPORT_BUCKETS,
|
|
131
|
+
FEEDBACK_FRAME_RATE_BUCKETS,
|
|
132
|
+
FEEDBACK_FRAME_TIME_BUCKETS
|
|
133
|
+
]) {
|
|
134
|
+
Object.freeze(vocabulary);
|
|
135
|
+
}
|
|
136
|
+
for (const entry of FEEDBACK_GAME_PROVENANCE_CONTRACTS) {
|
|
137
|
+
Object.freeze(entry);
|
|
138
|
+
}
|
|
139
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
140
|
+
0 && (module.exports = {
|
|
141
|
+
FEEDBACK_BACKEND_BUCKETS,
|
|
142
|
+
FEEDBACK_CONTRACT_VERSION,
|
|
143
|
+
FEEDBACK_FRAME_RATE_BUCKETS,
|
|
144
|
+
FEEDBACK_FRAME_TIME_BUCKETS,
|
|
145
|
+
FEEDBACK_GAME_COUNTER_CODES,
|
|
146
|
+
FEEDBACK_GAME_COUNTER_MAX_COUNT,
|
|
147
|
+
FEEDBACK_GAME_COUNTER_MAX_ITEMS,
|
|
148
|
+
FEEDBACK_GAME_ERROR_CODES,
|
|
149
|
+
FEEDBACK_GAME_FEATURE_IDS,
|
|
150
|
+
FEEDBACK_GAME_PROVENANCE_CONTRACTS,
|
|
151
|
+
FEEDBACK_GAME_PROVENANCE_CONTRACT_IDS,
|
|
152
|
+
FEEDBACK_GAME_SURFACE_IDS,
|
|
153
|
+
FEEDBACK_RENDERER_BUCKETS,
|
|
154
|
+
FEEDBACK_VIEWPORT_BUCKETS
|
|
155
|
+
});
|
|
156
|
+
//# sourceMappingURL=feedback-diagnostics-vocabulary.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/feedback-diagnostics-vocabulary.ts","../src/feedback-contract-version.ts"],"sourcesContent":["import { FEEDBACK_CONTRACT_VERSION } from \"./feedback-contract-version.js\";\n\nexport { FEEDBACK_CONTRACT_VERSION };\n\n/** Coarse renderer buckets permitted in privacy-safe game diagnostics. */\nexport const FEEDBACK_RENDERER_BUCKETS = [\n \"webgl2\",\n \"webgpu\",\n \"canvas2d\",\n \"unknown\",\n] as const;\n\n/** Coarse execution-backend buckets permitted in game diagnostics. */\nexport const FEEDBACK_BACKEND_BUCKETS = [\n \"browser\",\n \"worker\",\n \"unknown\",\n] as const;\n\n/** Renderer surfaces approved to carry diagnostics in the first contract. */\nexport const FEEDBACK_GAME_SURFACE_IDS = [\n \"site.generator\",\n \"site.gpu-demo\",\n] as const;\n\n/** Exact renderer-owned provenance contracts for approved game surfaces. */\nexport const FEEDBACK_GAME_PROVENANCE_CONTRACTS = [\n {\n surfaceId: \"site.generator\",\n contractId: \"generator.renderer-diagnostics.v1\",\n },\n {\n surfaceId: \"site.gpu-demo\",\n contractId: \"gpu-demo.renderer-diagnostics.v1\",\n },\n] as const;\n\n/** Closed provenance identifiers accepted from the browser. */\nexport const FEEDBACK_GAME_PROVENANCE_CONTRACT_IDS = [\n \"generator.renderer-diagnostics.v1\",\n \"gpu-demo.renderer-diagnostics.v1\",\n] as const;\n\n/** Closed renderer feature identifiers accepted from the browser. */\nexport const FEEDBACK_GAME_FEATURE_IDS = [\n \"renderer.initialisation\",\n \"renderer.frame-loop\",\n \"renderer.asset-loading\",\n \"renderer.input\",\n \"renderer.scene-generation\",\n \"renderer.post-processing\",\n] as const;\n\n/** Closed renderer counter identifiers accepted from the browser. */\nexport const FEEDBACK_GAME_COUNTER_CODES = [\n \"frame-drop\",\n \"device-loss\",\n \"asset-load-failure\",\n \"shader-failure\",\n \"fallback-activation\",\n] as const;\n\n/** Maximum number of distinct coarse counters in one diagnostics packet. */\nexport const FEEDBACK_GAME_COUNTER_MAX_ITEMS = 32;\n\n/** Maximum value accepted for one coarse diagnostics counter. */\nexport const FEEDBACK_GAME_COUNTER_MAX_COUNT = 10_000;\n\n/** Closed renderer error identifiers accepted from the browser. */\nexport const FEEDBACK_GAME_ERROR_CODES = [\n \"renderer.initialisation-failed\",\n \"renderer.device-lost\",\n \"renderer.asset-load-failed\",\n \"renderer.frame-budget-exceeded\",\n \"renderer.shader-failed\",\n \"renderer.unknown\",\n] as const;\n\n/** Coarse viewport buckets; exact dimensions are deliberately excluded. */\nexport const FEEDBACK_VIEWPORT_BUCKETS = [\n \"small-portrait\",\n \"small-landscape\",\n \"medium-portrait\",\n \"medium-landscape\",\n \"large-portrait\",\n \"large-landscape\",\n \"unknown\",\n] as const;\n\n/** Coarse frame-rate buckets permitted in game diagnostics. */\nexport const FEEDBACK_FRAME_RATE_BUCKETS = [\n \"under-15\",\n \"15-29\",\n \"30-59\",\n \"60-plus\",\n \"unknown\",\n] as const;\n\n/** Coarse frame-time buckets permitted in game diagnostics. */\nexport const FEEDBACK_FRAME_TIME_BUCKETS = [\n \"under-17ms\",\n \"17-33ms\",\n \"34-66ms\",\n \"over-66ms\",\n \"unknown\",\n] as const;\n\nfor (const vocabulary of [\n FEEDBACK_RENDERER_BUCKETS,\n FEEDBACK_BACKEND_BUCKETS,\n FEEDBACK_GAME_SURFACE_IDS,\n FEEDBACK_GAME_PROVENANCE_CONTRACTS,\n FEEDBACK_GAME_PROVENANCE_CONTRACT_IDS,\n FEEDBACK_GAME_FEATURE_IDS,\n FEEDBACK_GAME_COUNTER_CODES,\n FEEDBACK_GAME_ERROR_CODES,\n FEEDBACK_VIEWPORT_BUCKETS,\n FEEDBACK_FRAME_RATE_BUCKETS,\n FEEDBACK_FRAME_TIME_BUCKETS,\n]) {\n Object.freeze(vocabulary);\n}\nfor (const entry of FEEDBACK_GAME_PROVENANCE_CONTRACTS) {\n Object.freeze(entry);\n}\n\n/** Fields shared by every coarse, consented game-diagnostics packet. */\ninterface FeedbackGameDiagnosticsBase {\n type: \"feedback-game-diagnostics\";\n version: typeof FEEDBACK_CONTRACT_VERSION;\n consentConfirmed: true;\n renderer: (typeof FEEDBACK_RENDERER_BUCKETS)[number];\n backend: (typeof FEEDBACK_BACKEND_BUCKETS)[number];\n viewportBucket: (typeof FEEDBACK_VIEWPORT_BUCKETS)[number];\n frameRateBucket: (typeof FEEDBACK_FRAME_RATE_BUCKETS)[number];\n frameTimeBucket: (typeof FEEDBACK_FRAME_TIME_BUCKETS)[number];\n featureIds: readonly (typeof FEEDBACK_GAME_FEATURE_IDS)[number][];\n counters: readonly {\n code: (typeof FEEDBACK_GAME_COUNTER_CODES)[number];\n count: number;\n }[];\n errorCodes: readonly (typeof FEEDBACK_GAME_ERROR_CODES)[number][];\n}\n\ntype FeedbackGameProvenanceContract =\n (typeof FEEDBACK_GAME_PROVENANCE_CONTRACTS)[number];\n\ntype FeedbackGameProvenancePair = {\n [SurfaceId in FeedbackGameProvenanceContract[\"surfaceId\"]]: {\n surfaceId: SurfaceId;\n provenanceContractId: Extract<\n FeedbackGameProvenanceContract,\n { surfaceId: SurfaceId }\n >[\"contractId\"];\n };\n}[FeedbackGameProvenanceContract[\"surfaceId\"]];\n\n/**\n * Coarse, consented game facts that cannot express captured pixels.\n *\n * The discriminated union prevents a renderer from pairing one approved\n * surface with another surface's provenance contract at compile time.\n */\nexport type FeedbackGameDiagnostics = FeedbackGameDiagnosticsBase &\n FeedbackGameProvenancePair;\n","/** Version shared by the first privacy-safe feedback contracts. */\nexport const FEEDBACK_CONTRACT_VERSION = \"1.0.0\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCO,IAAM,4BAA4B;;;ADIlC,IAAM,4BAA4B;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,2BAA2B;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,4BAA4B;AAAA,EACvC;AAAA,EACA;AACF;AAGO,IAAM,qCAAqC;AAAA,EAChD;AAAA,IACE,WAAW;AAAA,IACX,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,WAAW;AAAA,IACX,YAAY;AAAA,EACd;AACF;AAGO,IAAM,wCAAwC;AAAA,EACnD;AAAA,EACA;AACF;AAGO,IAAM,4BAA4B;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,8BAA8B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,kCAAkC;AAGxC,IAAM,kCAAkC;AAGxC,IAAM,4BAA4B;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,4BAA4B;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,8BAA8B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,8BAA8B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,WAAW,cAAc;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAG;AACD,SAAO,OAAO,UAAU;AAC1B;AACA,WAAW,SAAS,oCAAoC;AACtD,SAAO,OAAO,KAAK;AACrB;","names":[]}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/** Version shared by the first privacy-safe feedback contracts. */
|
|
2
|
+
declare const FEEDBACK_CONTRACT_VERSION = "1.0.0";
|
|
3
|
+
|
|
4
|
+
/** Coarse renderer buckets permitted in privacy-safe game diagnostics. */
|
|
5
|
+
declare const FEEDBACK_RENDERER_BUCKETS: readonly ["webgl2", "webgpu", "canvas2d", "unknown"];
|
|
6
|
+
/** Coarse execution-backend buckets permitted in game diagnostics. */
|
|
7
|
+
declare const FEEDBACK_BACKEND_BUCKETS: readonly ["browser", "worker", "unknown"];
|
|
8
|
+
/** Renderer surfaces approved to carry diagnostics in the first contract. */
|
|
9
|
+
declare const FEEDBACK_GAME_SURFACE_IDS: readonly ["site.generator", "site.gpu-demo"];
|
|
10
|
+
/** Exact renderer-owned provenance contracts for approved game surfaces. */
|
|
11
|
+
declare const FEEDBACK_GAME_PROVENANCE_CONTRACTS: readonly [{
|
|
12
|
+
readonly surfaceId: "site.generator";
|
|
13
|
+
readonly contractId: "generator.renderer-diagnostics.v1";
|
|
14
|
+
}, {
|
|
15
|
+
readonly surfaceId: "site.gpu-demo";
|
|
16
|
+
readonly contractId: "gpu-demo.renderer-diagnostics.v1";
|
|
17
|
+
}];
|
|
18
|
+
/** Closed provenance identifiers accepted from the browser. */
|
|
19
|
+
declare const FEEDBACK_GAME_PROVENANCE_CONTRACT_IDS: readonly ["generator.renderer-diagnostics.v1", "gpu-demo.renderer-diagnostics.v1"];
|
|
20
|
+
/** Closed renderer feature identifiers accepted from the browser. */
|
|
21
|
+
declare const FEEDBACK_GAME_FEATURE_IDS: readonly ["renderer.initialisation", "renderer.frame-loop", "renderer.asset-loading", "renderer.input", "renderer.scene-generation", "renderer.post-processing"];
|
|
22
|
+
/** Closed renderer counter identifiers accepted from the browser. */
|
|
23
|
+
declare const FEEDBACK_GAME_COUNTER_CODES: readonly ["frame-drop", "device-loss", "asset-load-failure", "shader-failure", "fallback-activation"];
|
|
24
|
+
/** Maximum number of distinct coarse counters in one diagnostics packet. */
|
|
25
|
+
declare const FEEDBACK_GAME_COUNTER_MAX_ITEMS = 32;
|
|
26
|
+
/** Maximum value accepted for one coarse diagnostics counter. */
|
|
27
|
+
declare const FEEDBACK_GAME_COUNTER_MAX_COUNT = 10000;
|
|
28
|
+
/** Closed renderer error identifiers accepted from the browser. */
|
|
29
|
+
declare const FEEDBACK_GAME_ERROR_CODES: readonly ["renderer.initialisation-failed", "renderer.device-lost", "renderer.asset-load-failed", "renderer.frame-budget-exceeded", "renderer.shader-failed", "renderer.unknown"];
|
|
30
|
+
/** Coarse viewport buckets; exact dimensions are deliberately excluded. */
|
|
31
|
+
declare const FEEDBACK_VIEWPORT_BUCKETS: readonly ["small-portrait", "small-landscape", "medium-portrait", "medium-landscape", "large-portrait", "large-landscape", "unknown"];
|
|
32
|
+
/** Coarse frame-rate buckets permitted in game diagnostics. */
|
|
33
|
+
declare const FEEDBACK_FRAME_RATE_BUCKETS: readonly ["under-15", "15-29", "30-59", "60-plus", "unknown"];
|
|
34
|
+
/** Coarse frame-time buckets permitted in game diagnostics. */
|
|
35
|
+
declare const FEEDBACK_FRAME_TIME_BUCKETS: readonly ["under-17ms", "17-33ms", "34-66ms", "over-66ms", "unknown"];
|
|
36
|
+
/** Fields shared by every coarse, consented game-diagnostics packet. */
|
|
37
|
+
interface FeedbackGameDiagnosticsBase {
|
|
38
|
+
type: "feedback-game-diagnostics";
|
|
39
|
+
version: typeof FEEDBACK_CONTRACT_VERSION;
|
|
40
|
+
consentConfirmed: true;
|
|
41
|
+
renderer: (typeof FEEDBACK_RENDERER_BUCKETS)[number];
|
|
42
|
+
backend: (typeof FEEDBACK_BACKEND_BUCKETS)[number];
|
|
43
|
+
viewportBucket: (typeof FEEDBACK_VIEWPORT_BUCKETS)[number];
|
|
44
|
+
frameRateBucket: (typeof FEEDBACK_FRAME_RATE_BUCKETS)[number];
|
|
45
|
+
frameTimeBucket: (typeof FEEDBACK_FRAME_TIME_BUCKETS)[number];
|
|
46
|
+
featureIds: readonly (typeof FEEDBACK_GAME_FEATURE_IDS)[number][];
|
|
47
|
+
counters: readonly {
|
|
48
|
+
code: (typeof FEEDBACK_GAME_COUNTER_CODES)[number];
|
|
49
|
+
count: number;
|
|
50
|
+
}[];
|
|
51
|
+
errorCodes: readonly (typeof FEEDBACK_GAME_ERROR_CODES)[number][];
|
|
52
|
+
}
|
|
53
|
+
type FeedbackGameProvenanceContract = (typeof FEEDBACK_GAME_PROVENANCE_CONTRACTS)[number];
|
|
54
|
+
type FeedbackGameProvenancePair = {
|
|
55
|
+
[SurfaceId in FeedbackGameProvenanceContract["surfaceId"]]: {
|
|
56
|
+
surfaceId: SurfaceId;
|
|
57
|
+
provenanceContractId: Extract<FeedbackGameProvenanceContract, {
|
|
58
|
+
surfaceId: SurfaceId;
|
|
59
|
+
}>["contractId"];
|
|
60
|
+
};
|
|
61
|
+
}[FeedbackGameProvenanceContract["surfaceId"]];
|
|
62
|
+
/**
|
|
63
|
+
* Coarse, consented game facts that cannot express captured pixels.
|
|
64
|
+
*
|
|
65
|
+
* The discriminated union prevents a renderer from pairing one approved
|
|
66
|
+
* surface with another surface's provenance contract at compile time.
|
|
67
|
+
*/
|
|
68
|
+
type FeedbackGameDiagnostics = FeedbackGameDiagnosticsBase & FeedbackGameProvenancePair;
|
|
69
|
+
|
|
70
|
+
export { FEEDBACK_BACKEND_BUCKETS, FEEDBACK_CONTRACT_VERSION, FEEDBACK_FRAME_RATE_BUCKETS, FEEDBACK_FRAME_TIME_BUCKETS, FEEDBACK_GAME_COUNTER_CODES, FEEDBACK_GAME_COUNTER_MAX_COUNT, FEEDBACK_GAME_COUNTER_MAX_ITEMS, FEEDBACK_GAME_ERROR_CODES, FEEDBACK_GAME_FEATURE_IDS, FEEDBACK_GAME_PROVENANCE_CONTRACTS, FEEDBACK_GAME_PROVENANCE_CONTRACT_IDS, FEEDBACK_GAME_SURFACE_IDS, FEEDBACK_RENDERER_BUCKETS, FEEDBACK_VIEWPORT_BUCKETS, type FeedbackGameDiagnostics };
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/** Version shared by the first privacy-safe feedback contracts. */
|
|
2
|
+
declare const FEEDBACK_CONTRACT_VERSION = "1.0.0";
|
|
3
|
+
|
|
4
|
+
/** Coarse renderer buckets permitted in privacy-safe game diagnostics. */
|
|
5
|
+
declare const FEEDBACK_RENDERER_BUCKETS: readonly ["webgl2", "webgpu", "canvas2d", "unknown"];
|
|
6
|
+
/** Coarse execution-backend buckets permitted in game diagnostics. */
|
|
7
|
+
declare const FEEDBACK_BACKEND_BUCKETS: readonly ["browser", "worker", "unknown"];
|
|
8
|
+
/** Renderer surfaces approved to carry diagnostics in the first contract. */
|
|
9
|
+
declare const FEEDBACK_GAME_SURFACE_IDS: readonly ["site.generator", "site.gpu-demo"];
|
|
10
|
+
/** Exact renderer-owned provenance contracts for approved game surfaces. */
|
|
11
|
+
declare const FEEDBACK_GAME_PROVENANCE_CONTRACTS: readonly [{
|
|
12
|
+
readonly surfaceId: "site.generator";
|
|
13
|
+
readonly contractId: "generator.renderer-diagnostics.v1";
|
|
14
|
+
}, {
|
|
15
|
+
readonly surfaceId: "site.gpu-demo";
|
|
16
|
+
readonly contractId: "gpu-demo.renderer-diagnostics.v1";
|
|
17
|
+
}];
|
|
18
|
+
/** Closed provenance identifiers accepted from the browser. */
|
|
19
|
+
declare const FEEDBACK_GAME_PROVENANCE_CONTRACT_IDS: readonly ["generator.renderer-diagnostics.v1", "gpu-demo.renderer-diagnostics.v1"];
|
|
20
|
+
/** Closed renderer feature identifiers accepted from the browser. */
|
|
21
|
+
declare const FEEDBACK_GAME_FEATURE_IDS: readonly ["renderer.initialisation", "renderer.frame-loop", "renderer.asset-loading", "renderer.input", "renderer.scene-generation", "renderer.post-processing"];
|
|
22
|
+
/** Closed renderer counter identifiers accepted from the browser. */
|
|
23
|
+
declare const FEEDBACK_GAME_COUNTER_CODES: readonly ["frame-drop", "device-loss", "asset-load-failure", "shader-failure", "fallback-activation"];
|
|
24
|
+
/** Maximum number of distinct coarse counters in one diagnostics packet. */
|
|
25
|
+
declare const FEEDBACK_GAME_COUNTER_MAX_ITEMS = 32;
|
|
26
|
+
/** Maximum value accepted for one coarse diagnostics counter. */
|
|
27
|
+
declare const FEEDBACK_GAME_COUNTER_MAX_COUNT = 10000;
|
|
28
|
+
/** Closed renderer error identifiers accepted from the browser. */
|
|
29
|
+
declare const FEEDBACK_GAME_ERROR_CODES: readonly ["renderer.initialisation-failed", "renderer.device-lost", "renderer.asset-load-failed", "renderer.frame-budget-exceeded", "renderer.shader-failed", "renderer.unknown"];
|
|
30
|
+
/** Coarse viewport buckets; exact dimensions are deliberately excluded. */
|
|
31
|
+
declare const FEEDBACK_VIEWPORT_BUCKETS: readonly ["small-portrait", "small-landscape", "medium-portrait", "medium-landscape", "large-portrait", "large-landscape", "unknown"];
|
|
32
|
+
/** Coarse frame-rate buckets permitted in game diagnostics. */
|
|
33
|
+
declare const FEEDBACK_FRAME_RATE_BUCKETS: readonly ["under-15", "15-29", "30-59", "60-plus", "unknown"];
|
|
34
|
+
/** Coarse frame-time buckets permitted in game diagnostics. */
|
|
35
|
+
declare const FEEDBACK_FRAME_TIME_BUCKETS: readonly ["under-17ms", "17-33ms", "34-66ms", "over-66ms", "unknown"];
|
|
36
|
+
/** Fields shared by every coarse, consented game-diagnostics packet. */
|
|
37
|
+
interface FeedbackGameDiagnosticsBase {
|
|
38
|
+
type: "feedback-game-diagnostics";
|
|
39
|
+
version: typeof FEEDBACK_CONTRACT_VERSION;
|
|
40
|
+
consentConfirmed: true;
|
|
41
|
+
renderer: (typeof FEEDBACK_RENDERER_BUCKETS)[number];
|
|
42
|
+
backend: (typeof FEEDBACK_BACKEND_BUCKETS)[number];
|
|
43
|
+
viewportBucket: (typeof FEEDBACK_VIEWPORT_BUCKETS)[number];
|
|
44
|
+
frameRateBucket: (typeof FEEDBACK_FRAME_RATE_BUCKETS)[number];
|
|
45
|
+
frameTimeBucket: (typeof FEEDBACK_FRAME_TIME_BUCKETS)[number];
|
|
46
|
+
featureIds: readonly (typeof FEEDBACK_GAME_FEATURE_IDS)[number][];
|
|
47
|
+
counters: readonly {
|
|
48
|
+
code: (typeof FEEDBACK_GAME_COUNTER_CODES)[number];
|
|
49
|
+
count: number;
|
|
50
|
+
}[];
|
|
51
|
+
errorCodes: readonly (typeof FEEDBACK_GAME_ERROR_CODES)[number][];
|
|
52
|
+
}
|
|
53
|
+
type FeedbackGameProvenanceContract = (typeof FEEDBACK_GAME_PROVENANCE_CONTRACTS)[number];
|
|
54
|
+
type FeedbackGameProvenancePair = {
|
|
55
|
+
[SurfaceId in FeedbackGameProvenanceContract["surfaceId"]]: {
|
|
56
|
+
surfaceId: SurfaceId;
|
|
57
|
+
provenanceContractId: Extract<FeedbackGameProvenanceContract, {
|
|
58
|
+
surfaceId: SurfaceId;
|
|
59
|
+
}>["contractId"];
|
|
60
|
+
};
|
|
61
|
+
}[FeedbackGameProvenanceContract["surfaceId"]];
|
|
62
|
+
/**
|
|
63
|
+
* Coarse, consented game facts that cannot express captured pixels.
|
|
64
|
+
*
|
|
65
|
+
* The discriminated union prevents a renderer from pairing one approved
|
|
66
|
+
* surface with another surface's provenance contract at compile time.
|
|
67
|
+
*/
|
|
68
|
+
type FeedbackGameDiagnostics = FeedbackGameDiagnosticsBase & FeedbackGameProvenancePair;
|
|
69
|
+
|
|
70
|
+
export { FEEDBACK_BACKEND_BUCKETS, FEEDBACK_CONTRACT_VERSION, FEEDBACK_FRAME_RATE_BUCKETS, FEEDBACK_FRAME_TIME_BUCKETS, FEEDBACK_GAME_COUNTER_CODES, FEEDBACK_GAME_COUNTER_MAX_COUNT, FEEDBACK_GAME_COUNTER_MAX_ITEMS, FEEDBACK_GAME_ERROR_CODES, FEEDBACK_GAME_FEATURE_IDS, FEEDBACK_GAME_PROVENANCE_CONTRACTS, FEEDBACK_GAME_PROVENANCE_CONTRACT_IDS, FEEDBACK_GAME_SURFACE_IDS, FEEDBACK_RENDERER_BUCKETS, FEEDBACK_VIEWPORT_BUCKETS, type FeedbackGameDiagnostics };
|