@swf2es/desktop 0.1.19 → 0.1.21

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.
Files changed (63) hide show
  1. package/README.md +13 -8
  2. package/dist/main/air-bridge.d.ts +7 -0
  3. package/dist/main/air-bridge.d.ts.map +1 -0
  4. package/dist/main/air-bridge.js +166 -0
  5. package/dist/main/air-bridge.js.map +1 -0
  6. package/dist/main/dialogs.d.ts +18 -0
  7. package/dist/main/dialogs.d.ts.map +1 -0
  8. package/dist/main/dialogs.js +128 -0
  9. package/dist/main/dialogs.js.map +1 -0
  10. package/dist/main/main.js +24 -789
  11. package/dist/main/main.js.map +1 -1
  12. package/dist/main/menu.d.ts +2 -0
  13. package/dist/main/menu.d.ts.map +1 -0
  14. package/dist/main/menu.js +80 -0
  15. package/dist/main/menu.js.map +1 -0
  16. package/dist/main/network-rules.d.ts +35 -0
  17. package/dist/main/network-rules.d.ts.map +1 -0
  18. package/dist/main/network-rules.js +167 -0
  19. package/dist/main/network-rules.js.map +1 -0
  20. package/dist/main/network-types.d.ts +131 -0
  21. package/dist/main/network-types.d.ts.map +1 -0
  22. package/dist/main/network-types.js +21 -0
  23. package/dist/main/network-types.js.map +1 -0
  24. package/dist/main/network.d.ts +1 -113
  25. package/dist/main/network.d.ts.map +1 -1
  26. package/dist/main/network.js +8 -181
  27. package/dist/main/network.js.map +1 -1
  28. package/dist/main/open.d.ts +55 -0
  29. package/dist/main/open.d.ts.map +1 -0
  30. package/dist/main/open.js +256 -0
  31. package/dist/main/open.js.map +1 -0
  32. package/dist/main/permissions.d.ts +17 -0
  33. package/dist/main/permissions.d.ts.map +1 -0
  34. package/dist/main/permissions.js +113 -0
  35. package/dist/main/permissions.js.map +1 -0
  36. package/dist/main/settings.d.ts +8 -1
  37. package/dist/main/settings.d.ts.map +1 -1
  38. package/dist/main/settings.js +9 -4
  39. package/dist/main/settings.js.map +1 -1
  40. package/dist/main/state.d.ts +17 -0
  41. package/dist/main/state.d.ts.map +1 -0
  42. package/dist/main/state.js +30 -0
  43. package/dist/main/state.js.map +1 -0
  44. package/dist/main/switches.d.ts +25 -0
  45. package/dist/main/switches.d.ts.map +1 -0
  46. package/dist/main/switches.js +69 -0
  47. package/dist/main/switches.js.map +1 -0
  48. package/dist/renderer/index.js +11 -8
  49. package/dist/renderer/index.js.map +1 -1
  50. package/package.json +7 -7
  51. package/src/main/air-bridge.ts +185 -0
  52. package/src/main/dialogs.ts +147 -0
  53. package/src/main/main.ts +52 -938
  54. package/src/main/menu.ts +84 -0
  55. package/src/main/network-rules.ts +199 -0
  56. package/src/main/network-types.ts +150 -0
  57. package/src/main/network.ts +30 -337
  58. package/src/main/open.ts +302 -0
  59. package/src/main/permissions.ts +135 -0
  60. package/src/main/settings.ts +16 -5
  61. package/src/main/state.ts +44 -0
  62. package/src/main/switches.ts +87 -0
  63. package/src/renderer/index.ts +18 -7
package/README.md CHANGED
@@ -43,14 +43,19 @@ fetch-electron` does so ahead, for the tests.
43
43
  set one, and ends with Esc or F11, which the SWF hears of as a
44
44
  `FullScreenEvent`. Opening another SWF destroys the
45
45
  player before the next starts.
46
- - **Stage3D.** View › Stage3D (Experimental) opts in to Context3D playback.
47
- It starts off, remembers the choice in `settings.json`, and restarts the
48
- current movie when changed. The desktop loads the optional WebGL2 backend
49
- only when enabled and uses the web element's composition, live AS3 Stage
50
- layout and context recovery. If that module cannot load, playback continues
51
- with the usual unavailable-context fallback and logs the cause. The saved
52
- choice remains enabled. Each slot owns a separate WebGL2 context;
53
- closing or reloading the movie releases its resources and browser contexts.
46
+ - **Stage3D.** SWFs get a Context3D, as in Flash and AIR on a desktop. View ›
47
+ Stage3D turns it off, after which a SWF's `requestContext3D`
48
+ gets Error #3702 "Context3D not available", and on again; the app remembers
49
+ that choice in `settings.json` (`stage3DChoice`) and restarts the current
50
+ movie when it changes. Until it is changed there it is on, also for a
51
+ `settings.json` from before Stage3D was on by default: that one saved
52
+ `"stage3D": false` whether or not it was chosen, so it is not read. The
53
+ WebGL2 backend loads when a SWF first requests a context, so a SWF that
54
+ never does starts as fast as with Stage3D off. The desktop uses the web
55
+ element's composition, live AS3 Stage layout and context recovery. If the
56
+ backend cannot load, requests get Error #3702 and the cause is logged.
57
+ Each slot owns a separate WebGL2 context; closing or reloading the movie
58
+ releases its resources and browser contexts.
54
59
  Each resource type has its own 4,096-resource count limit.
55
60
  Buffer and texture byte allowances follow the shared backend's AIR-backed
56
61
  limits, with separate host budgets for target attachments. Supported
@@ -0,0 +1,7 @@
1
+ /**
2
+ * An AIR application's reach, shared/api.ts DesktopAir: the file system
3
+ * and the window, only while one the user opened plays and only for its
4
+ * page. The file system is read synchronously where File reads it so.
5
+ */
6
+ export declare function listenForAir(): void;
7
+ //# sourceMappingURL=air-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"air-bridge.d.ts","sourceRoot":"","sources":["../../src/main/air-bridge.ts"],"names":[],"mappings":"AA2CA;;;;GAIG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAwInC"}
@@ -0,0 +1,166 @@
1
+ // An AIR application's reach through the main process (shared/api.ts
2
+ // DesktopAir): its file system, its EncryptedLocalStore, its window and
3
+ // the screens. air.ts does the work apart from Electron.
4
+ import { readFile, realpath } from "node:fs/promises";
5
+ import { app, ipcMain, screen, } from "electron";
6
+ import { createDirectoryOf, listOf, moveOf, readOf, removeOf, statOf, writeOf } from "./air.js";
7
+ import { resolveCase } from "./case-paths.js";
8
+ import { air, encryptedItems } from "./open.js";
9
+ import { sandbox, trusted, window } from "./state.js";
10
+ /** The window as an AIR application's NativeWindow reads it. */
11
+ function windowState(w) {
12
+ const bounds = w.getBounds();
13
+ const content = w.getContentBounds();
14
+ return {
15
+ bounds,
16
+ contentOffset: { x: content.x - bounds.x, y: content.y - bounds.y },
17
+ title: w.getTitle(),
18
+ displayState: w.isMinimized() ? "minimized" : w.isMaximized() ? "maximized" : "normal",
19
+ active: w.isFocused(),
20
+ visible: w.isVisible(),
21
+ };
22
+ }
23
+ /** The displays as an AIR application's Screen reads them: the work area is past the system's bars. */
24
+ function screenStates() {
25
+ const primary = screen.getPrimaryDisplay().id;
26
+ return screen.getAllDisplays().map((display) => ({
27
+ bounds: display.bounds,
28
+ visibleBounds: display.workArea,
29
+ colorDepth: display.colorDepth,
30
+ main: display.id === primary,
31
+ }));
32
+ }
33
+ /**
34
+ * An AIR application's reach, shared/api.ts DesktopAir: the file system
35
+ * and the window, only while one the user opened plays and only for its
36
+ * page. The file system is read synchronously where File reads it so.
37
+ */
38
+ export function listenForAir() {
39
+ const playing = (event) => trusted(event) && sandbox.application;
40
+ ipcMain.on("air:stat", (event, path) => {
41
+ event.returnValue = playing(event) && typeof path === "string" ? statOf(path) : null;
42
+ });
43
+ ipcMain.on("air:list", (event, path) => {
44
+ event.returnValue = playing(event) && typeof path === "string" ? listOf(path) : null;
45
+ });
46
+ // FileStream's open, which reads a file at once, as stat does: only once the application plays.
47
+ ipcMain.on("air:read-sync", (event, path) => {
48
+ event.returnValue = playing(event) && typeof path === "string" ? readOf(path) : null;
49
+ });
50
+ // EncryptedLocalStore, at once as its methods are: only the application playing's.
51
+ const items = (event) => (playing(event) ? encryptedItems : null);
52
+ ipcMain.on("air:item-get", (event, name) => {
53
+ event.returnValue = typeof name === "string" ? (items(event)?.get(name) ?? null) : null;
54
+ });
55
+ ipcMain.on("air:item-set", (event, name, bytes) => {
56
+ if (typeof name === "string" && bytes instanceof Uint8Array) {
57
+ items(event)?.set(name, bytes);
58
+ }
59
+ event.returnValue = null;
60
+ });
61
+ ipcMain.on("air:item-remove", (event, name) => {
62
+ if (typeof name === "string") {
63
+ items(event)?.remove(name);
64
+ }
65
+ event.returnValue = null;
66
+ });
67
+ ipcMain.on("air:items-reset", (event) => {
68
+ items(event)?.reset();
69
+ event.returnValue = null;
70
+ });
71
+ // FileStream's writes and File's changes, at once as adl's: only once the application plays.
72
+ ipcMain.on("air:write-sync", (event, path, bytes, offset, length) => {
73
+ event.returnValue =
74
+ playing(event) &&
75
+ typeof path === "string" &&
76
+ bytes instanceof Uint8Array &&
77
+ Number.isSafeInteger(offset) &&
78
+ Number.isSafeInteger(length) &&
79
+ offset >= 0 &&
80
+ length >= 0 &&
81
+ writeOf(path, bytes, offset, length);
82
+ });
83
+ ipcMain.on("air:create-directory", (event, path) => {
84
+ event.returnValue = playing(event) && typeof path === "string" && createDirectoryOf(path);
85
+ });
86
+ ipcMain.on("air:remove", (event, path) => {
87
+ event.returnValue = playing(event) && typeof path === "string" && removeOf(path);
88
+ });
89
+ ipcMain.on("air:move", (event, from, to) => {
90
+ event.returnValue =
91
+ playing(event) && typeof from === "string" && typeof to === "string" && moveOf(from, to);
92
+ });
93
+ // A read is what starts the application's grant: the page reads its content SWF first.
94
+ ipcMain.handle("air:read", async (event, path) => {
95
+ if (!trusted(event) || typeof path !== "string" || !air) {
96
+ return null;
97
+ }
98
+ try {
99
+ const real = await realpath(resolveCase(path));
100
+ return sandbox.startApplication(real) ? new Uint8Array(await readFile(real)) : null;
101
+ }
102
+ catch {
103
+ return null;
104
+ }
105
+ });
106
+ ipcMain.on("air:window", (event) => {
107
+ event.returnValue = playing(event) && window ? windowState(window) : null;
108
+ });
109
+ ipcMain.on("air:screens", (event) => {
110
+ event.returnValue = playing(event) ? screenStates() : [];
111
+ });
112
+ ipcMain.on("air:set-bounds", (event, bounds) => {
113
+ const b = bounds;
114
+ const n = (v) => (typeof v === "number" && Number.isFinite(v) ? Math.round(v) : null);
115
+ const [x, y, width, height] = [n(b?.x), n(b?.y), n(b?.width), n(b?.height)];
116
+ if (playing(event) &&
117
+ window &&
118
+ x !== null &&
119
+ y !== null &&
120
+ width &&
121
+ height &&
122
+ width > 0 &&
123
+ height > 0) {
124
+ window.setBounds({ x, y, width, height });
125
+ }
126
+ });
127
+ ipcMain.on("air:set-title", (event, title) => {
128
+ if (playing(event) && window && typeof title === "string") {
129
+ window.setTitle(title.slice(0, 1024));
130
+ }
131
+ });
132
+ ipcMain.on("air:window-do", (event, what) => {
133
+ if (!playing(event) || !window) {
134
+ return;
135
+ }
136
+ switch (what) {
137
+ case "minimize":
138
+ window.minimize();
139
+ break;
140
+ case "maximize":
141
+ window.maximize();
142
+ break;
143
+ case "restore":
144
+ window.restore();
145
+ break;
146
+ case "activate":
147
+ window.focus();
148
+ break;
149
+ case "show":
150
+ window.show();
151
+ break;
152
+ case "hide":
153
+ window.hide();
154
+ break;
155
+ case "close":
156
+ window.close();
157
+ break;
158
+ }
159
+ });
160
+ ipcMain.on("air:exit", (event, code) => {
161
+ if (playing(event)) {
162
+ app.exit(typeof code === "number" ? code | 0 : 0);
163
+ }
164
+ });
165
+ }
166
+ //# sourceMappingURL=air-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"air-bridge.js","sourceRoot":"","sources":["../../src/main/air-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { BrowserWindow, type IpcMainEvent, type IpcMainInvokeEvent } from "electron";
2
+ import type { LibraryName } from "../shared/api.js";
3
+ /** The dialog that asks for a URL, while it is open. */
4
+ export declare let prompt: BrowserWindow | null;
5
+ export declare function refuse(message: string, detail: string): void;
6
+ export declare function showOpenDialog(): Promise<void>;
7
+ /** Ask for a library, check that it is ABC, keep its path, and start the page again with it. */
8
+ export declare function chooseLibrary(name: LibraryName): Promise<void>;
9
+ /** Play on the library the app ships again, in place of one the user chose. */
10
+ export declare function resetLibrary(name: LibraryName): void;
11
+ /**
12
+ * The dialog that asks for a SWF's URL: a window of its own, apart from the
13
+ * page, so that only the user, and never a SWF, opens one by its URL.
14
+ */
15
+ export declare function showUrlDialog(): void;
16
+ /** Whether a message comes from the URL dialog's own page. */
17
+ export declare function fromPrompt(event: IpcMainEvent | IpcMainInvokeEvent): boolean;
18
+ //# sourceMappingURL=dialogs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialogs.d.ts","sourceRoot":"","sources":["../../src/main/dialogs.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAU,KAAK,YAAY,EAAE,KAAK,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC7F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AASpD,wDAAwD;AACxD,eAAO,IAAI,MAAM,EAAE,aAAa,GAAG,IAAW,CAAC;AAE/C,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAI5D;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAgBpD;AAED,gGAAgG;AAChG,wBAAsB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCpE;AAED,+EAA+E;AAC/E,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAOpD;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,IAAI,CA2CpC;AAED,8DAA8D;AAC9D,wBAAgB,UAAU,CAAC,KAAK,EAAE,YAAY,GAAG,kBAAkB,GAAG,OAAO,CAS5E"}
@@ -0,0 +1,128 @@
1
+ // The app's dialogs: an error, File › Open, the library chooser, and the
2
+ // URL dialog, a window of its own.
3
+ import { basename } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { BrowserWindow, dialog } from "electron";
6
+ import { buildMenu } from "./menu.js";
7
+ import { openChosen, readStart } from "./open.js";
8
+ import { APP_ORIGIN } from "./protocol.js";
9
+ import { settings, window } from "./state.js";
10
+ const promptPreload = fileURLToPath(new URL("../preload/prompt.cjs", import.meta.url));
11
+ const PROMPT_URL = `${APP_ORIGIN}/open-url.html`;
12
+ /** The dialog that asks for a URL, while it is open. */
13
+ export let prompt = null;
14
+ export function refuse(message, detail) {
15
+ if (window) {
16
+ void dialog.showMessageBox(window, { type: "error", message, detail });
17
+ }
18
+ }
19
+ export async function showOpenDialog() {
20
+ if (!window) {
21
+ return;
22
+ }
23
+ const result = await dialog.showOpenDialog(window, {
24
+ title: "Open a SWF or an AIR application",
25
+ properties: ["openFile"],
26
+ filters: [
27
+ { name: "SWF and AIR application descriptors", extensions: ["swf", "xml"] },
28
+ { name: "All files", extensions: ["*"] },
29
+ ],
30
+ });
31
+ if (!result.canceled && result.filePaths[0]) {
32
+ await openChosen(result.filePaths[0]);
33
+ }
34
+ }
35
+ /** Ask for a library, check that it is ABC, keep its path, and start the page again with it. */
36
+ export async function chooseLibrary(name) {
37
+ if (!window) {
38
+ return;
39
+ }
40
+ const result = await dialog.showOpenDialog(window, {
41
+ title: `Choose ${name}.abc`,
42
+ properties: ["openFile"],
43
+ filters: [
44
+ { name: "ActionScript bytecode", extensions: ["abc"] },
45
+ { name: "All files", extensions: ["*"] },
46
+ ],
47
+ });
48
+ const path = result.filePaths[0];
49
+ if (result.canceled || !path) {
50
+ return;
51
+ }
52
+ // An ABC starts with its minor version, then its major one, 46.
53
+ const head = await readStart(path, 4);
54
+ if (head?.[2] !== 46 || head[3] !== 0) {
55
+ refuse(`${basename(path)} is not an ABC file.`, `swf2es needs ${name}.abc itself.`);
56
+ return;
57
+ }
58
+ if (!settings.setLibrary(name, path)) {
59
+ refuse("The settings could not be saved.", `swf2es uses ${path} until it quits.`);
60
+ }
61
+ buildMenu();
62
+ // The page fetched the libraries once; a fresh page fetches the new one.
63
+ window.webContents.reload();
64
+ }
65
+ /** Play on the library the app ships again, in place of one the user chose. */
66
+ export function resetLibrary(name) {
67
+ if (!settings.clearLibrary(name)) {
68
+ refuse("The settings could not be saved.", `swf2es uses its own ${name} until it quits.`);
69
+ }
70
+ buildMenu();
71
+ window?.webContents.reload();
72
+ }
73
+ /**
74
+ * The dialog that asks for a SWF's URL: a window of its own, apart from the
75
+ * page, so that only the user, and never a SWF, opens one by its URL.
76
+ */
77
+ export function showUrlDialog() {
78
+ if (!window) {
79
+ return;
80
+ }
81
+ if (prompt) {
82
+ prompt.focus();
83
+ return;
84
+ }
85
+ const dialogWindow = new BrowserWindow({
86
+ parent: window,
87
+ modal: true,
88
+ width: 560,
89
+ height: 180,
90
+ resizable: false,
91
+ minimizable: false,
92
+ maximizable: false,
93
+ fullscreenable: false,
94
+ title: "Open URL",
95
+ show: false,
96
+ webPreferences: {
97
+ preload: promptPreload,
98
+ contextIsolation: true,
99
+ sandbox: true,
100
+ nodeIntegration: false,
101
+ webSecurity: true,
102
+ spellcheck: false,
103
+ },
104
+ });
105
+ prompt = dialogWindow;
106
+ dialogWindow.setMenu(null);
107
+ dialogWindow.on("page-title-updated", (event) => event.preventDefault());
108
+ dialogWindow.once("ready-to-show", () => dialogWindow.show());
109
+ dialogWindow.on("closed", () => {
110
+ if (prompt === dialogWindow) {
111
+ prompt = null;
112
+ }
113
+ });
114
+ const contents = dialogWindow.webContents;
115
+ contents.on("will-navigate", (event) => event.preventDefault());
116
+ contents.setWindowOpenHandler(() => ({ action: "deny" }));
117
+ void dialogWindow.loadURL(PROMPT_URL);
118
+ }
119
+ /** Whether a message comes from the URL dialog's own page. */
120
+ export function fromPrompt(event) {
121
+ const frame = event.senderFrame;
122
+ return (prompt !== null &&
123
+ event.sender === prompt.webContents &&
124
+ frame !== null &&
125
+ frame.parent === null &&
126
+ frame.url === PROMPT_URL);
127
+ }
128
+ //# sourceMappingURL=dialogs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialogs.js","sourceRoot":"","sources":["../../src/main/dialogs.ts"],"names":[],"mappings":"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"}