@swf2es/desktop 0.1.20 → 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 (54) hide show
  1. package/dist/main/air-bridge.d.ts +7 -0
  2. package/dist/main/air-bridge.d.ts.map +1 -0
  3. package/dist/main/air-bridge.js +166 -0
  4. package/dist/main/air-bridge.js.map +1 -0
  5. package/dist/main/dialogs.d.ts +18 -0
  6. package/dist/main/dialogs.d.ts.map +1 -0
  7. package/dist/main/dialogs.js +128 -0
  8. package/dist/main/dialogs.js.map +1 -0
  9. package/dist/main/main.js +23 -788
  10. package/dist/main/main.js.map +1 -1
  11. package/dist/main/menu.d.ts +2 -0
  12. package/dist/main/menu.d.ts.map +1 -0
  13. package/dist/main/menu.js +80 -0
  14. package/dist/main/menu.js.map +1 -0
  15. package/dist/main/network-rules.d.ts +35 -0
  16. package/dist/main/network-rules.d.ts.map +1 -0
  17. package/dist/main/network-rules.js +167 -0
  18. package/dist/main/network-rules.js.map +1 -0
  19. package/dist/main/network-types.d.ts +131 -0
  20. package/dist/main/network-types.d.ts.map +1 -0
  21. package/dist/main/network-types.js +21 -0
  22. package/dist/main/network-types.js.map +1 -0
  23. package/dist/main/network.d.ts +1 -113
  24. package/dist/main/network.d.ts.map +1 -1
  25. package/dist/main/network.js +8 -181
  26. package/dist/main/network.js.map +1 -1
  27. package/dist/main/open.d.ts +55 -0
  28. package/dist/main/open.d.ts.map +1 -0
  29. package/dist/main/open.js +256 -0
  30. package/dist/main/open.js.map +1 -0
  31. package/dist/main/permissions.d.ts +17 -0
  32. package/dist/main/permissions.d.ts.map +1 -0
  33. package/dist/main/permissions.js +113 -0
  34. package/dist/main/permissions.js.map +1 -0
  35. package/dist/main/state.d.ts +17 -0
  36. package/dist/main/state.d.ts.map +1 -0
  37. package/dist/main/state.js +30 -0
  38. package/dist/main/state.js.map +1 -0
  39. package/dist/main/switches.d.ts +25 -0
  40. package/dist/main/switches.d.ts.map +1 -0
  41. package/dist/main/switches.js +69 -0
  42. package/dist/main/switches.js.map +1 -0
  43. package/package.json +7 -7
  44. package/src/main/air-bridge.ts +185 -0
  45. package/src/main/dialogs.ts +147 -0
  46. package/src/main/main.ts +51 -937
  47. package/src/main/menu.ts +84 -0
  48. package/src/main/network-rules.ts +199 -0
  49. package/src/main/network-types.ts +150 -0
  50. package/src/main/network.ts +30 -337
  51. package/src/main/open.ts +302 -0
  52. package/src/main/permissions.ts +135 -0
  53. package/src/main/state.ts +44 -0
  54. package/src/main/switches.ts +87 -0
@@ -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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"}