Skip to content

[functions] use JSON serialization in InMemoryCache for RuntimeCache consistency#14751

Merged
kldavis4 merged 3 commits intomainfrom
kd/01-27-_functions_use_json_serialization_in_inmemorycache_for_runtimecache_consistency
Jan 31, 2026
Merged

[functions] use JSON serialization in InMemoryCache for RuntimeCache consistency#14751
kldavis4 merged 3 commits intomainfrom
kd/01-27-_functions_use_json_serialization_in_inmemorycache_for_runtimecache_consistency

Conversation

@kldavis4
Copy link
Contributor

@kldavis4 kldavis4 commented Jan 27, 2026

TL;DR

Updated InMemoryCache to use JSON serialization for cache values, ensuring consistency with RuntimeCache.

What changed?

  • Modified InMemoryCache to serialize values with JSON.stringify() when storing and deserialize with JSON.parse() when retrieving
  • Changed the value type in CacheEntry interface from unknown to string to reflect the serialized storage format
  • Added comprehensive unit tests to verify serialization behavior and ensure compatibility with RuntimeCache

How to test?

Run the new unit tests that verify:

  • Basic get/set functionality for various data types
  • JSON serialization behavior (Date objects, undefined values, Maps, Sets, etc.)
  • TTL expiration functionality
  • Cache deletion and tag expiration
pnpm test packages/functions/test/unit/cache/in-memory-cache.test.ts

Why make this change?

This change ensures consistent behavior when switching between cache implementations (in-memory for development, remote for production). Previously, the InMemoryCache stored values directly while RuntimeCache used JSON serialization, leading to inconsistencies with types that don't survive JSON round-trips like Date, Map, Set, and undefined. Now both implementations handle data types the same way, preventing unexpected behavior when moving between environments.

@changeset-bot
Copy link

changeset-bot bot commented Jan 27, 2026

🦋 Changeset detected

Latest commit: 66e20f8

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@vercel/functions Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

Copy link
Contributor Author

This stack of pull requests is managed by Graphite. Learn more about stacking.

@kldavis4 kldavis4 marked this pull request as ready for review January 27, 2026 15:42
@kldavis4 kldavis4 requested review from a team as code owners January 27, 2026 15:42
@github-actions
Copy link
Contributor

github-actions bot commented Jan 27, 2026

📦 CLI Tarball Ready

The Vercel CLI tarball for this PR is now available!

Quick Test

You can test this PR's CLI directly by running:

npx https://vercel-flq52xgfr.vercel.sh/tarballs/vercel.tgz --help

Use in vercel.json

To use this CLI version in your project builds, add to your vercel.json:

{
  "build": {
    "env": {
      "VERCEL_CLI_VERSION": "vercel@https://vercel-flq52xgfr.vercel.sh/tarballs/vercel.tgz"
    }
  }
}

@github-actions
Copy link
Contributor

github-actions bot commented Jan 27, 2026

🧪 Unit Test Strategy

Comparing: d26ce3f66e20f8 (view diff)

Strategy: Affected packages only

✅ Only testing packages that have been modified or depend on modified packages.

Affected packages - 12 (29%)
  1. @vercel/client
  2. @vercel/edge
  3. @vercel/elysia
  4. @vercel/express
  5. @vercel/fastify
  6. @vercel/functions
  7. @vercel/h3
  8. @vercel/hono
  9. @vercel/koa
  10. @vercel/nestjs
  11. @vercel/node
  12. vercel
Unaffected packages - 29 (71%)
  1. @vercel-internals/get-package-json
  2. @vercel/backends
  3. @vercel/build-utils
  4. @vercel/cervel
  5. @vercel/cli-auth
  6. @vercel/config
  7. @vercel/detect-agent
  8. @vercel/error-utils
  9. @vercel/firewall
  10. @vercel/frameworks
  11. @vercel/fs-detectors
  12. @vercel/gatsby-plugin-vercel-builder
  13. @vercel/go
  14. @vercel/hydrogen
  15. @vercel/introspection
  16. @vercel/next
  17. @vercel/oidc
  18. @vercel/oidc-aws-credentials-provider
  19. @vercel/python
  20. @vercel/python-analysis
  21. @vercel/redwood
  22. @vercel/related-projects
  23. @vercel/remix-builder
  24. @vercel/routing-utils
  25. @vercel/ruby
  26. @vercel/rust
  27. @vercel/static-build
  28. @vercel/static-config
  29. examples

Results

  • Unit tests: Only affected packages will run unit tests
  • E2E tests: Handled separately (Version Packages PRs or run-e2e-tests label)
  • Type checks: Only affected packages will run type checks

This comment is automatically generated based on the affected testing strategy

kldavis4 and others added 2 commits January 27, 2026 15:56
JSON.stringify(undefined) returns JavaScript's undefined (not a string),
which causes JSON.parse() to throw SyntaxError in get(). Coerce undefined
values to null to prevent this error.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@kldavis4 kldavis4 merged commit 22e856f into main Jan 31, 2026
233 of 235 checks passed
@kldavis4 kldavis4 deleted the kd/01-27-_functions_use_json_serialization_in_inmemorycache_for_runtimecache_consistency branch January 31, 2026 05:20
jeffsee55 pushed a commit that referenced this pull request Feb 3, 2026
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.


# Releases
## vercel@50.10.0

### Minor Changes

- feat(cli): Add webhooks command for managing webhooks
([#14789](#14789))

Adds a new `webhooks` command to the Vercel CLI with the following
subcommands:

- `webhooks ls` - List all webhooks with optional `--format json` output
- `webhooks get <id>` - Get details of a specific webhook with optional
`--format json` output
- `webhooks create <url> --event <event>` - Create a new webhook with
specified events
- `webhooks rm <id>` - Remove a webhook with `--yes` flag to skip
confirmation

Webhook event types are fetched dynamically from the OpenAPI spec to
stay in sync with the API.

- Added experimental services support in the CLI new project flow. When
`VERCEL_USE_EXPERIMENTAL_SERVICES=1` is set and a project's
`vercel.json` contains `experimentalServices`, the CLI will detect and
display the configured services during project setup, automatically
selecting the "services" framework preset.
([#14776](#14776))

### Patch Changes

- Improve logsv2 command output format with compact single-line display,
text-based level labels, dynamic column widths, and smart date display
([#14767](#14767))

- Skip update check when running on Vercel to prevent unnecessary worker
spawning in build container
([#14794](#14794))

- fix --help exit codes for marketplace commands
([#14834](#14834))

- Updated dependencies
\[[`687f73cebb6ae1cdd7c7feb0910967de99a17ad6`](687f73c),
[`e7c5d5fd41e124ef7314978b351696d130e89917`](e7c5d5f),
[`c3104a1ae9dbf9048e08bb2fa85605a95b254876`](c3104a1),
[`b029736b4be8dac135bef77283f47e1450faf0a9`](b029736),
[`d36c1ad3ddaf9303041e61a0a41d973b02007988`](d36c1ad),
[`5b31b133970539986ff9e98013d2c364536bd0b5`](5b31b13)]:
    -   @vercel/next@4.15.21
    -   @vercel/python@6.5.0
    -   @vercel/remix-builder@5.5.10
    -   @vercel/backends@0.0.25
    -   @vercel/static-build@2.8.28
    -   @vercel/node@5.5.28
    -   @vercel/express@0.1.36

## @vercel/python@6.5.0

### Minor Changes

- vendor Python runtime dependencies
([#14827](#14827))

- Bump vercel-runtime version automatically on its releases
([#14842](#14842))

## @vercel/python-analysis@0.3.0

### Minor Changes

- initial implementation of Python semantic analysis in Rust
([#14690](#14690))

## @vercel/backends@0.0.25

### Patch Changes

- Improve handling of cjs/esm interop during imports
([#14798](#14798))

## @vercel/cervel@0.0.12

### Patch Changes

- Improve handling of cjs/esm interop during imports
([#14798](#14798))

- Updated dependencies
\[[`d36c1ad3ddaf9303041e61a0a41d973b02007988`](d36c1ad)]:
    -   @vercel/backends@0.0.25

## @vercel/express@0.1.36

### Patch Changes

- Updated dependencies
\[[`d36c1ad3ddaf9303041e61a0a41d973b02007988`](d36c1ad)]:
    -   @vercel/cervel@0.0.12
    -   @vercel/node@5.5.28

## @vercel/fs-detectors@5.7.20

### Patch Changes

- Added experimental services support in the CLI new project flow. When
`VERCEL_USE_EXPERIMENTAL_SERVICES=1` is set and a project's
`vercel.json` contains `experimentalServices`, the CLI will detect and
display the configured services during project setup, automatically
selecting the "services" framework preset.
([#14776](#14776))

## @vercel/functions@3.4.1

### Patch Changes

- Fix InMemoryCache to use JSON serialization for consistency with
RuntimeCache ([#14751](#14751))

InMemoryCache now serializes values with `JSON.stringify()` on set and
deserializes with `JSON.parse()` on get, matching the behavior of
RuntimeCache. This ensures consistent behavior when switching between
cache implementations (e.g., in-memory for development, remote for
production), particularly for types that don't survive JSON round-trips
like `Date`, `Map`, `Set`, and `undefined`.

## @vercel/introspection@0.0.11

### Patch Changes

- Updated dependencies
\[[`d36c1ad3ddaf9303041e61a0a41d973b02007988`](d36c1ad)]:
    -   @vercel/backends@0.0.25

## @vercel/next@4.15.21

### Patch Changes

- Strip routes-manifest.json for determinism
([#14783](#14783))

- Update Next.js adapter version
([#14801](#14801))

## @vercel/remix-builder@5.5.10

### Patch Changes

- [remix] Prevent 404 responses from being cached with immutable headers
([#14828](#14828))

## @vercel/python-runtime@0.3.0

### Minor Changes

- vendor Python runtime dependencies
([#14827](#14827))

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
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.

2 participants