From 586c6bb2dafa0ddd930c9c776caf7c8d45a90126 Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Wed, 1 Apr 2026 16:55:13 +0900 Subject: [PATCH] fix(kit): merge initialValue defaults when syncing client shared state Co-Authored-By: Claude Opus 4.6 (1M context) --- packages/kit/src/client/rpc-shared-state.ts | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/packages/kit/src/client/rpc-shared-state.ts b/packages/kit/src/client/rpc-shared-state.ts index 84a2e918..26d39af5 100644 --- a/packages/kit/src/client/rpc-shared-state.ts +++ b/packages/kit/src/client/rpc-shared-state.ts @@ -5,8 +5,18 @@ import { createSharedState } from '../utils/shared-state' export function createRpcSharedStateClientHost(rpc: DevToolsRpcClient): RpcSharedStateHost { const sharedState = new Map>() + const initialValues = new Map() const isStaticBackend = rpc.connectionMeta.backend === 'static' + function mergeWithInitialValue(key: string, serverState: any): any { + const initial = initialValues.get(key) + if (initial && typeof initial === 'object' && !Array.isArray(initial) + && typeof serverState === 'object' && !Array.isArray(serverState)) { + return { ...initial, ...serverState } + } + return serverState + } + rpc.client.register({ name: 'devtoolskit:internal:rpc:client-state:updated', type: 'event', @@ -14,7 +24,7 @@ export function createRpcSharedStateClientHost(rpc: DevToolsRpcClient): RpcShare const state = sharedState.get(key) if (!state || state.syncIds.has(syncId)) return - state.mutate(() => fullState, syncId) + state.mutate(() => mergeWithInitialValue(key, fullState), syncId) }, }) @@ -52,6 +62,9 @@ export function createRpcSharedStateClientHost(rpc: DevToolsRpcClient): RpcShare return { keys: () => Array.from(sharedState.keys()), get: async (key: string, options?: RpcSharedStateGetOptions) => { + if (options?.initialValue !== undefined) { + initialValues.set(key, options.initialValue) + } if (sharedState.has(key)) { return sharedState.get(key)! } @@ -70,7 +83,7 @@ export function createRpcSharedStateClientHost(rpc: DevToolsRpcClient): RpcShare rpc.call('devtoolskit:internal:rpc:server-state:get', key) .then((serverState) => { if (serverState !== undefined) - state.mutate(() => serverState) + state.mutate(() => mergeWithInitialValue(key, serverState)) }) .catch((error) => { console.error('Error getting server state', error) @@ -79,8 +92,8 @@ export function createRpcSharedStateClientHost(rpc: DevToolsRpcClient): RpcShare return state } else { - const initialValue = await rpc.call('devtoolskit:internal:rpc:server-state:get', key) as T - state.mutate(() => initialValue) + const serverValue = await rpc.call('devtoolskit:internal:rpc:server-state:get', key) as T + state.mutate(() => mergeWithInitialValue(key, serverValue)) sharedState.set(key, state) registerSharedState(key, state) return state