Files
2026-05-27 23:29:53 +01:00

4.3 KiB

Tasks — storage-cdn-rackspace

Every checkbox MUST reflect work actually done in this change. Hard dependency: @suaveplan/storage-cdn (change add-storage-cdn) MUST be archived first.

1. Spec authoring

  • 1.1 Read openspec/changes/add-storage-cdn/specs/storage-cdn/spec.md for the contract
  • 1.2 Read openspec/changes/add-storage-http/ for retry/AbortSignal/OTel patterns
  • 1.3 Read OpenStack Swift API reference + Rackspace identity v2 docs + Swift TempURL middleware spec
  • 1.4 Draft proposal.md, design.md, specs/storage-cdn-rackspace/spec.md, tasks.md
  • 1.5 Numbered Requirement/Scenario checklist per §0c step 6

2. Scaffolding

  • 2.1 Create packages/storage/storage-cdn-rackspace/
  • 2.2 package.json v0.0.0, "sideEffects": false, subpath exports
  • 2.3 Deps: @suaveplan/error, @suaveplan/storage, @suaveplan/storage-cdn, @suaveplan/retry, @suaveplan/types, @opentelemetry/api, zod, tslib
  • 2.4 DevDeps: @suaveplan/testing, @vitest/coverage-istanbul, fast-check, mitata, typescript, vite, vite-plugin-dts, vitest
  • 2.5 tsconfig, vite.config.ts, vitest.config.ts via createTestConfig

3. Implementation

  • 3.1 src/error-codes.ts — defineCodes("STORAGE_CDN_RACKSPACE", [...]) with 9 codes, StorageCdnRackspaceError
  • 3.2 src/types/*.ts + .schemas.ts — RackspaceCdnAdapterOptions + Zod schema
  • 3.3 src/auth-client/auth-client.ts — v2 identity auth, token cache, service-catalog lookup, proactive refresh
  • 3.4 src/cdn-client/cdn-client.ts — enableCdn, getCdnMetadata, purgeObject with retry
  • 3.5 src/temp-url/temp-url.ts — HMAC-SHA1 TempURL signer via WebCrypto
  • 3.6 src/key-sanitizer/key-sanitizer.ts — strict boundary + per-segment encoder (or import from storage-http if shared)
  • 3.7 src/retry-helper/retry-helper.ts — transient classifier + Retry-After honour
  • 3.8 src/otel/otel.ts — meter/tracer with provider="rackspace" + region attrs
  • 3.9 src/rackspace-cdn-adapter/rackspace-cdn-adapter.ts — RackspaceCdnAdapter extends CdnAdapter
  • 3.10 src/registry/registry.ts — registerRackspaceCdnProvider() idempotent
  • 3.11 src/index.ts — explicit named re-exports

4. Tests

  • 4.1 src/auth-client/auth-client.test.ts — auth round-trip, cache reuse, 401 re-auth, proactive refresh, region resolution, missing region
  • 4.2 src/cdn-client/cdn-client.test.ts — enable, metadata parse, purge 204, purge 429 → PURGE_RATE_LIMITED
  • 4.3 src/temp-url/temp-url.test.ts — reference vector byte-equality, temp-url-prefix mode, missing key error
  • 4.4 src/key-sanitizer/key-sanitizer.test.ts — traversal, absolute, overlong, per-segment encoding
  • 4.5 src/retry-helper/retry-helper.test.ts — transient classifier, Retry-After honour, non-retry on 401
  • 4.6 src/otel/otel.test.ts — measurement attrs include provider and region
  • 4.7 src/rackspace-cdn-adapter/rackspace-cdn-adapter.test.ts — full CRUD, range, edgeUrl, purge, signUrl, AbortSignal, retry
  • 4.8 src/rackspace-cdn-adapter/rackspace-cdn-adapter.spec-conformance.test.ts — type conformance, capabilities, every code reachable, tier-purity grep
  • 4.9 src/registry/registry.test.ts — factory dispatch, idempotency
  • 4.10 Every it(...) carries { timeout: 5000 } (or 30000 for genuinely async)
  • 4.11 All test imports via @suaveplan/testing/runner (§7)

5. Documentation

  • 5.1 Sibling .md for every implementation .ts
  • 5.2 README.md documents LON region default, TempURL key rotation guidance, purge rate-limit guidance

6. Gates

  • 6.1 bun run check
  • 6.2 bunx turbo lint typecheck test --filter=@suaveplan/storage-cdn-rackspace
  • 6.3 bunx turbo test:coverage --filter=@suaveplan/storage-cdn-rackspace (100/100/100/100)
  • 6.4 bun scripts/lint/check-test-runner-imports.ts
  • 6.5 Tier-purity grep returns empty
  • 6.6 bun scripts/openspec-conformance.ts @suaveplan/storage-cdn-rackspace

7. Manifest & archival

  • 7.1 bun scripts/folder-reorg/generate-manifest.ts
  • 7.2 Update STATUS.md
  • 7.3 Fold specs/storage-cdn-rackspace/spec.md → openspec/specs/storage-cdn-rackspace/spec.md
  • 7.4 Move change folder → openspec/archive/<yyyy-mm-dd>-add-storage-cdn-rackspace/