fix: use actual local platform ID to resolve linked ROS settings

This commit is contained in:
2026-09-30 17:06:26 +09:00
parent 08f74575c2
commit b0a4c2b1e6
4 changed files with 50 additions and 4 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "lms", "name": "lms",
"version": "1.2.5", "version": "1.2.6",
"description": "Autonomy Studio LMS Electron app", "description": "Autonomy Studio LMS Electron app",
"main": "./out/main/index.js", "main": "./out/main/index.js",
"author": { "author": {
+37
View File
@@ -0,0 +1,37 @@
const { test } = require('node:test')
const assert = require('node:assert/strict')
const fs = require('node:fs')
const vm = require('node:vm')
const ts = require('typescript')
function setup() {
const data = new Map()
const exports = {}
vm.runInNewContext(ts.transpileModule(fs.readFileSync(require.resolve('../src/renderer/src/features/workspace/sourceSettings.ts'), 'utf8'), {
compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2022 },
}).outputText, {
exports,
require: () => ({ STUDIO_SOURCE_SETTINGS_STORAGE_KEY: 'test-settings' }),
window: { localStorage: { getItem: key => data.get(key) ?? null, setItem: (key, value) => data.set(key, value) } },
})
return exports
}
test('remote workspace reads local domain and linked platform by actual platform ID', () => {
const api = setup()
api.storeStudioSourceSettings('local-platform-uuid', { ...api.defaultStudioSourceSettings, rosDomainId: '75', rosLinkedPlatformId: 'yahboom-uuid' })
const result = api.readLocalStudioSourceSettings([
{ id: 'yahboom-uuid', platformKey: 'yahboom', sourceSettings: { rosDomainId: '77' } },
{ id: 'local-platform-uuid', platformKey: 'futuredrive-local-pc' },
])
assert.equal(result.rosDomainId, '75')
assert.equal(result.rosLinkedPlatformId, 'yahboom-uuid')
})
test('local platform defaults and unlinked selection are preserved', () => {
const api = setup()
const platforms = [{ id: 'local-platform-uuid', platformKey: 'futuredrive-local-pc', sourceSettings: { rosDomainId: '76' } }]
assert.equal(api.readLocalStudioSourceSettings(platforms).rosDomainId, '76')
api.storeStudioSourceSettings('local-platform-uuid', { ...api.defaultStudioSourceSettings, rosDomainId: '75', rosLinkedPlatformId: null })
assert.equal(api.readLocalStudioSourceSettings(platforms).rosLinkedPlatformId, null)
})
+3 -3
View File
@@ -72,7 +72,7 @@ import { useWorkspaceVisualization } from './features/workspace/useWorkspaceVisu
import { makeModuleParameterKey, readStoredModuleParameters, serializeModuleParameters } from './features/workspace/moduleParameters' import { makeModuleParameterKey, readStoredModuleParameters, serializeModuleParameters } from './features/workspace/moduleParameters'
import { parseHostFromUrl, readNestedString } from './features/workspace/remoteWorkspaceTarget' import { parseHostFromUrl, readNestedString } from './features/workspace/remoteWorkspaceTarget'
import { resolveRuntimeModules } from './features/workspace/runtimeModuleSet' import { resolveRuntimeModules } from './features/workspace/runtimeModuleSet'
import { defaultStudioSourceSettings, makePlatformWorkspaceRoot, makeTeamWeekWorkspaceRoot, makeWeekWorkspaceRoot, normalizeStudioSourceSettings, readStudioSourceSettings, storeStudioSourceSettings } from './features/workspace/sourceSettings' import { defaultStudioSourceSettings, makePlatformWorkspaceRoot, makeTeamWeekWorkspaceRoot, makeWeekWorkspaceRoot, normalizeStudioSourceSettings, readLocalStudioSourceSettings, readStudioSourceSettings, storeStudioSourceSettings } from './features/workspace/sourceSettings'
import { makeWorkspaceUiSessionKey, readStudioRuntimeSessionState, storeStudioRuntimeSessionState } from './features/workspace/studioRuntimeSession' import { makeWorkspaceUiSessionKey, readStudioRuntimeSessionState, storeStudioRuntimeSessionState } from './features/workspace/studioRuntimeSession'
import type { StudioRuntimeSessionState } from './features/workspace/studioRuntimeSession' import type { StudioRuntimeSessionState } from './features/workspace/studioRuntimeSession'
import type { ModuleRow, RosNetworkConfig, RuntimeImageArtifact } from './features/workspace/types' import type { ModuleRow, RosNetworkConfig, RuntimeImageArtifact } from './features/workspace/types'
@@ -567,8 +567,8 @@ function LocalPcWorkspaceMockup({
const [sourceSettings, setSourceSettings] = useState<StudioSourceSettings>(() => readStudioSourceSettings(platformId, platformSourceSettingsDefaults)) const [sourceSettings, setSourceSettings] = useState<StudioSourceSettings>(() => readStudioSourceSettings(platformId, platformSourceSettingsDefaults))
const [sourceSettingsDraft, setSourceSettingsDraft] = useState<StudioSourceSettings>(() => readStudioSourceSettings(platformId, platformSourceSettingsDefaults)) const [sourceSettingsDraft, setSourceSettingsDraft] = useState<StudioSourceSettings>(() => readStudioSourceSettings(platformId, platformSourceSettingsDefaults))
const localWorkspaceSettings = useMemo( const localWorkspaceSettings = useMemo(
() => readStudioSourceSettings('futuredrive-local-pc', defaultStudioSourceSettings), () => remoteWorkspace ? readLocalStudioSourceSettings(platformOptions) : sourceSettings,
[platformId, sourceSettings.rosLinkedPlatformId, sourceSettings.rosDomainId, sourceSettings.visualizationBridgeLocation], [remoteWorkspace, platformOptions, sourceSettings],
) )
const linkedPlatformId = remoteWorkspace const linkedPlatformId = remoteWorkspace
? localWorkspaceSettings.rosLinkedPlatformId ? localWorkspaceSettings.rosLinkedPlatformId
@@ -95,3 +95,12 @@ export function storeStudioSourceSettings(platformId: string, settings: StudioSo
// Local source settings can be re-entered if persistence is unavailable. // Local source settings can be re-entered if persistence is unavailable.
} }
} }
export function readLocalStudioSourceSettings(platforms: Array<{
id: string
platformKey: string
sourceSettings?: Partial<StudioSourceSettings> | null
}>): StudioSourceSettings {
const local = platforms.find((platform) => platform.platformKey === 'futuredrive-local-pc')
return readStudioSourceSettings(local?.id ?? 'local-pc', normalizeStudioSourceSettings(local?.sourceSettings))
}