Docker images / prepare-release (push) Successful in 8s
Docker images / backend-test (push) Successful in 2m11s
Docker images / frontend-image (push) Successful in 3m14s
Docker images / updater-image (push) Successful in 43s
Docker images / backend-image (push) Successful in 2m44s
Docker images / notify-webhook (push) Skipped
Docker images / publish-release (push) Successful in 10s
- Контракт: countryServiceGroups (группа сервисов страны) в flowMapHopsDto, тип FlowMapCountryServiceGroup. - Бэкенд: вложенная агрегация brand×ISO в том же проходе hops; рёбра страна→сервис, пути с реальным EN; cap 8 / min 4, доля от байтов страны. - Хелпер mapCountryServiceNodeId: id вида cc:us|svc:google, сервисы разных стран не смешиваются. - Карта сети: клик по стране сдвигает колонку стран и раскрывает столбец её сервисов; остальные страны приглушены; панели страны и вложенного сервиса. - Тесты: группы US/US+NL, рёбра от страны, cap/min вложенного слоя; mock countryServiceGroups для демо-режима.
122 lines
5.6 KiB
TypeScript
122 lines
5.6 KiB
TypeScript
import assert from "node:assert/strict"
|
|
import {
|
|
brandByAsn,
|
|
brandByHolder,
|
|
countryFromHolder,
|
|
isSteamGamePort,
|
|
lookupBrand,
|
|
OTHER_SERVICE,
|
|
isNamedInternetService,
|
|
mapServiceNodeId,
|
|
mapCountryNodeId,
|
|
mapCountryServiceNodeId,
|
|
resolveFlowBrand,
|
|
resolveRipeCountry,
|
|
} from "./traffic-flow-brands.js"
|
|
|
|
assert.equal(resolveRipeCountry("?", 13335, "CLOUDFLARENET, US"), "US")
|
|
assert.equal(resolveRipeCountry("EU", 13335, ""), "US")
|
|
assert.equal(resolveRipeCountry("?", 0, "CLOUDFLARENET, US"), "US")
|
|
assert.equal(countryFromHolder("CLOUDFLARENET, US"), "US")
|
|
assert.equal(resolveRipeCountry("NL", 0, ""), "NL")
|
|
assert.equal(resolveRipeCountry("?", 0, ""), "")
|
|
|
|
assert.equal(brandByAsn(13335)?.service, "Cloudflare")
|
|
assert.equal(brandByAsn(13335)?.category, "CDN")
|
|
assert.equal(brandByAsn(15169)?.service, "Google")
|
|
assert.equal(brandByAsn(15169)?.category, "Веб")
|
|
assert.equal(lookupBrand("208.65.153.1", 0)?.service, "YouTube")
|
|
assert.equal(brandByAsn(32590)?.service, "Steam")
|
|
assert.equal(brandByAsn(32590)?.category, "Игры")
|
|
assert.equal(brandByAsn(16509)?.service, "AWS")
|
|
assert.equal(brandByAsn(57976)?.service, "Blizzard")
|
|
assert.equal(brandByAsn(401115)?.service, "ChatGPT")
|
|
assert.equal(lookupBrand("1.1.1.1", 13335)?.service, "Cloudflare")
|
|
assert.equal(lookupBrand("104.18.35.51", 0)?.service, "Cloudflare")
|
|
assert.equal(lookupBrand("173.194.151.65", 0)?.service, "Google")
|
|
assert.equal(lookupBrand("64.233.161.1", 0)?.service, "Google")
|
|
assert.equal(lookupBrand("142.250.1.10", 0)?.service, "Google")
|
|
assert.equal(lookupBrand("8.8.8.8", 0)?.service, "Google")
|
|
assert.equal(lookupBrand("203.0.113.9", 64500), null)
|
|
assert.equal(OTHER_SERVICE, "Прочее")
|
|
assert.equal(isNamedInternetService("Google", "Веб"), true)
|
|
assert.equal(isNamedInternetService("Прочее", "Прочее"), false)
|
|
assert.equal(isNamedInternetService("GRE", "Туннель"), false)
|
|
assert.equal(isNamedInternetService("DNS", "DNS"), false)
|
|
assert.equal(mapServiceNodeId("AWS"), "svc:aws")
|
|
assert.equal(mapServiceNodeId("Cloudflare"), "svc:cloudflare")
|
|
assert.equal(mapServiceNodeId("Прочее"), "svc:other")
|
|
assert.equal(mapCountryNodeId("US"), "cc:us")
|
|
assert.equal(mapCountryNodeId("nl"), "cc:nl")
|
|
assert.equal(mapCountryNodeId(""), "cc:other")
|
|
assert.equal(mapCountryNodeId("Прочее"), "cc:other")
|
|
assert.equal(mapCountryNodeId("EU"), "cc:other")
|
|
assert.equal(mapCountryServiceNodeId("cc:us", "svc:google"), "cc:us|svc:google")
|
|
assert.equal(mapCountryServiceNodeId("cc:other", "svc:other"), "cc:other|svc:other")
|
|
|
|
assert.equal(brandByAsn(714)?.service, "Apple")
|
|
assert.equal(brandByAsn(714)?.category, "CDN")
|
|
assert.equal(brandByAsn(36459)?.service, "GitHub")
|
|
assert.equal(brandByAsn(395701)?.service, "Epic")
|
|
assert.equal(brandByAsn(6507)?.service, "Riot")
|
|
assert.equal(brandByAsn(33353)?.service, "PlayStation")
|
|
assert.equal(brandByAsn(14061)?.service, "DigitalOcean")
|
|
assert.equal(brandByAsn(24940)?.service, "Hetzner")
|
|
assert.equal(brandByAsn(8403)?.service, "Spotify")
|
|
assert.equal(brandByAsn(13414)?.service, "X")
|
|
assert.equal(brandByAsn(47541)?.service, "VK")
|
|
assert.equal(brandByAsn(47764)?.service, "VK")
|
|
assert.equal(brandByAsn(30103)?.service, "Zoom")
|
|
assert.equal(brandByAsn(19281)?.service, "Quad9")
|
|
assert.equal(brandByAsn(9059)?.service, "AWS")
|
|
assert.equal(brandByAsn(396982)?.service, "Google")
|
|
assert.equal(brandByAsn(400645)?.service, "ChatGPT")
|
|
|
|
assert.equal(brandByHolder("VALVE-CORPORATION")?.service, "Steam")
|
|
assert.equal(brandByHolder("OpenAI, LLC")?.service, "ChatGPT")
|
|
assert.equal(brandByHolder("YouTube LLC")?.service, "YouTube")
|
|
assert.equal(brandByHolder("AMAZON-AES - Amazon.com, Inc."), null)
|
|
|
|
assert.equal(isSteamGamePort(17, 27015, 50000), true)
|
|
assert.equal(isSteamGamePort(6, 443, 50000), false)
|
|
|
|
assert.equal(resolveFlowBrand("104.18.35.51", 32590, "VALVE-CORPORATION", 6, 443, 1)?.service, "Cloudflare")
|
|
assert.equal(resolveFlowBrand("203.0.113.9", 32590, "", 17, 27015, 50000)?.service, "Steam")
|
|
assert.equal(resolveFlowBrand("8.8.8.8", 15169, "GOOGLE", 6, 443, 51234)?.service, "Google")
|
|
assert.equal(resolveFlowBrand("173.194.160.163", 15169, "GOOGLE", 6, 443, 51234)?.service, "YouTube")
|
|
assert.equal(resolveFlowBrand("64.233.161.1", 0, "", 17, 443, 50000)?.service, "YouTube")
|
|
assert.equal(resolveFlowBrand("64.233.161.1", 0, "", 6, 80, 50000)?.service, "Google")
|
|
assert.equal(resolveFlowBrand("2001:4860:4860::8888", 15169, "GOOGLE", 17, 53, 53000)?.service, "Google")
|
|
assert.equal(resolveFlowBrand("2001:4860:4860::8888", 15169, "GOOGLE", 17, 443, 50000)?.service, "YouTube")
|
|
|
|
assert.equal(brandByAsn(32934)?.service, "Meta")
|
|
assert.equal(lookupBrand("157.240.12.52", 0)?.service, "Meta")
|
|
assert.equal(lookupBrand("57.144.22.192", 0)?.service, "Meta")
|
|
assert.equal(brandByHolder("Instagram LLC")?.service, "Instagram")
|
|
assert.equal(mapServiceNodeId("Instagram"), "svc:instagram")
|
|
assert.equal(isNamedInternetService("Instagram", "Видео / стриминг"), true)
|
|
assert.equal(
|
|
resolveFlowBrand("157.240.12.52", 32934, "FACEBOOK", 6, 443, 51234)?.service,
|
|
"Instagram",
|
|
"HTTPS на Meta front → Instagram, как YouTube на Google",
|
|
)
|
|
assert.equal(
|
|
resolveFlowBrand("57.144.22.192", 0, "", 17, 443, 50000)?.service,
|
|
"Instagram",
|
|
"cdninstagram CIDR :443 без ASN → Instagram",
|
|
)
|
|
assert.equal(
|
|
resolveFlowBrand("157.240.12.52", 32934, "FACEBOOK", 6, 80, 50000)?.service,
|
|
"Meta",
|
|
":80 на Meta остаётся Meta",
|
|
)
|
|
assert.equal(
|
|
resolveFlowBrand("157.240.1.1", 54115, "WHATSAPP", 6, 443, 1)?.service,
|
|
"Meta",
|
|
"AS54115 WhatsApp не становится Instagram",
|
|
)
|
|
assert.equal(resolveRipeCountry("", 9059, ""), "IE")
|
|
assert.equal(resolveRipeCountry("", 24940, ""), "DE")
|
|
|
|
console.log("traffic-flow-brands.test.ts: ok")
|