fix(ui): сохранять контекст карты сети в ссылке
This commit is contained in:
1 parent
0cdb43a29d
commit
8bc4f22af7
6 files changed
+114
-24
No files matched your search
@@ -0,0 +1,11 @@
|
||||
import {test} from "node:test"
|
||||
import assert from "node:assert/strict"
|
||||
import {readNetworkMapUrl,patchNetworkMapUrl} from "./network-map-url-state"
|
||||
test("map URL restores exact context and keeps unrelated parameters",()=>{
|
||||
const state=readNetworkMapUrl(new URLSearchParams("server=srv1&wan=0&filter=unknown&q=site&dest=countries"))
|
||||
assert.deepEqual(state,{server:"srv1",wan:0,filter:"unknown",search:"site",dest:"countries",error:null})
|
||||
assert.equal(patchNetworkMapUrl(new URLSearchParams("tag=keep&server=1&wan=0"),{server:null,wan:null}),"/network-map?tag=keep")
|
||||
})
|
||||
test("map URL refuses duplicated, oversized and unknown context",()=>{
|
||||
for(const query of ["server=1&server=2","q=x&q=y","filter=bad","dest=bad","wan=0","server=1&wan=-1","server=1&wan=99999","server=%20","q="+("x".repeat(257))])assert.ok(readNetworkMapUrl(new URLSearchParams(query)).error,query)
|
||||
})
|
||||
@@ -0,0 +1,18 @@
|
||||
export const networkMapFilters=["all","online","degraded","offline","unknown","jump-host","exit-node","home-router"] as const
|
||||
export type NetworkMapFilter=typeof networkMapFilters[number]
|
||||
export function readNetworkMapUrl(params:URLSearchParams){
|
||||
const server=params.get("server"),search=params.get("q")??"",filter=params.get("filter")??"all",dest=params.get("dest")??"services",wan=params.get("wan")
|
||||
let error:string|null=null
|
||||
if(["server","q","filter","dest","wan"].some(key=>params.getAll(key).length>1))error="В ссылке повторяется контекст карты."
|
||||
else if(server!==null&&!/^[a-zA-Z0-9_.:-]{1,64}$/.test(server))error="В ссылке указан некорректный сервер карты."
|
||||
else if(search.length>256)error="Поиск карты в ссылке слишком длинный."
|
||||
else if(!(networkMapFilters as readonly string[]).includes(filter))error="В ссылке указан неизвестный фильтр карты."
|
||||
else if(!["services","countries"].includes(dest))error="В ссылке указан неизвестный режим назначений."
|
||||
else if(wan!==null&&(!server||!/^\d{1,4}$/.test(wan)))error="В ссылке указан некорректный аплинк карты."
|
||||
return {server,search,filter:filter as NetworkMapFilter,dest:dest as "services"|"countries",wan:wan===null?null:Number(wan),error}
|
||||
}
|
||||
export function patchNetworkMapUrl(params:URLSearchParams,values:Record<string,string|null>){
|
||||
const next=new URLSearchParams(params)
|
||||
for(const[key,value]of Object.entries(values)){if(value===null||value==="")next.delete(key);else next.set(key,value)}
|
||||
return "/network-map"+(next.size?"?"+next.toString():"")
|
||||
}
|
||||
Reference in new issue
Block a user