sveltejs/kit · error · Error

Invalid data for Set reviver

Error message

Invalid data for Set reviver

What it means

SvelteKit remote functions serialize arguments with devalue and revive them on the receiving side. The Set reviver expects the encoded payload for a Set to be a plain array of devalue-encoded strings. When the payload is not an array, Kit throws this error rather than producing a corrupt Set.

Source

Thrown at packages/kit/src/runtime/shared.js:205

			for (const item of value) {
				if (
					!Array.isArray(item) ||
					item.length !== 2 ||
					typeof item[0] !== 'string' ||
					typeof item[1] !== 'string'
				) {
					throw new Error('Invalid data for Map reviver');
				}
				const [key, val] = item;
				map.set(parse(key), parse(val));
			}

			return map;
		},
		/** @type {(value: unknown) => Set<unknown>} */
		[remote_set]: (value) => {
			if (!Array.isArray(value)) {
				throw new Error('Invalid data for Set reviver');
			}

			const set = new Set();

			for (const item of value) {
				if (typeof item !== 'string') {
					throw new Error('Invalid data for Set reviver');
				}
				set.add(parse(item));
			}

			return set;
		},
		/** @type {(value: any) => File} */
		[remote_file]: (value) => {
			if (
				!value ||
				typeof value !== 'object' ||

View on GitHub (pinned to 03f1687fe6)

Solutions

  1. Reinstall/upgrade @sveltejs/kit so client and server run the same version (pnpm install, clear node_modules/.vite cache)
  2. Clear cached prerendered files and dev caches that may hold stale encoded payloads (.svelte-kit, build output)
  3. Check that middleware/proxies do not alter remote-function request bodies or query strings
  4. Reproduce with a minimal Set argument; if a specific element triggers it, file a bug with the payload

Example fix

// before (stale versions)
"@sveltejs/kit": "2.0.0", "@sveltejs/vite-plugin-svelte": "^5"
// after (aligned)
"@sveltejs/kit": "^2.22.0", "@sveltejs/vite-plugin-svelte": "^5.0.0"
Defensive patterns

Strategy: validation

Validate before calling

const isEncodedSet = (v) => Array.isArray(v) && v.length === 0 || (Array.isArray(v) && v.every((i) => typeof i === 'string'));
if (!isEncodedSet(payload)) throw new Error('Refusing to revive malformed Set payload');

Type guard

function isValidRemoteSetPayload(v) {
  return Array.isArray(v) && v.every((i) => typeof i === 'string');
}

Try / catch

try {
  const result = await myRemoteFn(mySet);
} catch (e) {
  if (e.message.includes('Invalid data for Set reviver')) {
    console.error('Remote Set payload corrupted — check Kit versions and request integrity');
  } else throw e;
}

Prevention

When it happens

Trigger: Calling a remote function whose argument (or nested value) is a Set, but the serialized payload reaching create_remote_arg_revivers' [remote_set] reviver is not an array — typically because the encoded string was produced by a mismatched Kit version, hand-crafted/tampered, or corrupted in transit (e.g. truncated query param or POST body).

Common situations: Version skew between @sveltejs/kit packages during upgrades (old client code against new server code or vice versa); manually editing or caching an encoded remote-arg URL; proxies or middleware rewriting request payloads.

Related errors


AI-assisted analysis of sveltejs/kit@03f1687fe6 (2026-09-02). Data as JSON: /api/errors/1aebd5d765dbac32. Report an issue: GitHub.