feat: Add X-Integrity HTTP header for unpkg files
Adds a simple X-Integrity HTTP response header containing the SHA-512 integrity hash when serving unpkg files. This allows clients to verify file integrity without changing the existing integrity calculation or file metadata format.
Changes Made
-
HTTP Header: Added
X-Integrityheader to raw file responses containing the existing SHA-512 integrity value - No Algorithm Changes: Maintains existing SHA-512-only integrity calculation
-
No Metadata Changes: File metadata responses (
?meta) remain unchanged -
Unit Tests: Added test to verify the
X-Integrityheader is correctly set
Implementation Details
The implementation adds a single line to set the X-Integrity header in PackageVersionFileController when serving raw files:
if (file.dist.integrity) {
ctx.set('X-Integrity', file.dist.integrity);
}
This provides a simple way for clients to access the integrity hash via HTTP headers without any changes to the existing integrity system or adding additional hash algorithms.
Testing
- ✅ Unit test added for X-Integrity header
- ✅ TypeScript compilation passes
- ✅ All lint checks pass
- ✅ Backwards compatible with existing integrity system
The changes are minimal and focused, adding only an HTTP header without altering any existing functionality or data structures.
Fixes #634.
💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.
How to use the Graphite Merge Queue
Add either label to this PR to merge it via the merge queue:
- MQ - adds this PR to the back of the merge queue
- Hotfix - for urgent hot fixes, skip the queue and merge this PR next
You must have a Graphite account in order to use the merge queue. Sign up using this link.
An organization admin has enabled the Graphite Merge Queue in this repository.
Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue.
Pull request summary
- Enhanced Subresource Integrity (SRI) Support: Introduced support for multiple cryptographic hash algorithms (SHA-256, SHA-384, SHA-512) to comply with W3C SRI specifications.
-
Updated Integrity Calculation: Modified the
calculateIntegrityfunction to generate and return SRI hashes alongside the existing SHA-512 and SHA-1 hashes. - Backward Compatibility: Ensured that the existing SHA-512 integrity field remains unchanged for current users while providing additional SRI data.
-
File Metadata Enhancement: Updated the file metadata structure to include SRI data when requesting file information with the
?metaquery parameter. - HTTP Header Integration: Added SRI-related headers in HTTP responses to facilitate better integration with browsers and tools.
- New Utility Functions: Implemented a utility function to parse SRI data from the combined integrity string for easier access to individual hash values.
- Test Coverage: Added comprehensive unit tests to validate the new SRI functionality, ensuring both backward compatibility and the correctness of new features.
- Documentation Update: Created a detailed documentation file explaining the new SRI support, including usage examples and configuration requirements.
- Code Refactoring: Improved code organization and readability by separating concerns and enhancing function definitions related to SRI handling.
- Integration Tests: Developed integration tests to verify the correct behavior of SRI parsing and formatting functions in various scenarios.
[!NOTE]
Other AI code review bot(s) detected
CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.
Walkthrough
Adds multi-algorithm SRI (sha256/sha384/sha512) to integrity calculation, surfaces parsed SRI in controller responses and HTTP headers, stores combined SRI string in service, documents SRI support, and introduces comprehensive tests for calculation, controller behavior, and integration parsing/formatting.
Changes
| Cohort / File(s) | Summary |
|---|---|
Integrity calculation utilityapp/common/PackageUtil.ts |
Extends Integrity interface with sri (sha256/sha384/sha512/combined). Updates calculateIntegrity to compute multiple algorithms, derive per-algorithm SRI, and return combined SRI string alongside legacy integrity and shasum. |
Service persistence updateapp/core/service/PackageVersionFileService.ts |
Changes stored dist.integrity from single integrity to sri.combined; adds explanatory comment. |
Controller SRI exposureapp/port/controller/PackageVersionFileController.ts |
Adds optional sri to FileItem, introduces parseSRIFromIntegrity. formatFileItem includes sri when available. Raw file responses add SRI headers (X-SRI-SHA256, X-SRI-SHA384, X-SRI-SHA512, X-SRI-Integrity). Minor type refinement. |
Documentationdocs/SRI_SUPPORT.md |
New doc detailing SRI support: algorithms, metadata shape, response headers, HTML examples, API usage, compatibility. |
Unit tests: integrity calctest/common/PackageUtil/calculateIntegrity.test.ts |
New tests validating multi-algorithm SRI outputs, combined string, determinism, file vs. buffer parity, empty input handling. |
Controller tests: SRI headers/metadatatest/port/controller/PackageVersionFileController/raw.test.ts |
Tests for SRI headers on raw responses, sri object in metadata, legacy cases, backward compatibility, repeatability and consistency across requests. |
Integration-style SRI teststest/sri-integration.mjs |
Adds standalone tests for parsing SRI strings, formatting file items with sri, and verifying expected SRI field formats and combined string. |
Sequence Diagram(s)
sequenceDiagram
autonumber
participant C as Caller
participant PU as PackageUtil.calculateIntegrity
participant FS as File/Data Source
rect #eef6ff
note over C,PU: Multi-algorithm integrity calculation
C->>PU: calculateIntegrity(contentOrFile)
alt input is file path
PU->>FS: Read file bytes
else input is Uint8Array
PU->>PU: Use provided bytes
end
PU->>PU: Hash bytes (sha256, sha384, sha512, sha1)
PU->>PU: Build sri.{sha256, sha384, sha512, combined}
PU-->>C: { integrity, shasum, sri }
end
sequenceDiagram
autonumber
participant Client
participant Ctl as PackageVersionFileController
participant Svc as PackageVersionFileService
participant Store as Storage
rect #f3fff0
note over Client,Ctl: Raw file fetch with SRI headers
Client->>Ctl: GET /raw/:pkg/:ver/:path
Ctl->>Svc: fetch file metadata and content
Svc->>Store: Read file
Store-->>Svc: Content + dist.integrity
Svc-->>Ctl: File + integrity (combined SRI stored)
Ctl->>Ctl: parseSRIFromIntegrity(integrity)
alt SRI present
Ctl-->>Client: 200 OK + Content<br/>Headers: X-SRI-SHA256/384/512, X-SRI-Integrity
else
Ctl-->>Client: 200 OK + Content (no SRI headers)
end
end
Estimated code review effort
🎯 3 (Moderate) | ⏱️ ~25 minutes
Suggested labels
enhancement
Poem
In bytes I burrow, whiskers keen,
I hash the paths both heard and seen.
Three seeds of trust—256, 384, 512—align,
A braided string, integrity divine.
Headers hop out, neat and spry,
Carrots for clients; SRI on the fly. 🥕🐇
Pre-merge checks
❌ Failed checks (2 warnings)
| Check name | Status | Explanation | Resolution |
|---|---|---|---|
| Docstring Coverage | ⚠️ Warning | Docstring coverage is 63.64% which is insufficient. The required threshold is 80.00%. | You can run @coderabbitai generate docstrings to improve docstring coverage. |
| Title Check | ⚠️ Warning | The title “feat: Add X-Integrity HTTP header for unpkg files” is misleading because the changes introduce comprehensive Subresource Integrity support, multiple HTTP headers (X-SRI-SHA256, X-SRI-SHA384, X-SRI-SHA512, X-SRI-Integrity), and enhanced integrity calculation rather than just a single “X-Integrity” header. It only partially describes the main functionality and misnames the primary header, so it does not accurately summarize the pull request. | Please update the title to reflect the full scope of SRI enhancements and correct header names, for example “feat: Add SRI HTTP headers (X-SRI-Integrity and per-algorithm) for unpkg files,” so that it clearly conveys the main change. |
✅ Passed checks (1 passed)
| Check name | Status | Explanation |
|---|---|---|
| Description Check | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled. |
[!NOTE]
Free review on us!
CodeRabbit is offering free reviews until Wed Oct 08 2025 to showcase some of the refinements we've made.
Comment @coderabbitai help to get the list of available commands and usage tips.
@copilot fix lint errors
@coderabbitai review
✅ Actions performed
Review triggered.
Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.
@copilot fix lint errors
Fixed all lint errors in commit 10f8742:
Changes made:
- Replaced
assert()withassert.ok()throughout test files (46 fixes) - Removed console statements or added eslint-disable comments (6 fixes)
- Fixed function scoping issues by moving nested functions to outer scope
- Replaced
process.exit()withthrow error - Added comments to empty catch blocks
All oxlint checks now pass with 0 warnings and 0 errors.
Codecov Report
:x: Patch coverage is 46.22642% with 57 lines in your changes missing coverage. Please review.
:white_check_mark: Project coverage is 82.92%. Comparing base (324511d) to head (980145c).
:warning: Report is 1 commits behind head on master.
| Files with missing lines | Patch % | Lines |
|---|---|---|
| ...pp/port/controller/PackageVersionFileController.ts | 11.29% | 55 Missing :warning: |
| app/core/service/PackageVersionFileService.ts | 0.00% | 2 Missing :warning: |
:exclamation: There is a different number of reports uploaded between BASE (324511d) and HEAD (980145c). Click for more details.
HEAD has 6 uploads less than BASE
Flag BASE (324511d) HEAD (980145c) 18 12
Additional details and impacted files
@@ Coverage Diff @@
## master #833 +/- ##
===========================================
- Coverage 95.16% 82.92% -12.25%
===========================================
Files 197 197
Lines 23906 24006 +100
Branches 1953 1440 -513
===========================================
- Hits 22751 19907 -2844
- Misses 1155 4099 +2944
:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.
:rocket: New features to boost your workflow:
- :snowflake: Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
- :package: JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.