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

decentraland / profile-images / 24508717107
89%

Build:
DEFAULT BRANCH: main
Ran 16 Apr 2026 11:55AM UTC
Jobs 1
Files 20
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

16 Apr 2026 11:53AM UTC coverage: 88.567% (-0.6%) from 89.127%
24508717107

push

github

web-flow
feat: skip Godot render when avatar has not changed (#147)

* feat(storage): add retrieveAvatarInfo, storeAvatarInfo, deleteAvatarInfo methods

Add three new methods to IStorageComponent to persist and retrieve the last-rendered
AvatarInfo per entity. Key pattern: ${prefix}/entities/${entityId}/avatar.json.

- retrieveAvatarInfo: returns undefined on NoSuchKey or any S3 error (graceful degradation)
- storeAvatarInfo: non-fatal write; logs warning on failure
- deleteAvatarInfo: non-fatal delete; logs warning on failure

* feat(utils): add avatar-comparison utility for change detection

Pure function avatarsAreVisuallyEqual(a, b) compares visually-relevant AvatarInfo
fields: bodyShape, wearables, forceRender, eye/hair/skin colors.

- Wearables and forceRender compared case-insensitively and order-independently
- Colors rounded to 4 decimal places to avoid float serialization noise
- null/undefined wearables arrays normalized to []

* fix(image-processor): skip Godot render when avatar is unchanged

Implements core-team#200. Before calling Godot, fetch the last-rendered AvatarInfo
from S3 for each entity in the batch and compare visually-relevant fields.

Changes:
- Read stored avatar info in parallel for all batch entities
- Partition entities into needsRender vs skipped using avatarsAreVisuallyEqual
- Skip Godot entirely for unchanged entities; return synthetic success result
- Store rendered AvatarInfo after storeImages succeeds (for future comparisons)
- Delete stored AvatarInfo on Godot failure so DLQ retry always re-renders
- Increment snapshot_generation_count{status=skipped} metric for skipped entities
- Preserve original entity order in returned results

* test: add coverage for change detection and new storage methods

- Update IStorageComponent mocks (in-memory, jest mocks, test/components.ts)
- Add 44 new test cases: avatar-comparison utility, storage methods, image-processor
  change-detection flows (unchanged skip, changed render, mixed bat... (continued)

160 of 205 branches covered (78.05%)

Branch coverage included in aggregate %.

56 of 57 new or added lines in 3 files covered. (98.25%)

483 of 521 relevant lines covered (92.71%)

20.78 hits per line

Uncovered Changes

Lines Coverage ∆ File
1
97.4
-2.6% src/logic/image-processor.ts
Jobs
ID Job ID Ran Files Coverage
1 24508717107.1 16 Apr 2026 11:55AM UTC 40
89.83
GitHub Action Run
Source Files on build 24508717107
  • Tree
  • List 20
  • Changed 19
  • Source Changed 19
  • Coverage Changed 19
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • Github Actions Build #24508717107
  • f2082d5f on github
  • Prev Build on main (#21028367562)
  • Next Build on main (#25168095401)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc