- Add contentFetchFlow() to proxy (FR-001 through FR-012) - Add extractArticleBody() helper with vkm:articleBody / articleBody fallback - Dynamic proxyBaseUrl derivation from x-forwarded-proto/host headers - Forward query/size/category params on /sitemap.xml requests - Add Accept: application/ld+json header to content API calls - Remove oidcAuthFlow() - unmatched requests now return 404 Not Found - Fix xmlbuilder2 import: default import, call as xmlbuilder2.create(...) - Version bump 0.2.0 → 0.3.0 - 45/45 tests passing Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
4.4 KiB
4.4 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.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