diff --git a/src/backend/electron/manager/RuntimeInfoManager.ts b/src/backend/electron/manager/RuntimeInfoManager.ts index 732e0fa341..ddefc10f2d 100644 --- a/src/backend/electron/manager/RuntimeInfoManager.ts +++ b/src/backend/electron/manager/RuntimeInfoManager.ts @@ -8,6 +8,7 @@ import log from "electron-log/main"; import type { AltPortInfos } from "@/store/type"; import { EngineId, EngineInfo } from "@/type/preload"; import { writeFileSafely } from "@/backend/electron/fileHelper"; +import { createEngineUrl } from "@/domain/url"; /** * ランタイム情報書き出しに必要なEngineInfo @@ -85,13 +86,14 @@ export class RuntimeInfoManager { const altPort: string | undefined = this.altportInfos[engineInfo.uuid]; const port = altPort ?? engineInfo.defaultPort; - // NOTE: URLを正規化する - const url = new URL(`${engineInfo.protocol}//${engineInfo.hostname}`); - url.port = port; return { uuid: engineInfo.uuid, - // NOTE: URLインターフェースは"pathname"が空文字でも"/"を付けるので手動で結合する。 - url: `${url.origin}${engineInfo.pathname}`, + url: createEngineUrl({ + protocol: engineInfo.protocol, + hostname: engineInfo.hostname, + port, + pathname: engineInfo.pathname, + }), name: engineInfo.name, }; }), diff --git a/src/domain/url.ts b/src/domain/url.ts new file mode 100644 index 0000000000..723c9ab31f --- /dev/null +++ b/src/domain/url.ts @@ -0,0 +1,18 @@ +/** エンジンのURLを構成するパラメータ */ +export type EngineUrlParams = { + protocol: string; // `http:`など + hostname: string; // `example.com`など + port: string; // `50021`など。空文字列もありえる。 + pathname: string; // `/engine`など。空文字列もありえる。 +}; + +/** + * URLを構成するパラメータから、VOICEVOXエディタが初期から想定しているURL文字列を組み立てる。 + * pathnameが空文字の場合は末尾にスラッシュを付与しない、などがビルトインのURLクラスと異なる。 + */ +export function createEngineUrl(params: EngineUrlParams) { + const { protocol, hostname, port, pathname } = params; + const url = new URL(`${protocol}//${hostname}`); // NOTE: URLを正規化する + url.port = port; + return `${url.origin}${pathname}`; // NOTE: URLインターフェースは"pathname"が空文字でも"/"を付けるので手動で結合する。 +} diff --git a/src/store/proxy.ts b/src/store/proxy.ts index 6cc82334d2..050174d37a 100644 --- a/src/store/proxy.ts +++ b/src/store/proxy.ts @@ -1,5 +1,6 @@ import { ProxyStoreState, ProxyStoreTypes, EditorAudioQuery } from "./type"; import { createPartialStore } from "./vuex"; +import { createEngineUrl } from "@/domain/url"; import { IEngineConnectorFactory, OpenAPIEngineConnectorFactory, @@ -22,12 +23,13 @@ const proxyStoreCreator = (_engineFactory: IEngineConnectorFactory) => { const altPort: string | undefined = state.altPortInfos[engineId]; const port = altPort ?? engineInfo.defaultPort; - // NOTE: URLを正規化する - const url = new URL(`${engineInfo.protocol}//${engineInfo.hostname}`); - url.port = port; - // NOTE: URLインターフェースは"pathname"が空文字でも"/"を付けるので手動で結合する。 const instance = _engineFactory.instance( - `${url.origin}${engineInfo.pathname}`, + createEngineUrl({ + protocol: engineInfo.protocol, + hostname: engineInfo.hostname, + port, + pathname: engineInfo.pathname, + }), ); return Promise.resolve({ invoke: (v) => (arg) =>