@swf2es/desktop 0.0.0-stage → 0.1.15
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/LICENSE +202 -0
- package/README.md +135 -2
- package/dist/launch/electron.d.ts +14 -0
- package/dist/launch/electron.d.ts.map +1 -0
- package/dist/launch/electron.js +40 -0
- package/dist/launch/electron.js.map +1 -0
- package/dist/launch/launch.d.ts +3 -0
- package/dist/launch/launch.d.ts.map +1 -0
- package/dist/launch/launch.js +69 -0
- package/dist/launch/launch.js.map +1 -0
- package/dist/main/addresses.d.ts +7 -0
- package/dist/main/addresses.d.ts.map +1 -0
- package/dist/main/addresses.js +155 -0
- package/dist/main/addresses.js.map +1 -0
- package/dist/main/air.d.ts +71 -0
- package/dist/main/air.d.ts.map +1 -0
- package/dist/main/air.js +216 -0
- package/dist/main/air.js.map +1 -0
- package/dist/main/connections.d.ts +38 -0
- package/dist/main/connections.d.ts.map +1 -0
- package/dist/main/connections.js +103 -0
- package/dist/main/connections.js.map +1 -0
- package/dist/main/decompress.d.ts +51 -0
- package/dist/main/decompress.d.ts.map +1 -0
- package/dist/main/decompress.js +184 -0
- package/dist/main/decompress.js.map +1 -0
- package/dist/main/files.d.ts +9 -0
- package/dist/main/files.d.ts.map +1 -0
- package/dist/main/files.js +120 -0
- package/dist/main/files.js.map +1 -0
- package/dist/main/main.d.ts +2 -0
- package/dist/main/main.d.ts.map +1 -0
- package/dist/main/main.js +1009 -0
- package/dist/main/main.js.map +1 -0
- package/dist/main/network.d.ts +182 -0
- package/dist/main/network.d.ts.map +1 -0
- package/dist/main/network.js +909 -0
- package/dist/main/network.js.map +1 -0
- package/dist/main/policy.d.ts +103 -0
- package/dist/main/policy.d.ts.map +1 -0
- package/dist/main/policy.js +481 -0
- package/dist/main/policy.js.map +1 -0
- package/dist/main/protocol.d.ts +14 -0
- package/dist/main/protocol.d.ts.map +1 -0
- package/dist/main/protocol.js +216 -0
- package/dist/main/protocol.js.map +1 -0
- package/dist/main/sandbox.d.ts +67 -0
- package/dist/main/sandbox.d.ts.map +1 -0
- package/dist/main/sandbox.js +182 -0
- package/dist/main/sandbox.js.map +1 -0
- package/dist/main/settings.d.ts +37 -0
- package/dist/main/settings.d.ts.map +1 -0
- package/dist/main/settings.js +88 -0
- package/dist/main/settings.js.map +1 -0
- package/dist/main/sockets.d.ts +10 -0
- package/dist/main/sockets.d.ts.map +1 -0
- package/dist/main/sockets.js +71 -0
- package/dist/main/sockets.js.map +1 -0
- package/dist/preload/preload.cjs +91 -0
- package/dist/preload/preload.cjs.map +1 -0
- package/dist/preload/preload.d.cts +2 -0
- package/dist/preload/preload.d.cts.map +1 -0
- package/dist/preload/prompt.cjs +12 -0
- package/dist/preload/prompt.cjs.map +1 -0
- package/dist/preload/prompt.d.cts +2 -0
- package/dist/preload/prompt.d.cts.map +1 -0
- package/dist/renderer/air.d.ts +14 -0
- package/dist/renderer/air.d.ts.map +1 -0
- package/dist/renderer/air.js +83 -0
- package/dist/renderer/air.js.map +1 -0
- package/dist/renderer/files.d.ts +4 -0
- package/dist/renderer/files.d.ts.map +1 -0
- package/dist/renderer/files.js +58 -0
- package/dist/renderer/files.js.map +1 -0
- package/dist/renderer/index.d.ts +7 -0
- package/dist/renderer/index.d.ts.map +1 -0
- package/dist/renderer/index.js +126 -0
- package/dist/renderer/index.js.map +1 -0
- package/dist/renderer/network.d.ts +6 -0
- package/dist/renderer/network.d.ts.map +1 -0
- package/dist/renderer/network.js +39 -0
- package/dist/renderer/network.js.map +1 -0
- package/dist/renderer/open-url.d.ts +10 -0
- package/dist/renderer/open-url.d.ts.map +1 -0
- package/dist/renderer/open-url.js +38 -0
- package/dist/renderer/open-url.js.map +1 -0
- package/dist/renderer/sockets.d.ts +4 -0
- package/dist/renderer/sockets.d.ts.map +1 -0
- package/dist/renderer/sockets.js +36 -0
- package/dist/renderer/sockets.js.map +1 -0
- package/dist/renderer/stage3d.d.ts +3 -0
- package/dist/renderer/stage3d.d.ts.map +1 -0
- package/dist/renderer/stage3d.js +26 -0
- package/dist/renderer/stage3d.js.map +1 -0
- package/dist/shared/api.d.ts +205 -0
- package/dist/shared/api.d.ts.map +1 -0
- package/dist/shared/api.js +5 -0
- package/dist/shared/api.js.map +1 -0
- package/package.json +46 -3
- package/src/launch/electron.ts +44 -0
- package/src/launch/launch.ts +72 -0
- package/src/launch/tsconfig.json +14 -0
- package/src/main/addresses.ts +184 -0
- package/src/main/air.ts +275 -0
- package/src/main/connections.ts +125 -0
- package/src/main/decompress.ts +219 -0
- package/src/main/files.ts +147 -0
- package/src/main/main.ts +1180 -0
- package/src/main/network.ts +1205 -0
- package/src/main/policy.ts +630 -0
- package/src/main/protocol.ts +237 -0
- package/src/main/sandbox.ts +213 -0
- package/src/main/settings.ts +117 -0
- package/src/main/sockets.ts +81 -0
- package/src/main/tsconfig.json +15 -0
- package/src/preload/preload.cts +110 -0
- package/src/preload/prompt.cts +11 -0
- package/src/preload/tsconfig.json +12 -0
- package/src/renderer/air.ts +100 -0
- package/src/renderer/files.ts +65 -0
- package/src/renderer/index.ts +145 -0
- package/src/renderer/network.ts +56 -0
- package/src/renderer/open-url.ts +50 -0
- package/src/renderer/sockets.ts +42 -0
- package/src/renderer/stage3d.ts +27 -0
- package/src/renderer/tsconfig.json +17 -0
- package/src/shared/api.ts +204 -0
- package/src/shared/tsconfig.json +11 -0
- package/static/icon.png +0 -0
- package/static/index.html +22 -0
- package/static/open-url.html +21 -0
- package/static/style.css +96 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
// The desktop app's page: one <swf2es-player> filling the window, and what
|
|
2
|
+
// to do when nothing plays.
|
|
3
|
+
// It reaches the shell only through window.swf2esDesktop (shared/api.ts).
|
|
4
|
+
import { configure } from "@swf2es/web";
|
|
5
|
+
import { airHosts, airPath } from "./air.js";
|
|
6
|
+
import { shellFiles } from "./files.js";
|
|
7
|
+
import { shellFetch } from "./network.js";
|
|
8
|
+
import { shellSocketHost } from "./sockets.js";
|
|
9
|
+
const desktop = window.swf2esDesktop;
|
|
10
|
+
/** The AIR application playing, whose local URLs are read through the shell; null for a SWF. */
|
|
11
|
+
let airLaunch = null;
|
|
12
|
+
configure({
|
|
13
|
+
cache: true,
|
|
14
|
+
fileHost: shellFiles(desktop.files),
|
|
15
|
+
sockets: shellSocketHost(desktop.sockets),
|
|
16
|
+
fetch: shellFetch(desktop.network, () => {
|
|
17
|
+
const launch = airLaunch;
|
|
18
|
+
return launch
|
|
19
|
+
? (url) => {
|
|
20
|
+
const path = airPath(launch, url);
|
|
21
|
+
return path === null ? null : desktop.air.read(path);
|
|
22
|
+
}
|
|
23
|
+
: null;
|
|
24
|
+
}),
|
|
25
|
+
loadPolicyFile: (url) => desktop.network.loadPolicyFile(url),
|
|
26
|
+
});
|
|
27
|
+
const byId = (id) => document.getElementById(id);
|
|
28
|
+
const player = byId("player");
|
|
29
|
+
const welcome = byId("welcome");
|
|
30
|
+
const failure = byId("failure");
|
|
31
|
+
/** A playerglobal.abc the user chose, which the shell serves, in place of swf2es's own. */
|
|
32
|
+
function useLibraries(state) {
|
|
33
|
+
configure({
|
|
34
|
+
libraries: {
|
|
35
|
+
playerglobal: state.playerglobal !== null ? "/libraries/playerglobal.abc" : undefined,
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function showFailure(message) {
|
|
40
|
+
failure.hidden = message === null;
|
|
41
|
+
failure.textContent = message ?? "";
|
|
42
|
+
}
|
|
43
|
+
let loadGeneration = 0;
|
|
44
|
+
function play(movie) {
|
|
45
|
+
const generation = ++loadGeneration;
|
|
46
|
+
airLaunch = movie.air ?? null;
|
|
47
|
+
configure({
|
|
48
|
+
sandboxType: movie.sandbox,
|
|
49
|
+
air: movie.air ? airHosts(movie.air, desktop.air) : null,
|
|
50
|
+
});
|
|
51
|
+
showFailure(null);
|
|
52
|
+
welcome.hidden = true;
|
|
53
|
+
player.hidden = false;
|
|
54
|
+
player.load(movie.url).then(() => {
|
|
55
|
+
if (generation === loadGeneration) {
|
|
56
|
+
player.focus();
|
|
57
|
+
}
|
|
58
|
+
}, (error) => {
|
|
59
|
+
if (generation !== loadGeneration) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
player.hidden = true;
|
|
63
|
+
welcome.hidden = false;
|
|
64
|
+
showFailure(`${movie.name} did not play: ${error instanceof Error ? error.message : error}`);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
function close() {
|
|
68
|
+
loadGeneration++;
|
|
69
|
+
player.destroy();
|
|
70
|
+
player.hidden = true;
|
|
71
|
+
welcome.hidden = false;
|
|
72
|
+
showFailure(null);
|
|
73
|
+
}
|
|
74
|
+
byId("open").addEventListener("click", () => desktop.openDialog());
|
|
75
|
+
byId("open-url").addEventListener("click", () => desktop.openUrlDialog());
|
|
76
|
+
// A file dropped anywhere is offered to the shell; the page never navigates to it.
|
|
77
|
+
document.addEventListener("dragover", (event) => {
|
|
78
|
+
event.preventDefault();
|
|
79
|
+
if (event.dataTransfer) {
|
|
80
|
+
event.dataTransfer.dropEffect = "copy";
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
document.addEventListener("drop", (event) => {
|
|
84
|
+
event.preventDefault();
|
|
85
|
+
const file = event.dataTransfer?.files[0];
|
|
86
|
+
if (file) {
|
|
87
|
+
desktop.openDropped(file);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
// An open or close during optional backend loading takes precedence over the startup snapshot.
|
|
91
|
+
let started = false;
|
|
92
|
+
let pending;
|
|
93
|
+
desktop.onOpen((movie) => {
|
|
94
|
+
if (started) {
|
|
95
|
+
play(movie);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
pending = movie;
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
desktop.onClose(() => {
|
|
102
|
+
if (started) {
|
|
103
|
+
close();
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
pending = null;
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
const state = await desktop.start();
|
|
110
|
+
configure({ build: state.build ?? undefined });
|
|
111
|
+
if (state.stage3D) {
|
|
112
|
+
try {
|
|
113
|
+
const { createStage3D } = await import("./stage3d.js");
|
|
114
|
+
configure({ stage3D: createStage3D });
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
console.warn("swf2es: Stage3D backend could not be loaded; using default playback.", error);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
useLibraries(state.libraries);
|
|
121
|
+
started = true;
|
|
122
|
+
const movie = pending === undefined ? state.movie : pending;
|
|
123
|
+
if (movie) {
|
|
124
|
+
play(movie);
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/renderer/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { FetchRequest, FetchResult } from "@swf2es/player";
|
|
2
|
+
import type { DesktopNetwork } from "../shared/api.js";
|
|
3
|
+
export declare function shellFetch(network: DesktopNetwork,
|
|
4
|
+
/** An AIR application's local URL read, null where `url` is none; null where none plays. */
|
|
5
|
+
airFile?: () => ((url: string) => Promise<Uint8Array | null> | null) | null): (request: FetchRequest, signal: AbortSignal) => Promise<FetchResult>;
|
|
6
|
+
//# sourceMappingURL=network.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../src/renderer/network.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,wBAAgB,UAAU,CACxB,OAAO,EAAE,cAAc;AACvB,4FAA4F;AAC5F,OAAO,GAAE,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,IAAiB,GACtF,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,WAAW,CAAC,CAyCtE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export function shellFetch(network,
|
|
2
|
+
/** An AIR application's local URL read, null where `url` is none; null where none plays. */
|
|
3
|
+
airFile = () => null) {
|
|
4
|
+
return async (request, signal) => {
|
|
5
|
+
const local = airFile()?.(request.url);
|
|
6
|
+
if (local) {
|
|
7
|
+
const bytes = await local;
|
|
8
|
+
signal.throwIfAborted();
|
|
9
|
+
// A file that is not there is a failed load, as a 404 is.
|
|
10
|
+
return { bytes, status: bytes ? 200 : 404, headers: [] };
|
|
11
|
+
}
|
|
12
|
+
const url = new URL(request.url);
|
|
13
|
+
// By its parts: a URL's origin is "null" for a scheme the URL standard does not know.
|
|
14
|
+
if (url.protocol === "swf2es:" && url.host === "file") {
|
|
15
|
+
const response = await fetch(url.href, { signal });
|
|
16
|
+
const headers = [];
|
|
17
|
+
response.headers.forEach((value, name) => {
|
|
18
|
+
headers.push([name, value]);
|
|
19
|
+
});
|
|
20
|
+
return {
|
|
21
|
+
bytes: response.ok ? new Uint8Array(await response.arrayBuffer()) : null,
|
|
22
|
+
status: response.status,
|
|
23
|
+
headers,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
27
|
+
throw new Error(`swf2es: no ${url.protocol} URL is loaded`);
|
|
28
|
+
}
|
|
29
|
+
signal.throwIfAborted();
|
|
30
|
+
return network.fetch({
|
|
31
|
+
url: url.href,
|
|
32
|
+
method: request.method,
|
|
33
|
+
headers: request.headers.map(([name, value]) => [name, value]),
|
|
34
|
+
body: request.body,
|
|
35
|
+
purpose: request.purpose ?? "data",
|
|
36
|
+
}, (abort) => signal.addEventListener("abort", abort, { once: true }));
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=network.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/renderer/network.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,UAAU,CACxB,OAAuB;AACvB,4FAA4F;AAC5F,OAAO,GAAsE,GAAG,EAAE,CAAC,IAAI;IAEvF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;QAC/B,MAAM,KAAK,GAAG,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC;YAC1B,MAAM,CAAC,cAAc,EAAE,CAAC;YACxB,0DAA0D;YAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAC3D,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,sFAAsF;QACtF,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACtD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YACnD,MAAM,OAAO,GAAuB,EAAE,CAAC;YACvC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;gBACvC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;YACH,OAAO;gBACL,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;gBACxE,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,OAAO;aACR,CAAC;QACJ,CAAC;QAED,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,cAAc,GAAG,CAAC,QAAQ,gBAAgB,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC,KAAK,CAClB;YACE,GAAG,EAAE,GAAG,CAAC,IAAI;YACb,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC9D,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,MAAM;SACnC,EACD,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CACnE,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-url.d.ts","sourceRoot":"","sources":["../../src/renderer/open-url.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC;AAEV,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,YAAY,EAAE;YACZ,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;YAC3B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;SAClC,CAAC;KACH;CACF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// The URL dialog (static/open-url.html): a URL to open a remote SWF by,
|
|
2
|
+
// told the main process through window.swf2esPrompt. Only http and https.
|
|
3
|
+
export {};
|
|
4
|
+
const shell = window.swf2esPrompt;
|
|
5
|
+
const form = document.getElementById("form");
|
|
6
|
+
const input = document.getElementById("url");
|
|
7
|
+
const problem = document.getElementById("problem");
|
|
8
|
+
function remote(text) {
|
|
9
|
+
try {
|
|
10
|
+
const url = new URL(text.trim());
|
|
11
|
+
return (url.protocol === "http:" || url.protocol === "https:") && url.hostname !== "";
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
form.addEventListener("submit", (event) => {
|
|
18
|
+
event.preventDefault();
|
|
19
|
+
if (!remote(input.value)) {
|
|
20
|
+
problem.hidden = false;
|
|
21
|
+
input.focus();
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
shell.answer(input.value.trim());
|
|
25
|
+
});
|
|
26
|
+
document.getElementById("cancel")?.addEventListener("click", () => shell.answer(null));
|
|
27
|
+
document.addEventListener("keydown", (event) => {
|
|
28
|
+
if (event.key === "Escape") {
|
|
29
|
+
shell.answer(null);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
input.addEventListener("input", () => {
|
|
33
|
+
problem.hidden = true;
|
|
34
|
+
});
|
|
35
|
+
input.value = await shell.initial();
|
|
36
|
+
input.focus();
|
|
37
|
+
input.select();
|
|
38
|
+
//# sourceMappingURL=open-url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-url.js","sourceRoot":"","sources":["../../src/renderer/open-url.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,0EAA0E;AAC1E,OAAO,EAAE,CAAC;AAWV,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC;AAClC,MAAM,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAoB,CAAC;AAChE,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAqB,CAAC;AACjE,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAgB,CAAC;AAElE,SAAS,MAAM,CAAC,IAAY;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,CAAC;IACxF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;IACxC,KAAK,CAAC,cAAc,EAAE,CAAC;IACvB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;QACvB,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,OAAO;IACT,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AACH,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AACvF,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;IAC7C,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC3B,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;AACH,CAAC,CAAC,CAAC;AACH,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;IACnC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;AACxB,CAAC,CAAC,CAAC;AAEH,KAAK,CAAC,KAAK,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;AACpC,KAAK,CAAC,KAAK,EAAE,CAAC;AACd,KAAK,CAAC,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sockets.d.ts","sourceRoot":"","sources":["../../src/renderer/sockets.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAgB,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,UAAU,CAoCnE"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export function shellSocketHost(sockets) {
|
|
2
|
+
// Until its close, which the shell sends after an error and after a close asked for.
|
|
3
|
+
const open = new Map();
|
|
4
|
+
sockets.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);
|
|
12
|
+
break;
|
|
13
|
+
case "data":
|
|
14
|
+
events.data(event.bytes);
|
|
15
|
+
break;
|
|
16
|
+
case "error":
|
|
17
|
+
events.error(event.message);
|
|
18
|
+
break;
|
|
19
|
+
case "close":
|
|
20
|
+
open.delete(id);
|
|
21
|
+
events.close();
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
return {
|
|
26
|
+
connect(host, port, events) {
|
|
27
|
+
const id = sockets.connect(host, port);
|
|
28
|
+
open.set(id, events);
|
|
29
|
+
return {
|
|
30
|
+
send: (bytes) => sockets.send(id, bytes),
|
|
31
|
+
close: () => sockets.close(id),
|
|
32
|
+
};
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=sockets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sockets.js","sourceRoot":"","sources":["../../src/renderer/sockets.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,eAAe,CAAC,OAAuB;IACrD,qFAAqF;IACrF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC7C,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE;QAC5B,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,CAAC;gBACnB,MAAM;YACR,KAAK,MAAM;gBACT,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACzB,MAAM;YACR,KAAK,OAAO;gBACV,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC5B,MAAM;YACR,KAAK,OAAO;gBACV,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAChB,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM;QACV,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM;YACxB,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YACrB,OAAO;gBACL,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC;gBACxC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;aAC/B,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stage3d.d.ts","sourceRoot":"","sources":["../../src/renderer/stage3d.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD,eAAO,MAAM,aAAa,EAAE,qBAuB3B,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { WebGLContext3D } from "@swf2es/context3d/webgl";
|
|
2
|
+
export const createStage3D = () => {
|
|
3
|
+
const canvas = document.createElement("canvas");
|
|
4
|
+
const gl = canvas.getContext("webgl2", {
|
|
5
|
+
alpha: false,
|
|
6
|
+
antialias: false,
|
|
7
|
+
depth: false,
|
|
8
|
+
stencil: false,
|
|
9
|
+
preserveDrawingBuffer: true,
|
|
10
|
+
});
|
|
11
|
+
if (!gl) {
|
|
12
|
+
throw new Error("WebGL2 is unavailable");
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
return {
|
|
16
|
+
canvas,
|
|
17
|
+
context: new WebGLContext3D(gl),
|
|
18
|
+
destroy: () => gl.getExtension("WEBGL_lose_context")?.loseContext(),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
gl.getExtension("WEBGL_lose_context")?.loseContext();
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=stage3d.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stage3d.js","sourceRoot":"","sources":["../../src/renderer/stage3d.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAGzD,MAAM,CAAC,MAAM,aAAa,GAA0B,GAAG,EAAE;IACvD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE;QACrC,KAAK,EAAE,KAAK;QACZ,SAAS,EAAE,KAAK;QAChB,KAAK,EAAE,KAAK;QACZ,OAAO,EAAE,KAAK;QACd,qBAAqB,EAAE,IAAI;KAC5B,CAAC,CAAC;IACH,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,CAAC;QACH,OAAO;YACL,MAAM;YACN,OAAO,EAAE,IAAI,cAAc,CAAC,EAAE,CAAC;YAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,oBAAoB,CAAC,EAAE,WAAW,EAAE;SACpE,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,EAAE,CAAC,YAAY,CAAC,oBAAoB,CAAC,EAAE,WAAW,EAAE,CAAC;QACrD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/** Flash's sandboxes, as Security.sandboxType names them, and AIR's application sandbox. */
|
|
2
|
+
export type SandboxType = "localWithFile" | "localWithNetwork" | "remote" | "application";
|
|
3
|
+
/**
|
|
4
|
+
* An AIR application the shell opened by its descriptor, as adl runs one:
|
|
5
|
+
* what NativeApplication and File see of it.
|
|
6
|
+
*/
|
|
7
|
+
export interface AirLaunch {
|
|
8
|
+
/** The descriptor's XML and its id. */
|
|
9
|
+
descriptor: string;
|
|
10
|
+
id: string;
|
|
11
|
+
/** What followed `--` on the command line. */
|
|
12
|
+
arguments: string[];
|
|
13
|
+
/** Where the shell was started, a native path. */
|
|
14
|
+
currentDirectory: string;
|
|
15
|
+
/** The system's path separator. */
|
|
16
|
+
separator: string;
|
|
17
|
+
/** The directories AIR names: the application's (the descriptor's) and its storage's among them. */
|
|
18
|
+
directories: {
|
|
19
|
+
application: string;
|
|
20
|
+
applicationStorage: string;
|
|
21
|
+
user: string;
|
|
22
|
+
documents: string;
|
|
23
|
+
desktop: string;
|
|
24
|
+
cache: string;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/** What is at a path, as the player's FileStat has it. */
|
|
28
|
+
export interface AirFileStat {
|
|
29
|
+
directory: boolean;
|
|
30
|
+
size: number;
|
|
31
|
+
modified: number;
|
|
32
|
+
created: number;
|
|
33
|
+
hidden?: boolean;
|
|
34
|
+
symbolicLink?: boolean;
|
|
35
|
+
}
|
|
36
|
+
/** The window as NativeWindow reads it: bounds frame included, and the content's corner in it. */
|
|
37
|
+
export interface AirWindowState {
|
|
38
|
+
bounds: {
|
|
39
|
+
x: number;
|
|
40
|
+
y: number;
|
|
41
|
+
width: number;
|
|
42
|
+
height: number;
|
|
43
|
+
};
|
|
44
|
+
contentOffset: {
|
|
45
|
+
x: number;
|
|
46
|
+
y: number;
|
|
47
|
+
};
|
|
48
|
+
title: string;
|
|
49
|
+
displayState: string;
|
|
50
|
+
active: boolean;
|
|
51
|
+
visible: boolean;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* An AIR application's own reach, only while one the user opened plays:
|
|
55
|
+
* the file system, read and written synchronously as File does, and the
|
|
56
|
+
* window.
|
|
57
|
+
*/
|
|
58
|
+
export interface DesktopAir {
|
|
59
|
+
stat(path: string): AirFileStat | null;
|
|
60
|
+
list(path: string): string[] | null;
|
|
61
|
+
read(path: string): Promise<Uint8Array | null>;
|
|
62
|
+
/** A file's bytes at once, as FileStream's open reads them; null where none can be read. */
|
|
63
|
+
readSync(path: string): Uint8Array | null;
|
|
64
|
+
/** EncryptedLocalStore's items, at once, as the player's EncryptedStoreHost has them. */
|
|
65
|
+
getItem(name: string): Uint8Array | null;
|
|
66
|
+
setItem(name: string, bytes: Uint8Array): void;
|
|
67
|
+
removeItem(name: string): void;
|
|
68
|
+
resetItems(): void;
|
|
69
|
+
/** FileStream's writes and File's changes, at once, as FileSystemHost's; false where they fail. */
|
|
70
|
+
writeSync(path: string, bytes: Uint8Array, offset: number, length: number): boolean;
|
|
71
|
+
createDirectory(path: string): boolean;
|
|
72
|
+
remove(path: string): boolean;
|
|
73
|
+
move(from: string, to: string): boolean;
|
|
74
|
+
window(): AirWindowState;
|
|
75
|
+
setBounds(bounds: {
|
|
76
|
+
x: number;
|
|
77
|
+
y: number;
|
|
78
|
+
width: number;
|
|
79
|
+
height: number;
|
|
80
|
+
}): void;
|
|
81
|
+
setTitle(title: string): void;
|
|
82
|
+
minimize(): void;
|
|
83
|
+
maximize(): void;
|
|
84
|
+
restore(): void;
|
|
85
|
+
activate(): void;
|
|
86
|
+
setVisible(visible: boolean): void;
|
|
87
|
+
close(): void;
|
|
88
|
+
exit(code: number): void;
|
|
89
|
+
}
|
|
90
|
+
/** A SWF the shell opened, by the URL the page fetches it from. */
|
|
91
|
+
export interface OpenedMovie {
|
|
92
|
+
url: string;
|
|
93
|
+
/** Its file name, for the page to show. */
|
|
94
|
+
name: string;
|
|
95
|
+
/** The sandbox it plays in, for Security.sandboxType. */
|
|
96
|
+
sandbox: SandboxType;
|
|
97
|
+
/** For an AIR application opened by its descriptor: its launch, which plays it as AIR's. */
|
|
98
|
+
air?: AirLaunch;
|
|
99
|
+
}
|
|
100
|
+
/** The libraries' paths on disk, null for one the shell has not found. */
|
|
101
|
+
/** A playerglobal.abc the user chose in place of swf2es's own; builtin.abc ships with the player. */
|
|
102
|
+
export interface LibraryState {
|
|
103
|
+
playerglobal: string | null;
|
|
104
|
+
}
|
|
105
|
+
/** What the page starts from: the libraries, and the SWF to play, if one is open. */
|
|
106
|
+
export interface StartState {
|
|
107
|
+
/** The user's opt-in; changing it restarts the page. */
|
|
108
|
+
stage3D: boolean;
|
|
109
|
+
libraries: LibraryState;
|
|
110
|
+
movie: OpenedMovie | null;
|
|
111
|
+
/** The app's build, a short commit, for the context menu's About item; null where unknown. */
|
|
112
|
+
build: string | null;
|
|
113
|
+
}
|
|
114
|
+
export type LibraryName = keyof LibraryState;
|
|
115
|
+
/** What befalls a socket, as player's SocketEvents has it. */
|
|
116
|
+
export type SocketEvent = {
|
|
117
|
+
type: "open";
|
|
118
|
+
localAddress: string;
|
|
119
|
+
localPort: number;
|
|
120
|
+
remoteAddress: string;
|
|
121
|
+
remotePort: number;
|
|
122
|
+
} | {
|
|
123
|
+
type: "data";
|
|
124
|
+
bytes: Uint8Array;
|
|
125
|
+
} | {
|
|
126
|
+
type: "close";
|
|
127
|
+
} | {
|
|
128
|
+
type: "error";
|
|
129
|
+
message: string;
|
|
130
|
+
};
|
|
131
|
+
/** flash.net.Socket's TCP connections, opened by the shell. */
|
|
132
|
+
export interface DesktopSockets {
|
|
133
|
+
/** A connection's id; its events follow, an "error" one if the shell refuses it. */
|
|
134
|
+
connect(host: string, port: number): number;
|
|
135
|
+
send(id: number, bytes: Uint8Array): void;
|
|
136
|
+
close(id: number): void;
|
|
137
|
+
onEvent(listener: (id: number, event: SocketEvent) => void): void;
|
|
138
|
+
}
|
|
139
|
+
/** A request of a SWF's, as player's FetchRequest has it. */
|
|
140
|
+
export interface NetworkRequest {
|
|
141
|
+
url: string;
|
|
142
|
+
method: string;
|
|
143
|
+
headers: [string, string][];
|
|
144
|
+
body: Uint8Array | null;
|
|
145
|
+
/** "movie" for the SWF the page plays, else what the SWF loads it for. */
|
|
146
|
+
purpose: "movie" | "content" | "data" | "send";
|
|
147
|
+
}
|
|
148
|
+
/** Its response, as player's FetchResult has it: no bytes for a failure. */
|
|
149
|
+
export interface NetworkResponse {
|
|
150
|
+
bytes: Uint8Array | null;
|
|
151
|
+
status: number;
|
|
152
|
+
headers: [string, string][];
|
|
153
|
+
url?: string;
|
|
154
|
+
}
|
|
155
|
+
/** A SWF's http and https requests, sent and judged by the shell, as Flash's sandboxes had them. */
|
|
156
|
+
export interface DesktopNetwork {
|
|
157
|
+
/**
|
|
158
|
+
* The response, or a rejection where the shell refused the request.
|
|
159
|
+
* `cancel` is called at once with what aborts it.
|
|
160
|
+
*/
|
|
161
|
+
fetch(request: NetworkRequest, cancel: (abort: () => void) => void): Promise<NetworkResponse>;
|
|
162
|
+
/** A policy file the SWF named with Security.loadPolicyFile. */
|
|
163
|
+
loadPolicyFile(url: string): void;
|
|
164
|
+
}
|
|
165
|
+
export interface DesktopFile {
|
|
166
|
+
id: number;
|
|
167
|
+
name: string;
|
|
168
|
+
size: number;
|
|
169
|
+
modificationDate: number;
|
|
170
|
+
creationDate: number;
|
|
171
|
+
}
|
|
172
|
+
export interface DesktopFiles {
|
|
173
|
+
browse(filters: {
|
|
174
|
+
description: string;
|
|
175
|
+
extension: string;
|
|
176
|
+
}[], multiple: boolean): Promise<DesktopFile[]>;
|
|
177
|
+
save(name: string): Promise<{
|
|
178
|
+
id: number;
|
|
179
|
+
name: string;
|
|
180
|
+
} | null>;
|
|
181
|
+
read(id: number): Promise<Uint8Array>;
|
|
182
|
+
write(id: number, bytes: Uint8Array): Promise<void>;
|
|
183
|
+
release(id: number): void;
|
|
184
|
+
}
|
|
185
|
+
export interface DesktopApi {
|
|
186
|
+
files: DesktopFiles;
|
|
187
|
+
/** The page has loaded and listens: what it is to show. */
|
|
188
|
+
start(): Promise<StartState>;
|
|
189
|
+
/** The shell opened a SWF: play it in place of what plays. */
|
|
190
|
+
onOpen(listener: (movie: OpenedMovie) => void): void;
|
|
191
|
+
/** The shell closed the SWF playing. */
|
|
192
|
+
onClose(listener: () => void): void;
|
|
193
|
+
/** Ask for the open dialog. */
|
|
194
|
+
openDialog(): void;
|
|
195
|
+
/** Ask for the dialog that opens a SWF by its URL, which only the user answers. */
|
|
196
|
+
openUrlDialog(): void;
|
|
197
|
+
/** A file dropped on the page: the shell opens it if it is a SWF. */
|
|
198
|
+
openDropped(file: File): void;
|
|
199
|
+
/** Ask the user for a library; the page reloads once the shell has it. */
|
|
200
|
+
chooseLibrary(name: LibraryName): void;
|
|
201
|
+
sockets: DesktopSockets;
|
|
202
|
+
network: DesktopNetwork;
|
|
203
|
+
air: DesktopAir;
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/shared/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// What the shell gives the page, and all it gives: the preload puts it on
|
|
2
|
+
// window.swf2esDesktop. The renderer knows the shell only through it, so
|
|
3
|
+
// another shell (Tauri, later) plays the same page by giving the same API.
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/shared/api.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,yEAAyE;AACzE,2EAA2E"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,49 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@swf2es/desktop",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.15",
|
|
4
|
+
"description": "swf2es's desktop app: local and remote SWFs, and AIR applications, in an Electron window",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"swf",
|
|
7
|
+
"flash",
|
|
8
|
+
"flash-player",
|
|
9
|
+
"actionscript",
|
|
10
|
+
"air",
|
|
11
|
+
"electron",
|
|
12
|
+
"desktop"
|
|
13
|
+
],
|
|
14
|
+
"homepage": "https://swf2es.github.io/swf2es/",
|
|
15
|
+
"bugs": "https://github.com/swf2es/swf2es/issues",
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "git+https://github.com/swf2es/swf2es.git",
|
|
19
|
+
"directory": "apps/desktop"
|
|
20
|
+
},
|
|
21
|
+
"license": "Apache-2.0",
|
|
22
|
+
"type": "module",
|
|
23
|
+
"engines": {
|
|
24
|
+
"node": ">=22.18"
|
|
25
|
+
},
|
|
26
|
+
"main": "dist/main/main.js",
|
|
27
|
+
"bin": {
|
|
28
|
+
"swf2es-desktop": "./dist/launch/launch.js"
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist",
|
|
32
|
+
"!dist/**/.tsbuildinfo",
|
|
33
|
+
"static",
|
|
34
|
+
"src"
|
|
35
|
+
],
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"electron": "44.10.2",
|
|
38
|
+
"@swf2es/codegen": "0.1.15",
|
|
39
|
+
"@swf2es/format": "0.1.15",
|
|
40
|
+
"@swf2es/context3d": "0.1.15",
|
|
41
|
+
"@swf2es/player": "0.1.15",
|
|
42
|
+
"@swf2es/player-hosts": "0.1.15",
|
|
43
|
+
"@swf2es/web": "0.1.15"
|
|
44
|
+
},
|
|
45
|
+
"scripts": {
|
|
46
|
+
"fetch-electron": "node node_modules/electron/install.js",
|
|
47
|
+
"start": "node dist/launch/launch.js"
|
|
48
|
+
}
|
|
6
49
|
}
|