• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

microlinkhq / ua / 41815960127
100%

Build:
DEFAULT BRANCH: master
Ran 04 Nov 2026 10:43AM UTC
Jobs 1
Files 2
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

04 Nov 2026 10:42AM UTC coverage: 100.0%. Remained the same
41815960127

push

github

web-flow
feat: count only real browsers, once per client (#26)

* feat: count only real browsers, once per client

incr() now skips any user agent that does not have the exact shape a
real browser sends: a known platform, an engine that runs on it, known
vendor tokens and well-formed versions. Bots, HTTP libraries, Electron
apps, in-app webviews and hand-written fakes such as `Chrome/124.0` or
`Mac OS X 14_6` never reach Redis.

incr(userAgent, clientId) counts each client once per user agent within
a window (default 24h) through a single Lua round trip, so one heavy
caller cannot dominate the ranking. IPv6 clients are grouped per /64 and
every IPv4-mapped spelling folds into its IPv4.

isBrowser is exported for read-side reuse. isbot is dropped: nothing
isbot flags survives the shape check, and the write path gets ~3x
cheaper (1048 -> 343 ns per call on the 1369-UA corpus).

Refs microlinkhq/top-user-agents#60

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(types): require scripting only for per-client counting

A client implementing the original three-method contract keeps working
for incr(userAgent); passing a clientId needs defineCommand, so the
factory overloads return BasicUserAgentsAPI for basic clients.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix: default the window when options is null

A null options object threw while reading window. Tests now lock that path and the grammar allows the suite did not assert.

Co-authored-by: Cursor <cursoragent@cursor.com>

* refactor: drop the per-factory incr command cache

The defineCommand guard already skips a second definition, and removing the cache left the suite green.

Co-authored-by: Cursor <cursoragent@cursor.com>

* refactor: pass client ids to the IP check directly

String() was not what kept non-string ids from throwing, and dropping it left the suite green.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: keep per-client marks on the counter's cluster slot

T... (continued)

64 of 64 branches covered (100.0%)

Branch coverage included in aggregate %.

190 of 190 new or added lines in 2 files covered. (100.0%)

215 of 215 relevant lines covered (100.0%)

294.82 hits per line

Jobs
ID Job ID Ran Files Coverage
1 41815960127.1 04 Nov 2026 10:43AM UTC 2
100.0
GitHub Action Run
Source Files on build 41815960127
  • Tree
  • List 2
  • Changed 1
  • Source Changed 1
  • Coverage Changed 1
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • Github Actions Build #41815960127
  • c35547a9 on github
  • Prev Build on master (#40840663057)
  • Delete
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc