@parlor/shell-desktop 0.1.0 → 0.3.0
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/dist/build.js.map +1 -1
- package/dist/dev.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/prerequisites.js.map +1 -1
- package/dist/project.d.ts +2 -1
- package/dist/project.d.ts.map +1 -1
- package/dist/project.js +5 -3
- package/dist/project.js.map +1 -1
- package/dist/target-triple.js.map +1 -1
- package/dist/tauri-cli.js.map +1 -1
- package/package.json +4 -4
- package/rust/Cargo.toml +11 -0
- package/rust/src/auth_browser.rs +195 -0
- package/rust/src/lib.rs +2 -0
package/dist/build.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAoB;IACrD,mBAAmB,EAAE,CAAC;IACtB,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACzE,MAAM,QAAQ,CAAC,MAAM,EAAE;QACrB,UAAU,EAAE,CAAC,eAAe,CAAC;QAC7B,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG;KACpC,CAAC,CAAC;IACH,MAAM,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AACtE,CAAC"}
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAoB;IACrD,mBAAmB,EAAE,CAAC;IACtB,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACzE,MAAM,QAAQ,CAAC,MAAM,EAAE;QACrB,UAAU,EAAE,CAAC,eAAe,CAAC;QAC7B,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG;KACpC,CAAC,CAAC;IACH,MAAM,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AACtE,CAAC","sourcesContent":["import { join } from \"node:path\";\n\nimport type { LoadedConfig } from \"@parlor/config\";\nimport { buildWeb } from \"@parlor/shell-web\";\n\nimport { TAURI_CONDITION } from \"./dev.js\";\nimport { assertRustToolchain } from \"./prerequisites.js\";\nimport { prepareTauriProject } from \"./project.js\";\nimport { hostTargetTriple } from \"./target-triple.js\";\nimport { runTauri } from \"./tauri-cli.js\";\n\nexport async function buildDesktop(loaded: LoadedConfig): Promise<string> {\n assertRustToolchain();\n const projectDir = await prepareTauriProject(loaded, hostTargetTriple());\n await buildWeb(loaded, {\n conditions: [TAURI_CONDITION],\n serverUrl: loaded.config.server.url,\n });\n await runTauri([\"build\"], { cwd: projectDir });\n return join(projectDir, \"src-tauri\", \"target\", \"release\", \"bundle\");\n}\n"]}
|
package/dist/dev.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../src/dev.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,CAAC,MAAM,eAAe,GAAG,cAAc,CAAC;AAQ9C,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAoB,EACpB,OAAO,GAAsB,EAAE;IAE/B,mBAAmB,EAAE,CAAC;IACtB,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE;QACvE,aAAa,EAAE,MAAM;KACtB,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE;QACpC,UAAU,EAAE,CAAC,eAAe,CAAC;QAC7B,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG;QACnC,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,oBAAoB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IAC5D,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE;YACzE,GAAG,EAAE,UAAU;YACf,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../src/dev.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,CAAC,MAAM,eAAe,GAAG,cAAc,CAAC;AAQ9C,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAoB,EACpB,OAAO,GAAsB,EAAE;IAE/B,mBAAmB,EAAE,CAAC;IACtB,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE;QACvE,aAAa,EAAE,MAAM;KACtB,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE;QACpC,UAAU,EAAE,CAAC,eAAe,CAAC;QAC7B,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG;QACnC,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,oBAAoB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IAC5D,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE;YACzE,GAAG,EAAE,UAAU;YACf,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;AACH,CAAC","sourcesContent":["import type { LoadedConfig } from \"@parlor/config\";\nimport { startWebDev } from \"@parlor/shell-web\";\n\nimport { assertRustToolchain } from \"./prerequisites.js\";\nimport { prepareTauriProject } from \"./project.js\";\nimport { hostTargetTriple } from \"./target-triple.js\";\nimport { runTauri } from \"./tauri-cli.js\";\n\nexport const TAURI_CONDITION = \"parlor-tauri\";\n\nexport interface DesktopDevOptions {\n readonly signal?: AbortSignal | undefined;\n /** The web target's origin when `parlor dev` runs both, so the window pairs and signs as it. */\n readonly appOrigin?: string | undefined;\n}\n\nexport async function startDesktopDev(\n loaded: LoadedConfig,\n options: DesktopDevOptions = {},\n): Promise<void> {\n assertRustToolchain();\n const projectDir = await prepareTauriProject(loaded, hostTargetTriple(), {\n onMissingHost: \"warn\",\n });\n const web = await startWebDev(loaded, {\n conditions: [TAURI_CONDITION],\n serverUrl: loaded.config.server.url,\n appOrigin: options.appOrigin,\n });\n const devUrl = `http://localhost:${loaded.config.web.port}`;\n try {\n await runTauri([\"dev\", \"--config\", JSON.stringify({ build: { devUrl } })], {\n cwd: projectDir,\n signal: options.signal,\n });\n } finally {\n await web.close();\n }\n}\n"]}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAA0B,eAAe,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AACpF,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,EAEL,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAwB,QAAQ,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAA0B,eAAe,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AACpF,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,EAEL,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAwB,QAAQ,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC","sourcesContent":["export { buildDesktop } from \"./build.js\";\nexport { type DesktopDevOptions, startDesktopDev, TAURI_CONDITION } from \"./dev.js\";\nexport {\n AGENT_HOST_SIDECAR,\n ensureTauriProject,\n libRs,\n type PrepareTauriProjectOptions,\n prepareTauriProject,\n stageAgentHost,\n stageAgentHostFrom,\n tauriConfig,\n tauriProjectDir,\n tauriProjectFiles,\n} from \"./project.js\";\nexport { assertRustToolchain, hasCargo } from \"./prerequisites.js\";\nexport { type RunTauriOptions, runTauri, TauriCliError } from \"./tauri-cli.js\";\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prerequisites.js","sourceRoot":"","sources":["../src/prerequisites.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,UAAU,QAAQ,CAAC,GAAG,GAAqB,SAAS;IACxD,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChE,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAK,GAAkB,QAAQ;IACjE,IAAI,KAAK,EAAE;QAAE,OAAO;IACpB,MAAM,IAAI,aAAa,CACrB,iIAAiI,CAClI,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"prerequisites.js","sourceRoot":"","sources":["../src/prerequisites.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,UAAU,QAAQ,CAAC,GAAG,GAAqB,SAAS;IACxD,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChE,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAK,GAAkB,QAAQ;IACjE,IAAI,KAAK,EAAE;QAAE,OAAO;IACpB,MAAM,IAAI,aAAa,CACrB,iIAAiI,CAClI,CAAC;AACJ,CAAC","sourcesContent":["import { spawnSync } from \"node:child_process\";\n\nimport { TauriCliError } from \"./tauri-cli.js\";\n\nexport function hasCargo(run: typeof spawnSync = spawnSync): boolean {\n const result = run(\"cargo\", [\"--version\"], { stdio: \"ignore\" });\n return result.status === 0;\n}\n\nexport function assertRustToolchain(check: () => boolean = hasCargo): void {\n if (check()) return;\n throw new TauriCliError(\n \"Rust toolchain not found. Desktop builds need cargo on PATH: install it from https://rustup.rs and run `rustup default stable`.\",\n );\n}\n"]}
|
package/dist/project.d.ts
CHANGED
|
@@ -5,7 +5,8 @@ export declare function tauriConfig(config: ParlorConfig): Record<string, unknow
|
|
|
5
5
|
export declare function cargoToml(config: ParlorConfig): string;
|
|
6
6
|
export declare const AGENT_HOST_SIDECAR = "binaries/parlor-host";
|
|
7
7
|
/**
|
|
8
|
-
* Every app registers the Keychain `parlor_session_*` and `parlor_device_key_*` commands
|
|
8
|
+
* Every app registers the Keychain `parlor_session_*` and `parlor_device_key_*` commands,
|
|
9
|
+
* and `parlor_auth_browser_open` for social sign-in.
|
|
9
10
|
* With `desktop.agentHost`, `setup()` also runs the bundled `parlor-host daemon --ensure`
|
|
10
11
|
* (adopt, install or upgrade the per-user service) and the `parlor_host_*` commands
|
|
11
12
|
* join them. The dialog and fs plugins back the `files` capability.
|
package/dist/project.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAKA,OAAO,
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAKA,OAAO,EAAgB,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAWpF,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAIhD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvD;AASD,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA8BzE;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAwBtD;AAED,eAAO,MAAM,kBAAkB,yBAAyB,CAAC;AAiBzD;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAiBlD;AAMD,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,SAAkB,IAAI,yBAAyB;CAChD;AAgBD,6GAA6G;AAC7G,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CAmBjB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED,eAAO,MAAM,OAAO,wHAKnB,CAAC;AAEF,eAAO,MAAM,QAAQ,+CAGpB,CAAC;AAEF,eAAO,MAAM,YAAY;IACvB,OAAO;IACP,UAAU;IACV,WAAW;IACX,OAAO;IACP,WAAW;CASZ,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAW9E;AAaD,wBAAsB,kBAAkB,CACtC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,YAAY,EACjC,KAAK,GAAE,MAAyB,GAC/B,OAAO,CAAC,MAAM,CAAC,CAYjB;AAED,MAAM,WAAW,0BAA0B;IACzC,oGAAoG;IACpG,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,cAAc,CAAC;IACvC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,MAAM,EACpB,EACE,aAAsB,EACtB,KAAsB,EACtB,IAAmB,GACpB,GAAE,0BAA+B,GACjC,OAAO,CAAC,MAAM,CAAC,CAgBjB"}
|
package/dist/project.js
CHANGED
|
@@ -2,7 +2,7 @@ import { chmod, copyFile, mkdir, readFile, stat, writeFile } from "node:fs/promi
|
|
|
2
2
|
import { createRequire } from "node:module";
|
|
3
3
|
import { dirname, join } from "node:path";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
|
-
import {
|
|
5
|
+
import { generatedDir } from "@parlor/config";
|
|
6
6
|
import { appCsp, extendCsp, serializeCsp } from "@parlor/shell-web";
|
|
7
7
|
const ICONS = [
|
|
8
8
|
"32x32.png",
|
|
@@ -15,7 +15,7 @@ export const TAURI_CARGO_PACKAGE = "parlor_app";
|
|
|
15
15
|
const AGENT_HOST_SIGNATURE = "parlor-host.sig";
|
|
16
16
|
const SHELL_CRATE_DIR = fileURLToPath(new URL("../rust", import.meta.url));
|
|
17
17
|
export function tauriProjectDir(rootDir) {
|
|
18
|
-
return join(rootDir,
|
|
18
|
+
return join(generatedDir(rootDir), "tauri");
|
|
19
19
|
}
|
|
20
20
|
const TAURI_IPC_SOURCES = ["ipc:", "http://ipc.localhost"];
|
|
21
21
|
function tauriCsp(config, dev) {
|
|
@@ -80,6 +80,7 @@ serde_json = "1"
|
|
|
80
80
|
}
|
|
81
81
|
export const AGENT_HOST_SIDECAR = "binaries/parlor-host";
|
|
82
82
|
const SHELL_COMMANDS = [
|
|
83
|
+
"parlor_auth_browser_open",
|
|
83
84
|
"parlor_device_key_public",
|
|
84
85
|
"parlor_device_key_sign",
|
|
85
86
|
"parlor_session_get",
|
|
@@ -92,7 +93,8 @@ const AGENT_HOST_COMMANDS = [
|
|
|
92
93
|
"parlor_host_finish",
|
|
93
94
|
];
|
|
94
95
|
/**
|
|
95
|
-
* Every app registers the Keychain `parlor_session_*` and `parlor_device_key_*` commands
|
|
96
|
+
* Every app registers the Keychain `parlor_session_*` and `parlor_device_key_*` commands,
|
|
97
|
+
* and `parlor_auth_browser_open` for social sign-in.
|
|
96
98
|
* With `desktop.agentHost`, `setup()` also runs the bundled `parlor-host daemon --ensure`
|
|
97
99
|
* (adopt, install or upgrade the per-user service) and the `parlor_host_*` commands
|
|
98
100
|
* join them. The dialog and fs plugins back the `files` capability.
|
package/dist/project.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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","sourcesContent":["import { chmod, copyFile, mkdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { generatedDir, type LoadedConfig, type ParlorConfig } from \"@parlor/config\";\nimport { appCsp, extendCsp, serializeCsp } from \"@parlor/shell-web\";\n\nconst ICONS = [\n \"32x32.png\",\n \"128x128.png\",\n \"128x128@2x.png\",\n \"icon.icns\",\n \"icon.ico\",\n] as const;\n\nexport const TAURI_CARGO_PACKAGE = \"parlor_app\";\nconst AGENT_HOST_SIGNATURE = \"parlor-host.sig\";\nconst SHELL_CRATE_DIR = fileURLToPath(new URL(\"../rust\", import.meta.url));\n\nexport function tauriProjectDir(rootDir: string): string {\n return join(generatedDir(rootDir), \"tauri\");\n}\n\nconst TAURI_IPC_SOURCES = [\"ipc:\", \"http://ipc.localhost\"];\n\nfunction tauriCsp(config: ParlorConfig, dev: boolean): string {\n const policy = appCsp(config, { serverOrigin: config.server.url, dev });\n return serializeCsp(extendCsp(policy, { \"connect-src\": TAURI_IPC_SOURCES }));\n}\n\nexport function tauriConfig(config: ParlorConfig): Record<string, unknown> {\n return {\n $schema: \"https://schema.tauri.app/config/2\",\n productName: config.app.name,\n version: config.app.version,\n identifier: config.app.id,\n build: { frontendDist: \"../../web\" },\n app: {\n windows: [\n {\n title: config.app.name,\n width: config.desktop.width,\n height: config.desktop.height,\n resizable: true,\n },\n ],\n security: { csp: tauriCsp(config, false), devCsp: tauriCsp(config, true) },\n },\n bundle: {\n active: true,\n targets: \"all\",\n icon: ICONS.map((icon) => `icons/${icon}`),\n ...(config.desktop.agentHost\n ? { externalBin: [AGENT_HOST_SIDECAR], resources: [AGENT_HOST_SIGNATURE] }\n : {}),\n },\n plugins: {\n \"deep-link\": { desktop: { schemes: config.app.scheme ? [config.app.scheme] : [] } },\n },\n };\n}\n\nexport function cargoToml(config: ParlorConfig): string {\n return `[package]\nname = \"${TAURI_CARGO_PACKAGE}\"\nversion = \"${config.app.version}\"\ndescription = \"${config.app.description ?? config.app.name}\"\nedition = \"2024\"\n\n[lib]\nname = \"${TAURI_CARGO_PACKAGE}_lib\"\ncrate-type = [\"staticlib\", \"cdylib\", \"rlib\"]\n\n[build-dependencies]\ntauri-build = { version = \"2\", features = [] }\n\n[dependencies]\ntauri = { version = \"2\", features = [] }\ntauri-plugin-deep-link = \"2\"\ntauri-plugin-dialog = \"2\"\ntauri-plugin-fs = \"2\"\ntauri-plugin-notification = \"2\"\nparlor-shell = { path = ${JSON.stringify(SHELL_CRATE_DIR)} }\nserde = { version = \"1\", features = [\"derive\"] }\nserde_json = \"1\"\n`;\n}\n\nexport const AGENT_HOST_SIDECAR = \"binaries/parlor-host\";\n\nconst SHELL_COMMANDS = [\n \"parlor_auth_browser_open\",\n \"parlor_device_key_public\",\n \"parlor_device_key_sign\",\n \"parlor_session_get\",\n \"parlor_session_set\",\n];\n\nconst AGENT_HOST_COMMANDS = [\n \"parlor_host_bundled\",\n \"parlor_host_status\",\n \"parlor_host_begin\",\n \"parlor_host_finish\",\n];\n\n/**\n * Every app registers the Keychain `parlor_session_*` and `parlor_device_key_*` commands,\n * and `parlor_auth_browser_open` for social sign-in.\n * With `desktop.agentHost`, `setup()` also runs the bundled `parlor-host daemon --ensure`\n * (adopt, install or upgrade the per-user service) and the `parlor_host_*` commands\n * join them. The dialog and fs plugins back the `files` capability.\n */\nexport function libRs(config: ParlorConfig): string {\n const agentHost = Boolean(config.desktop.agentHost);\n const commands = [...(agentHost ? AGENT_HOST_COMMANDS : []), ...SHELL_COMMANDS];\n return `#[cfg_attr(mobile, tauri::mobile_entry_point)]\npub fn run() {\n tauri::Builder::default()\n .plugin(tauri_plugin_deep_link::init())\n .plugin(tauri_plugin_notification::init())\n .plugin(tauri_plugin_dialog::init())\n .plugin(tauri_plugin_fs::init())\n${agentHost ? \" .setup(|app| parlor_shell::setup(app))\\n\" : \"\"} .invoke_handler(tauri::generate_handler![\n${commands.map((command) => ` parlor_shell::${command},`).join(\"\\n\")}\n ])\n .run(tauri::generate_context!())\n .expect(\"error while running tauri application\");\n}\n`;\n}\n\nconst PREBUILT_HOST_PACKAGES: Readonly<Record<string, string>> = {\n \"aarch64-apple-darwin\": \"@parlor/agent-host-darwin-arm64\",\n};\n\nexport class AgentHostStageError extends Error {\n override readonly name = \"AgentHostStageError\";\n}\n\nfunction prebuiltHostDir(targetTriple: string): string {\n const name = PREBUILT_HOST_PACKAGES[targetTriple];\n if (!name) {\n throw new AgentHostStageError(\n `There is no prebuilt Parlor Host for ${targetTriple}; desktop.agentHost supports ${Object.keys(PREBUILT_HOST_PACKAGES).join(\", \")}.`,\n );\n }\n try {\n return dirname(createRequire(import.meta.url).resolve(`${name}/package.json`));\n } catch (error) {\n throw new AgentHostStageError(`${name} is not installed.`, { cause: error });\n }\n}\n\n/** Copies a prebuilt host's `bin/` into the Tauri project, where `externalBin` and `resources` expect it. */\nexport async function stageAgentHostFrom(\n packageDir: string,\n projectDir: string,\n targetTriple: string,\n): Promise<string> {\n const bin = join(packageDir, \"bin\");\n const source = {\n binary: join(bin, \"parlor-host\"),\n signature: join(bin, AGENT_HOST_SIGNATURE),\n };\n for (const file of Object.values(source)) {\n if (!(await stat(file).catch(() => undefined))) {\n throw new AgentHostStageError(\n `${file} is missing: build it with pnpm --filter @parlor/agent-host-darwin-arm64 build (needs PARLOR_HOST_SIGNING_KEY and PARLOR_HOST_RELEASE_KEY_FILE).`,\n );\n }\n }\n const sidecar = join(projectDir, \"src-tauri\", `${AGENT_HOST_SIDECAR}-${targetTriple}`);\n await mkdir(dirname(sidecar), { recursive: true });\n await copyFile(source.binary, sidecar);\n await chmod(sidecar, 0o755);\n await copyFile(source.signature, join(projectDir, \"src-tauri\", AGENT_HOST_SIGNATURE));\n return sidecar;\n}\n\n/**\n * Copies the prebuilt host for `targetTriple` from its `@parlor/agent-host-<platform>`\n * package to `binaries/parlor-host-<triple>`; copies only, compiles nothing.\n */\nexport async function stageAgentHost(\n projectDir: string,\n targetTriple: string,\n): Promise<string> {\n return stageAgentHostFrom(prebuiltHostDir(targetTriple), projectDir, targetTriple);\n}\n\nexport const MAIN_RS = `#![cfg_attr(not(debug_assertions), windows_subsystem = \"windows\")]\n\nfn main() {\n ${TAURI_CARGO_PACKAGE}_lib::run()\n}\n`;\n\nexport const BUILD_RS = `fn main() {\n tauri_build::build()\n}\n`;\n\nexport const CAPABILITIES = {\n $schema: \"../gen/schemas/desktop-schema.json\",\n identifier: \"default\",\n description: \"Permissions Parlor needs on desktop\",\n windows: [\"main\"],\n permissions: [\n \"core:default\",\n \"notification:default\",\n \"deep-link:default\",\n \"dialog:default\",\n \"fs:allow-read-file\",\n \"fs:allow-write-file\",\n \"fs:allow-stat\",\n ],\n};\n\nexport function tauriProjectFiles(config: ParlorConfig): Record<string, string> {\n return {\n \"src-tauri/tauri.conf.json\": `${JSON.stringify(tauriConfig(config), null, 2)}\\n`,\n \"src-tauri/Cargo.toml\": cargoToml(config),\n \"src-tauri/build.rs\": BUILD_RS,\n \"src-tauri/src/main.rs\": MAIN_RS,\n \"src-tauri/src/lib.rs\": libRs(config),\n \"src-tauri/capabilities/default.json\": `${JSON.stringify(CAPABILITIES, null, 2)}\\n`,\n \"src-tauri/.gitignore\": \"target/\\ngen/schemas/\\n\",\n \".gitignore\": \"*\\n\",\n };\n}\n\nfunction iconsSourceDir(): string {\n return fileURLToPath(new URL(\"../assets/icons/\", import.meta.url));\n}\n\nasync function writeIfChanged(path: string, content: string | Uint8Array): Promise<void> {\n const current = await readFile(path).catch(() => undefined);\n if (current && Buffer.compare(current, Buffer.from(content)) === 0) return;\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, content);\n}\n\nexport async function ensureTauriProject(\n { config, rootDir }: LoadedConfig,\n icons: string = iconsSourceDir(),\n): Promise<string> {\n const projectDir = tauriProjectDir(rootDir);\n for (const [relative, content] of Object.entries(tauriProjectFiles(config))) {\n await writeIfChanged(join(projectDir, relative), content);\n }\n for (const icon of ICONS) {\n await writeIfChanged(\n join(projectDir, \"src-tauri\", \"icons\", icon),\n await readFile(join(icons, icon)),\n );\n }\n return projectDir;\n}\n\nexport interface PrepareTauriProjectOptions {\n /** What a missing prebuilt host does: `fail` the build, or `warn` and go on without the sidecar. */\n readonly onMissingHost?: \"fail\" | \"warn\";\n readonly stage?: typeof stageAgentHost;\n readonly warn?: (message: string) => void;\n}\n\n/**\n * Generates the Tauri project, bundling the Parlor Host sidecar when `desktop.agentHost` is\n * set. With no prebuilt host for the target it throws the staging error, or with\n * `onMissingHost: \"warn\"` warns once and generates the project as if `agentHost` were off,\n * so the app runs and the sidebar offers the install command.\n */\nexport async function prepareTauriProject(\n loaded: LoadedConfig,\n targetTriple: string,\n {\n onMissingHost = \"fail\",\n stage = stageAgentHost,\n warn = console.warn,\n }: PrepareTauriProjectOptions = {},\n): Promise<string> {\n if (!loaded.config.desktop.agentHost) return ensureTauriProject(loaded);\n try {\n await stage(tauriProjectDir(loaded.rootDir), targetTriple);\n } catch (error) {\n if (!(error instanceof AgentHostStageError) || onMissingHost === \"fail\") throw error;\n warn(\n `Building without the bundled Parlor Host, so the sidebar will show the install command: ${error.message}`,\n );\n const { desktop } = loaded.config;\n return ensureTauriProject({\n ...loaded,\n config: { ...loaded.config, desktop: { ...desktop, agentHost: false } },\n });\n }\n return ensureTauriProject(loaded);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"target-triple.js","sourceRoot":"","sources":["../src/target-triple.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,MAAM,UAAU,gBAAgB,CAAC,GAAG,GAAqB,SAAS;IAChE,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
1
|
+
{"version":3,"file":"target-triple.js","sourceRoot":"","sources":["../src/target-triple.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,MAAM,UAAU,gBAAgB,CAAC,GAAG,GAAqB,SAAS;IAChE,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { spawnSync } from \"node:child_process\";\n\nexport function hostTargetTriple(run: typeof spawnSync = spawnSync): string {\n const result = run(\"rustc\", [\"-vV\"], { encoding: \"utf8\" });\n const triple = /^host: (\\S+)$/m.exec(String(result.stdout))?.[1];\n if (result.status !== 0 || !triple) {\n throw new Error(\"Could not read the host target triple from `rustc -vV`.\");\n }\n return triple;\n}\n"]}
|
package/dist/tauri-cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tauri-cli.js","sourceRoot":"","sources":["../src/tauri-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAEjC,MAAM,OAAO,aAAc,SAAQ,KAAK;IACpB,IAAI,GAAG,eAAe,CAAC;CAC1C;AAOD,SAAS,SAAS,CAAC,GAAW,EAAE,MAAsB;IACpD,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,4BAA4B;IAC9B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CACtB,IAAuB,EACvB,OAAwB;IAExB,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;IACxD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE;YACpD,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,SAAS;YAChB,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;QACtB,MAAM,KAAK,GAAG,GAAG,EAAE;YACjB,IAAI,GAAG,KAAK,SAAS;gBAAE,OAAO;YAC9B,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YACzB,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,mBAAmB,CAAC,CAAC,KAAK,EAAE,CAAC;QAC3E,CAAC,CAAC;QACF,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAEjE,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YAClC,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACpD,IAAI,IAAI,KAAK,CAAC,IAAI,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;gBAAE,OAAO,EAAE,CAAC;;gBAC1D,MAAM,CAAC,IAAI,aAAa,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"tauri-cli.js","sourceRoot":"","sources":["../src/tauri-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAEjC,MAAM,OAAO,aAAc,SAAQ,KAAK;IACpB,IAAI,GAAG,eAAe,CAAC;CAC1C;AAOD,SAAS,SAAS,CAAC,GAAW,EAAE,MAAsB;IACpD,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,4BAA4B;IAC9B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CACtB,IAAuB,EACvB,OAAwB;IAExB,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;IACxD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE;YACpD,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,SAAS;YAChB,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;QACtB,MAAM,KAAK,GAAG,GAAG,EAAE;YACjB,IAAI,GAAG,KAAK,SAAS;gBAAE,OAAO;YAC9B,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YACzB,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,mBAAmB,CAAC,CAAC,KAAK,EAAE,CAAC;QAC3E,CAAC,CAAC;QACF,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAEjE,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YAClC,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACpD,IAAI,IAAI,KAAK,CAAC,IAAI,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;gBAAE,OAAO,EAAE,CAAC;;gBAC1D,MAAM,CAAC,IAAI,aAAa,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { createRequire } from \"node:module\";\n\nconst require = createRequire(import.meta.url);\nconst FORCE_KILL_AFTER_MS = 5000;\n\nexport class TauriCliError extends Error {\n override readonly name = \"TauriCliError\";\n}\n\nexport interface RunTauriOptions {\n readonly cwd: string;\n readonly signal?: AbortSignal | undefined;\n}\n\nfunction killGroup(pid: number, signal: NodeJS.Signals): void {\n try {\n process.kill(-pid, signal);\n } catch {\n // the group is already gone\n }\n}\n\nexport function runTauri(\n args: readonly string[],\n options: RunTauriOptions,\n): Promise<void> {\n const bin = require.resolve(\"@tauri-apps/cli/tauri.js\");\n return new Promise((resolve, reject) => {\n const child = spawn(process.execPath, [bin, ...args], {\n cwd: options.cwd,\n stdio: \"inherit\",\n detached: true,\n });\n const pid = child.pid;\n const abort = () => {\n if (pid === undefined) return;\n killGroup(pid, \"SIGINT\");\n setTimeout(() => killGroup(pid, \"SIGKILL\"), FORCE_KILL_AFTER_MS).unref();\n };\n options.signal?.addEventListener(\"abort\", abort, { once: true });\n\n child.once(\"error\", reject);\n child.once(\"exit\", (code, signal) => {\n options.signal?.removeEventListener(\"abort\", abort);\n if (code === 0 || signal || options.signal?.aborted) resolve();\n else reject(new TauriCliError(`tauri ${args[0]} exited with code ${code}`));\n });\n });\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@parlor/shell-desktop",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"homepage": "https://cychien.github.io/parlor",
|
|
5
5
|
"bugs": "https://github.com/cychien/parlor/issues",
|
|
6
6
|
"license": "MIT",
|
|
@@ -29,8 +29,8 @@
|
|
|
29
29
|
"@tauri-apps/plugin-dialog": "^2.8.3",
|
|
30
30
|
"@tauri-apps/plugin-fs": "^2.7.1",
|
|
31
31
|
"@tauri-apps/plugin-notification": "^2.5.1",
|
|
32
|
-
"@parlor/
|
|
33
|
-
"@parlor/
|
|
32
|
+
"@parlor/config": "0.3.0",
|
|
33
|
+
"@parlor/shell-web": "0.3.0"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"@types/node": "^24.14.0",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"vitest": "^5.0.3"
|
|
39
39
|
},
|
|
40
40
|
"optionalDependencies": {
|
|
41
|
-
"@parlor/agent-host-darwin-arm64": "0.
|
|
41
|
+
"@parlor/agent-host-darwin-arm64": "0.3.0"
|
|
42
42
|
},
|
|
43
43
|
"scripts": {
|
|
44
44
|
"build": "tsc -p tsconfig.json",
|
package/rust/Cargo.toml
CHANGED
|
@@ -23,4 +23,15 @@ core-foundation-sys = "0.8"
|
|
|
23
23
|
objc2 = "0.6"
|
|
24
24
|
objc2-foundation = "0.3"
|
|
25
25
|
objc2-local-authentication = "0.3"
|
|
26
|
+
objc2-app-kit = { version = "0.3", default-features = false, features = [
|
|
27
|
+
"std",
|
|
28
|
+
"NSResponder",
|
|
29
|
+
"NSWindow",
|
|
30
|
+
] }
|
|
31
|
+
objc2-authentication-services = { version = "0.3", default-features = false, features = [
|
|
32
|
+
"std",
|
|
33
|
+
"block2",
|
|
34
|
+
"ASFoundation",
|
|
35
|
+
"ASWebAuthenticationSession",
|
|
36
|
+
] }
|
|
26
37
|
block2 = "0.6"
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
use tauri::{Url, WebviewWindow};
|
|
2
|
+
|
|
3
|
+
fn sign_in_page(url: &str) -> Result<Url, String> {
|
|
4
|
+
match Url::parse(url) {
|
|
5
|
+
Ok(page) if matches!(page.scheme(), "https" | "http") => Ok(page),
|
|
6
|
+
_ => Err(format!("The sign-in page must be an http(s) URL: {url:?}")),
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
fn url_scheme(scheme: &str) -> Result<&str, String> {
|
|
11
|
+
let mut chars = scheme.chars();
|
|
12
|
+
let valid = chars.next().is_some_and(|first| first.is_ascii_lowercase())
|
|
13
|
+
&& chars.all(|c| c.is_ascii_lowercase() || c.is_ascii_digit() || "+.-".contains(c));
|
|
14
|
+
if valid {
|
|
15
|
+
Ok(scheme)
|
|
16
|
+
} else {
|
|
17
|
+
Err(format!("The callback must be the app's URL scheme: {scheme:?}"))
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
#[cfg(target_os = "macos")]
|
|
22
|
+
mod apple {
|
|
23
|
+
use std::cell::RefCell;
|
|
24
|
+
use std::rc::Rc;
|
|
25
|
+
use std::sync::mpsc;
|
|
26
|
+
|
|
27
|
+
use block2::RcBlock;
|
|
28
|
+
use objc2::rc::Retained;
|
|
29
|
+
use objc2::runtime::ProtocolObject;
|
|
30
|
+
use objc2::{AnyThread, DefinedClass, MainThreadMarker, MainThreadOnly, define_class, msg_send};
|
|
31
|
+
use objc2_app_kit::NSWindow;
|
|
32
|
+
use objc2_authentication_services::{
|
|
33
|
+
ASWebAuthenticationPresentationContextProviding, ASWebAuthenticationSession,
|
|
34
|
+
ASWebAuthenticationSessionErrorCode, ASWebAuthenticationSessionErrorDomain,
|
|
35
|
+
};
|
|
36
|
+
use objc2_foundation::{NSError, NSObject, NSObjectProtocol, NSString, NSURL};
|
|
37
|
+
use tauri::{Url, WebviewWindow};
|
|
38
|
+
|
|
39
|
+
type Outcome = Result<Option<String>, String>;
|
|
40
|
+
/// The session presents over its anchor, which it holds weakly.
|
|
41
|
+
type Running = (Retained<ASWebAuthenticationSession>, Retained<Anchor>);
|
|
42
|
+
|
|
43
|
+
define_class!(
|
|
44
|
+
#[unsafe(super(NSObject))]
|
|
45
|
+
#[thread_kind = MainThreadOnly]
|
|
46
|
+
#[ivars = Retained<NSWindow>]
|
|
47
|
+
struct Anchor;
|
|
48
|
+
|
|
49
|
+
unsafe impl NSObjectProtocol for Anchor {}
|
|
50
|
+
|
|
51
|
+
unsafe impl ASWebAuthenticationPresentationContextProviding for Anchor {
|
|
52
|
+
#[unsafe(method_id(presentationAnchorForWebAuthenticationSession:))]
|
|
53
|
+
fn anchor(&self, _session: &ASWebAuthenticationSession) -> Retained<NSWindow> {
|
|
54
|
+
self.ivars().clone()
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
impl Anchor {
|
|
60
|
+
fn new(mtm: MainThreadMarker, window: Retained<NSWindow>) -> Retained<Self> {
|
|
61
|
+
let this = Self::alloc(mtm).set_ivars(window);
|
|
62
|
+
unsafe { msg_send![super(this), init] }
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
fn outcome(url: *mut NSURL, error: *mut NSError) -> Outcome {
|
|
67
|
+
if let Some(url) = unsafe { url.as_ref() } {
|
|
68
|
+
return Ok(url.absoluteString().map(|text| text.to_string()));
|
|
69
|
+
}
|
|
70
|
+
let Some(error) = (unsafe { error.as_ref() }) else {
|
|
71
|
+
return Err("Sign-in did not finish.".to_string());
|
|
72
|
+
};
|
|
73
|
+
let cancelled = error.domain().to_string()
|
|
74
|
+
== unsafe { ASWebAuthenticationSessionErrorDomain }.to_string()
|
|
75
|
+
&& error.code() == ASWebAuthenticationSessionErrorCode::CanceledLogin.0;
|
|
76
|
+
if cancelled {
|
|
77
|
+
Ok(None)
|
|
78
|
+
} else {
|
|
79
|
+
Err(error.localizedDescription().to_string())
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/// Runs on the main thread; the session and its anchor stay alive until it completes.
|
|
84
|
+
fn start(window: &WebviewWindow, page: &Url, scheme: &str, done: mpsc::Sender<Outcome>) {
|
|
85
|
+
let fail = |done: &mpsc::Sender<Outcome>, message: &str| {
|
|
86
|
+
let _ = done.send(Err(message.to_string()));
|
|
87
|
+
};
|
|
88
|
+
let Some(mtm) = MainThreadMarker::new() else {
|
|
89
|
+
return fail(&done, "The sign-in browser must open on the main thread.");
|
|
90
|
+
};
|
|
91
|
+
let Some(ns_window) = window
|
|
92
|
+
.ns_window()
|
|
93
|
+
.ok()
|
|
94
|
+
.and_then(|pointer| unsafe { Retained::retain(pointer.cast::<NSWindow>()) })
|
|
95
|
+
else {
|
|
96
|
+
return fail(&done, "The app has no window to show the sign-in browser over.");
|
|
97
|
+
};
|
|
98
|
+
let Some(url) = NSURL::URLWithString(&NSString::from_str(page.as_str())) else {
|
|
99
|
+
return fail(&done, "The sign-in page URL is not valid.");
|
|
100
|
+
};
|
|
101
|
+
let anchor = Anchor::new(mtm, ns_window);
|
|
102
|
+
let running: Rc<RefCell<Option<Running>>> = Rc::new(RefCell::new(None));
|
|
103
|
+
let keep = running.clone();
|
|
104
|
+
let reply = RefCell::new(Some(done.clone()));
|
|
105
|
+
let completion = RcBlock::new(move |url: *mut NSURL, error: *mut NSError| {
|
|
106
|
+
keep.borrow_mut().take();
|
|
107
|
+
if let Some(done) = reply.borrow_mut().take() {
|
|
108
|
+
let _ = done.send(outcome(url, error));
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
#[allow(deprecated)]
|
|
112
|
+
let session = unsafe {
|
|
113
|
+
ASWebAuthenticationSession::initWithURL_callbackURLScheme_completionHandler(
|
|
114
|
+
ASWebAuthenticationSession::alloc(),
|
|
115
|
+
&url,
|
|
116
|
+
Some(&NSString::from_str(scheme)),
|
|
117
|
+
RcBlock::as_ptr(&completion),
|
|
118
|
+
)
|
|
119
|
+
};
|
|
120
|
+
unsafe {
|
|
121
|
+
session.setPresentationContextProvider(Some(ProtocolObject::from_ref(&*anchor)));
|
|
122
|
+
session.setPrefersEphemeralWebBrowserSession(false);
|
|
123
|
+
}
|
|
124
|
+
*running.borrow_mut() = Some((session.clone(), anchor));
|
|
125
|
+
if !unsafe { session.start() } {
|
|
126
|
+
running.borrow_mut().take();
|
|
127
|
+
fail(&done, "The sign-in browser could not open.");
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
pub async fn open(window: WebviewWindow, page: Url, scheme: String) -> Outcome {
|
|
132
|
+
let (done, outcome) = mpsc::channel();
|
|
133
|
+
let target = window.clone();
|
|
134
|
+
window
|
|
135
|
+
.run_on_main_thread(move || start(&target, &page, &scheme, done))
|
|
136
|
+
.map_err(|e| e.to_string())?;
|
|
137
|
+
tauri::async_runtime::spawn_blocking(move || outcome.recv())
|
|
138
|
+
.await
|
|
139
|
+
.map_err(|e| e.to_string())?
|
|
140
|
+
.map_err(|_| "The sign-in browser closed without an answer.".to_string())?
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
#[cfg(not(target_os = "macos"))]
|
|
145
|
+
mod apple {
|
|
146
|
+
use tauri::{Url, WebviewWindow};
|
|
147
|
+
|
|
148
|
+
pub async fn open(
|
|
149
|
+
_window: WebviewWindow,
|
|
150
|
+
_page: Url,
|
|
151
|
+
_scheme: String,
|
|
152
|
+
) -> Result<Option<String>, String> {
|
|
153
|
+
Err("unsupported".to_string())
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/// Opens `url` in ASWebAuthenticationSession and resolves with the URL it returned to under
|
|
158
|
+
/// `callback_scheme`, or `None` when the user closed it.
|
|
159
|
+
#[tauri::command]
|
|
160
|
+
pub async fn parlor_auth_browser_open(
|
|
161
|
+
window: WebviewWindow,
|
|
162
|
+
url: String,
|
|
163
|
+
callback_scheme: String,
|
|
164
|
+
) -> Result<Option<String>, String> {
|
|
165
|
+
let page = sign_in_page(&url)?;
|
|
166
|
+
let scheme = url_scheme(&callback_scheme)?.to_string();
|
|
167
|
+
apple::open(window, page, scheme).await
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
#[cfg(test)]
|
|
171
|
+
mod tests {
|
|
172
|
+
use super::*;
|
|
173
|
+
|
|
174
|
+
#[test]
|
|
175
|
+
fn only_an_http_page_and_a_url_scheme_are_accepted() {
|
|
176
|
+
assert!(sign_in_page("https://app.example.com/_parlor/auth/native").is_ok());
|
|
177
|
+
assert!(sign_in_page("http://localhost:3000/x").is_ok());
|
|
178
|
+
for bad in ["", "javascript:alert(1)", "file:///etc/passwd", "hello://x"] {
|
|
179
|
+
assert!(sign_in_page(bad).is_err(), "{bad}");
|
|
180
|
+
}
|
|
181
|
+
assert_eq!(url_scheme("hello"), Ok("hello"));
|
|
182
|
+
assert_eq!(url_scheme("dev.parlor-app+x"), Ok("dev.parlor-app+x"));
|
|
183
|
+
for bad in ["", "Hello", "1app", "a b", "https://x"] {
|
|
184
|
+
assert!(url_scheme(bad).is_err(), "{bad}");
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
#[test]
|
|
189
|
+
fn a_refused_probe_never_reads_as_unavailable() {
|
|
190
|
+
for error in [sign_in_page("").unwrap_err(), url_scheme("").unwrap_err()] {
|
|
191
|
+
let lower = error.to_lowercase();
|
|
192
|
+
assert!(!lower.contains("not found") && !lower.contains("unsupported"));
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
package/rust/src/lib.rs
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
mod auth_browser;
|
|
1
2
|
#[cfg(unix)]
|
|
2
3
|
mod control;
|
|
3
4
|
mod device_key;
|
|
@@ -12,6 +13,7 @@ mod session;
|
|
|
12
13
|
#[cfg(target_os = "macos")]
|
|
13
14
|
mod vault;
|
|
14
15
|
|
|
16
|
+
pub use auth_browser::parlor_auth_browser_open;
|
|
15
17
|
pub use device_key::{parlor_device_key_public, parlor_device_key_sign};
|
|
16
18
|
#[cfg(unix)]
|
|
17
19
|
pub use host::{
|