Merge branch 'main' into fix/remove-operator-hud-layout

This commit is contained in:
Said Turksever authored and GitHub committed 2026-10-29 14:22:01 +00:00
commit adb21d098d
53 files changed
+215 -240

No files matched your search

+7
View File
@@ -107,6 +107,13 @@ test('the HAL example survives the round trip and shrinks to 39 characters', ()
);
});
test('a long-form link to the retired Snow style opens as Normal', () => {
const snow = parseLegacy('v=2&lat=1&lon=2&style=snow&sp=d.90_w.20');
const normal = parseLegacy('v=2&lat=1&lon=2');
assert.equal(snow.style, 'normal');
assert.deepEqual(snow.styleParams, normal.styleParams);
});
test('links from earlier long-form versions keep their historical meaning', () => {
for (const hash of [
'lat=10&lon=20',
+8 -7
View File
@@ -31,6 +31,7 @@ import {
} from '../data/detectionPolicy.js';
import { clampScopeFeatherPct } from '../scopeMaskPolicy.js';
import { VIEW_STYLES } from '../view/index.js';
import { RETIRED_STYLES } from '../visualStylePolicy.js';
import {
GLOBAL_POST_DEFAULTS,
STYLE_PRESET_DEFAULTS,
@@ -101,7 +102,7 @@ export const SHARE_VIEW_ENUMS = Object.freeze({
'thermal',
'anime',
'noir',
'snow',
'snow', // retired (RETIRED_STYLES): decodes as Normal
]),
mapStack: Object.freeze([
'photoreal',
@@ -221,10 +222,6 @@ export const SHARE_VIEW_STYLE_PARAMS = Object.freeze({
{ key: 'grainAmt', token: 'g', min: 0, max: 1 },
{ key: 'vignetteAmt', token: 'v', min: 0, max: 1 },
]),
snow: freezeAll([
{ key: 'density', token: 'd', min: 0, max: 1 },
{ key: 'wind', token: 'w', min: 0, max: 1 },
]),
});
/**
@@ -1321,8 +1318,12 @@ export function decodeShareView(code, { nowMs = Date.now() } = {}) {
return { ok: false, reason: 'out-of-range' };
}
// A retired style's code stays reserved: the view opens on Normal, and
// parameters written for it are dropped rather than reported as unknown.
const retiredStyle = RETIRED_STYLES.includes(raw.style);
if (raw.style !== undefined && !VIEW_STYLES.includes(raw.style)) {
if (get('style').len) unknown.code('enum:style', raw.style);
if (get('style').len && !retiredStyle)
unknown.code('enum:style', raw.style);
raw.style = undefined;
}
for (const key of ['hudVariant', 'mapStack']) {
@@ -1357,7 +1358,7 @@ export function decodeShareView(code, { nowMs = Date.now() } = {}) {
unknown.code('layer-option', 'without-layers');
if (get('panelState'))
raw.panelState = decodePanels(get('panelState').len, unknown);
if (get('styleParams'))
if (get('styleParams') && !retiredStyle)
raw.styleParams = decodeStyleParams(
get('styleParams').len,
raw.style ?? 'normal',
+24 -1
View File
@@ -2,6 +2,7 @@ import { test } from 'node:test';
import assert from 'node:assert/strict';
import {
LAYER_STATE_REGISTRY,
LAYER_STATE_TOKEN_ALPHABET,
LAYER_STATE_TOKEN_RESERVATIONS,
REGISTERED_LAYER_IDS,
createDefaultLayerState,
@@ -558,7 +559,6 @@ test('the field registry is well formed and permanent', () => {
...common,
styleParams: { contrastAmt: 1.2, grainAmt: 0.5, vignetteAmt: 0.5 },
},
snow: { ...common, styleParams: { density: 0.6, wind: 0.5 } },
});
assert.deepEqual(
SHARE_VIEW_ENTITY_KINDS.map((e) => [e.code, e.kind]),
@@ -975,6 +975,29 @@ test('enum names outside the code tables travel as text', () => {
]);
});
test('links to the retired Snow style open as Normal', () => {
const snowCode = SHARE_VIEW_ENUMS.style.indexOf('snow');
assert.equal(snowCode, 6, 'a retired code is never reused');
const params = new WireWriter()
.varint(LAYER_STATE_TOKEN_ALPHABET.indexOf('d'))
.varint(90)
.varint(LAYER_STATE_TOKEN_ALPHABET.indexOf('w'))
.varint(20)
.finish();
for (const writeStyle of [
(writer) => writer.uintField(14, snowCode),
(writer) => writer.textField(14, 'snow'),
]) {
const writer = new WireWriter();
writer.bytes.push(1);
writeStyle(writer);
writer.bytesField(27, params);
const { state, unknownFields } = decodeOk(hashOf(writer.finish()));
assert.deepEqual(state, normalizeShareViewState({}));
assert.equal(unknownFields, undefined);
}
});
/* ---------------- integrity ---------------- */
test('malformed input is rejected with a reason, never thrown', () => {