Skip to content

Commit c08c250

Browse files
committed
v8.3.8: option to change ipx server
1 parent e497df6 commit c08c250

File tree

7 files changed

+80
-43
lines changed

7 files changed

+80
-43
lines changed

index.html

+8
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,14 @@
7373
pathPrefix: "/emulators/",
7474
server: params.get("server"),
7575
room: params.get("room"),
76+
// ipx: [{
77+
// name: "my-ipx-server",
78+
// host: "wss://some.url",
79+
// }, {
80+
// name: "dos.zone",
81+
// host: "wss://netherlands.dos.zone",
82+
// }
83+
// ],
7684
// backendHardware: (backend) => {
7785
// console.log("Hardware backend for", backend);
7886
// return Promise.resolve("ws://127.0.0.1:8888");

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "js-dos",
3-
"version": "8.3.7",
3+
"version": "8.3.8",
44
"description": "Full-featured DOS player with multiple emulator backends",
55
"type": "module",
66
"keywords": [

src/frame/network-frame.tsx

+18-16
Original file line numberDiff line numberDiff line change
@@ -8,33 +8,35 @@ import { uiSlice } from "../store/ui";
88
import { Dispatch } from "@reduxjs/toolkit";
99

1010
export function NetworkFrame() {
11-
const network = useSelector((state: State) => state.dos.network);
11+
const network = useSelector((state: State) => state.dos.ipx);
12+
const backends = network.backends;
13+
const selected = network.backend;
1214
const room = network.room;
13-
const server = network.server;
14-
const disabled = network.ipx !== "disconnected";
15+
const backend = network.backends.find((v) => v.name === selected) ?? backends[0];
16+
const disabled = network.status !== "disconnected";
1517
const t = useT();
1618
const dispatch = useDispatch();
1719
const ipxLink =
18-
network.ipx === "connected" ?
20+
network.status === "connected" ?
1921
location.href + searchSeparator() +
20-
"ipx=1&server=" + network.server + "&room=" + room :
22+
"ipx=1&server=" + selected + "&room=" + room :
2123
null;
2224

2325
function setRoom(room: string) {
2426
dispatch(dosSlice.actions.setRoom(room));
2527
}
2628

27-
function setServer(server: string) {
28-
dispatch(dosSlice.actions.setServer(server as any));
29+
function setIpxBackend(backend: string) {
30+
dispatch(dosSlice.actions.setIpxBackend(backend));
2931
}
3032

3133
function toggleIpx() {
32-
if (network.ipx === "connected") {
34+
if (network.status === "connected") {
3335
dispatch(dosSlice.actions.disconnectIpx({}));
3436
} else {
3537
dispatch(dosSlice.actions.connectIpx({
3638
room,
37-
address: "wss://" + server + ".dos.zone",
39+
address: backend.host,
3840
}) as any);
3941
}
4042
}
@@ -47,7 +49,7 @@ export function NetworkFrame() {
4749
}
4850

4951
function onServer(newServer: string) {
50-
setServer(newServer);
52+
setIpxBackend(newServer);
5153
}
5254

5355
return <div class="network-frame frame-root items-start px-4 relative">
@@ -56,8 +58,8 @@ export function NetworkFrame() {
5658
class="text-sm"
5759
selectClass="w-full"
5860
label={t("server") + ":"}
59-
selected={server}
60-
values={["netherlands"]}
61+
selected={backend.name}
62+
values={backends.map((b) => b.name)}
6163
disabled={disabled}
6264
onSelect={onServer}
6365
/>
@@ -73,12 +75,12 @@ export function NetworkFrame() {
7375
value={room}></input>
7476
</div>
7577
<Checkbox
76-
class={"mt-4 " + (network.ipx === "error" ? "error" : "")}
78+
class={"mt-4 " + (network.status === "error" ? "error" : "")}
7779
onChange={toggleIpx}
7880
label="IPX"
79-
checked={network.ipx === "connected"}
80-
disabled={network.ipx === "connecting"}
81-
intermediate={network.ipx === "connecting"}
81+
checked={network.status === "connected"}
82+
disabled={network.status === "connecting"}
83+
intermediate={network.status === "connecting"}
8284
/>
8385

8486
{ipxLink !== null && <div class="mt-4 text-sm alert alert-success shadow-lg flex flex-col">

src/main.tsx

+10-5
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,12 @@ export const Dos: DosFn = (element: HTMLDivElement,
105105
store.dispatch(dosSlice.actions.mouseCapture(capture));
106106
}
107107

108-
function setServer(server: DosOptions["server"]) {
109-
store.dispatch(dosSlice.actions.setServer(server));
108+
function setIpx(backends: DosOptions["ipx"]) {
109+
store.dispatch(dosSlice.actions.setIpxBackends(backends));
110+
}
111+
112+
function setIpxBackend(backend: string) {
113+
store.dispatch(dosSlice.actions.setIpxBackend(backend));
110114
}
111115

112116
function setRoom(room: DosOptions["room"]) {
@@ -211,8 +215,8 @@ export const Dos: DosFn = (element: HTMLDivElement,
211215
setWorkerThread(options.workerThread);
212216
}
213217

214-
if (options.server) {
215-
setServer(options.server);
218+
if (options.ipx) {
219+
setIpx(options.ipx);
216220
}
217221

218222
if (options.room) {
@@ -297,7 +301,8 @@ export const Dos: DosFn = (element: HTMLDivElement,
297301
setBackendLocked,
298302
setWorkerThread,
299303
setMouseCapture,
300-
setServer,
304+
setIpx,
305+
setIpxBackend,
301306
setRoom,
302307
setFrame,
303308
setBackground,

src/public/types.ts

+9-6
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ export interface InitFileEntry {
1212
export type InitFsEntry = InitBundleEntry | InitFileEntry;
1313
export type InitFs = InitFsEntry | InitFsEntry[];
1414

15+
export interface NamedHost {
16+
name: string,
17+
host: string,
18+
}
19+
1520
export interface DosOptions {
1621
url: string,
1722
dosboxConf: string,
@@ -31,13 +36,10 @@ export interface DosOptions {
3136
workerThread: boolean,
3237
mouseCapture: boolean,
3338
onEvent: (event: DosEvent, ci?: any /* CommandInterface */) => void,
34-
server: "netherlands",
39+
ipx: NamedHost[],
3540
room: string,
3641
fullScreen: boolean,
37-
sockdriveBackend: {
38-
name: string,
39-
host: string,
40-
},
42+
sockdriveBackend: NamedHost,
4143
autoStart: boolean,
4244
kiosk: boolean,
4345
imageRendering: ImageRendering,
@@ -61,7 +63,8 @@ export interface DosProps {
6163
setBackendLocked(locked: boolean): void;
6264
setWorkerThread(capture: DosOptions["workerThread"]): void;
6365
setMouseCapture(capture: DosOptions["mouseCapture"]): void;
64-
setServer(server: DosOptions["server"]): void;
66+
setIpx(ipx: DosOptions["ipx"]): void;
67+
setIpxBackend(backend: string): void;
6568
setRoom(room: DosOptions["room"]): void;
6669
setFrame(frame: "network"): void;
6770
setBackground(background: string | null): void;

src/sidebar/network-button.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export function NetworkButton(props: {
66
class?: string,
77
}) {
88
const hightlight = useSelector((state: State) => state.ui.frame) === "network";
9-
const inactive = useSelector((state: State) => state.dos.network.ipx !== "connected");
9+
const inactive = useSelector((state: State) => state.dos.ipx.status !== "connected");
1010
const dispatch = useDispatch();
1111

1212
function onClick() {

src/store/dos.ts

+33-14
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { createSlice } from "@reduxjs/toolkit";
22
import { DosAction, getNonSerializableStore, makeStore, postJsDosEvent } from "../store";
33
import { Emulators } from "emulators";
44
import { lStorage } from "../host/lstorage";
5+
import { NamedHost } from "../public/types";
56

67
const alphabet = "qwertyuiopasdfghjklzxcvbnm1234567890";
78
declare const emulators: Emulators;
@@ -71,10 +72,11 @@ const initialState: {
7172
stats: EmulatorStats,
7273
ci: boolean,
7374
ciStartedAt: number,
74-
network: {
75-
server: "netherlands",
75+
ipx: {
76+
backends: NamedHost[],
77+
backend: string,
7678
room: string,
77-
ipx: "connecting" | "connected" | "disconnected" | "error",
79+
status: "connecting" | "connected" | "disconnected" | "error",
7880
},
7981
imageRendering: ImageRendering,
8082
sockdriveWrite: boolean,
@@ -125,10 +127,14 @@ const initialState: {
125127
driveBufferedAmount: 0,
126128
driveIo: [],
127129
},
128-
network: {
129-
server: "netherlands",
130+
ipx: {
131+
backends: [{
132+
name: "dos.zone",
133+
host: "wss://netherlands.dos.zone",
134+
}],
135+
backend: lStorage.getItem("net.ipx.server") ?? "netherlands",
130136
room: randomRoom(),
131-
ipx: "disconnected",
137+
status: "disconnected",
132138
},
133139
ci: false,
134140
ciStartedAt: 0,
@@ -295,7 +301,7 @@ export const dosSlice = createSlice({
295301
}
296302
},
297303
connectIpx: (s, a: { payload: { room: string, address: string } }) => {
298-
if (s.network.ipx === "connected") {
304+
if (s.ipx.status === "connected") {
299305
throw new Error("Already connected");
300306
}
301307

@@ -304,7 +310,7 @@ export const dosSlice = createSlice({
304310
}
305311

306312
const { room, address } = a.payload;
307-
s.network.ipx = "connecting";
313+
s.ipx.status = "connecting";
308314
(a as unknown as DosAction).asyncStore((store) => {
309315
const nonSerializableStore = getNonSerializableStore(store);
310316
if (!nonSerializableStore.ci) {
@@ -327,20 +333,33 @@ export const dosSlice = createSlice({
327333
});
328334
},
329335
statusIpx: (s, a: { payload: "error" | "connected" | "connecting" }) => {
330-
s.network.ipx = a.payload;
336+
s.ipx.status = a.payload;
331337
},
332338
disconnectIpx: (s, a) => {
333-
s.network.ipx = "disconnected";
339+
s.ipx.status = "disconnected";
334340
(a as unknown as DosAction).asyncStore((store) => {
335341
getNonSerializableStore(store).ci?.networkDisconnect(0 /* IPX */);
336342
});
337343
},
338344
setRoom: (s, a: { payload: string }) => {
339-
s.network.room = a.payload;
345+
s.ipx.room = a.payload;
340346
},
341-
setServer: (s, a: { payload: typeof initialState.network.server }) => {
342-
s.network.server = a.payload;
343-
lStorage.setItem("net.server", a.payload);
347+
setIpxBackends: (s, a: { payload: NamedHost[] }) => {
348+
s.ipx.backends = a.payload;
349+
const selected = lStorage.getItem("net.ipx.server");
350+
if (selected !== null && a.payload.find((b) => b.name === selected) !== undefined) {
351+
s.ipx.backend = selected;
352+
} else {
353+
s.ipx.backend = a.payload[0].name;
354+
lStorage.setItem("net.ipx.server", s.ipx.backend);
355+
}
356+
},
357+
setIpxBackend: (s, a: { payload: string }) => {
358+
const backend = s.ipx.backends.find((v) => v.name === a.payload);
359+
if (backend) {
360+
s.ipx.backend = backend.name;
361+
lStorage.setItem("net.ipx.server", a.payload);
362+
}
344363
},
345364
setSockdriveWrite: (s, a: { payload: boolean }) => {
346365
s.sockdriveWrite = a.payload;

0 commit comments

Comments
 (0)