@swf2es/desktop 0.1.15 → 0.1.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +85 -12
- package/dist/launch/launch.js +4 -1
- package/dist/launch/launch.js.map +1 -1
- package/dist/main/air.d.ts +3 -3
- package/dist/main/air.d.ts.map +1 -1
- package/dist/main/air.js +17 -8
- package/dist/main/air.js.map +1 -1
- package/dist/main/case-paths.d.ts +12 -0
- package/dist/main/case-paths.d.ts.map +1 -0
- package/dist/main/case-paths.js +84 -0
- package/dist/main/case-paths.js.map +1 -0
- package/dist/main/connections.d.ts +20 -1
- package/dist/main/connections.d.ts.map +1 -1
- package/dist/main/connections.js +71 -8
- package/dist/main/connections.js.map +1 -1
- package/dist/main/main.js +133 -9
- package/dist/main/main.js.map +1 -1
- package/dist/main/netlog.d.ts +21 -0
- package/dist/main/netlog.d.ts.map +1 -0
- package/dist/main/netlog.js +90 -0
- package/dist/main/netlog.js.map +1 -0
- package/dist/main/network.d.ts +10 -0
- package/dist/main/network.d.ts.map +1 -1
- package/dist/main/network.js +111 -35
- package/dist/main/network.js.map +1 -1
- package/dist/main/proxy.d.ts +48 -0
- package/dist/main/proxy.d.ts.map +1 -0
- package/dist/main/proxy.js +402 -0
- package/dist/main/proxy.js.map +1 -0
- package/dist/main/sandbox.d.ts.map +1 -1
- package/dist/main/sandbox.js +2 -1
- package/dist/main/sandbox.js.map +1 -1
- package/dist/main/settings.d.ts +2 -0
- package/dist/main/settings.d.ts.map +1 -1
- package/dist/main/settings.js +4 -0
- package/dist/main/settings.js.map +1 -1
- package/dist/main/sockets.d.ts +6 -2
- package/dist/main/sockets.d.ts.map +1 -1
- package/dist/main/sockets.js +18 -3
- package/dist/main/sockets.js.map +1 -1
- package/dist/main/websocket-connections.d.ts +73 -0
- package/dist/main/websocket-connections.d.ts.map +1 -0
- package/dist/main/websocket-connections.js +266 -0
- package/dist/main/websocket-connections.js.map +1 -0
- package/dist/main/websockets.d.ts +12 -0
- package/dist/main/websockets.d.ts.map +1 -0
- package/dist/main/websockets.js +94 -0
- package/dist/main/websockets.js.map +1 -0
- package/dist/preload/preload.cjs +20 -0
- package/dist/preload/preload.cjs.map +1 -1
- package/dist/renderer/air.d.ts.map +1 -1
- package/dist/renderer/air.js +1 -0
- package/dist/renderer/air.js.map +1 -1
- package/dist/renderer/full-screen.d.ts +4 -0
- package/dist/renderer/full-screen.d.ts.map +1 -0
- package/dist/renderer/full-screen.js +32 -0
- package/dist/renderer/full-screen.js.map +1 -0
- package/dist/renderer/index.d.ts.map +1 -1
- package/dist/renderer/index.js +4 -0
- package/dist/renderer/index.js.map +1 -1
- package/dist/renderer/websockets.d.ts +4 -0
- package/dist/renderer/websockets.d.ts.map +1 -0
- package/dist/renderer/websockets.js +36 -0
- package/dist/renderer/websockets.js.map +1 -0
- package/dist/shared/api.d.ts +53 -0
- package/dist/shared/api.d.ts.map +1 -1
- package/package.json +7 -7
- package/src/launch/launch.ts +5 -2
- package/src/main/air.ts +18 -8
- package/src/main/case-paths.ts +97 -0
- package/src/main/connections.ts +90 -8
- package/src/main/main.ts +174 -10
- package/src/main/netlog.ts +108 -0
- package/src/main/network.ts +140 -37
- package/src/main/proxy.ts +497 -0
- package/src/main/sandbox.ts +2 -1
- package/src/main/settings.ts +5 -0
- package/src/main/sockets.ts +22 -3
- package/src/main/websocket-connections.ts +344 -0
- package/src/main/websockets.ts +117 -0
- package/src/preload/preload.cts +23 -0
- package/src/renderer/air.ts +1 -0
- package/src/renderer/full-screen.ts +44 -0
- package/src/renderer/index.ts +4 -0
- package/src/renderer/websockets.ts +43 -0
- package/src/shared/api.ts +40 -0
package/dist/renderer/index.js
CHANGED
|
@@ -4,8 +4,10 @@
|
|
|
4
4
|
import { configure } from "@swf2es/web";
|
|
5
5
|
import { airHosts, airPath } from "./air.js";
|
|
6
6
|
import { shellFiles } from "./files.js";
|
|
7
|
+
import { windowFullScreen } from "./full-screen.js";
|
|
7
8
|
import { shellFetch } from "./network.js";
|
|
8
9
|
import { shellSocketHost } from "./sockets.js";
|
|
10
|
+
import { shellWebSocketHost } from "./websockets.js";
|
|
9
11
|
const desktop = window.swf2esDesktop;
|
|
10
12
|
/** The AIR application playing, whose local URLs are read through the shell; null for a SWF. */
|
|
11
13
|
let airLaunch = null;
|
|
@@ -13,6 +15,7 @@ configure({
|
|
|
13
15
|
cache: true,
|
|
14
16
|
fileHost: shellFiles(desktop.files),
|
|
15
17
|
sockets: shellSocketHost(desktop.sockets),
|
|
18
|
+
webSockets: shellWebSocketHost(desktop.webSockets),
|
|
16
19
|
fetch: shellFetch(desktop.network, () => {
|
|
17
20
|
const launch = airLaunch;
|
|
18
21
|
return launch
|
|
@@ -23,6 +26,7 @@ configure({
|
|
|
23
26
|
: null;
|
|
24
27
|
}),
|
|
25
28
|
loadPolicyFile: (url) => desktop.network.loadPolicyFile(url),
|
|
29
|
+
fullScreen: windowFullScreen(desktop.fullScreen),
|
|
26
30
|
});
|
|
27
31
|
const byId = (id) => document.getElementById(id);
|
|
28
32
|
const player = byId("player");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/renderer/index.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,4BAA4B;AAC5B,0EAA0E;AAC1E,OAAO,EAAE,SAAS,EAA4B,MAAM,aAAa,CAAC;AAElE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/renderer/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websockets.d.ts","sourceRoot":"","sources":["../../src/renderer/websockets.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAmB,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,iBAAiB,GAAG,aAAa,CAoC/E"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export function shellWebSocketHost(webSockets) {
|
|
2
|
+
// Until its close, which the shell sends after a failure too.
|
|
3
|
+
const open = new Map();
|
|
4
|
+
webSockets.onEvent((id, event) => {
|
|
5
|
+
const events = open.get(id);
|
|
6
|
+
if (!events) {
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
switch (event.type) {
|
|
10
|
+
case "open":
|
|
11
|
+
events.open(event.protocol);
|
|
12
|
+
break;
|
|
13
|
+
case "message":
|
|
14
|
+
events.message(event.data);
|
|
15
|
+
break;
|
|
16
|
+
case "error":
|
|
17
|
+
events.error();
|
|
18
|
+
break;
|
|
19
|
+
case "close":
|
|
20
|
+
open.delete(id);
|
|
21
|
+
events.close(event.code);
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
return {
|
|
26
|
+
connect(url, protocols, events) {
|
|
27
|
+
const id = webSockets.connect(url, protocols);
|
|
28
|
+
open.set(id, events);
|
|
29
|
+
return {
|
|
30
|
+
send: (data) => webSockets.send(id, data),
|
|
31
|
+
close: (code) => webSockets.close(id, code),
|
|
32
|
+
};
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=websockets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websockets.js","sourceRoot":"","sources":["../../src/renderer/websockets.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,kBAAkB,CAAC,UAA6B;IAC9D,8DAA8D;IAC9D,MAAM,IAAI,GAAG,IAAI,GAAG,EAA2B,CAAC;IAChD,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,MAAM;gBACT,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC5B,MAAM;YACR,KAAK,SAAS;gBACZ,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC3B,MAAM;YACR,KAAK,OAAO;gBACV,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM;YACR,KAAK,OAAO;gBACV,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAChB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACzB,MAAM;QACV,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM;YAC5B,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YAC9C,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YACrB,OAAO;gBACL,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC;gBACzC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC;aAC5C,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/shared/api.d.ts
CHANGED
|
@@ -50,6 +50,23 @@ export interface AirWindowState {
|
|
|
50
50
|
active: boolean;
|
|
51
51
|
visible: boolean;
|
|
52
52
|
}
|
|
53
|
+
/** One of the system's displays as flash.display.Screen reads it: all of it, and what a window may fill. */
|
|
54
|
+
export interface AirScreenState {
|
|
55
|
+
bounds: {
|
|
56
|
+
x: number;
|
|
57
|
+
y: number;
|
|
58
|
+
width: number;
|
|
59
|
+
height: number;
|
|
60
|
+
};
|
|
61
|
+
visibleBounds: {
|
|
62
|
+
x: number;
|
|
63
|
+
y: number;
|
|
64
|
+
width: number;
|
|
65
|
+
height: number;
|
|
66
|
+
};
|
|
67
|
+
colorDepth: number;
|
|
68
|
+
main: boolean;
|
|
69
|
+
}
|
|
53
70
|
/**
|
|
54
71
|
* An AIR application's own reach, only while one the user opened plays:
|
|
55
72
|
* the file system, read and written synchronously as File does, and the
|
|
@@ -72,6 +89,8 @@ export interface DesktopAir {
|
|
|
72
89
|
remove(path: string): boolean;
|
|
73
90
|
move(from: string, to: string): boolean;
|
|
74
91
|
window(): AirWindowState;
|
|
92
|
+
/** The displays as they are now; none where no application plays. */
|
|
93
|
+
screens(): AirScreenState[];
|
|
75
94
|
setBounds(bounds: {
|
|
76
95
|
x: number;
|
|
77
96
|
y: number;
|
|
@@ -136,6 +155,28 @@ export interface DesktopSockets {
|
|
|
136
155
|
close(id: number): void;
|
|
137
156
|
onEvent(listener: (id: number, event: SocketEvent) => void): void;
|
|
138
157
|
}
|
|
158
|
+
/** What befalls a WebSocket, as player's WebSocketEvents has it. */
|
|
159
|
+
export type WebSocketEvent = {
|
|
160
|
+
type: "open";
|
|
161
|
+
protocol: string;
|
|
162
|
+
} | {
|
|
163
|
+
type: "message";
|
|
164
|
+
data: string | Uint8Array;
|
|
165
|
+
} | {
|
|
166
|
+
type: "close";
|
|
167
|
+
code: number;
|
|
168
|
+
} | {
|
|
169
|
+
type: "error";
|
|
170
|
+
};
|
|
171
|
+
/** air.net.WebSocket's connections, opened by the shell, for an AIR application alone. */
|
|
172
|
+
export interface DesktopWebSockets {
|
|
173
|
+
/** A connection's id; its events follow, an "error" then a "close" if the shell refuses it. */
|
|
174
|
+
connect(url: string, protocols: string[]): number;
|
|
175
|
+
/** A text message for a string, a binary one for bytes. */
|
|
176
|
+
send(id: number, data: string | Uint8Array): void;
|
|
177
|
+
close(id: number, code?: number): void;
|
|
178
|
+
onEvent(listener: (id: number, event: WebSocketEvent) => void): void;
|
|
179
|
+
}
|
|
139
180
|
/** A request of a SWF's, as player's FetchRequest has it. */
|
|
140
181
|
export interface NetworkRequest {
|
|
141
182
|
url: string;
|
|
@@ -182,8 +223,19 @@ export interface DesktopFiles {
|
|
|
182
223
|
write(id: number, bytes: Uint8Array): Promise<void>;
|
|
183
224
|
release(id: number): void;
|
|
184
225
|
}
|
|
226
|
+
/**
|
|
227
|
+
* The window's full screen, which a SWF's Stage.displayState asks for
|
|
228
|
+
* while one the user opened plays, with no gesture, as AIR's and the
|
|
229
|
+
* projector's did.
|
|
230
|
+
*/
|
|
231
|
+
export interface DesktopFullScreen {
|
|
232
|
+
set(fullScreen: boolean): void;
|
|
233
|
+
/** The window has entered or left full screen, a SWF's doing or the user's (F11). */
|
|
234
|
+
onChange(listener: (fullScreen: boolean) => void): void;
|
|
235
|
+
}
|
|
185
236
|
export interface DesktopApi {
|
|
186
237
|
files: DesktopFiles;
|
|
238
|
+
fullScreen: DesktopFullScreen;
|
|
187
239
|
/** The page has loaded and listens: what it is to show. */
|
|
188
240
|
start(): Promise<StartState>;
|
|
189
241
|
/** The shell opened a SWF: play it in place of what plays. */
|
|
@@ -199,6 +251,7 @@ export interface DesktopApi {
|
|
|
199
251
|
/** Ask the user for a library; the page reloads once the shell has it. */
|
|
200
252
|
chooseLibrary(name: LibraryName): void;
|
|
201
253
|
sockets: DesktopSockets;
|
|
254
|
+
webSockets: DesktopWebSockets;
|
|
202
255
|
network: DesktopNetwork;
|
|
203
256
|
air: DesktopAir;
|
|
204
257
|
}
|
package/dist/shared/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/shared/api.ts"],"names":[],"mappings":"AAIA,4FAA4F;AAC5F,MAAM,MAAM,WAAW,GAAG,eAAe,GAAG,kBAAkB,GAAG,QAAQ,GAAG,aAAa,CAAC;AAE1F;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,8CAA8C;IAC9C,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,kDAAkD;IAClD,gBAAgB,EAAE,MAAM,CAAC;IACzB,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,oGAAoG;IACpG,WAAW,EAAE;QACX,WAAW,EAAE,MAAM,CAAC;QACpB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,0DAA0D;AAC1D,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,kGAAkG;AAClG,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAChE,aAAa,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAAC;IACvC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IACpC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAC/C,4FAA4F;IAC5F,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;IAC1C,yFAAyF;IACzF,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;IACzC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/C,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,IAAI,IAAI,CAAC;IACnB,mGAAmG;IACnG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACpF,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACvC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IACxC,MAAM,IAAI,cAAc,CAAC;IACzB,SAAS,CAAC,MAAM,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACjF,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,IAAI,IAAI,CAAC;IACjB,QAAQ,IAAI,IAAI,CAAC;IACjB,OAAO,IAAI,IAAI,CAAC;IAChB,QAAQ,IAAI,IAAI,CAAC;IACjB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACnC,KAAK,IAAI,IAAI,CAAC;IACd,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,mEAAmE;AACnE,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,OAAO,EAAE,WAAW,CAAC;IACrB,4FAA4F;IAC5F,GAAG,CAAC,EAAE,SAAS,CAAC;CACjB;AAED,0EAA0E;AAC1E,qGAAqG;AACrG,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,qFAAqF;AACrF,MAAM,WAAW,UAAU;IACzB,wDAAwD;IACxD,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,YAAY,CAAC;IACxB,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAC1B,8FAA8F;IAC9F,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC;AAE7C,8DAA8D;AAC9D,MAAM,MAAM,WAAW,GACnB;IACE,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,GACD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvC,+DAA+D;AAC/D,MAAM,WAAW,cAAc;IAC7B,oFAAoF;IACpF,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5C,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1C,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI,CAAC;CACnE;AAED,6DAA6D;AAC7D,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAC5B,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IACxB,0EAA0E;IAC1E,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;CAChD;AAED,4EAA4E;AAC5E,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,oGAAoG;AACpG,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC9F,gEAAgE;IAChE,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CACJ,OAAO,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,EACrD,QAAQ,EAAE,OAAO,GAChB,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IACjE,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,YAAY,CAAC;IACpB,2DAA2D;IAC3D,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7B,8DAA8D;IAC9D,MAAM,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI,CAAC;IACrD,wCAAwC;IACxC,OAAO,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACpC,+BAA+B;IAC/B,UAAU,IAAI,IAAI,CAAC;IACnB,mFAAmF;IACnF,aAAa,IAAI,IAAI,CAAC;IACtB,qEAAqE;IACrE,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAC9B,0EAA0E;IAC1E,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IACvC,OAAO,EAAE,cAAc,CAAC;IACxB,OAAO,EAAE,cAAc,CAAC;IACxB,GAAG,EAAE,UAAU,CAAC;CACjB"}
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/shared/api.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@swf2es/desktop",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.17",
|
|
4
4
|
"description": "swf2es's desktop app: local and remote SWFs, and AIR applications, in an Electron window",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"swf",
|
|
@@ -35,12 +35,12 @@
|
|
|
35
35
|
],
|
|
36
36
|
"dependencies": {
|
|
37
37
|
"electron": "44.10.2",
|
|
38
|
-
"@swf2es/codegen": "0.1.
|
|
39
|
-
"@swf2es/format": "0.1.
|
|
40
|
-
"@swf2es/
|
|
41
|
-
"@swf2es/
|
|
42
|
-
"@swf2es/player-hosts": "0.1.
|
|
43
|
-
"@swf2es/
|
|
38
|
+
"@swf2es/codegen": "0.1.17",
|
|
39
|
+
"@swf2es/format": "0.1.17",
|
|
40
|
+
"@swf2es/player": "0.1.17",
|
|
41
|
+
"@swf2es/web": "0.1.17",
|
|
42
|
+
"@swf2es/player-hosts": "0.1.17",
|
|
43
|
+
"@swf2es/context3d": "0.1.17"
|
|
44
44
|
},
|
|
45
45
|
"scripts": {
|
|
46
46
|
"fetch-electron": "node node_modules/electron/install.js",
|
package/src/launch/launch.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// swf2es-desktop command of the package npm installs, and a checkout's
|
|
4
4
|
// `start`.
|
|
5
5
|
//
|
|
6
|
-
// npx @swf2es/desktop [--trace] [file.swf | https://host/movie.swf]
|
|
6
|
+
// npx @swf2es/desktop [--trace] [--log-network] [file.swf | https://host/movie.swf]
|
|
7
7
|
// npx @swf2es/desktop [--trace] app.xml [root-dir] [-- arguments...]
|
|
8
8
|
// pnpm --filter @swf2es/desktop start ... the same, in a checkout
|
|
9
9
|
//
|
|
@@ -64,7 +64,10 @@ if (!build || appRoot.includes(`${join("node_modules", "@swf2es")}`)) {
|
|
|
64
64
|
build = JSON.parse(readFileSync(join(appRoot, "package.json"), "utf8")).version;
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
const env = { ...process.env, SWF2ES_DESKTOP_BUILD: build };
|
|
67
|
+
const env: NodeJS.ProcessEnv = { ...process.env, SWF2ES_DESKTOP_BUILD: build };
|
|
68
|
+
// Set by tools that are Electron apps themselves, an editor's terminals and tasks among them,
|
|
69
|
+
// for the node they run: here it would make Electron run the app's main module as plain node.
|
|
70
|
+
delete env.ELECTRON_RUN_AS_NODE;
|
|
68
71
|
const child = spawn(electronBinary() as string, [appRoot, ...args], { stdio: "inherit", env });
|
|
69
72
|
child.on("exit", (code, signal) => process.exit(signal ? 1 : (code ?? 0)));
|
|
70
73
|
for (const signal of ["SIGINT", "SIGTERM"] as const) {
|
package/src/main/air.ts
CHANGED
|
@@ -22,6 +22,7 @@ import { homedir } from "node:os";
|
|
|
22
22
|
import { basename, dirname, join, resolve, sep } from "node:path";
|
|
23
23
|
import { readAirDescriptor } from "@swf2es/format";
|
|
24
24
|
import type { AirFileStat, AirLaunch } from "../shared/api.js";
|
|
25
|
+
import { resolveCase } from "./case-paths.ts";
|
|
25
26
|
|
|
26
27
|
/** What the command line asks adl's way: the descriptor, the application's directory, the arguments. */
|
|
27
28
|
export interface AirCommand {
|
|
@@ -78,7 +79,7 @@ export function airLaunch(
|
|
|
78
79
|
);
|
|
79
80
|
mkdirSync(applicationStorage, { recursive: true });
|
|
80
81
|
return {
|
|
81
|
-
content: resolve(application, ...descriptor.content.split("/")),
|
|
82
|
+
content: resolveCase(resolve(application, ...descriptor.content.split("/"))),
|
|
82
83
|
relative: descriptor.content,
|
|
83
84
|
launch: {
|
|
84
85
|
descriptor: xml,
|
|
@@ -95,7 +96,8 @@ export function airLaunch(
|
|
|
95
96
|
}
|
|
96
97
|
|
|
97
98
|
/** What is at `path`, as File reads it; null where nothing is. */
|
|
98
|
-
export function statOf(
|
|
99
|
+
export function statOf(asked: string): AirFileStat | null {
|
|
100
|
+
const path = resolveCase(asked);
|
|
99
101
|
try {
|
|
100
102
|
const s = statSync(path);
|
|
101
103
|
const link = lstatSync(path).isSymbolicLink();
|
|
@@ -116,7 +118,7 @@ export function statOf(path: string): AirFileStat | null {
|
|
|
116
118
|
/** The names in the directory at `path`; null where it is none. */
|
|
117
119
|
export function listOf(path: string): string[] | null {
|
|
118
120
|
try {
|
|
119
|
-
return readdirSync(path);
|
|
121
|
+
return readdirSync(resolveCase(path));
|
|
120
122
|
} catch {
|
|
121
123
|
return null;
|
|
122
124
|
}
|
|
@@ -125,7 +127,7 @@ export function listOf(path: string): string[] | null {
|
|
|
125
127
|
/** The bytes of the file at `path`, as FileStream's open reads them at once; null where none can be read. */
|
|
126
128
|
export function readOf(path: string): Uint8Array | null {
|
|
127
129
|
try {
|
|
128
|
-
return new Uint8Array(readFileSync(path));
|
|
130
|
+
return new Uint8Array(readFileSync(resolveCase(path)));
|
|
129
131
|
} catch {
|
|
130
132
|
return null;
|
|
131
133
|
}
|
|
@@ -222,7 +224,8 @@ export class EncryptedItems {
|
|
|
222
224
|
* `length` long, made with its directories where it is not: FileStream's
|
|
223
225
|
* writes. False where it cannot be written.
|
|
224
226
|
*/
|
|
225
|
-
export function writeOf(
|
|
227
|
+
export function writeOf(asked: string, bytes: Uint8Array, offset: number, length: number): boolean {
|
|
228
|
+
const path = resolveCase(asked);
|
|
226
229
|
return attempt(() => {
|
|
227
230
|
mkdirSync(dirname(path), { recursive: true });
|
|
228
231
|
// "a+" would only append; "r+" needs the file there, which "a" makes without emptying it.
|
|
@@ -239,16 +242,23 @@ export function writeOf(path: string, bytes: Uint8Array, offset: number, length:
|
|
|
239
242
|
|
|
240
243
|
/** Makes the directory at `path` and those it is in; false where it cannot. */
|
|
241
244
|
export function createDirectoryOf(path: string): boolean {
|
|
242
|
-
return attempt(() => mkdirSync(path, { recursive: true }));
|
|
245
|
+
return attempt(() => mkdirSync(resolveCase(path), { recursive: true }));
|
|
243
246
|
}
|
|
244
247
|
|
|
245
248
|
/** Removes the file or directory at `path`, with all in it; false where it cannot. */
|
|
246
249
|
export function removeOf(path: string): boolean {
|
|
247
|
-
return attempt(() => rmSync(path, { recursive: true }));
|
|
250
|
+
return attempt(() => rmSync(resolveCase(path), { recursive: true }));
|
|
248
251
|
}
|
|
249
252
|
|
|
250
253
|
/** Moves what is at `from` to `to`, its directories made; false where it cannot. */
|
|
251
|
-
export function moveOf(
|
|
254
|
+
export function moveOf(askedFrom: string, askedTo: string): boolean {
|
|
255
|
+
const from = resolveCase(askedFrom);
|
|
256
|
+
let to = resolveCase(askedTo);
|
|
257
|
+
// A rename of its case alone, which Windows makes: the name as given, in its directory as found.
|
|
258
|
+
if (to === from) {
|
|
259
|
+
to = join(resolveCase(dirname(askedTo)), basename(askedTo));
|
|
260
|
+
}
|
|
261
|
+
|
|
252
262
|
return attempt(() => {
|
|
253
263
|
mkdirSync(dirname(to), { recursive: true });
|
|
254
264
|
try {
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// Local paths as a case-insensitive file system finds them. AIR runs on
|
|
2
|
+
// Windows and macOS, whose file systems ignore case, so an AIR application
|
|
3
|
+
// or a SWF made there may name a file in any case: maps/Town.swf for
|
|
4
|
+
// maps/town.swf. On Linux such a path finds nothing, so where the exact
|
|
5
|
+
// path is missing each missing segment is taken as the one entry of its
|
|
6
|
+
// directory equal to it ignoring case. Names are compared as NFC,
|
|
7
|
+
// lowercased by toLowerCase(): close enough to how NTFS and APFS fold
|
|
8
|
+
// case, and APFS keeps a name's normalization, as NFC compares it.
|
|
9
|
+
// Apart from Electron, so that node tests it (tests/desktop/case-paths.test.ts).
|
|
10
|
+
import { lstatSync, readdirSync } from "node:fs";
|
|
11
|
+
import { isAbsolute, parse, sep } from "node:path";
|
|
12
|
+
|
|
13
|
+
/** Whether this system's file system tells names apart by case: Linux's do; Windows' and macOS's do not. */
|
|
14
|
+
const CASE_SENSITIVE = process.platform === "linux";
|
|
15
|
+
|
|
16
|
+
/** The directories already said, on stderr, to hold names that differ only in case. */
|
|
17
|
+
const told = new Set<string>();
|
|
18
|
+
|
|
19
|
+
const fold = (name: string) => name.normalize("NFC").toLowerCase();
|
|
20
|
+
|
|
21
|
+
function exists(path: string): boolean {
|
|
22
|
+
try {
|
|
23
|
+
lstatSync(path);
|
|
24
|
+
return true;
|
|
25
|
+
} catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* `path`, absolute, as Windows would find it: unchanged where it is there
|
|
32
|
+
* exactly; otherwise from the deepest ancestor that is there, each missing
|
|
33
|
+
* segment taken as the entry of its directory equal to it ignoring case,
|
|
34
|
+
* until one has none, which is kept as given with all after it (a file to
|
|
35
|
+
* be made keeps its name). Where two entries or more are equal ignoring
|
|
36
|
+
* case, which one is meant is not guessed: `path` comes back unchanged.
|
|
37
|
+
* Each call lists the directories it needs afresh, as they change; one
|
|
38
|
+
* whose path is there costs one lstat.
|
|
39
|
+
*/
|
|
40
|
+
export function resolveCase(path: string, caseSensitive = CASE_SENSITIVE): string {
|
|
41
|
+
if (!caseSensitive || !isAbsolute(path) || exists(path)) {
|
|
42
|
+
return path;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const root = parse(path).root;
|
|
46
|
+
const segments = path.slice(root.length).split(sep);
|
|
47
|
+
// Joined as given, not normalized: ".." is the file system's to follow, through links as today.
|
|
48
|
+
const at = (count: number, from: string[]) => root + from.slice(0, count).join(sep);
|
|
49
|
+
let found = segments.length - 1;
|
|
50
|
+
while (found > 0 && !exists(at(found, segments))) {
|
|
51
|
+
found--;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const resolved = segments.slice();
|
|
55
|
+
for (let i = found; i < segments.length; i++) {
|
|
56
|
+
const segment = segments[i];
|
|
57
|
+
if (segment === "" || segment === "." || segment === "..") {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const directory = at(i, resolved);
|
|
62
|
+
let names: string[];
|
|
63
|
+
try {
|
|
64
|
+
names = readdirSync(directory);
|
|
65
|
+
} catch {
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// In a directory resolved by case, a segment after it may be there exactly.
|
|
70
|
+
if (names.includes(segment)) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const wanted = fold(segment);
|
|
75
|
+
const matches = names.filter((name) => fold(name) === wanted);
|
|
76
|
+
if (matches.length === 0) {
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (matches.length > 1) {
|
|
81
|
+
const key = `${directory}${sep}${wanted}`;
|
|
82
|
+
if (!told.has(key)) {
|
|
83
|
+
told.add(key);
|
|
84
|
+
console.error(
|
|
85
|
+
`swf2es: ${directory} holds ${matches.join(", ")}, which differ only in case; ` +
|
|
86
|
+
`${segment} is taken as named, not as any of them.`,
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return path;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
resolved[i] = matches[0];
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return root + resolved.join(sep);
|
|
97
|
+
}
|
package/src/main/connections.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
// One page's flash.net.Socket connections, made with node:net
|
|
2
|
-
//
|
|
3
|
-
// that node runs it in the tests
|
|
1
|
+
// One page's flash.net.Socket connections, made with node:net, or through
|
|
2
|
+
// the proxy (--proxy, proxy.ts): what the socket bridge (sockets.ts) holds
|
|
3
|
+
// for each page, apart from Electron so that node runs it in the tests
|
|
4
|
+
// (tests/desktop/connections.test.ts).
|
|
4
5
|
import { connect, type Socket } from "node:net";
|
|
5
6
|
import type { SocketEvent } from "../shared/api.js";
|
|
7
|
+
import { connectThrough, type ProxyConfig, type ProxyError } from "./proxy.ts";
|
|
6
8
|
|
|
7
9
|
/** As many as a page may hold open at once; past it a connection is refused. */
|
|
8
10
|
const MAX_OPEN = 64;
|
|
@@ -30,17 +32,30 @@ export function validEndpoint(host: unknown, port: unknown): host is string {
|
|
|
30
32
|
);
|
|
31
33
|
}
|
|
32
34
|
|
|
35
|
+
export interface ConnectionOptions {
|
|
36
|
+
/** What every connection goes through; none by default. */
|
|
37
|
+
proxy?: ProxyConfig | null;
|
|
38
|
+
/** Told why a connection through the proxy did not come about, for stderr. */
|
|
39
|
+
warn?: (message: string) => void;
|
|
40
|
+
}
|
|
41
|
+
|
|
33
42
|
export class Connections {
|
|
34
43
|
private readonly sockets = new Map<number, Socket>();
|
|
44
|
+
/** Connections still being made through the proxy, each stopped by its controller. */
|
|
45
|
+
private readonly opening = new Map<number, AbortController>();
|
|
35
46
|
private readonly tell: (id: number, event: SocketEvent) => void;
|
|
47
|
+
private readonly proxy: ProxyConfig | null;
|
|
48
|
+
private readonly warn: (message: string) => void;
|
|
36
49
|
|
|
37
50
|
/** `tell` carries each connection's events to its page. */
|
|
38
|
-
constructor(tell: (id: number, event: SocketEvent) => void) {
|
|
51
|
+
constructor(tell: (id: number, event: SocketEvent) => void, options: ConnectionOptions = {}) {
|
|
39
52
|
this.tell = tell;
|
|
53
|
+
this.proxy = options.proxy ?? null;
|
|
54
|
+
this.warn = options.warn ?? (() => {});
|
|
40
55
|
}
|
|
41
56
|
|
|
42
57
|
get size(): number {
|
|
43
|
-
return this.sockets.size;
|
|
58
|
+
return this.sockets.size + this.opening.size;
|
|
44
59
|
}
|
|
45
60
|
|
|
46
61
|
/** Counts closeAll's: a connection decided on before one belongs to a page that is gone. */
|
|
@@ -51,13 +66,23 @@ export class Connections {
|
|
|
51
66
|
* was pinned (a remote SWF's socket policy came from there); a refusal is an error, then a close.
|
|
52
67
|
*/
|
|
53
68
|
connect(id: number, host: unknown, port: unknown, address?: string): void {
|
|
54
|
-
if (
|
|
69
|
+
if (
|
|
70
|
+
!validEndpoint(host, port) ||
|
|
71
|
+
this.sockets.has(id) ||
|
|
72
|
+
this.opening.has(id) ||
|
|
73
|
+
this.size >= MAX_OPEN
|
|
74
|
+
) {
|
|
55
75
|
this.refuse(id);
|
|
56
76
|
return;
|
|
57
77
|
}
|
|
58
78
|
|
|
59
|
-
const
|
|
60
|
-
this.
|
|
79
|
+
const target = address ?? host;
|
|
80
|
+
if (this.proxy) {
|
|
81
|
+
this.connectThrough(this.proxy, id, target, port as number);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const socket = connect({ host: target, port: port as number });
|
|
61
86
|
socket.on("connect", () =>
|
|
62
87
|
this.tell(id, {
|
|
63
88
|
type: "open",
|
|
@@ -67,6 +92,49 @@ export class Connections {
|
|
|
67
92
|
remotePort: socket.remotePort ?? 0,
|
|
68
93
|
}),
|
|
69
94
|
);
|
|
95
|
+
this.attach(id, socket);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Connect `id` through `proxy`, by the address where one was pinned, else
|
|
100
|
+
* by name for the proxy to resolve. Its peer is the target: the proxy's
|
|
101
|
+
* address is no business of the SWF's. A proxy that fails is a refusal,
|
|
102
|
+
* said with why.
|
|
103
|
+
*/
|
|
104
|
+
private connectThrough(proxy: ProxyConfig, id: number, target: string, port: number): void {
|
|
105
|
+
const opening = new AbortController();
|
|
106
|
+
this.opening.set(id, opening);
|
|
107
|
+
connectThrough(proxy, target, port, { signal: opening.signal }).then(
|
|
108
|
+
(socket) => {
|
|
109
|
+
if (this.opening.get(id) !== opening) {
|
|
110
|
+
socket.destroy();
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
this.opening.delete(id);
|
|
115
|
+
this.attach(id, socket);
|
|
116
|
+
this.tell(id, {
|
|
117
|
+
type: "open",
|
|
118
|
+
localAddress: socket.localAddress ?? "",
|
|
119
|
+
localPort: socket.localPort ?? 0,
|
|
120
|
+
remoteAddress: target,
|
|
121
|
+
remotePort: port,
|
|
122
|
+
});
|
|
123
|
+
},
|
|
124
|
+
(error: ProxyError) => {
|
|
125
|
+
if (this.opening.get(id) !== opening) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
this.opening.delete(id);
|
|
130
|
+
this.warn(`no socket to ${target}:${port}: ${error.message}`);
|
|
131
|
+
this.refuse(id);
|
|
132
|
+
},
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
private attach(id: number, socket: Socket): void {
|
|
137
|
+
this.sockets.set(id, socket);
|
|
70
138
|
socket.on("data", (bytes) => this.tell(id, { type: "data", bytes: new Uint8Array(bytes) }));
|
|
71
139
|
socket.on("error", () => this.tell(id, { type: "error", message: SOCKET_ERROR }));
|
|
72
140
|
socket.on("close", () => {
|
|
@@ -105,6 +173,15 @@ export class Connections {
|
|
|
105
173
|
}
|
|
106
174
|
|
|
107
175
|
close(id: number): void {
|
|
176
|
+
const opening = this.opening.get(id);
|
|
177
|
+
if (opening) {
|
|
178
|
+
// Closed before the proxy made it: closed, as a socket destroyed before it connects.
|
|
179
|
+
this.opening.delete(id);
|
|
180
|
+
opening.abort();
|
|
181
|
+
this.tell(id, { type: "close" });
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
|
|
108
185
|
this.sockets.get(id)?.destroy();
|
|
109
186
|
}
|
|
110
187
|
|
|
@@ -119,7 +196,12 @@ export class Connections {
|
|
|
119
196
|
socket.destroy();
|
|
120
197
|
}
|
|
121
198
|
|
|
199
|
+
for (const opening of this.opening.values()) {
|
|
200
|
+
opening.abort();
|
|
201
|
+
}
|
|
202
|
+
|
|
122
203
|
this.sockets.clear();
|
|
204
|
+
this.opening.clear();
|
|
123
205
|
this.generation++;
|
|
124
206
|
}
|
|
125
207
|
}
|