Skip to content

feat(compression): add compressMetadata and decompressMetadata (#619) - #815

Open
ZacLou wants to merge 6 commits into
Stellar-split:mainfrom
ZacLou:feat/compress-metadata-619
Open

feat(compression): add compressMetadata and decompressMetadata (#619)#815
ZacLou wants to merge 6 commits into
Stellar-split:mainfrom
ZacLou:feat/compress-metadata-619

Conversation

@ZacLou

@ZacLou ZacLou commented Sep 5, 2026

Copy link
Copy Markdown

Closes #619

What

Adds JSON + base64url round-trip helpers for compact invoice metadata storage (e.g. memos, IPFS payloads).

Changes

  • compressMetadata(obj, maxBytes=512): string — JSON-stringify then base64url encode; throws SdkError (CONTRACT_REJECTED) if result exceeds maxBytes
  • decompressMetadata(encoded): Record<string, unknown> — base64url decode then JSON parse; throws SdkError (CONTRACT_REJECTED) on malformed input
  • Both exported from src/index.ts
  • 6 unit tests covering round-trip correctness, nested objects, base64url format (no padding/+/), size limit enforcement, and invalid input handling

Verification

  • Unit tests in test/compression.test.ts

ZacLou added 6 commits September 6, 2026 02:08
…it#612)

- generateIdempotencyKey: deterministic SHA-256 hex key from invoiceId, payer, amount
- isKnownKey / registerKey / clearKeys: in-memory Set-backed registry
- Exported from index.ts alongside existing Deduplicator
- Unit tests: determinism, input sensitivity, nonce variation, registry lifecycle

Closes Stellar-split#612
…#614)

- searchByMemo(invoices, query, opts?) filters invoices by memo substring
- case-insensitive by default; opts.caseSensitive=true for exact case
- empty query returns all invoices unchanged
- invoices with undefined/null memo are skipped without error
- 6 unit tests covering all acceptance criteria

Closes Stellar-split#614
…r class (Stellar-split#617)

- verifyWebhookSignature(payload, signature, secret): boolean — HMAC-SHA256 with timing-safe comparison
- verifyWebhookSignatureOrThrow: wrapper that throws WebhookVerificationError
- WebhookVerificationError: typed error for consumers who prefer throwing
- Exported from src/index.ts alongside existing webhookMiddleware exports
- 7 unit tests covering valid/invalid signatures, tampered payloads, malformed input, and error class

Closes Stellar-split#617
…nders (Stellar-split#616)

- scheduleReminder(invoiceId, offsetMs) returns opaque reminderId
- cancelReminder(reminderId): boolean — true if pending and cancelled, false otherwise
- getPendingReminders(): array of { reminderId, invoiceId, remindAt }
- clearAllReminders(): void — clears all timers and persisted state (test teardown)
- Cancelled reminders never fire even if their scheduled time passes
- 6 unit tests using fake timers

Closes Stellar-split#616
…plit#618)

- paginateArray<T>(items, { page, pageSize }) returns { data, total, totalPages, hasNext, hasPrev }
- page is 1-indexed; out-of-range pages return data: []
- pageSize must be 1–200, otherwise throws SdkError with INVALID_RECIPIENT code
- Exported from src/index.ts alongside existing horizon utilities
- 7 unit tests covering first/last pages, out-of-range, boundary pageSize, empty arrays, and error code

Closes Stellar-split#618
…ar-split#619)

- compressMetadata(obj, maxBytes=512): JSON + base64url encode with size validation
- decompressMetadata(encoded): base64url decode + JSON parse
- Both throw SdkError with CONTRACT_REJECTED code on invalid input or size violation
- Exported from src/index.ts
- 6 unit tests: round-trip, nested objects, base64url format, size limit, invalid input

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

1 participant