Skip to content

feat: add compressMetadata / decompressMetadata to compression.ts - #782

Closed
ZacLou wants to merge 1 commit into
Stellar-split:mainfrom
ZacLou:feat/compress-metadata-619
Closed

feat: add compressMetadata / decompressMetadata to compression.ts#782
ZacLou wants to merge 1 commit into
Stellar-split:mainfrom
ZacLou:feat/compress-metadata-619

Conversation

@ZacLou

@ZacLou ZacLou commented Aug 29, 2026

Copy link
Copy Markdown

Overview

Implements #619 — adds compressMetadata and decompressMetadata to src/compression.ts with JSON + base64url round-trip and size validation.

Changes

src/compression.ts

  • compressMetadata(obj: Record<string, unknown>, maxBytes?: number): string — serializes to JSON then encodes as base64url (no padding =). Throws SdkError with CONTRACT_REJECTED if the resulting base64 string exceeds maxBytes (default 512).
  • decompressMetadata(encoded: string): Record<string, unknown> — decodes base64url and parses JSON. Throws SdkError with CONTRACT_REJECTED on invalid base64 input, invalid JSON, or non-object JSON.

src/index.ts

  • Exports compressMetadata and decompressMetadata.

test/metadataCompression.test.ts

  • Round-trip correctness (simple, nested, empty object)
  • Oversized payload throws CONTRACT_REJECTED
  • Custom maxBytes argument respected
  • Invalid base64 input throws CONTRACT_REJECTED
  • Valid base64 but invalid JSON throws CONTRACT_REJECTED
  • Decoded JSON that is not an object (array, string, number) throws CONTRACT_REJECTED

Acceptance Criteria Checklist

  • compressMetadata(obj: Record<string, unknown>): string exported — serializes to JSON then encodes as base64url (no padding =)
  • decompressMetadata(encoded: string): Record<string, unknown> exported — decodes base64url and parses JSON; throws SdkError with CONTRACT_REJECTED code on invalid input
  • compressMetadata throws SdkError with CONTRACT_REJECTED code if the resulting base64 string exceeds maxBytes (default 512 bytes, configurable via second argument)
  • Round-trip: decompressMetadata(compressMetadata(obj)) deep-equals obj for any JSON-serialisable input
  • Both exported from src/index.ts
  • Unit tests: round-trip correctness, oversized payload throws, invalid base64 input throws, empty object round-trips

Closes #619

- compressMetadata(obj, maxBytes=512): JSON → base64url encoding with size validation
- decompressMetadata(encoded): base64url → JSON parsing with error handling
- Both throw SdkError with CONTRACT_REJECTED code on failures
- Exported from src/index.ts
- Unit tests: round-trip, oversized payload, invalid input, empty object

Closes Stellar-split#619
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add compressMetadata and decompressMetadata to compression.ts

2 participants