5.8 KiB
5.8 KiB
Changelog
All notable changes to this project will be documented in this file.
The format follows Keep a Changelog. This project adheres to Semantic Versioning.
Unreleased
[0.4.0] - 2026-04-23
Added
- Sitemap pagination via
hydra:view['hydra:last']: after the first search page, all subsequent pages are fetched in parallel using the correct 0-based item-indexstartmodel (start = size, 2×size, …, lastStart); when all results fit on one page (hydra:viewabsent) no additional requests are made - Latest
vkm:datePublishedselection perSearchResultItem: when a search result contains multiple content fragments, only the fragment with the most recentvkm:datePublishedis included in the sitemap; fragments without a date are treated as epoch 0 - Sitemap URL cap: output is limited to 50,000
<loc>entries per the Sitemaps protocol; awarnlog is emitted when results are truncated - Full HTML document wrapper for content fetch responses: body is now
<!DOCTYPE html><html><head><title>…</title></head><body>…</body></html>instead of a barearticleBodyfragment <title>element populated from thevkm:namefield of the fetched article (empty<title></title>whenvkm:nameis absent)
Changed
oidcAuthFlowroute removed: requests that do not match?kmeURL=or/sitemap.xmlnow return404 Not Found
Fixed
proxyBaseUrlis now derived dynamically from the incoming request (X-Forwarded-Proto,X-Forwarded-Host,Hostheaders) rather than read from settings, ensuring correct<loc>URLs in all deployment environments
[0.3.0] - 2026-04-23
Added
GET /?kmeURL=<upstream-article-url>content fetch endpoint: fetches a KME article by URL and returns itsvkm:articleBodyas200 text/html; charset=utf-8contentFetchFlow()async function inkmeContentSourceAdapter.js— URL routing branch, 9-step implementation: validateskmeURLparameter (400 for missing/blank/malformed/non-http), acquires OIDC token viagetValidToken(502 on failure), fetches upstream article with 10-second timeout, handles all error paths (4xx upstream → 404, 5xx/timeout/network → 502, unparseable body → 502, missing/emptyvkm:articleBody→ 404)- URL routing updated:
?kmeURL=present →contentFetchFlow(),/sitemap.xml→sitemapFlow(), otherwise →oidcAuthFlow()(passthrough, FR-012 preserved) extractArticleBody(data)pure helper inkmeContentSourceAdapterHelpers.js— returnsdata['vkm:articleBody']if non-empty non-whitespace string, otherwisenull; guards against null/non-object input- Unit test describe blocks in
tests/unit/proxy.test.js:extractArticleBody helper(7 edge-case tests),US-content-fetch: happy path(2 tests),US-content-fetch: input validation(6 tests),US-content-fetch: upstream errors(7 tests),US-content-fetch: body parsing(5 tests),US-content-fetch: passthrough preserved(1 test) - Contract tests in
tests/contract/proxy-http.test.js:content fetch: happy path(full round-trip 200 + SC-001 timing),content fetch: error handling(upstream 404 → 404, upstream 503 → 502, server hang → 502 within 12s)
[0.2.0] - 2026-04-23
Added
GET /sitemap.xmlendpoint: returns a well-formed XML Sitemap (Sitemaps protocol 0.9) containing one<url><loc>per knowledge item from the KME Knowledge Search ServicesitemapFlow()async function inkmeContentSourceAdapter.js— settings validation, OIDC token reuse, search API call, XML build viaxmlbuilder2, 10-second timeout, 502/504/500 error responsesgetValidToken()shared helper extracted from the existing OIDC auth flow — used by both sitemap and non-sitemap paths- URL routing at IIFE entry point: requests ending in
/sitemap.xml→sitemapFlow(), all others →oidcAuthFlow() - Three new fields in
src/globalVariables/kme_CSA_settings.json:searchApiBaseUrl,tenant,proxyBaseUrl - Three new placeholder fields in
src/globalVariables/kme_CSA_settings.json.example - Unit tests for sitemap flow: happy path (items present), empty results,
vkm:urlfiltering, 502/504/500 error scenarios, non-sitemap regression tests - Contract tests for sitemap endpoint: full round-trip 200, empty results 200, 502 upstream error, 504 timeout
0.1.0 - 2026-04-23
Added
src/proxyScripts/kmeContentSourceAdapter.js— OIDC authentication proxy script running in a Node.js VM sandbox (zero imports/exports)src/globalVariables/kme_CSA_settings.json— OIDC credentials and token endpoint configuration (gitignored)src/globalVariables/kme_CSA_settings.json.example— placeholder settings file for version control- Redis-backed token cache (
authorizationhash, fieldstokenandexpiry) — token persists across adapter restarts - Token stampede guard via in-process
_pendingFetchpromise — only one token fetch in-flight at a time - Absolute Unix epoch expiry check (
Date.now() / 1000 < expiry) 200 OK / Authorizedresponse on successful authentication401 Unauthorizedresponse with descriptive message on auth failure (bad credentials, timeout, unreachable service)- 5-second timeout on OIDC token POST requests
- Structured logging throughout proxy script using
console.debug,console.info, andconsole.error redisdependency wired into VM context viacreateClient().connect()inserver.js- Unit tests (
tests/unit/proxy.test.js) — 12 tests covering US1, US2, US3, and stampede guard - Contract tests (
tests/contract/proxy-http.test.js) — 2 tests covering HTTP 200/401 response shape