From 099c3af48fae87c79569ecf7ce55c444cdb67c6e Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Sun, 10 Mar 2024 01:26:43 +0100 Subject: [PATCH 01/48] start building the package --- deltachat-rpc-server/npm-package/.gitignore | 2 + deltachat-rpc-server/npm-package/.npmignore | 4 + deltachat-rpc-server/npm-package/Readme.md | 35 +++++++ .../npm-package/build_platform_package.py | 97 +++++++++++++++++++ deltachat-rpc-server/npm-package/index.js | 0 deltachat-rpc-server/npm-package/package.json | 13 +++ ...update_optional_dependencie_and_version.js | 42 ++++++++ 7 files changed, 193 insertions(+) create mode 100644 deltachat-rpc-server/npm-package/.gitignore create mode 100644 deltachat-rpc-server/npm-package/.npmignore create mode 100644 deltachat-rpc-server/npm-package/Readme.md create mode 100644 deltachat-rpc-server/npm-package/build_platform_package.py create mode 100644 deltachat-rpc-server/npm-package/index.js create mode 100644 deltachat-rpc-server/npm-package/package.json create mode 100644 deltachat-rpc-server/npm-package/update_optional_dependencie_and_version.js diff --git a/deltachat-rpc-server/npm-package/.gitignore b/deltachat-rpc-server/npm-package/.gitignore new file mode 100644 index 0000000000..511a7e1fa0 --- /dev/null +++ b/deltachat-rpc-server/npm-package/.gitignore @@ -0,0 +1,2 @@ +platform_package +*.tgz \ No newline at end of file diff --git a/deltachat-rpc-server/npm-package/.npmignore b/deltachat-rpc-server/npm-package/.npmignore new file mode 100644 index 0000000000..68681a0acc --- /dev/null +++ b/deltachat-rpc-server/npm-package/.npmignore @@ -0,0 +1,4 @@ +platform_package/* +build_platform_package.py +update_optional_dependencie_and_version.js +*.tgz \ No newline at end of file diff --git a/deltachat-rpc-server/npm-package/Readme.md b/deltachat-rpc-server/npm-package/Readme.md new file mode 100644 index 0000000000..7039ddc61a --- /dev/null +++ b/deltachat-rpc-server/npm-package/Readme.md @@ -0,0 +1,35 @@ +## npm backage for deltachat-rpc-server + +This is the successor of `deltachat-node`, +it does not use NAPI bindings but instead uses stdio executables +to let you talk to core over jsonrpc over stdio. +This simplifies cross-compilation and even reduces binary size (no CFFI layer and no NAPI layer). + +## How to use on an unsupported platform + + + +## How does it work when you install it + +NPM automatically installs platform dependent optional dependencies when `os` and `cpu` fields are set correctly. + +references: +- https://napi.rs/docs/deep-dive/release#3-the-native-addon-for-different-platforms-is-distributed-through-different-npm-packages, [webarchive version](https://web.archive.org/web/20240309234250/https://napi.rs/docs/deep-dive/release#3-the-native-addon-for-different-platforms-is-distributed-through-different-npm-packages) +- https://docs.npmjs.com/cli/v6/configuring-npm/package-json#cpu +- https://docs.npmjs.com/cli/v6/configuring-npm/package-json#os + +## How do you built this package in CI + +- To build platform packages, run the `build_platform_package.py` script: + ``` + python3 build_platform_package.py x86_64-apple-darwin + ``` +- Then pass it as an artifact to the last CI action that publishes the main package. +- upload all packages from `deltachat-rpc-server/npm-package/platform_package`. +- then publish `deltachat-rpc-server/npm-package`, + - this will run `update_optional_dependencie_and_version.js` (in the `prepack` script), + which puts all platform packages into `optionalDependencies` and updates the `version` in `package.json` + +## Thanks to nlnet + +The initial work on this package was funded by nlnet as part of the [Delta Tauri](https://nlnet.nl/project/DeltaTauri/) Project. \ No newline at end of file diff --git a/deltachat-rpc-server/npm-package/build_platform_package.py b/deltachat-rpc-server/npm-package/build_platform_package.py new file mode 100644 index 0000000000..6bd49bae33 --- /dev/null +++ b/deltachat-rpc-server/npm-package/build_platform_package.py @@ -0,0 +1,97 @@ +import subprocess +from sys import argv +from os import path, makedirs +import json +import tomllib +from shutil import copy + +if len(argv) < 2: + print("First argument should be target architecture as required by cargo") + exit(1) + +target = argv[1].strip() + +output = subprocess.run(["rustup","target","list"], capture_output=True) +available_targets = output.stdout.decode("utf-8") + +if available_targets.find(target) == -1: + print("target", target, "is not known") + exit(1) + +if available_targets.find(target + " (installed)") == -1: + print("target ", target, " is not installed, run 'rustup target add "+target+"'") + exit(1) + +subprocess.run([ + "cargo", + "build", + "--release", + "-p", + "deltachat-rpc-server", + "--target", + target +]) + +newpath = r'platform_package' +if not path.exists(newpath): + makedirs(newpath) + +# make new folder + +platform_path = 'platform_package/' + target +if not path.exists(platform_path): + makedirs(platform_path) + +# copy binary it over + +def binary_path(binary_name): + return "../../target/"+target+"/release/"+binary_name + +my_binary_name = "deltachat-rpc-server" + +if not path.isfile(binary_path("deltachat-rpc-server")): + my_binary_name = "deltachat-rpc-server.exe" + if not path.isfile(binary_path("deltachat-rpc-server.exe")): + print("Did not find the build") + exit(1) + +my_binary_path = binary_path(my_binary_name) + +copy(my_binary_path, platform_path + "/" + my_binary_name) + +# read version +tomlfile = open("../Cargo.toml", 'rb') +version = tomllib.load(tomlfile)['package']['version'] + +# make a package.json for it +[cpu_arch, vendor, os] = target.split("-") + +def convert_cpu_arch_to_npm_cpu_arch(arch): + if arch == "x86_64": + return "x64" + if arch == "i686": + return "i32" + if arch == "aarch64": + return "arm64" + print("architecture might not be known by nodejs, please make sure it can be returned by 'process.arch':", arch) + return arch + +def convert_os_to_npm_os(os): + if os == "windows": + return "win32" + if os == "darwin" or os == "linux": + return os + print("architecture might not be known by nodejs, please make sure it can be returned by 'process.platform':", os) + return os + +package_json = dict({ + "name": "@deltachat/stdio-rpc-server-" + target, + "version": version, + "os": [convert_os_to_npm_os(os)], + "cpu": [convert_cpu_arch_to_npm_cpu_arch(cpu_arch)], + "main": my_binary_name, + "license": "MPL-2.0" +}) + +file = open(platform_path + "/package.json", 'w') +file.write(json.dumps(package_json, indent=4)) \ No newline at end of file diff --git a/deltachat-rpc-server/npm-package/index.js b/deltachat-rpc-server/npm-package/index.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/deltachat-rpc-server/npm-package/package.json b/deltachat-rpc-server/npm-package/package.json new file mode 100644 index 0000000000..3a5b190ff5 --- /dev/null +++ b/deltachat-rpc-server/npm-package/package.json @@ -0,0 +1,13 @@ +{ + "type": "module", + "name": "@deltachat/stdio-rpc-server", + "version": "1.136.3", + "license": "MPL-2.0", + "scripts": { + "prepack": "node update_optional_dependencie_and_version.js" + }, + "optionalDependencies": { + "@deltachat/stdio-rpc-server-aarch64-apple-darwin": "1.136.3", + "@deltachat/stdio-rpc-server-x86_64-apple-darwin": "1.136.3" + } +} \ No newline at end of file diff --git a/deltachat-rpc-server/npm-package/update_optional_dependencie_and_version.js b/deltachat-rpc-server/npm-package/update_optional_dependencie_and_version.js new file mode 100644 index 0000000000..3cbde9fe64 --- /dev/null +++ b/deltachat-rpc-server/npm-package/update_optional_dependencie_and_version.js @@ -0,0 +1,42 @@ +import fs from "fs/promises"; +import { join } from "path"; + +const package_json = JSON.parse(await fs.readFile("package.json", "utf8")); + +const cargo_toml = await fs.readFile("../Cargo.toml", "utf8"); +const version = cargo_toml + .split("\n") + .find((line) => line.includes("version")) + .split('"')[1]; + +const platform_packages_dir = "platform_package"; + +const platform_package_names = await Promise.all( + ( + await fs.readdir(platform_packages_dir) + ).map(async (name) => { + const p = JSON.parse( + await fs.readFile( + join(platform_packages_dir, name, "package.json"), + "utf8" + ) + ); + if (p.version !== version) { + console.error( + name, + "has a different version than the version of the rpc server.", + { rpc_server: version, platform_package: p.version } + ); + throw new Error("version missmatch"); + } + return { folder_name: name, package_name: p.name }; + }) +); + +package_json.version = version; +package_json.optionalDependencies = {}; +for (const { folder_name, package_name } of platform_package_names) { + package_json.optionalDependencies[package_name] = version; +} + +await fs.writeFile("package.json", JSON.stringify(package_json, null, 4)); From 102814e27279612a8135777868fa4dddf8bc425f Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Sun, 10 Mar 2024 01:28:28 +0100 Subject: [PATCH 02/48] update readme --- deltachat-rpc-server/npm-package/Readme.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/deltachat-rpc-server/npm-package/Readme.md b/deltachat-rpc-server/npm-package/Readme.md index 7039ddc61a..139aea2d43 100644 --- a/deltachat-rpc-server/npm-package/Readme.md +++ b/deltachat-rpc-server/npm-package/Readme.md @@ -22,6 +22,8 @@ references: - To build platform packages, run the `build_platform_package.py` script: ``` + python3 build_platform_package.py + # example python3 build_platform_package.py x86_64-apple-darwin ``` - Then pass it as an artifact to the last CI action that publishes the main package. From 272cac45525fde6929d0d4995aa174dea0b9a2de Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Sun, 17 Mar 2024 23:48:49 +0100 Subject: [PATCH 03/48] rename npm packages and start with js code --- deltachat-rpc-server/npm-package/Readme.md | 5 +++ .../npm-package/build_platform_package.py | 2 +- deltachat-rpc-server/npm-package/index.js | 39 +++++++++++++++++++ deltachat-rpc-server/npm-package/package.json | 5 ++- deltachat-rpc-server/npm-package/src/const.js | 2 + .../npm-package/src/errors.js | 26 +++++++++++++ 6 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 deltachat-rpc-server/npm-package/src/const.js create mode 100644 deltachat-rpc-server/npm-package/src/errors.js diff --git a/deltachat-rpc-server/npm-package/Readme.md b/deltachat-rpc-server/npm-package/Readme.md index 139aea2d43..d60590bca1 100644 --- a/deltachat-rpc-server/npm-package/Readme.md +++ b/deltachat-rpc-server/npm-package/Readme.md @@ -18,6 +18,11 @@ references: - https://docs.npmjs.com/cli/v6/configuring-npm/package-json#cpu - https://docs.npmjs.com/cli/v6/configuring-npm/package-json#os +When you import this package it searches for the rpc server in the following locations and order: +1. `DELTA_CHAT_RPC_SERVER` environment variable +2. prebuilds in npm packages +3. in PATH, but there an additional version check is performed + ## How do you built this package in CI - To build platform packages, run the `build_platform_package.py` script: diff --git a/deltachat-rpc-server/npm-package/build_platform_package.py b/deltachat-rpc-server/npm-package/build_platform_package.py index 6bd49bae33..3f8a2eadb2 100644 --- a/deltachat-rpc-server/npm-package/build_platform_package.py +++ b/deltachat-rpc-server/npm-package/build_platform_package.py @@ -85,7 +85,7 @@ def convert_os_to_npm_os(os): return os package_json = dict({ - "name": "@deltachat/stdio-rpc-server-" + target, + "name": "@deltachat/stdio-rpc-server-" + convert_os_to_npm_os(os) + "-" + convert_cpu_arch_to_npm_cpu_arch(cpu_arch), "version": version, "os": [convert_os_to_npm_os(os)], "cpu": [convert_cpu_arch_to_npm_cpu_arch(cpu_arch)], diff --git a/deltachat-rpc-server/npm-package/index.js b/deltachat-rpc-server/npm-package/index.js index e69de29bb2..87c561b1ad 100644 --- a/deltachat-rpc-server/npm-package/index.js +++ b/deltachat-rpc-server/npm-package/index.js @@ -0,0 +1,39 @@ +//@ts-check +import os from "os" +import { join } from "path" +import process from "process" +import { NPM_NOT_FOUND_SUPPORTED_PLATFORM_ERROR, NPM_NOT_FOUND_UNSUPPORTED_PLATFORM_ERROR } from "./src/errors" + +const ENV_VAR_NAME = "DELTA_CHAT_RPC_SERVER" + +// find the rpc server +// - [ ] env var +// - [ ] in npm packages +// - [ ] in PATH -> but there we need extra version check + +// exports +// - [ ] expose from where the rpc server was loaded (env_var, prebuild or npm package) +// - [ ] a raw starter that has a stdin/out handle thingie like desktop uses +// - [ ] a function that already wraps the stdio handle from aboe into the deltachat jsonrpc bindings + + +function findRpcServerInNodeModules() { + const arch = os.arch() + const operating_system = process.platform + + const package_name = `@deltachat/stdio-rpc-server-${operating_system}-${arch}` + + try { + return join(require.resolve(package_name), "deltachat-rpc-server") + } catch (error) { + console.debug("findRpcServerInNodeModules", error) + if( + Object.keys(require("./package.json").optionalDependencies).includes(package_name) + ) { + throw new Error(NPM_NOT_FOUND_SUPPORTED_PLATFORM_ERROR()) + } else { + throw new Error(NPM_NOT_FOUND_UNSUPPORTED_PLATFORM_ERROR()) + } + } +} + diff --git a/deltachat-rpc-server/npm-package/package.json b/deltachat-rpc-server/npm-package/package.json index 3a5b190ff5..f7ee309cb0 100644 --- a/deltachat-rpc-server/npm-package/package.json +++ b/deltachat-rpc-server/npm-package/package.json @@ -3,11 +3,12 @@ "name": "@deltachat/stdio-rpc-server", "version": "1.136.3", "license": "MPL-2.0", + "main": "index.js", "scripts": { "prepack": "node update_optional_dependencie_and_version.js" }, "optionalDependencies": { - "@deltachat/stdio-rpc-server-aarch64-apple-darwin": "1.136.3", - "@deltachat/stdio-rpc-server-x86_64-apple-darwin": "1.136.3" + "@deltachat/stdio-rpc-server-darwin-arm64": "1.136.3", + "@deltachat/stdio-rpc-server-darwin-x64": "1.136.3" } } \ No newline at end of file diff --git a/deltachat-rpc-server/npm-package/src/const.js b/deltachat-rpc-server/npm-package/src/const.js new file mode 100644 index 0000000000..3472228bd0 --- /dev/null +++ b/deltachat-rpc-server/npm-package/src/const.js @@ -0,0 +1,2 @@ +//@ts-check +export const ENV_VAR_NAME = "DELTA_CHAT_RPC_SERVER" \ No newline at end of file diff --git a/deltachat-rpc-server/npm-package/src/errors.js b/deltachat-rpc-server/npm-package/src/errors.js new file mode 100644 index 0000000000..e2d12ba465 --- /dev/null +++ b/deltachat-rpc-server/npm-package/src/errors.js @@ -0,0 +1,26 @@ +//@ts-check +import {ENV_VAR_NAME} from "./const" + + +const cargoInstallCommand = "cargo install --git https://github.com/deltachat/deltachat-core-rust deltachat-rpc-server" + +export function NPM_NOT_FOUND_SUPPORTED_PLATFORM_ERROR (package_name) { + + return `deltachat-rpc-server not found: + +- Install it with "npm i ${package_name}" +- or download/compile deltachat-rpc-server for your platform and + - either put it into your PATH (for example with "${cargoInstallCommand}") + - or set the "${ENV_VAR_NAME}" env var to the path to deltachat-rpc-server"` +} + +export function NPM_NOT_FOUND_UNSUPPORTED_PLATFORM_ERROR () { + + return `deltachat-rpc-server not found: + +Unfortunately no prebuild is available for your system, so you need to provide deltachat-rpc-server yourself. + +- Download or Compile deltachat-rpc-server for your platform and + - either put it into your PATH (for example with "${cargoInstallCommand}") + - or set the "${ENV_VAR_NAME}" env var to the path to deltachat-rpc-server"` +} \ No newline at end of file From 282cbe6d1cc2dfd390d7d7fb3ea3a96e059a7c6b Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Sun, 17 Mar 2024 23:53:41 +0100 Subject: [PATCH 04/48] fix filename typo --- deltachat-rpc-server/npm-package/package.json | 2 +- ...d_version.js => update_optional_dependencies_and_version.js} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename deltachat-rpc-server/npm-package/{update_optional_dependencie_and_version.js => update_optional_dependencies_and_version.js} (100%) diff --git a/deltachat-rpc-server/npm-package/package.json b/deltachat-rpc-server/npm-package/package.json index f7ee309cb0..accf2d8fd4 100644 --- a/deltachat-rpc-server/npm-package/package.json +++ b/deltachat-rpc-server/npm-package/package.json @@ -5,7 +5,7 @@ "license": "MPL-2.0", "main": "index.js", "scripts": { - "prepack": "node update_optional_dependencie_and_version.js" + "prepack": "node update_optional_dependencies_and_version.js" }, "optionalDependencies": { "@deltachat/stdio-rpc-server-darwin-arm64": "1.136.3", diff --git a/deltachat-rpc-server/npm-package/update_optional_dependencie_and_version.js b/deltachat-rpc-server/npm-package/update_optional_dependencies_and_version.js similarity index 100% rename from deltachat-rpc-server/npm-package/update_optional_dependencie_and_version.js rename to deltachat-rpc-server/npm-package/update_optional_dependencies_and_version.js From b5fbdda997274246f8f0ab4389340e4820fda481 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Sun, 17 Mar 2024 23:54:53 +0100 Subject: [PATCH 05/48] fix typo --- deltachat-rpc-server/npm-package/Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deltachat-rpc-server/npm-package/Readme.md b/deltachat-rpc-server/npm-package/Readme.md index d60590bca1..5c354d9a74 100644 --- a/deltachat-rpc-server/npm-package/Readme.md +++ b/deltachat-rpc-server/npm-package/Readme.md @@ -1,4 +1,4 @@ -## npm backage for deltachat-rpc-server +## npm package for deltachat-rpc-server This is the successor of `deltachat-node`, it does not use NAPI bindings but instead uses stdio executables From 0cc2bc12fd89325192868885989844acb00835b3 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Mon, 6 May 2024 04:50:18 +0200 Subject: [PATCH 06/48] git: ignore vscode folder --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index c476805289..aab1ac6f08 100644 --- a/.gitignore +++ b/.gitignore @@ -33,6 +33,7 @@ deltachat-ffi/xml coverage/ .DS_Store +.vscode .vscode/launch.json python/accounts.txt python/all-testaccounts.txt From f6aa4dedd59ccbb7a277fc39f7b2aa218ebca8ef Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Mon, 6 May 2024 04:50:36 +0200 Subject: [PATCH 07/48] more progress --- deltachat-rpc-server/npm-package/Readme.md | 7 +- deltachat-rpc-server/npm-package/index.js | 112 +++++++++++++++--- deltachat-rpc-server/npm-package/src/const.js | 6 +- .../npm-package/src/errors.js | 10 +- scripts/set_core_version.py | 6 +- 5 files changed, 120 insertions(+), 21 deletions(-) diff --git a/deltachat-rpc-server/npm-package/Readme.md b/deltachat-rpc-server/npm-package/Readme.md index 5c354d9a74..ab0a099b21 100644 --- a/deltachat-rpc-server/npm-package/Readme.md +++ b/deltachat-rpc-server/npm-package/Readme.md @@ -20,8 +20,11 @@ references: When you import this package it searches for the rpc server in the following locations and order: 1. `DELTA_CHAT_RPC_SERVER` environment variable -2. prebuilds in npm packages -3. in PATH, but there an additional version check is performed +2. in PATH + - unless `DELTA_CHAT_SKIP_PATH=1` is specified + - searches in .cargo/bin directory first + - but there an additional version check is performed +3. prebuilds in npm packages ## How do you built this package in CI diff --git a/deltachat-rpc-server/npm-package/index.js b/deltachat-rpc-server/npm-package/index.js index 87c561b1ad..213b015ea8 100644 --- a/deltachat-rpc-server/npm-package/index.js +++ b/deltachat-rpc-server/npm-package/index.js @@ -1,10 +1,24 @@ //@ts-check -import os from "os" -import { join } from "path" -import process from "process" -import { NPM_NOT_FOUND_SUPPORTED_PLATFORM_ERROR, NPM_NOT_FOUND_UNSUPPORTED_PLATFORM_ERROR } from "./src/errors" +import { execFile } from "child_process"; +import { stat, readdir } from "fs/promises"; +import os from "os"; +import { join } from "path"; +import { basename } from "path/posix"; +import process from "process"; +import { promisify } from "node:util"; +import { + ENV_VAR_NAME, + PATH_EXECUTABLE_NAME, + SKIP_SEARCH_IN_PATH, +} from "./src/const.js"; +import { + ENV_VAR_LOCATION_NOT_FOUND, + NPM_NOT_FOUND_SUPPORTED_PLATFORM_ERROR, + NPM_NOT_FOUND_UNSUPPORTED_PLATFORM_ERROR, +} from "./src/errors.js"; -const ENV_VAR_NAME = "DELTA_CHAT_RPC_SERVER" +// Because this is not compiled by typescript, nodejs needs this stuff (` assert { type: "json" };`) +import package_json from "./package.json" assert { type: "json" }; // find the rpc server // - [ ] env var @@ -16,24 +30,90 @@ const ENV_VAR_NAME = "DELTA_CHAT_RPC_SERVER" // - [ ] a raw starter that has a stdin/out handle thingie like desktop uses // - [ ] a function that already wraps the stdio handle from aboe into the deltachat jsonrpc bindings +function findRPCServerInNodeModules() { + const arch = os.arch(); + const operating_system = process.platform; -function findRpcServerInNodeModules() { - const arch = os.arch() - const operating_system = process.platform + const package_name = `@deltachat/stdio-rpc-server-${operating_system}-${arch}`; - const package_name = `@deltachat/stdio-rpc-server-${operating_system}-${arch}` + try { + return join(require.resolve(package_name), "deltachat-rpc-server"); + } catch (error) { + console.debug("findRpcServerInNodeModules", error); + if (Object.keys(package_json.optionalDependencies).includes(package_name)) { + throw new Error(NPM_NOT_FOUND_SUPPORTED_PLATFORM_ERROR(package_name)); + } else { + throw new Error(NPM_NOT_FOUND_UNSUPPORTED_PLATFORM_ERROR()); + } + } +} +export default async function findRPCServer() { + // 1. check if it is set as env var + if (process.env[ENV_VAR_NAME]) { try { - return join(require.resolve(package_name), "deltachat-rpc-server") + if (!(await stat(process.env[ENV_VAR_NAME])).isFile()) { + throw new Error( + `expected ${ENV_VAR_NAME} to point to the deltachat-rpc-server executable` + ); + } } catch (error) { - console.debug("findRpcServerInNodeModules", error) - if( - Object.keys(require("./package.json").optionalDependencies).includes(package_name) - ) { - throw new Error(NPM_NOT_FOUND_SUPPORTED_PLATFORM_ERROR()) + throw new Error(ENV_VAR_LOCATION_NOT_FOUND()); + } + return process.env[ENV_VAR_NAME]; + } + + // 2. check if it can be found in PATH + if (!process.env[SKIP_SEARCH_IN_PATH]) { + const path_dirs = process.env["PATH"].split(/:|;/); + // check cargo dir first + const cargo_dirs = path_dirs.filter((p) => p.endsWith(".cargo/bin")); + const findExecutable = async (directory) => { + const files = await readdir(directory); + const file = files.find((p) => + basename(p).includes(PATH_EXECUTABLE_NAME) + ); + if (file) { + return join(directory, file); + } else { + throw null; + } + }; + const executable_search = // TODO make code simpler to read + (await Promise.allSettled(cargo_dirs.map(findExecutable))).find( + ({ status }) => status === "fulfilled" + ) || + (await Promise.allSettled(path_dirs.map(findExecutable))).find( + ({ status }) => status === "fulfilled" + ); + // TODO maybe we could the system do this stuff automatically + // by just trying to execute it and then use "which" (unix) or "where" (windows) to get the path to the executable + if (executable_search.status === "fulfilled") { + const executable = executable_search.value; + // test if it is the right version + try { + // for some unknown reason it is in stderr and not in stdout + const { stderr } = await promisify(execFile)(executable, ["--version"]); + if (package_json.version !== stderr) { + throw new Error( + `version mismatch: (npm package: ${package_json.version}) (installed ${PATH_EXECUTABLE_NAME} version: ${stderr})` + ); } else { - throw new Error(NPM_NOT_FOUND_UNSUPPORTED_PLATFORM_ERROR()) + return executable; } + } catch (error) { + console.error( + "Found executable in PATH, but there was an error: " + error + ); + console.error("So falling back to using prebuild..."); + } } + } + // 3. check for prebuilds + + return findRPCServerInNodeModules(); } +// TODO script for local development (build for current platform and change link in package.json to be local) +// TODO script to build prebuild for current platform +// TODO disable PATH search in desktop (hardening, so it can not be easily replaced in production) diff --git a/deltachat-rpc-server/npm-package/src/const.js b/deltachat-rpc-server/npm-package/src/const.js index 3472228bd0..fafed99a5c 100644 --- a/deltachat-rpc-server/npm-package/src/const.js +++ b/deltachat-rpc-server/npm-package/src/const.js @@ -1,2 +1,6 @@ //@ts-check -export const ENV_VAR_NAME = "DELTA_CHAT_RPC_SERVER" \ No newline at end of file + +export const PATH_EXECUTABLE_NAME = 'deltachat-rpc-server' + +export const ENV_VAR_NAME = "DELTA_CHAT_RPC_SERVER" +export const SKIP_SEARCH_IN_PATH = "DELTA_CHAT_SKIP_PATH" \ No newline at end of file diff --git a/deltachat-rpc-server/npm-package/src/errors.js b/deltachat-rpc-server/npm-package/src/errors.js index e2d12ba465..9455ce0712 100644 --- a/deltachat-rpc-server/npm-package/src/errors.js +++ b/deltachat-rpc-server/npm-package/src/errors.js @@ -1,5 +1,5 @@ //@ts-check -import {ENV_VAR_NAME} from "./const" +import {ENV_VAR_NAME} from "./const.js" const cargoInstallCommand = "cargo install --git https://github.com/deltachat/deltachat-core-rust deltachat-rpc-server" @@ -23,4 +23,12 @@ Unfortunately no prebuild is available for your system, so you need to provide d - Download or Compile deltachat-rpc-server for your platform and - either put it into your PATH (for example with "${cargoInstallCommand}") - or set the "${ENV_VAR_NAME}" env var to the path to deltachat-rpc-server"` +} + +export function ENV_VAR_LOCATION_NOT_FOUND (error) { + return `deltachat-rpc-server not found in ${ENV_VAR_NAME}: + + Error: ${error} + + Content of ${ENV_VAR_NAME}: "${process.env[ENV_VAR_NAME]}"` } \ No newline at end of file diff --git a/scripts/set_core_version.py b/scripts/set_core_version.py index d83d564940..d2abbdb3b1 100755 --- a/scripts/set_core_version.py +++ b/scripts/set_core_version.py @@ -66,7 +66,11 @@ def main(): parser = ArgumentParser(prog="set_core_version") parser.add_argument("newversion") - json_list = ["package.json", "deltachat-jsonrpc/typescript/package.json"] + json_list = [ + "package.json", + "deltachat-jsonrpc/typescript/package.json", + "deltachat-rpc-server/npm-package/package.json", + ] toml_list = [ "Cargo.toml", "deltachat-ffi/Cargo.toml", From 8582c632c6073ca3529cca92fd977c512995f73c Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Mon, 6 May 2024 06:08:09 +0200 Subject: [PATCH 08/48] add script for local instalation --- deltachat-rpc-server/npm-package/Readme.md | 9 +++ .../{ => scripts}/build_platform_package.py | 5 +- .../scripts/make_local_dev_version.py | 31 ++++++++++ ...pdate_optional_dependencies_and_version.js | 57 +++++++++++++++++++ ...pdate_optional_dependencies_and_version.js | 42 -------------- 5 files changed, 101 insertions(+), 43 deletions(-) rename deltachat-rpc-server/npm-package/{ => scripts}/build_platform_package.py (93%) create mode 100644 deltachat-rpc-server/npm-package/scripts/make_local_dev_version.py create mode 100644 deltachat-rpc-server/npm-package/scripts/update_optional_dependencies_and_version.js delete mode 100644 deltachat-rpc-server/npm-package/update_optional_dependencies_and_version.js diff --git a/deltachat-rpc-server/npm-package/Readme.md b/deltachat-rpc-server/npm-package/Readme.md index ab0a099b21..81489a40a8 100644 --- a/deltachat-rpc-server/npm-package/Readme.md +++ b/deltachat-rpc-server/npm-package/Readme.md @@ -40,6 +40,15 @@ When you import this package it searches for the rpc server in the following loc - this will run `update_optional_dependencie_and_version.js` (in the `prepack` script), which puts all platform packages into `optionalDependencies` and updates the `version` in `package.json` +## How to build a version you can use localy on your host machine for development + +You can not install the npm packet from the previous section locally, unless you have a local npm registry set up where you upload it too. This is why we have seperate scripts for making it work for local installation. + +- If you just need your host platform run `python scripts/make_local_dev_version.py` + - note: this clears the `platform_package` folder +- (advanced) If you need more than one platform for local install you can just run `node scripts/update_optional_dependencies_and_version.js` after building multiple plaftorms with `build_platform_package.py` + + ## Thanks to nlnet The initial work on this package was funded by nlnet as part of the [Delta Tauri](https://nlnet.nl/project/DeltaTauri/) Project. \ No newline at end of file diff --git a/deltachat-rpc-server/npm-package/build_platform_package.py b/deltachat-rpc-server/npm-package/scripts/build_platform_package.py similarity index 93% rename from deltachat-rpc-server/npm-package/build_platform_package.py rename to deltachat-rpc-server/npm-package/scripts/build_platform_package.py index 3f8a2eadb2..1a97bb0274 100644 --- a/deltachat-rpc-server/npm-package/build_platform_package.py +++ b/deltachat-rpc-server/npm-package/scripts/build_platform_package.py @@ -1,10 +1,13 @@ import subprocess from sys import argv -from os import path, makedirs +from os import path, makedirs, chdir import json import tomllib from shutil import copy +# ensure correct working directory +chdir(path.join(path.dirname(path.abspath(__file__)), "../")) + if len(argv) < 2: print("First argument should be target architecture as required by cargo") exit(1) diff --git a/deltachat-rpc-server/npm-package/scripts/make_local_dev_version.py b/deltachat-rpc-server/npm-package/scripts/make_local_dev_version.py new file mode 100644 index 0000000000..05ded16a8e --- /dev/null +++ b/deltachat-rpc-server/npm-package/scripts/make_local_dev_version.py @@ -0,0 +1,31 @@ +# This script is for making a version of the npm packet that you can install locally + +import subprocess +from sys import argv +from os import path, makedirs, chdir +import re +import json +import tomllib +from shutil import copy, rmtree + +# ensure correct working directory +chdir(path.join(path.dirname(path.abspath(__file__)), "../")) + +# get host target with "rustc -vV" +output = subprocess.run(["rustc","-vV"], capture_output=True) +host_target = re.search('host: ([-\\w]*)', output.stdout.decode("utf-8")).group(1) +print("host target to build for is:", host_target) + +# clean platform_package folder +newpath = r'platform_package' +if not path.exists(newpath): + makedirs(newpath) +else: + rmtree(path.join(path.dirname(path.abspath(__file__)), "../platform_package/")) + makedirs(newpath) + +# run build_platform_package.py with the host's target to build it +subprocess.run(["python", "scripts/build_platform_package.py", host_target], capture_output=False) + +# run update_optional_dependencies_and_version.js to adjust the package / make it installable locally +subprocess.run(["node", "scripts/update_optional_dependencies_and_version.js", "--local"], capture_output=False) \ No newline at end of file diff --git a/deltachat-rpc-server/npm-package/scripts/update_optional_dependencies_and_version.js b/deltachat-rpc-server/npm-package/scripts/update_optional_dependencies_and_version.js new file mode 100644 index 0000000000..56dbadd939 --- /dev/null +++ b/deltachat-rpc-server/npm-package/scripts/update_optional_dependencies_and_version.js @@ -0,0 +1,57 @@ +import fs from "fs/promises"; +import { join, dirname } from "path"; +import { fileURLToPath } from "url"; + +const expected_cwd = join(dirname(fileURLToPath(import.meta.url)), ".."); + +if (process.cwd() !== expected_cwd) { + console.error( + "CWD missmatch: this script needs to be run from " + expected_cwd, + { actual: process.cwd(), expected: expected_cwd } + ); + process.exit(1); +} + +// whether to use local paths instead of npm registry version number for the prebuilds in optionalDependencies +// useful for local development +const is_local = process.argv.includes("--local"); + +const package_json = JSON.parse(await fs.readFile("./package.json", "utf8")); + +const cargo_toml = await fs.readFile("../Cargo.toml", "utf8"); +const version = cargo_toml + .split("\n") + .find((line) => line.includes("version")) + .split('"')[1]; + +const platform_packages_dir = "./platform_package"; + +const platform_package_names = await Promise.all( + (await fs.readdir(platform_packages_dir)).map(async (name) => { + const p = JSON.parse( + await fs.readFile( + join(platform_packages_dir, name, "package.json"), + "utf8" + ) + ); + if (p.version !== version) { + console.error( + name, + "has a different version than the version of the rpc server.", + { rpc_server: version, platform_package: p.version } + ); + throw new Error("version missmatch"); + } + return { folder_name: name, package_name: p.name }; + }) +); + +package_json.version = version; +package_json.optionalDependencies = {}; +for (const { folder_name, package_name } of platform_package_names) { + package_json.optionalDependencies[package_name] = is_local + ? `file:./platform-package/${folder_name}` + : version; +} + +await fs.writeFile("./package.json", JSON.stringify(package_json, null, 4)); diff --git a/deltachat-rpc-server/npm-package/update_optional_dependencies_and_version.js b/deltachat-rpc-server/npm-package/update_optional_dependencies_and_version.js deleted file mode 100644 index 3cbde9fe64..0000000000 --- a/deltachat-rpc-server/npm-package/update_optional_dependencies_and_version.js +++ /dev/null @@ -1,42 +0,0 @@ -import fs from "fs/promises"; -import { join } from "path"; - -const package_json = JSON.parse(await fs.readFile("package.json", "utf8")); - -const cargo_toml = await fs.readFile("../Cargo.toml", "utf8"); -const version = cargo_toml - .split("\n") - .find((line) => line.includes("version")) - .split('"')[1]; - -const platform_packages_dir = "platform_package"; - -const platform_package_names = await Promise.all( - ( - await fs.readdir(platform_packages_dir) - ).map(async (name) => { - const p = JSON.parse( - await fs.readFile( - join(platform_packages_dir, name, "package.json"), - "utf8" - ) - ); - if (p.version !== version) { - console.error( - name, - "has a different version than the version of the rpc server.", - { rpc_server: version, platform_package: p.version } - ); - throw new Error("version missmatch"); - } - return { folder_name: name, package_name: p.name }; - }) -); - -package_json.version = version; -package_json.optionalDependencies = {}; -for (const { folder_name, package_name } of platform_package_names) { - package_json.optionalDependencies[package_name] = version; -} - -await fs.writeFile("package.json", JSON.stringify(package_json, null, 4)); From 50ad41b1fd5bbf6792c7335bb3273e3ac4d05010 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Mon, 6 May 2024 07:31:49 +0200 Subject: [PATCH 09/48] add types and fix local installation --- deltachat-rpc-server/npm-package/.npmignore | 3 +-- deltachat-rpc-server/npm-package/index.d.ts | 2 ++ deltachat-rpc-server/npm-package/package.json | 1 + .../scripts/update_optional_dependencies_and_version.js | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 deltachat-rpc-server/npm-package/index.d.ts diff --git a/deltachat-rpc-server/npm-package/.npmignore b/deltachat-rpc-server/npm-package/.npmignore index 68681a0acc..473106442a 100644 --- a/deltachat-rpc-server/npm-package/.npmignore +++ b/deltachat-rpc-server/npm-package/.npmignore @@ -1,4 +1,3 @@ platform_package/* -build_platform_package.py -update_optional_dependencie_and_version.js +scripts/ *.tgz \ No newline at end of file diff --git a/deltachat-rpc-server/npm-package/index.d.ts b/deltachat-rpc-server/npm-package/index.d.ts new file mode 100644 index 0000000000..6332355ba8 --- /dev/null +++ b/deltachat-rpc-server/npm-package/index.d.ts @@ -0,0 +1,2 @@ + +export default async function getRPCServerPath(): string \ No newline at end of file diff --git a/deltachat-rpc-server/npm-package/package.json b/deltachat-rpc-server/npm-package/package.json index accf2d8fd4..6a6103841c 100644 --- a/deltachat-rpc-server/npm-package/package.json +++ b/deltachat-rpc-server/npm-package/package.json @@ -4,6 +4,7 @@ "version": "1.136.3", "license": "MPL-2.0", "main": "index.js", + "types": "index.d.ts", "scripts": { "prepack": "node update_optional_dependencies_and_version.js" }, diff --git a/deltachat-rpc-server/npm-package/scripts/update_optional_dependencies_and_version.js b/deltachat-rpc-server/npm-package/scripts/update_optional_dependencies_and_version.js index 56dbadd939..50e92c1137 100644 --- a/deltachat-rpc-server/npm-package/scripts/update_optional_dependencies_and_version.js +++ b/deltachat-rpc-server/npm-package/scripts/update_optional_dependencies_and_version.js @@ -50,7 +50,7 @@ package_json.version = version; package_json.optionalDependencies = {}; for (const { folder_name, package_name } of platform_package_names) { package_json.optionalDependencies[package_name] = is_local - ? `file:./platform-package/${folder_name}` + ? `file:${expected_cwd}/platform_package/${folder_name}` // npm seems to work better with an absolute path here : version; } From 288a1f0e8c4e9c4a9bc44825f45fad601b064e2a Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Mon, 6 May 2024 07:34:54 +0200 Subject: [PATCH 10/48] fix ts --- deltachat-rpc-server/npm-package/index.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deltachat-rpc-server/npm-package/index.d.ts b/deltachat-rpc-server/npm-package/index.d.ts index 6332355ba8..b32b2349f9 100644 --- a/deltachat-rpc-server/npm-package/index.d.ts +++ b/deltachat-rpc-server/npm-package/index.d.ts @@ -1,2 +1,2 @@ -export default async function getRPCServerPath(): string \ No newline at end of file +export default function getRPCServerPath(): Promise \ No newline at end of file From 972ab654b8cb3ea28d8265c8d3f6ce0d06e67a39 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Mon, 6 May 2024 08:46:44 +0200 Subject: [PATCH 11/48] fix resolving npm prebuild path and add option object to disable certain resolvers --- deltachat-rpc-server/npm-package/index.d.ts | 10 +++++++++- deltachat-rpc-server/npm-package/index.js | 21 ++++++++++++--------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/deltachat-rpc-server/npm-package/index.d.ts b/deltachat-rpc-server/npm-package/index.d.ts index b32b2349f9..6cc7dcee80 100644 --- a/deltachat-rpc-server/npm-package/index.d.ts +++ b/deltachat-rpc-server/npm-package/index.d.ts @@ -1,2 +1,10 @@ -export default function getRPCServerPath(): Promise \ No newline at end of file +export interface SearchOptions { + /** whether to disable looking for deltachat-rpc-server inside of $PATH */ + skipSearchInPath: boolean + + /** whether to disable the DELTA_CHAT_RPC_SERVER environment variable */ + disableEnvPath: boolean +} + +export default function getRPCServerPath(options: Partial): Promise \ No newline at end of file diff --git a/deltachat-rpc-server/npm-package/index.js b/deltachat-rpc-server/npm-package/index.js index 213b015ea8..513cb773ab 100644 --- a/deltachat-rpc-server/npm-package/index.js +++ b/deltachat-rpc-server/npm-package/index.js @@ -19,11 +19,14 @@ import { // Because this is not compiled by typescript, nodejs needs this stuff (` assert { type: "json" };`) import package_json from "./package.json" assert { type: "json" }; +import { createRequire } from "node:module"; + +const { resolve } = createRequire(import.meta.url); // find the rpc server -// - [ ] env var -// - [ ] in npm packages -// - [ ] in PATH -> but there we need extra version check +// - [X] env var +// - [X] in npm packages +// - [X] in PATH -> but there we need extra version check // exports // - [ ] expose from where the rpc server was loaded (env_var, prebuild or npm package) @@ -33,11 +36,9 @@ import package_json from "./package.json" assert { type: "json" }; function findRPCServerInNodeModules() { const arch = os.arch(); const operating_system = process.platform; - const package_name = `@deltachat/stdio-rpc-server-${operating_system}-${arch}`; - try { - return join(require.resolve(package_name), "deltachat-rpc-server"); + return resolve(package_name); } catch (error) { console.debug("findRpcServerInNodeModules", error); if (Object.keys(package_json.optionalDependencies).includes(package_name)) { @@ -48,9 +49,11 @@ function findRPCServerInNodeModules() { } } -export default async function findRPCServer() { +export default async function findRPCServer( + { skipSearchInPath, disableEnvPath } = { skipSearchInPath: false, disableEnvPath = false } +) { // 1. check if it is set as env var - if (process.env[ENV_VAR_NAME]) { + if (process.env[ENV_VAR_NAME] && !disableEnvPath) { try { if (!(await stat(process.env[ENV_VAR_NAME])).isFile()) { throw new Error( @@ -64,7 +67,7 @@ export default async function findRPCServer() { } // 2. check if it can be found in PATH - if (!process.env[SKIP_SEARCH_IN_PATH]) { + if (!process.env[SKIP_SEARCH_IN_PATH] && !skipSearchInPath) { const path_dirs = process.env["PATH"].split(/:|;/); // check cargo dir first const cargo_dirs = path_dirs.filter((p) => p.endsWith(".cargo/bin")); From fe0e7069eb475146dfcd0cdf36357a0619b542e5 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Mon, 6 May 2024 08:54:22 +0200 Subject: [PATCH 12/48] fix options --- deltachat-rpc-server/npm-package/index.d.ts | 2 +- deltachat-rpc-server/npm-package/index.js | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/deltachat-rpc-server/npm-package/index.d.ts b/deltachat-rpc-server/npm-package/index.d.ts index 6cc7dcee80..1b63ff10c2 100644 --- a/deltachat-rpc-server/npm-package/index.d.ts +++ b/deltachat-rpc-server/npm-package/index.d.ts @@ -7,4 +7,4 @@ export interface SearchOptions { disableEnvPath: boolean } -export default function getRPCServerPath(options: Partial): Promise \ No newline at end of file +export default function getRPCServerPath(options?: Partial): Promise \ No newline at end of file diff --git a/deltachat-rpc-server/npm-package/index.js b/deltachat-rpc-server/npm-package/index.js index 513cb773ab..46aeb6b098 100644 --- a/deltachat-rpc-server/npm-package/index.js +++ b/deltachat-rpc-server/npm-package/index.js @@ -50,8 +50,9 @@ function findRPCServerInNodeModules() { } export default async function findRPCServer( - { skipSearchInPath, disableEnvPath } = { skipSearchInPath: false, disableEnvPath = false } + options = { skipSearchInPath: false, disableEnvPath: false } ) { + const { skipSearchInPath, disableEnvPath } = options // 1. check if it is set as env var if (process.env[ENV_VAR_NAME] && !disableEnvPath) { try { @@ -97,9 +98,10 @@ export default async function findRPCServer( try { // for some unknown reason it is in stderr and not in stdout const { stderr } = await promisify(execFile)(executable, ["--version"]); - if (package_json.version !== stderr) { + const version = stderr.slice(0,stderr.indexOf('\n')) + if (package_json.version !== version) { throw new Error( - `version mismatch: (npm package: ${package_json.version}) (installed ${PATH_EXECUTABLE_NAME} version: ${stderr})` + `version mismatch: (npm package: ${package_json.version}) (installed ${PATH_EXECUTABLE_NAME} version: ${version})` ); } else { return executable; From 09f8d7a1b457cfe62708fba7f31dd90ed63a5b17 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Mon, 6 May 2024 08:58:06 +0200 Subject: [PATCH 13/48] add todo comment --- deltachat-rpc-server/npm-package/index.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/deltachat-rpc-server/npm-package/index.js b/deltachat-rpc-server/npm-package/index.js index 46aeb6b098..0eaedbe641 100644 --- a/deltachat-rpc-server/npm-package/index.js +++ b/deltachat-rpc-server/npm-package/index.js @@ -52,7 +52,8 @@ function findRPCServerInNodeModules() { export default async function findRPCServer( options = { skipSearchInPath: false, disableEnvPath: false } ) { - const { skipSearchInPath, disableEnvPath } = options + // @TODO: improve confusing naming of these options + const { skipSearchInPath, disableEnvPath } = options; // 1. check if it is set as env var if (process.env[ENV_VAR_NAME] && !disableEnvPath) { try { @@ -98,7 +99,7 @@ export default async function findRPCServer( try { // for some unknown reason it is in stderr and not in stdout const { stderr } = await promisify(execFile)(executable, ["--version"]); - const version = stderr.slice(0,stderr.indexOf('\n')) + const version = stderr.slice(0, stderr.indexOf("\n")); if (package_json.version !== version) { throw new Error( `version mismatch: (npm package: ${package_json.version}) (installed ${PATH_EXECUTABLE_NAME} version: ${version})` From a42cf32063d726fc31a485457763a95506669b8a Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Mon, 6 May 2024 09:21:46 +0200 Subject: [PATCH 14/48] add missing export in jsonrpc typescript package.json --- deltachat-jsonrpc/typescript/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/deltachat-jsonrpc/typescript/package.json b/deltachat-jsonrpc/typescript/package.json index a1010d5e97..4f76e7fd94 100644 --- a/deltachat-jsonrpc/typescript/package.json +++ b/deltachat-jsonrpc/typescript/package.json @@ -25,7 +25,8 @@ "exports": { ".": { "import": "./dist/deltachat.js", - "require": "./dist/deltachat.cjs" + "require": "./dist/deltachat.cjs", + "types": "./dist/deltachat.d.ts" } }, "license": "MPL-2.0", From 406d33b672ddb1dbde4105caea639ba2eafec2a0 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Tue, 7 May 2024 02:11:34 +0200 Subject: [PATCH 15/48] add highlevel interface "startDeltaChat" also fix prepack script --- deltachat-rpc-server/npm-package/index.d.ts | 38 +++++++++++-- deltachat-rpc-server/npm-package/index.js | 54 +++++++++++++++---- deltachat-rpc-server/npm-package/package.json | 9 ++-- .../npm-package/src/errors.js | 37 +++++++------ 4 files changed, 104 insertions(+), 34 deletions(-) diff --git a/deltachat-rpc-server/npm-package/index.d.ts b/deltachat-rpc-server/npm-package/index.d.ts index 1b63ff10c2..4307f5ab06 100644 --- a/deltachat-rpc-server/npm-package/index.d.ts +++ b/deltachat-rpc-server/npm-package/index.d.ts @@ -1,10 +1,38 @@ +import { StdioDeltaChat } from "@deltachat/jsonrpc-client"; export interface SearchOptions { - /** whether to disable looking for deltachat-rpc-server inside of $PATH */ - skipSearchInPath: boolean + /** whether to disable looking for deltachat-rpc-server inside of $PATH */ + skipSearchInPath: boolean; - /** whether to disable the DELTA_CHAT_RPC_SERVER environment variable */ - disableEnvPath: boolean + /** whether to disable the DELTA_CHAT_RPC_SERVER environment variable */ + disableEnvPath: boolean; } -export default function getRPCServerPath(options?: Partial): Promise \ No newline at end of file +/** + * + * @returns absolute path to deltachat-rpc-server binary + * @throws when it is not found + */ +export function getRPCServerPath( + options?: Partial +): Promise; + + + +export type DeltaChatOverJsonRpcServer = StdioDeltaChat & { + shutdown: () => Promise; +}; + + +/** + * + * @param directory directory for accounts folder + * @param options + */ +export function startDeltaChat(directory: string, options?: Partial ): Promise + + +export namespace FnTypes { + export type getRPCServerPath = typeof getRPCServerPath + export type startDeltaChat = typeof startDeltaChat +} \ No newline at end of file diff --git a/deltachat-rpc-server/npm-package/index.js b/deltachat-rpc-server/npm-package/index.js index 0eaedbe641..74342effff 100644 --- a/deltachat-rpc-server/npm-package/index.js +++ b/deltachat-rpc-server/npm-package/index.js @@ -1,5 +1,5 @@ //@ts-check -import { execFile } from "child_process"; +import { execFile, spawn } from "child_process"; import { stat, readdir } from "fs/promises"; import os from "os"; import { join } from "path"; @@ -13,6 +13,7 @@ import { } from "./src/const.js"; import { ENV_VAR_LOCATION_NOT_FOUND, + FAILED_TO_START_SERVER_EXECUTABLE, NPM_NOT_FOUND_SUPPORTED_PLATFORM_ERROR, NPM_NOT_FOUND_UNSUPPORTED_PLATFORM_ERROR, } from "./src/errors.js"; @@ -23,15 +24,11 @@ import { createRequire } from "node:module"; const { resolve } = createRequire(import.meta.url); -// find the rpc server -// - [X] env var -// - [X] in npm packages -// - [X] in PATH -> but there we need extra version check // exports // - [ ] expose from where the rpc server was loaded (env_var, prebuild or npm package) // - [ ] a raw starter that has a stdin/out handle thingie like desktop uses -// - [ ] a function that already wraps the stdio handle from aboe into the deltachat jsonrpc bindings +// - [X] a function that already wraps the stdio handle from above into the deltachat jsonrpc bindings function findRPCServerInNodeModules() { const arch = os.arch(); @@ -49,7 +46,8 @@ function findRPCServerInNodeModules() { } } -export default async function findRPCServer( +/** @type {import("./index").FnTypes.getRPCServerPath} */ +export async function getRPCServerPath( options = { skipSearchInPath: false, disableEnvPath: false } ) { // @TODO: improve confusing naming of these options @@ -120,6 +118,42 @@ export default async function findRPCServer( return findRPCServerInNodeModules(); } -// TODO script for local development (build for current platform and change link in package.json to be local) -// TODO script to build prebuild for current platform -// TODO disable PATH search in desktop (hardening, so it can not be easily replaced in production) +import { StdioDeltaChat } from "@deltachat/jsonrpc-client"; + +/** @type {import("./index").FnTypes.startDeltaChat} */ +export async function startDeltaChat(directory, options) { + const pathToServerBinary = await getRPCServerPath(options); + const server = spawn(pathToServerBinary, { + env: { + RUST_LOG: process.env.RUST_LOG || "info", + DC_ACCOUNTS_PATH: directory + }, + }); + + server.on("error", (err) => { + throw new Error(FAILED_TO_START_SERVER_EXECUTABLE(pathToServerBinary, err)); + }); + let shouldClose = false; + + server.on("exit", () => { + if (shouldClose) { + return; + } + throw new Error("Server quit"); + }); + + server.stderr.pipe(process.stderr); + + /** @type {import('./index').DeltaChatOverJsonRpcServer} */ + //@ts-expect-error + const dc = new StdioDeltaChat(server.stdin, server.stdout, true); + + dc.shutdown = async () => { + shouldClose = true; + if (!server.kill()) { + console.log("server termination failed"); + } + }; + + return dc; +} diff --git a/deltachat-rpc-server/npm-package/package.json b/deltachat-rpc-server/npm-package/package.json index 6a6103841c..92a38e8db3 100644 --- a/deltachat-rpc-server/npm-package/package.json +++ b/deltachat-rpc-server/npm-package/package.json @@ -1,15 +1,16 @@ { "type": "module", "name": "@deltachat/stdio-rpc-server", - "version": "1.136.3", + "version": "1.137.4", "license": "MPL-2.0", "main": "index.js", "types": "index.d.ts", "scripts": { - "prepack": "node update_optional_dependencies_and_version.js" + "prepack": "node scripts/update_optional_dependencies_and_version.js" }, "optionalDependencies": { - "@deltachat/stdio-rpc-server-darwin-arm64": "1.136.3", - "@deltachat/stdio-rpc-server-darwin-x64": "1.136.3" + }, + "peerDependencies": { + "@deltachat/jsonrpc-client": "*" } } \ No newline at end of file diff --git a/deltachat-rpc-server/npm-package/src/errors.js b/deltachat-rpc-server/npm-package/src/errors.js index 9455ce0712..52d8f115aa 100644 --- a/deltachat-rpc-server/npm-package/src/errors.js +++ b/deltachat-rpc-server/npm-package/src/errors.js @@ -1,34 +1,41 @@ //@ts-check -import {ENV_VAR_NAME} from "./const.js" +import { ENV_VAR_NAME } from "./const.js"; +const cargoInstallCommand = + "cargo install --git https://github.com/deltachat/deltachat-core-rust deltachat-rpc-server"; -const cargoInstallCommand = "cargo install --git https://github.com/deltachat/deltachat-core-rust deltachat-rpc-server" - -export function NPM_NOT_FOUND_SUPPORTED_PLATFORM_ERROR (package_name) { - - return `deltachat-rpc-server not found: +export function NPM_NOT_FOUND_SUPPORTED_PLATFORM_ERROR(package_name) { + return `deltachat-rpc-server not found: - Install it with "npm i ${package_name}" - or download/compile deltachat-rpc-server for your platform and - either put it into your PATH (for example with "${cargoInstallCommand}") - - or set the "${ENV_VAR_NAME}" env var to the path to deltachat-rpc-server"` + - or set the "${ENV_VAR_NAME}" env var to the path to deltachat-rpc-server"`; } -export function NPM_NOT_FOUND_UNSUPPORTED_PLATFORM_ERROR () { - - return `deltachat-rpc-server not found: +export function NPM_NOT_FOUND_UNSUPPORTED_PLATFORM_ERROR() { + return `deltachat-rpc-server not found: Unfortunately no prebuild is available for your system, so you need to provide deltachat-rpc-server yourself. - Download or Compile deltachat-rpc-server for your platform and - either put it into your PATH (for example with "${cargoInstallCommand}") - - or set the "${ENV_VAR_NAME}" env var to the path to deltachat-rpc-server"` + - or set the "${ENV_VAR_NAME}" env var to the path to deltachat-rpc-server"`; } -export function ENV_VAR_LOCATION_NOT_FOUND (error) { - return `deltachat-rpc-server not found in ${ENV_VAR_NAME}: +export function ENV_VAR_LOCATION_NOT_FOUND(error) { + return `deltachat-rpc-server not found in ${ENV_VAR_NAME}: Error: ${error} - Content of ${ENV_VAR_NAME}: "${process.env[ENV_VAR_NAME]}"` -} \ No newline at end of file + Content of ${ENV_VAR_NAME}: "${process.env[ENV_VAR_NAME]}"`; +} + +export function FAILED_TO_START_SERVER_EXECUTABLE(pathToServerBinary, error) { + return `Failed to start server executable at '${pathToServerBinary}', + + Error: ${error} + +Make sure the deltachat-rpc-server binary exists at this location +and you can start it with \`${pathToServerBinary} --version\``; +} From 11c2e76339fb10656d99156b99464a157d92bab9 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Tue, 7 May 2024 02:36:05 +0200 Subject: [PATCH 16/48] add usage example to readme --- deltachat-rpc-server/npm-package/Readme.md | 37 +++++++++++++++++----- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/deltachat-rpc-server/npm-package/Readme.md b/deltachat-rpc-server/npm-package/Readme.md index 81489a40a8..d24c385fb7 100644 --- a/deltachat-rpc-server/npm-package/Readme.md +++ b/deltachat-rpc-server/npm-package/Readme.md @@ -5,20 +5,42 @@ it does not use NAPI bindings but instead uses stdio executables to let you talk to core over jsonrpc over stdio. This simplifies cross-compilation and even reduces binary size (no CFFI layer and no NAPI layer). +## Usage + +``` +npm i @deltachat/stdio-rpc-server @deltachat/jsonrpc-client +``` + +```js +import { startDeltaChat } from "@deltachat/stdio-rpc-server"; +import { C } from "@deltachat/jsonrpc-client"; + +async function main() { + const dc = await startDeltaChat("deltachat-data"); + console.log(await dc.rpc.getSystemInfo()); +} +``` + +For a more complete example refer to https://github.com/deltachat-bot/echo/pull/69/files (TODO change link when pr is merged). + ## How to use on an unsupported platform + + ## How does it work when you install it NPM automatically installs platform dependent optional dependencies when `os` and `cpu` fields are set correctly. references: + - https://napi.rs/docs/deep-dive/release#3-the-native-addon-for-different-platforms-is-distributed-through-different-npm-packages, [webarchive version](https://web.archive.org/web/20240309234250/https://napi.rs/docs/deep-dive/release#3-the-native-addon-for-different-platforms-is-distributed-through-different-npm-packages) - https://docs.npmjs.com/cli/v6/configuring-npm/package-json#cpu - https://docs.npmjs.com/cli/v6/configuring-npm/package-json#os When you import this package it searches for the rpc server in the following locations and order: + 1. `DELTA_CHAT_RPC_SERVER` environment variable 2. in PATH - unless `DELTA_CHAT_SKIP_PATH=1` is specified @@ -29,11 +51,11 @@ When you import this package it searches for the rpc server in the following loc ## How do you built this package in CI - To build platform packages, run the `build_platform_package.py` script: - ``` - python3 build_platform_package.py - # example - python3 build_platform_package.py x86_64-apple-darwin - ``` + ``` + python3 build_platform_package.py + # example + python3 build_platform_package.py x86_64-apple-darwin + ``` - Then pass it as an artifact to the last CI action that publishes the main package. - upload all packages from `deltachat-rpc-server/npm-package/platform_package`. - then publish `deltachat-rpc-server/npm-package`, @@ -45,10 +67,9 @@ When you import this package it searches for the rpc server in the following loc You can not install the npm packet from the previous section locally, unless you have a local npm registry set up where you upload it too. This is why we have seperate scripts for making it work for local installation. - If you just need your host platform run `python scripts/make_local_dev_version.py` - - note: this clears the `platform_package` folder +- note: this clears the `platform_package` folder - (advanced) If you need more than one platform for local install you can just run `node scripts/update_optional_dependencies_and_version.js` after building multiple plaftorms with `build_platform_package.py` - ## Thanks to nlnet -The initial work on this package was funded by nlnet as part of the [Delta Tauri](https://nlnet.nl/project/DeltaTauri/) Project. \ No newline at end of file +The initial work on this package was funded by nlnet as part of the [Delta Tauri](https://nlnet.nl/project/DeltaTauri/) Project. From 335f6e1ef0e9b65b36720f19b88163f180edd9d3 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Tue, 7 May 2024 02:51:12 +0200 Subject: [PATCH 17/48] updates to imports --- deltachat-rpc-server/npm-package/index.js | 17 ++++++++--------- .../update_optional_dependencies_and_version.js | 6 +++--- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/deltachat-rpc-server/npm-package/index.js b/deltachat-rpc-server/npm-package/index.js index 74342effff..afe0d41951 100644 --- a/deltachat-rpc-server/npm-package/index.js +++ b/deltachat-rpc-server/npm-package/index.js @@ -1,10 +1,9 @@ //@ts-check -import { execFile, spawn } from "child_process"; -import { stat, readdir } from "fs/promises"; -import os from "os"; -import { join } from "path"; -import { basename } from "path/posix"; -import process from "process"; +import { execFile, spawn } from "node:child_process"; +import { stat, readdir } from "node:fs/promises"; +import os from "node:os"; +import { join , basename} from "node:path"; +import process from "node:process"; import { promisify } from "node:util"; import { ENV_VAR_NAME, @@ -18,13 +17,13 @@ import { NPM_NOT_FOUND_UNSUPPORTED_PLATFORM_ERROR, } from "./src/errors.js"; -// Because this is not compiled by typescript, nodejs needs this stuff (` assert { type: "json" };`) -import package_json from "./package.json" assert { type: "json" }; +// Because this is not compiled by typescript, esm needs this stuff (` with { type: "json" };`, +// nodejs still complains about it being experimental, but deno also uses it, so treefit bets taht it will become standard) +import package_json from "./package.json" with { type: "json" }; import { createRequire } from "node:module"; const { resolve } = createRequire(import.meta.url); - // exports // - [ ] expose from where the rpc server was loaded (env_var, prebuild or npm package) // - [ ] a raw starter that has a stdin/out handle thingie like desktop uses diff --git a/deltachat-rpc-server/npm-package/scripts/update_optional_dependencies_and_version.js b/deltachat-rpc-server/npm-package/scripts/update_optional_dependencies_and_version.js index 50e92c1137..1c30d48063 100644 --- a/deltachat-rpc-server/npm-package/scripts/update_optional_dependencies_and_version.js +++ b/deltachat-rpc-server/npm-package/scripts/update_optional_dependencies_and_version.js @@ -1,6 +1,6 @@ -import fs from "fs/promises"; -import { join, dirname } from "path"; -import { fileURLToPath } from "url"; +import fs from "node:fs/promises"; +import { join, dirname } from "node:path"; +import { fileURLToPath } from "node:url"; const expected_cwd = join(dirname(fileURLToPath(import.meta.url)), ".."); From bb409004f9671c26f476f2c8a16dfb8feb0b888e Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Tue, 7 May 2024 02:58:56 +0200 Subject: [PATCH 18/48] move code in attempt to make it cross compatible with deno --- deltachat-rpc-server/npm-package/index.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/deltachat-rpc-server/npm-package/index.js b/deltachat-rpc-server/npm-package/index.js index afe0d41951..f157637c07 100644 --- a/deltachat-rpc-server/npm-package/index.js +++ b/deltachat-rpc-server/npm-package/index.js @@ -2,7 +2,7 @@ import { execFile, spawn } from "node:child_process"; import { stat, readdir } from "node:fs/promises"; import os from "node:os"; -import { join , basename} from "node:path"; +import { join, basename } from "node:path"; import process from "node:process"; import { promisify } from "node:util"; import { @@ -22,8 +22,6 @@ import { import package_json from "./package.json" with { type: "json" }; import { createRequire } from "node:module"; -const { resolve } = createRequire(import.meta.url); - // exports // - [ ] expose from where the rpc server was loaded (env_var, prebuild or npm package) // - [ ] a raw starter that has a stdin/out handle thingie like desktop uses @@ -34,6 +32,7 @@ function findRPCServerInNodeModules() { const operating_system = process.platform; const package_name = `@deltachat/stdio-rpc-server-${operating_system}-${arch}`; try { + const { resolve } = createRequire(import.meta.url); return resolve(package_name); } catch (error) { console.debug("findRpcServerInNodeModules", error); @@ -125,7 +124,7 @@ export async function startDeltaChat(directory, options) { const server = spawn(pathToServerBinary, { env: { RUST_LOG: process.env.RUST_LOG || "info", - DC_ACCOUNTS_PATH: directory + DC_ACCOUNTS_PATH: directory, }, }); From ddd17b7396a502c1ea55e26bd00e86a2d0951f68 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Tue, 7 May 2024 03:16:22 +0200 Subject: [PATCH 19/48] expose pathToServerBinary in DeltaChatOverJsonRpcServer --- deltachat-rpc-server/npm-package/index.d.ts | 1 + deltachat-rpc-server/npm-package/index.js | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/deltachat-rpc-server/npm-package/index.d.ts b/deltachat-rpc-server/npm-package/index.d.ts index 4307f5ab06..a3cd2c421a 100644 --- a/deltachat-rpc-server/npm-package/index.d.ts +++ b/deltachat-rpc-server/npm-package/index.d.ts @@ -21,6 +21,7 @@ export function getRPCServerPath( export type DeltaChatOverJsonRpcServer = StdioDeltaChat & { shutdown: () => Promise; + readonly pathToServerBinary: string; }; diff --git a/deltachat-rpc-server/npm-package/index.js b/deltachat-rpc-server/npm-package/index.js index f157637c07..1a9b229636 100644 --- a/deltachat-rpc-server/npm-package/index.js +++ b/deltachat-rpc-server/npm-package/index.js @@ -23,7 +23,6 @@ import package_json from "./package.json" with { type: "json" }; import { createRequire } from "node:module"; // exports -// - [ ] expose from where the rpc server was loaded (env_var, prebuild or npm package) // - [ ] a raw starter that has a stdin/out handle thingie like desktop uses // - [X] a function that already wraps the stdio handle from above into the deltachat jsonrpc bindings @@ -153,5 +152,7 @@ export async function startDeltaChat(directory, options) { } }; + dc.pathToServerBinary = pathToServerBinary + return dc; } From 816005a709b097a4e63580257b6d29b46ca4f928 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Tue, 7 May 2024 03:21:46 +0200 Subject: [PATCH 20/48] add temporary logging --- deltachat-rpc-server/npm-package/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/deltachat-rpc-server/npm-package/index.js b/deltachat-rpc-server/npm-package/index.js index 1a9b229636..f7c8f52cab 100644 --- a/deltachat-rpc-server/npm-package/index.js +++ b/deltachat-rpc-server/npm-package/index.js @@ -120,6 +120,7 @@ import { StdioDeltaChat } from "@deltachat/jsonrpc-client"; /** @type {import("./index").FnTypes.startDeltaChat} */ export async function startDeltaChat(directory, options) { const pathToServerBinary = await getRPCServerPath(options); + console.log('{pathToServerBinary}:', pathToServerBinary); const server = spawn(pathToServerBinary, { env: { RUST_LOG: process.env.RUST_LOG || "info", From 078e5f38b3dab854ee52a4e7449c03d174a33108 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Tue, 7 May 2024 03:23:57 +0200 Subject: [PATCH 21/48] rm temp log line again --- deltachat-rpc-server/npm-package/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/deltachat-rpc-server/npm-package/index.js b/deltachat-rpc-server/npm-package/index.js index f7c8f52cab..1a9b229636 100644 --- a/deltachat-rpc-server/npm-package/index.js +++ b/deltachat-rpc-server/npm-package/index.js @@ -120,7 +120,6 @@ import { StdioDeltaChat } from "@deltachat/jsonrpc-client"; /** @type {import("./index").FnTypes.startDeltaChat} */ export async function startDeltaChat(directory, options) { const pathToServerBinary = await getRPCServerPath(options); - console.log('{pathToServerBinary}:', pathToServerBinary); const server = spawn(pathToServerBinary, { env: { RUST_LOG: process.env.RUST_LOG || "info", From f8478a5a816074ebee1581f5482e566610139e8b Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Tue, 7 May 2024 03:24:37 +0200 Subject: [PATCH 22/48] ignore ts error --- deltachat-rpc-server/npm-package/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/deltachat-rpc-server/npm-package/index.js b/deltachat-rpc-server/npm-package/index.js index 1a9b229636..12a5900de4 100644 --- a/deltachat-rpc-server/npm-package/index.js +++ b/deltachat-rpc-server/npm-package/index.js @@ -152,6 +152,7 @@ export async function startDeltaChat(directory, options) { } }; + //@ts-expect-error dc.pathToServerBinary = pathToServerBinary return dc; From 2552ae7b8dfeefa2695aed93ad51a48db48814b2 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Wed, 8 May 2024 18:58:21 +0200 Subject: [PATCH 23/48] hint about min nodejs version --- deltachat-rpc-server/npm-package/Readme.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/deltachat-rpc-server/npm-package/Readme.md b/deltachat-rpc-server/npm-package/Readme.md index d24c385fb7..6e62e79a52 100644 --- a/deltachat-rpc-server/npm-package/Readme.md +++ b/deltachat-rpc-server/npm-package/Readme.md @@ -7,6 +7,8 @@ This simplifies cross-compilation and even reduces binary size (no CFFI layer an ## Usage +> The **minimum** nodejs version for this package is `20.11` + ``` npm i @deltachat/stdio-rpc-server @deltachat/jsonrpc-client ``` From 32328483d6de215d5614f785884bba4275b92ef8 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Wed, 8 May 2024 21:15:21 +0200 Subject: [PATCH 24/48] Split up python module and add a script to pack already built binary. --- .../scripts/build_platform_package.py | 39 ++-------------- .../scripts/make_local_dev_version.py | 2 +- .../scripts/pack_binary_for_platform.py | 44 +++++++++++++++++++ .../scripts/src/convert_platform.py | 17 +++++++ .../npm-package/scripts/src/make_package.py | 24 ++++++++++ 5 files changed, 89 insertions(+), 37 deletions(-) create mode 100644 deltachat-rpc-server/npm-package/scripts/pack_binary_for_platform.py create mode 100644 deltachat-rpc-server/npm-package/scripts/src/convert_platform.py create mode 100644 deltachat-rpc-server/npm-package/scripts/src/make_package.py diff --git a/deltachat-rpc-server/npm-package/scripts/build_platform_package.py b/deltachat-rpc-server/npm-package/scripts/build_platform_package.py index 1a97bb0274..d6ff199666 100644 --- a/deltachat-rpc-server/npm-package/scripts/build_platform_package.py +++ b/deltachat-rpc-server/npm-package/scripts/build_platform_package.py @@ -2,8 +2,8 @@ from sys import argv from os import path, makedirs, chdir import json -import tomllib from shutil import copy +from src.make_package import write_package_json # ensure correct working directory chdir(path.join(path.dirname(path.abspath(__file__)), "../")) @@ -62,39 +62,6 @@ def binary_path(binary_name): copy(my_binary_path, platform_path + "/" + my_binary_name) -# read version -tomlfile = open("../Cargo.toml", 'rb') -version = tomllib.load(tomlfile)['package']['version'] - # make a package.json for it -[cpu_arch, vendor, os] = target.split("-") - -def convert_cpu_arch_to_npm_cpu_arch(arch): - if arch == "x86_64": - return "x64" - if arch == "i686": - return "i32" - if arch == "aarch64": - return "arm64" - print("architecture might not be known by nodejs, please make sure it can be returned by 'process.arch':", arch) - return arch - -def convert_os_to_npm_os(os): - if os == "windows": - return "win32" - if os == "darwin" or os == "linux": - return os - print("architecture might not be known by nodejs, please make sure it can be returned by 'process.platform':", os) - return os - -package_json = dict({ - "name": "@deltachat/stdio-rpc-server-" + convert_os_to_npm_os(os) + "-" + convert_cpu_arch_to_npm_cpu_arch(cpu_arch), - "version": version, - "os": [convert_os_to_npm_os(os)], - "cpu": [convert_cpu_arch_to_npm_cpu_arch(cpu_arch)], - "main": my_binary_name, - "license": "MPL-2.0" -}) - -file = open(platform_path + "/package.json", 'w') -file.write(json.dumps(package_json, indent=4)) \ No newline at end of file + +write_package_json(platform_path, target, my_binary_name) \ No newline at end of file diff --git a/deltachat-rpc-server/npm-package/scripts/make_local_dev_version.py b/deltachat-rpc-server/npm-package/scripts/make_local_dev_version.py index 05ded16a8e..1f8af7319f 100644 --- a/deltachat-rpc-server/npm-package/scripts/make_local_dev_version.py +++ b/deltachat-rpc-server/npm-package/scripts/make_local_dev_version.py @@ -12,7 +12,7 @@ chdir(path.join(path.dirname(path.abspath(__file__)), "../")) # get host target with "rustc -vV" -output = subprocess.run(["rustc","-vV"], capture_output=True) +output = subprocess.run(["rustc", "-vV"], capture_output=True) host_target = re.search('host: ([-\\w]*)', output.stdout.decode("utf-8")).group(1) print("host target to build for is:", host_target) diff --git a/deltachat-rpc-server/npm-package/scripts/pack_binary_for_platform.py b/deltachat-rpc-server/npm-package/scripts/pack_binary_for_platform.py new file mode 100644 index 0000000000..0b441c224a --- /dev/null +++ b/deltachat-rpc-server/npm-package/scripts/pack_binary_for_platform.py @@ -0,0 +1,44 @@ +import subprocess +from sys import argv +from os import path, makedirs, chdir +import json +from shutil import copy +from src.make_package import write_package_json + +# ensure correct working directory +chdir(path.join(path.dirname(path.abspath(__file__)), "../")) + +if len(argv) < 3: + print("First argument should be target architecture as required by cargo") + print("Second argument should be the location of th built binary (binary_path)") + exit(1) + +target = argv[1].strip() +binary_path = argv[2].strip() + +output = subprocess.run(["rustup","target","list"], capture_output=True) +available_targets = output.stdout.decode("utf-8") + +if available_targets.find(target) == -1: + print("target", target, "is not known / not valid") + exit(1) + + +newpath = r'platform_package' +if not path.exists(newpath): + makedirs(newpath) + +# make new folder + +platform_path = 'platform_package/' + target +if not path.exists(platform_path): + makedirs(platform_path) + +# copy binary it over + +my_binary_name = path.basename(binary_path) +copy(binary_path, platform_path + "/" + my_binary_name) + +# make a package.json for it + +write_package_json(platform_path, target, my_binary_name) \ No newline at end of file diff --git a/deltachat-rpc-server/npm-package/scripts/src/convert_platform.py b/deltachat-rpc-server/npm-package/scripts/src/convert_platform.py new file mode 100644 index 0000000000..0f077faf58 --- /dev/null +++ b/deltachat-rpc-server/npm-package/scripts/src/convert_platform.py @@ -0,0 +1,17 @@ +def convert_cpu_arch_to_npm_cpu_arch(arch): + if arch == "x86_64": + return "x64" + if arch == "i686": + return "i32" + if arch == "aarch64": + return "arm64" + print("architecture might not be known by nodejs, please make sure it can be returned by 'process.arch':", arch) + return arch + +def convert_os_to_npm_os(os): + if os == "windows": + return "win32" + if os == "darwin" or os == "linux": + return os + print("architecture might not be known by nodejs, please make sure it can be returned by 'process.platform':", os) + return os \ No newline at end of file diff --git a/deltachat-rpc-server/npm-package/scripts/src/make_package.py b/deltachat-rpc-server/npm-package/scripts/src/make_package.py new file mode 100644 index 0000000000..9cfe3c6c16 --- /dev/null +++ b/deltachat-rpc-server/npm-package/scripts/src/make_package.py @@ -0,0 +1,24 @@ +import tomllib +import json + +from .convert_platform import convert_cpu_arch_to_npm_cpu_arch, convert_os_to_npm_os + +def write_package_json(platform_path, rust_target, my_binary_name): + [cpu_arch, vendor, os] = rust_target.split("-") + + # read version + tomlfile = open("../../Cargo.toml", 'rb') + version = tomllib.load(tomlfile)['package']['version'] + + package_json = dict({ + "name": "@deltachat/stdio-rpc-server-" + convert_os_to_npm_os(os) + "-" + convert_cpu_arch_to_npm_cpu_arch(cpu_arch), + "version": version, + "os": [convert_os_to_npm_os(os)], + "cpu": [convert_cpu_arch_to_npm_cpu_arch(cpu_arch)], + "main": my_binary_name, + "license": "MPL-2.0" + }) + + file = open(platform_path + "/package.json", 'w') + file.write(json.dumps(package_json, indent=4)) + From 31bf2a15d3a674ee984347d0ac9d6dde2db15e69 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Fri, 10 May 2024 00:04:27 +0200 Subject: [PATCH 25/48] add ci to make npm packages --- .github/workflows/deltachat-rpc-server.yml | 113 +++++++++++++++++++++ 1 file changed, 113 insertions(+) diff --git a/.github/workflows/deltachat-rpc-server.yml b/.github/workflows/deltachat-rpc-server.yml index 78a3fbd331..a484f56e5e 100644 --- a/.github/workflows/deltachat-rpc-server.yml +++ b/.github/workflows/deltachat-rpc-server.yml @@ -266,3 +266,116 @@ jobs: - name: Publish deltachat-rpc-client to PyPI if: github.event_name == 'release' uses: pypa/gh-action-pypi-publish@release/v1 + + publish_npm_package: + name: Build & Publish npm prebuilds and deltachat-rpc-server + needs: ["build_linux", "build_windows", "build_macos"] + runs-on: "ubuntu-latest" + steps: + - uses: actions/checkout@v4 + with: + show-progress: false + + - name: Download Linux aarch64 binary + uses: actions/download-artifact@v4 + with: + name: deltachat-rpc-server-aarch64-linux + path: deltachat-rpc-server-aarch64-linux.d + + - name: Download Linux armv7l binary + uses: actions/download-artifact@v4 + with: + name: deltachat-rpc-server-armv7l-linux + path: deltachat-rpc-server-armv7l-linux.d + + - name: Download Linux armv6l binary + uses: actions/download-artifact@v4 + with: + name: deltachat-rpc-server-armv6l-linux + path: deltachat-rpc-server-armv6l-linux.d + + - name: Download Linux i686 binary + uses: actions/download-artifact@v4 + with: + name: deltachat-rpc-server-i686-linux + path: deltachat-rpc-server-i686-linux.d + + - name: Download Linux x86_64 binary + uses: actions/download-artifact@v4 + with: + name: deltachat-rpc-server-x86_64-linux + path: deltachat-rpc-server-x86_64-linux.d + + - name: Download Win32 binary + uses: actions/download-artifact@v4 + with: + name: deltachat-rpc-server-win32 + path: deltachat-rpc-server-win32.d + + - name: Download Win64 binary + uses: actions/download-artifact@v4 + with: + name: deltachat-rpc-server-win64 + path: deltachat-rpc-server-win64.d + + - name: Download macOS binary for x86_64 + uses: actions/download-artifact@v4 + with: + name: deltachat-rpc-server-x86_64-macos + path: deltachat-rpc-server-x86_64-macos.d + + - name: Download macOS binary for aarch64 + uses: actions/download-artifact@v4 + with: + name: deltachat-rpc-server-aarch64-macos + path: deltachat-rpc-server-aarch64-macos.d + + - name: Download Android binary for arm64-v8a + uses: actions/download-artifact@v4 + with: + name: deltachat-rpc-server-arm64-v8a-android + path: deltachat-rpc-server-arm64-v8a-android.d + + - name: Download Android binary for armeabi-v7a + uses: actions/download-artifact@v4 + with: + name: deltachat-rpc-server-armeabi-v7a-android + path: deltachat-rpc-server-armeabi-v7a-android.d + + - name: make npm packets for prebuilds and `@deltachat/stdio-rpc-server` + run: | + cd deltachat-rpc-server/npm-package + + python scripts/pack_binary_for_platform.py aarch64-unknown-linux-musl deltachat-rpc-server-aarch64-linux.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py armv7-unknown-linux-musleabihf deltachat-rpc-server-armv7l-linux.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py arm-unknown-linux-musleabihf deltachat-rpc-server-armv6l-linux.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py i686-unknown-linux-musl deltachat-rpc-server-i686-linux.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py x86_64-unknown-linux-musl deltachat-rpc-server-x86_64-linux.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py i686-pc-windows-gnu deltachat-rpc-server-win32.d/deltachat-rpc-server.exe + python scripts/pack_binary_for_platform.py x86_64-pc-windows-gnu deltachat-rpc-server-win64.d/deltachat-rpc-server.exe + python scripts/pack_binary_for_platform.py x86_64-apple-darwin deltachat-rpc-server-x86_64-macos.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py aarch64-apple-darwin deltachat-rpc-server-aarch64-macos.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py aarch64-linux-android deltachat-rpc-server-arm64-v8a-android.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py armv7-linux-androideabi deltachat-rpc-server-armeabi-v7a-android.d/deltachat-rpc-server + + ls -lah platform_package + + for platform in ./platform_package/*; do npm pack "$platform"; done + npm pack + ls -lah + + - name: Upload npm packets to the GitHub release + if: github.event_name == 'release' + env: + GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" + run: | + gh release upload ${{ github.ref_name }} \ + --repo ${{ github.repository }} \ + *.tgz + + - name: Publish npm packets for prebuilds and `@deltachat/stdio-rpc-server` + if: github.event_name == 'release' + run: | + ls -lah platform_package + + for platform in *.tgz; do npm publish "$platform"; done From 6d82bc4ee93e83360ad302304cbe05a9cfc5c52e Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Fri, 10 May 2024 00:18:13 +0200 Subject: [PATCH 26/48] change trigger condition of release ci to test it --- .github/workflows/deltachat-rpc-server.yml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/deltachat-rpc-server.yml b/.github/workflows/deltachat-rpc-server.yml index a484f56e5e..f4a03a4fd5 100644 --- a/.github/workflows/deltachat-rpc-server.yml +++ b/.github/workflows/deltachat-rpc-server.yml @@ -12,10 +12,14 @@ concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true -on: - workflow_dispatch: - release: - types: [published] +# on: +# workflow_dispatch: +# release: +# types: [published] +pull_request: + push: + branches: + - main jobs: # Build a version statically linked against musl libc From bcae52db4c9e1249b8a6ef00a7d5f45952a441cd Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Fri, 10 May 2024 00:28:12 +0200 Subject: [PATCH 27/48] try fix yaml syntax --- .github/workflows/deltachat-rpc-server.yml | 216 ++++++++++----------- 1 file changed, 108 insertions(+), 108 deletions(-) diff --git a/.github/workflows/deltachat-rpc-server.yml b/.github/workflows/deltachat-rpc-server.yml index f4a03a4fd5..17852ada31 100644 --- a/.github/workflows/deltachat-rpc-server.yml +++ b/.github/workflows/deltachat-rpc-server.yml @@ -275,111 +275,111 @@ jobs: name: Build & Publish npm prebuilds and deltachat-rpc-server needs: ["build_linux", "build_windows", "build_macos"] runs-on: "ubuntu-latest" - steps: - - uses: actions/checkout@v4 - with: - show-progress: false - - - name: Download Linux aarch64 binary - uses: actions/download-artifact@v4 - with: - name: deltachat-rpc-server-aarch64-linux - path: deltachat-rpc-server-aarch64-linux.d - - - name: Download Linux armv7l binary - uses: actions/download-artifact@v4 - with: - name: deltachat-rpc-server-armv7l-linux - path: deltachat-rpc-server-armv7l-linux.d - - - name: Download Linux armv6l binary - uses: actions/download-artifact@v4 - with: - name: deltachat-rpc-server-armv6l-linux - path: deltachat-rpc-server-armv6l-linux.d - - - name: Download Linux i686 binary - uses: actions/download-artifact@v4 - with: - name: deltachat-rpc-server-i686-linux - path: deltachat-rpc-server-i686-linux.d - - - name: Download Linux x86_64 binary - uses: actions/download-artifact@v4 - with: - name: deltachat-rpc-server-x86_64-linux - path: deltachat-rpc-server-x86_64-linux.d - - - name: Download Win32 binary - uses: actions/download-artifact@v4 - with: - name: deltachat-rpc-server-win32 - path: deltachat-rpc-server-win32.d - - - name: Download Win64 binary - uses: actions/download-artifact@v4 - with: - name: deltachat-rpc-server-win64 - path: deltachat-rpc-server-win64.d - - - name: Download macOS binary for x86_64 - uses: actions/download-artifact@v4 - with: - name: deltachat-rpc-server-x86_64-macos - path: deltachat-rpc-server-x86_64-macos.d - - - name: Download macOS binary for aarch64 - uses: actions/download-artifact@v4 - with: - name: deltachat-rpc-server-aarch64-macos - path: deltachat-rpc-server-aarch64-macos.d - - - name: Download Android binary for arm64-v8a - uses: actions/download-artifact@v4 - with: - name: deltachat-rpc-server-arm64-v8a-android - path: deltachat-rpc-server-arm64-v8a-android.d - - - name: Download Android binary for armeabi-v7a - uses: actions/download-artifact@v4 - with: - name: deltachat-rpc-server-armeabi-v7a-android - path: deltachat-rpc-server-armeabi-v7a-android.d - - - name: make npm packets for prebuilds and `@deltachat/stdio-rpc-server` - run: | - cd deltachat-rpc-server/npm-package - - python scripts/pack_binary_for_platform.py aarch64-unknown-linux-musl deltachat-rpc-server-aarch64-linux.d/deltachat-rpc-server - python scripts/pack_binary_for_platform.py armv7-unknown-linux-musleabihf deltachat-rpc-server-armv7l-linux.d/deltachat-rpc-server - python scripts/pack_binary_for_platform.py arm-unknown-linux-musleabihf deltachat-rpc-server-armv6l-linux.d/deltachat-rpc-server - python scripts/pack_binary_for_platform.py i686-unknown-linux-musl deltachat-rpc-server-i686-linux.d/deltachat-rpc-server - python scripts/pack_binary_for_platform.py x86_64-unknown-linux-musl deltachat-rpc-server-x86_64-linux.d/deltachat-rpc-server - python scripts/pack_binary_for_platform.py i686-pc-windows-gnu deltachat-rpc-server-win32.d/deltachat-rpc-server.exe - python scripts/pack_binary_for_platform.py x86_64-pc-windows-gnu deltachat-rpc-server-win64.d/deltachat-rpc-server.exe - python scripts/pack_binary_for_platform.py x86_64-apple-darwin deltachat-rpc-server-x86_64-macos.d/deltachat-rpc-server - python scripts/pack_binary_for_platform.py aarch64-apple-darwin deltachat-rpc-server-aarch64-macos.d/deltachat-rpc-server - python scripts/pack_binary_for_platform.py aarch64-linux-android deltachat-rpc-server-arm64-v8a-android.d/deltachat-rpc-server - python scripts/pack_binary_for_platform.py armv7-linux-androideabi deltachat-rpc-server-armeabi-v7a-android.d/deltachat-rpc-server - - ls -lah platform_package - - for platform in ./platform_package/*; do npm pack "$platform"; done - npm pack - ls -lah - - - name: Upload npm packets to the GitHub release - if: github.event_name == 'release' - env: - GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" - run: | - gh release upload ${{ github.ref_name }} \ - --repo ${{ github.repository }} \ - *.tgz - - - name: Publish npm packets for prebuilds and `@deltachat/stdio-rpc-server` - if: github.event_name == 'release' - run: | - ls -lah platform_package - - for platform in *.tgz; do npm publish "$platform"; done + steps: + - uses: actions/checkout@v4 + with: + show-progress: false + + - name: Download Linux aarch64 binary + uses: actions/download-artifact@v4 + with: + name: deltachat-rpc-server-aarch64-linux + path: deltachat-rpc-server-aarch64-linux.d + + - name: Download Linux armv7l binary + uses: actions/download-artifact@v4 + with: + name: deltachat-rpc-server-armv7l-linux + path: deltachat-rpc-server-armv7l-linux.d + + - name: Download Linux armv6l binary + uses: actions/download-artifact@v4 + with: + name: deltachat-rpc-server-armv6l-linux + path: deltachat-rpc-server-armv6l-linux.d + + - name: Download Linux i686 binary + uses: actions/download-artifact@v4 + with: + name: deltachat-rpc-server-i686-linux + path: deltachat-rpc-server-i686-linux.d + + - name: Download Linux x86_64 binary + uses: actions/download-artifact@v4 + with: + name: deltachat-rpc-server-x86_64-linux + path: deltachat-rpc-server-x86_64-linux.d + + - name: Download Win32 binary + uses: actions/download-artifact@v4 + with: + name: deltachat-rpc-server-win32 + path: deltachat-rpc-server-win32.d + + - name: Download Win64 binary + uses: actions/download-artifact@v4 + with: + name: deltachat-rpc-server-win64 + path: deltachat-rpc-server-win64.d + + - name: Download macOS binary for x86_64 + uses: actions/download-artifact@v4 + with: + name: deltachat-rpc-server-x86_64-macos + path: deltachat-rpc-server-x86_64-macos.d + + - name: Download macOS binary for aarch64 + uses: actions/download-artifact@v4 + with: + name: deltachat-rpc-server-aarch64-macos + path: deltachat-rpc-server-aarch64-macos.d + + - name: Download Android binary for arm64-v8a + uses: actions/download-artifact@v4 + with: + name: deltachat-rpc-server-arm64-v8a-android + path: deltachat-rpc-server-arm64-v8a-android.d + + - name: Download Android binary for armeabi-v7a + uses: actions/download-artifact@v4 + with: + name: deltachat-rpc-server-armeabi-v7a-android + path: deltachat-rpc-server-armeabi-v7a-android.d + + - name: make npm packets for prebuilds and `@deltachat/stdio-rpc-server` + run: | + cd deltachat-rpc-server/npm-package + + python scripts/pack_binary_for_platform.py aarch64-unknown-linux-musl deltachat-rpc-server-aarch64-linux.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py armv7-unknown-linux-musleabihf deltachat-rpc-server-armv7l-linux.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py arm-unknown-linux-musleabihf deltachat-rpc-server-armv6l-linux.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py i686-unknown-linux-musl deltachat-rpc-server-i686-linux.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py x86_64-unknown-linux-musl deltachat-rpc-server-x86_64-linux.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py i686-pc-windows-gnu deltachat-rpc-server-win32.d/deltachat-rpc-server.exe + python scripts/pack_binary_for_platform.py x86_64-pc-windows-gnu deltachat-rpc-server-win64.d/deltachat-rpc-server.exe + python scripts/pack_binary_for_platform.py x86_64-apple-darwin deltachat-rpc-server-x86_64-macos.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py aarch64-apple-darwin deltachat-rpc-server-aarch64-macos.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py aarch64-linux-android deltachat-rpc-server-arm64-v8a-android.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py armv7-linux-androideabi deltachat-rpc-server-armeabi-v7a-android.d/deltachat-rpc-server + + ls -lah platform_package + + for platform in ./platform_package/*; do npm pack "$platform"; done + npm pack + ls -lah + + - name: Upload npm packets to the GitHub release + if: github.event_name == 'release' + env: + GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" + run: | + gh release upload ${{ github.ref_name }} \ + --repo ${{ github.repository }} \ + *.tgz + + - name: Publish npm packets for prebuilds and `@deltachat/stdio-rpc-server` + if: github.event_name == 'release' + run: | + ls -lah platform_package + + for platform in *.tgz; do npm publish "$platform"; done From 18f3143d715f12db33df5ec5083846fe57a95cee Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Fri, 10 May 2024 00:30:11 +0200 Subject: [PATCH 28/48] fix ci yaml --- .github/workflows/deltachat-rpc-server.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/deltachat-rpc-server.yml b/.github/workflows/deltachat-rpc-server.yml index 17852ada31..72807b9689 100644 --- a/.github/workflows/deltachat-rpc-server.yml +++ b/.github/workflows/deltachat-rpc-server.yml @@ -16,10 +16,11 @@ concurrency: # workflow_dispatch: # release: # types: [published] -pull_request: - push: - branches: - - main +on: + pull_request: + push: + branches: + - main jobs: # Build a version statically linked against musl libc From f4954b36b4070ecc9c9c73520a8ea12a4ffcb7fc Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Fri, 10 May 2024 01:20:13 +0200 Subject: [PATCH 29/48] try to fix ci: change python comand to use new version --- .github/workflows/deltachat-rpc-server.yml | 24 ++++++++++++---------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/.github/workflows/deltachat-rpc-server.yml b/.github/workflows/deltachat-rpc-server.yml index 72807b9689..69c6a48547 100644 --- a/.github/workflows/deltachat-rpc-server.yml +++ b/.github/workflows/deltachat-rpc-server.yml @@ -351,17 +351,19 @@ jobs: run: | cd deltachat-rpc-server/npm-package - python scripts/pack_binary_for_platform.py aarch64-unknown-linux-musl deltachat-rpc-server-aarch64-linux.d/deltachat-rpc-server - python scripts/pack_binary_for_platform.py armv7-unknown-linux-musleabihf deltachat-rpc-server-armv7l-linux.d/deltachat-rpc-server - python scripts/pack_binary_for_platform.py arm-unknown-linux-musleabihf deltachat-rpc-server-armv6l-linux.d/deltachat-rpc-server - python scripts/pack_binary_for_platform.py i686-unknown-linux-musl deltachat-rpc-server-i686-linux.d/deltachat-rpc-server - python scripts/pack_binary_for_platform.py x86_64-unknown-linux-musl deltachat-rpc-server-x86_64-linux.d/deltachat-rpc-server - python scripts/pack_binary_for_platform.py i686-pc-windows-gnu deltachat-rpc-server-win32.d/deltachat-rpc-server.exe - python scripts/pack_binary_for_platform.py x86_64-pc-windows-gnu deltachat-rpc-server-win64.d/deltachat-rpc-server.exe - python scripts/pack_binary_for_platform.py x86_64-apple-darwin deltachat-rpc-server-x86_64-macos.d/deltachat-rpc-server - python scripts/pack_binary_for_platform.py aarch64-apple-darwin deltachat-rpc-server-aarch64-macos.d/deltachat-rpc-server - python scripts/pack_binary_for_platform.py aarch64-linux-android deltachat-rpc-server-arm64-v8a-android.d/deltachat-rpc-server - python scripts/pack_binary_for_platform.py armv7-linux-androideabi deltachat-rpc-server-armeabi-v7a-android.d/deltachat-rpc-server + python3 --version + + python3 scripts/pack_binary_for_platform.py aarch64-unknown-linux-musl deltachat-rpc-server-aarch64-linux.d/deltachat-rpc-server + python3 scripts/pack_binary_for_platform.py armv7-unknown-linux-musleabihf deltachat-rpc-server-armv7l-linux.d/deltachat-rpc-server + python3 scripts/pack_binary_for_platform.py arm-unknown-linux-musleabihf deltachat-rpc-server-armv6l-linux.d/deltachat-rpc-server + python3 scripts/pack_binary_for_platform.py i686-unknown-linux-musl deltachat-rpc-server-i686-linux.d/deltachat-rpc-server + python3 scripts/pack_binary_for_platform.py x86_64-unknown-linux-musl deltachat-rpc-server-x86_64-linux.d/deltachat-rpc-server + python3 scripts/pack_binary_for_platform.py i686-pc-windows-gnu deltachat-rpc-server-win32.d/deltachat-rpc-server.exe + python3 scripts/pack_binary_for_platform.py x86_64-pc-windows-gnu deltachat-rpc-server-win64.d/deltachat-rpc-server.exe + python3 scripts/pack_binary_for_platform.py x86_64-apple-darwin deltachat-rpc-server-x86_64-macos.d/deltachat-rpc-server + python3 scripts/pack_binary_for_platform.py aarch64-apple-darwin deltachat-rpc-server-aarch64-macos.d/deltachat-rpc-server + python3 scripts/pack_binary_for_platform.py aarch64-linux-android deltachat-rpc-server-arm64-v8a-android.d/deltachat-rpc-server + python3 scripts/pack_binary_for_platform.py armv7-linux-androideabi deltachat-rpc-server-armeabi-v7a-android.d/deltachat-rpc-server ls -lah platform_package From 22cc1102ac6ccdc7f74b24c8dfa4d818b13ebbb1 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Fri, 10 May 2024 02:02:54 +0200 Subject: [PATCH 30/48] ci: fix python version ci: upload to artifacts --- .github/workflows/deltachat-rpc-server.yml | 34 ++++++++++++++-------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/.github/workflows/deltachat-rpc-server.yml b/.github/workflows/deltachat-rpc-server.yml index 69c6a48547..337a0d2025 100644 --- a/.github/workflows/deltachat-rpc-server.yml +++ b/.github/workflows/deltachat-rpc-server.yml @@ -280,6 +280,9 @@ jobs: - uses: actions/checkout@v4 with: show-progress: false + - uses: actions/setup-python@v5 + with: + python-version: '3.11' - name: Download Linux aarch64 binary uses: actions/download-artifact@v4 @@ -351,25 +354,32 @@ jobs: run: | cd deltachat-rpc-server/npm-package - python3 --version + python --version - python3 scripts/pack_binary_for_platform.py aarch64-unknown-linux-musl deltachat-rpc-server-aarch64-linux.d/deltachat-rpc-server - python3 scripts/pack_binary_for_platform.py armv7-unknown-linux-musleabihf deltachat-rpc-server-armv7l-linux.d/deltachat-rpc-server - python3 scripts/pack_binary_for_platform.py arm-unknown-linux-musleabihf deltachat-rpc-server-armv6l-linux.d/deltachat-rpc-server - python3 scripts/pack_binary_for_platform.py i686-unknown-linux-musl deltachat-rpc-server-i686-linux.d/deltachat-rpc-server - python3 scripts/pack_binary_for_platform.py x86_64-unknown-linux-musl deltachat-rpc-server-x86_64-linux.d/deltachat-rpc-server - python3 scripts/pack_binary_for_platform.py i686-pc-windows-gnu deltachat-rpc-server-win32.d/deltachat-rpc-server.exe - python3 scripts/pack_binary_for_platform.py x86_64-pc-windows-gnu deltachat-rpc-server-win64.d/deltachat-rpc-server.exe - python3 scripts/pack_binary_for_platform.py x86_64-apple-darwin deltachat-rpc-server-x86_64-macos.d/deltachat-rpc-server - python3 scripts/pack_binary_for_platform.py aarch64-apple-darwin deltachat-rpc-server-aarch64-macos.d/deltachat-rpc-server - python3 scripts/pack_binary_for_platform.py aarch64-linux-android deltachat-rpc-server-arm64-v8a-android.d/deltachat-rpc-server - python3 scripts/pack_binary_for_platform.py armv7-linux-androideabi deltachat-rpc-server-armeabi-v7a-android.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py aarch64-unknown-linux-musl deltachat-rpc-server-aarch64-linux.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py armv7-unknown-linux-musleabihf deltachat-rpc-server-armv7l-linux.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py arm-unknown-linux-musleabihf deltachat-rpc-server-armv6l-linux.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py i686-unknown-linux-musl deltachat-rpc-server-i686-linux.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py x86_64-unknown-linux-musl deltachat-rpc-server-x86_64-linux.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py i686-pc-windows-gnu deltachat-rpc-server-win32.d/deltachat-rpc-server.exe + python scripts/pack_binary_for_platform.py x86_64-pc-windows-gnu deltachat-rpc-server-win64.d/deltachat-rpc-server.exe + python scripts/pack_binary_for_platform.py x86_64-apple-darwin deltachat-rpc-server-x86_64-macos.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py aarch64-apple-darwin deltachat-rpc-server-aarch64-macos.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py aarch64-linux-android deltachat-rpc-server-arm64-v8a-android.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py armv7-linux-androideabi deltachat-rpc-server-armeabi-v7a-android.d/deltachat-rpc-server ls -lah platform_package for platform in ./platform_package/*; do npm pack "$platform"; done npm pack ls -lah + + - name: Upload to artifacts + uses: actions/upload-artifact@v4 + with: + name: deltachat-rpc-server-npm-package + path: deltachat-rpc-server/npm-package/*.tgz + if-no-files-found: error - name: Upload npm packets to the GitHub release if: github.event_name == 'release' From 40b33ebd49344aaede680b100ee98b6240d1815f Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Fri, 10 May 2024 02:27:57 +0200 Subject: [PATCH 31/48] try fix ci --- .github/workflows/deltachat-rpc-server.yml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/deltachat-rpc-server.yml b/.github/workflows/deltachat-rpc-server.yml index 337a0d2025..6324036602 100644 --- a/.github/workflows/deltachat-rpc-server.yml +++ b/.github/workflows/deltachat-rpc-server.yml @@ -356,17 +356,17 @@ jobs: python --version - python scripts/pack_binary_for_platform.py aarch64-unknown-linux-musl deltachat-rpc-server-aarch64-linux.d/deltachat-rpc-server - python scripts/pack_binary_for_platform.py armv7-unknown-linux-musleabihf deltachat-rpc-server-armv7l-linux.d/deltachat-rpc-server - python scripts/pack_binary_for_platform.py arm-unknown-linux-musleabihf deltachat-rpc-server-armv6l-linux.d/deltachat-rpc-server - python scripts/pack_binary_for_platform.py i686-unknown-linux-musl deltachat-rpc-server-i686-linux.d/deltachat-rpc-server - python scripts/pack_binary_for_platform.py x86_64-unknown-linux-musl deltachat-rpc-server-x86_64-linux.d/deltachat-rpc-server - python scripts/pack_binary_for_platform.py i686-pc-windows-gnu deltachat-rpc-server-win32.d/deltachat-rpc-server.exe - python scripts/pack_binary_for_platform.py x86_64-pc-windows-gnu deltachat-rpc-server-win64.d/deltachat-rpc-server.exe - python scripts/pack_binary_for_platform.py x86_64-apple-darwin deltachat-rpc-server-x86_64-macos.d/deltachat-rpc-server - python scripts/pack_binary_for_platform.py aarch64-apple-darwin deltachat-rpc-server-aarch64-macos.d/deltachat-rpc-server - python scripts/pack_binary_for_platform.py aarch64-linux-android deltachat-rpc-server-arm64-v8a-android.d/deltachat-rpc-server - python scripts/pack_binary_for_platform.py armv7-linux-androideabi deltachat-rpc-server-armeabi-v7a-android.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py aarch64-unknown-linux-musl ../../deltachat-rpc-server-aarch64-linux.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py armv7-unknown-linux-musleabihf ../../deltachat-rpc-server-armv7l-linux.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py arm-unknown-linux-musleabihf ../../deltachat-rpc-server-armv6l-linux.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py i686-unknown-linux-musl ../../deltachat-rpc-server-i686-linux.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py x86_64-unknown-linux-musl ../../deltachat-rpc-server-x86_64-linux.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py i686-pc-windows-gnu ../../deltachat-rpc-server-win32.d/deltachat-rpc-server.exe + python scripts/pack_binary_for_platform.py x86_64-pc-windows-gnu ../../deltachat-rpc-server-win64.d/deltachat-rpc-server.exe + python scripts/pack_binary_for_platform.py x86_64-apple-darwin ../../deltachat-rpc-server-x86_64-macos.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py aarch64-apple-darwin ../../deltachat-rpc-server-aarch64-macos.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py aarch64-linux-android ../../deltachat-rpc-server-arm64-v8a-android.d/deltachat-rpc-server + python scripts/pack_binary_for_platform.py armv7-linux-androideabi ../../deltachat-rpc-server-armeabi-v7a-android.d/deltachat-rpc-server ls -lah platform_package From 66ebd257e6307cb6cd0994ea4d5babc8cd0fc5c9 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Fri, 10 May 2024 02:37:18 +0200 Subject: [PATCH 32/48] fix make_package script --- deltachat-rpc-server/npm-package/scripts/src/make_package.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/deltachat-rpc-server/npm-package/scripts/src/make_package.py b/deltachat-rpc-server/npm-package/scripts/src/make_package.py index 9cfe3c6c16..c8f1b35410 100644 --- a/deltachat-rpc-server/npm-package/scripts/src/make_package.py +++ b/deltachat-rpc-server/npm-package/scripts/src/make_package.py @@ -4,7 +4,10 @@ from .convert_platform import convert_cpu_arch_to_npm_cpu_arch, convert_os_to_npm_os def write_package_json(platform_path, rust_target, my_binary_name): - [cpu_arch, vendor, os] = rust_target.split("-") + if len(rust_target.split("-")) == 3: + [cpu_arch, vendor, os] = rust_target.split("-") + else: + [cpu_arch, _, vendor, os] = rust_target.split("-") # read version tomlfile = open("../../Cargo.toml", 'rb') From a4752f3e0391561493d9cd934ac9584a92533e73 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Fri, 10 May 2024 03:25:10 +0200 Subject: [PATCH 33/48] revert run conditions of workflow --- .github/workflows/deltachat-rpc-server.yml | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/.github/workflows/deltachat-rpc-server.yml b/.github/workflows/deltachat-rpc-server.yml index 6324036602..2aedc2e897 100644 --- a/.github/workflows/deltachat-rpc-server.yml +++ b/.github/workflows/deltachat-rpc-server.yml @@ -12,15 +12,10 @@ concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true -# on: -# workflow_dispatch: -# release: -# types: [published] -on: - pull_request: - push: - branches: - - main +on: + workflow_dispatch: + release: + types: [published] jobs: # Build a version statically linked against musl libc From f98c0aff3a6f3579cbbf49a8c96b283cd70c3ee4 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Fri, 10 May 2024 03:39:50 +0200 Subject: [PATCH 34/48] fix tripplet parsing --- deltachat-rpc-server/npm-package/scripts/src/make_package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deltachat-rpc-server/npm-package/scripts/src/make_package.py b/deltachat-rpc-server/npm-package/scripts/src/make_package.py index c8f1b35410..253d0b4332 100644 --- a/deltachat-rpc-server/npm-package/scripts/src/make_package.py +++ b/deltachat-rpc-server/npm-package/scripts/src/make_package.py @@ -7,7 +7,7 @@ def write_package_json(platform_path, rust_target, my_binary_name): if len(rust_target.split("-")) == 3: [cpu_arch, vendor, os] = rust_target.split("-") else: - [cpu_arch, _, vendor, os] = rust_target.split("-") + [cpu_arch, vendor, os, _env] = rust_target.split("-") # read version tomlfile = open("../../Cargo.toml", 'rb') From 5eff575f8254249ee759553997608b01d4541882 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Fri, 10 May 2024 04:29:59 +0200 Subject: [PATCH 35/48] fix platform conversion --- .../npm-package/scripts/src/convert_platform.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/deltachat-rpc-server/npm-package/scripts/src/convert_platform.py b/deltachat-rpc-server/npm-package/scripts/src/convert_platform.py index 0f077faf58..d7fe6ab516 100644 --- a/deltachat-rpc-server/npm-package/scripts/src/convert_platform.py +++ b/deltachat-rpc-server/npm-package/scripts/src/convert_platform.py @@ -5,6 +5,8 @@ def convert_cpu_arch_to_npm_cpu_arch(arch): return "i32" if arch == "aarch64": return "arm64" + if arch == "armv7" or arch == "arm": + return "arm" print("architecture might not be known by nodejs, please make sure it can be returned by 'process.arch':", arch) return arch @@ -13,5 +15,7 @@ def convert_os_to_npm_os(os): return "win32" if os == "darwin" or os == "linux": return os + if os.startswith("android"): + return "android" print("architecture might not be known by nodejs, please make sure it can be returned by 'process.platform':", os) return os \ No newline at end of file From 335ba1569b9f3d8fb7200c5770b072e57598d1b8 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Fri, 10 May 2024 06:59:49 +0200 Subject: [PATCH 36/48] make deltachat-rpc-server executable --- .../npm-package/scripts/pack_binary_for_platform.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/deltachat-rpc-server/npm-package/scripts/pack_binary_for_platform.py b/deltachat-rpc-server/npm-package/scripts/pack_binary_for_platform.py index 0b441c224a..9d1288dd18 100644 --- a/deltachat-rpc-server/npm-package/scripts/pack_binary_for_platform.py +++ b/deltachat-rpc-server/npm-package/scripts/pack_binary_for_platform.py @@ -1,6 +1,6 @@ import subprocess from sys import argv -from os import path, makedirs, chdir +from os import path, makedirs, chdir, chmod, stat import json from shutil import copy from src.make_package import write_package_json @@ -37,7 +37,9 @@ # copy binary it over my_binary_name = path.basename(binary_path) -copy(binary_path, platform_path + "/" + my_binary_name) +new_binary_path = platform_path + "/" + my_binary_name +copy(binary_path, new_binary_path) +chmod(new_binary_path, 0o555) # everyone can read & execute, nobody can write # make a package.json for it From bea421b18db4ba2e674924b2ce29b48c13f48545 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 11 May 2024 17:45:45 +0000 Subject: [PATCH 37/48] Remove unused `json` import from build_platform_package.py --- .../npm-package/scripts/build_platform_package.py | 1 - 1 file changed, 1 deletion(-) mode change 100644 => 100755 deltachat-rpc-server/npm-package/scripts/build_platform_package.py diff --git a/deltachat-rpc-server/npm-package/scripts/build_platform_package.py b/deltachat-rpc-server/npm-package/scripts/build_platform_package.py old mode 100644 new mode 100755 index d6ff199666..47e6f3dac9 --- a/deltachat-rpc-server/npm-package/scripts/build_platform_package.py +++ b/deltachat-rpc-server/npm-package/scripts/build_platform_package.py @@ -1,7 +1,6 @@ import subprocess from sys import argv from os import path, makedirs, chdir -import json from shutil import copy from src.make_package import write_package_json From 59ad9fbf2bdbe82e68074d96e92f0e867f3fdc88 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 11 May 2024 17:50:34 +0000 Subject: [PATCH 38/48] Make build_platform_package.py executable --- .../npm-package/scripts/build_platform_package.py | 1 + 1 file changed, 1 insertion(+) diff --git a/deltachat-rpc-server/npm-package/scripts/build_platform_package.py b/deltachat-rpc-server/npm-package/scripts/build_platform_package.py index 47e6f3dac9..6cc3604af0 100755 --- a/deltachat-rpc-server/npm-package/scripts/build_platform_package.py +++ b/deltachat-rpc-server/npm-package/scripts/build_platform_package.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 import subprocess from sys import argv from os import path, makedirs, chdir From fbe82b0af9d8c05052270590a46ceade8fb68fbe Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 11 May 2024 17:52:01 +0000 Subject: [PATCH 39/48] Format build_platform_package.py --- .../scripts/build_platform_package.py | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/deltachat-rpc-server/npm-package/scripts/build_platform_package.py b/deltachat-rpc-server/npm-package/scripts/build_platform_package.py index 6cc3604af0..752d9b90b9 100755 --- a/deltachat-rpc-server/npm-package/scripts/build_platform_package.py +++ b/deltachat-rpc-server/npm-package/scripts/build_platform_package.py @@ -14,7 +14,7 @@ target = argv[1].strip() -output = subprocess.run(["rustup","target","list"], capture_output=True) +output = subprocess.run(["rustup", "target", "list"], capture_output=True) available_targets = output.stdout.decode("utf-8") if available_targets.find(target) == -1: @@ -22,33 +22,31 @@ exit(1) if available_targets.find(target + " (installed)") == -1: - print("target ", target, " is not installed, run 'rustup target add "+target+"'") + print( + "target ", target, " is not installed, run 'rustup target add " + target + "'" + ) exit(1) -subprocess.run([ - "cargo", - "build", - "--release", - "-p", - "deltachat-rpc-server", - "--target", - target -]) - -newpath = r'platform_package' +subprocess.run( + ["cargo", "build", "--release", "-p", "deltachat-rpc-server", "--target", target] +) + +newpath = "platform_package" if not path.exists(newpath): makedirs(newpath) # make new folder -platform_path = 'platform_package/' + target +platform_path = "platform_package/" + target if not path.exists(platform_path): makedirs(platform_path) # copy binary it over + def binary_path(binary_name): - return "../../target/"+target+"/release/"+binary_name + return "../../target/" + target + "/release/" + binary_name + my_binary_name = "deltachat-rpc-server" @@ -64,4 +62,4 @@ def binary_path(binary_name): # make a package.json for it -write_package_json(platform_path, target, my_binary_name) \ No newline at end of file +write_package_json(platform_path, target, my_binary_name) From 377e8919ec5f0f00a304727eae36756703c5f534 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 11 May 2024 17:55:04 +0000 Subject: [PATCH 40/48] Do not depend on rustup in build_platform_package.py Check for success of `cargo build` instead, it will fail if target is not available. --- .../scripts/build_platform_package.py | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/deltachat-rpc-server/npm-package/scripts/build_platform_package.py b/deltachat-rpc-server/npm-package/scripts/build_platform_package.py index 752d9b90b9..4ebc29b8dd 100755 --- a/deltachat-rpc-server/npm-package/scripts/build_platform_package.py +++ b/deltachat-rpc-server/npm-package/scripts/build_platform_package.py @@ -14,21 +14,9 @@ target = argv[1].strip() -output = subprocess.run(["rustup", "target", "list"], capture_output=True) -available_targets = output.stdout.decode("utf-8") - -if available_targets.find(target) == -1: - print("target", target, "is not known") - exit(1) - -if available_targets.find(target + " (installed)") == -1: - print( - "target ", target, " is not installed, run 'rustup target add " + target + "'" - ) - exit(1) - subprocess.run( - ["cargo", "build", "--release", "-p", "deltachat-rpc-server", "--target", target] + ["cargo", "build", "--release", "-p", "deltachat-rpc-server", "--target", target], + check=True, ) newpath = "platform_package" From 7b6f1473758bc35d11c42d19fe673c25dcb697f6 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 11 May 2024 18:06:12 +0000 Subject: [PATCH 41/48] Use `rustc --print target-list` instead of `rustup` in pack_binary_for_platform.py --- .../npm-package/scripts/pack_binary_for_platform.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deltachat-rpc-server/npm-package/scripts/pack_binary_for_platform.py b/deltachat-rpc-server/npm-package/scripts/pack_binary_for_platform.py index 9d1288dd18..2d29327aad 100644 --- a/deltachat-rpc-server/npm-package/scripts/pack_binary_for_platform.py +++ b/deltachat-rpc-server/npm-package/scripts/pack_binary_for_platform.py @@ -16,7 +16,7 @@ target = argv[1].strip() binary_path = argv[2].strip() -output = subprocess.run(["rustup","target","list"], capture_output=True) +output = subprocess.run(["rustc","--print","target-list"], capture_output=True, check=True) available_targets = output.stdout.decode("utf-8") if available_targets.find(target) == -1: From f31a5254628242a54d3ffcc08a2b25d421db1c9a Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 11 May 2024 18:07:15 +0000 Subject: [PATCH 42/48] Readme typo fixing --- deltachat-rpc-server/npm-package/Readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deltachat-rpc-server/npm-package/Readme.md b/deltachat-rpc-server/npm-package/Readme.md index 6e62e79a52..97d17ac335 100644 --- a/deltachat-rpc-server/npm-package/Readme.md +++ b/deltachat-rpc-server/npm-package/Readme.md @@ -27,7 +27,7 @@ For a more complete example refer to https://github.com/deltachat-bot/echo/pull/ ## How to use on an unsupported platform - + @@ -61,7 +61,7 @@ When you import this package it searches for the rpc server in the following loc - Then pass it as an artifact to the last CI action that publishes the main package. - upload all packages from `deltachat-rpc-server/npm-package/platform_package`. - then publish `deltachat-rpc-server/npm-package`, - - this will run `update_optional_dependencie_and_version.js` (in the `prepack` script), + - this will run `update_optional_dependencies_and_version.js` (in the `prepack` script), which puts all platform packages into `optionalDependencies` and updates the `version` in `package.json` ## How to build a version you can use localy on your host machine for development From c551522daa6a1dc0d6b8abaef31747ff63e9e053 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 11 May 2024 18:07:27 +0000 Subject: [PATCH 43/48] Check subprocess exit code --- .../npm-package/scripts/make_local_dev_version.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deltachat-rpc-server/npm-package/scripts/make_local_dev_version.py b/deltachat-rpc-server/npm-package/scripts/make_local_dev_version.py index 1f8af7319f..635a6014ff 100644 --- a/deltachat-rpc-server/npm-package/scripts/make_local_dev_version.py +++ b/deltachat-rpc-server/npm-package/scripts/make_local_dev_version.py @@ -25,7 +25,7 @@ makedirs(newpath) # run build_platform_package.py with the host's target to build it -subprocess.run(["python", "scripts/build_platform_package.py", host_target], capture_output=False) +subprocess.run(["python", "scripts/build_platform_package.py", host_target], capture_output=False, check=True) # run update_optional_dependencies_and_version.js to adjust the package / make it installable locally -subprocess.run(["node", "scripts/update_optional_dependencies_and_version.js", "--local"], capture_output=False) \ No newline at end of file +subprocess.run(["node", "scripts/update_optional_dependencies_and_version.js", "--local"], capture_output=False, check=True) From fda57286c784e804bd5f2b66d134fc11d38498cc Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 11 May 2024 18:07:45 +0000 Subject: [PATCH 44/48] Add newline at the end of python file --- .../npm-package/scripts/pack_binary_for_platform.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deltachat-rpc-server/npm-package/scripts/pack_binary_for_platform.py b/deltachat-rpc-server/npm-package/scripts/pack_binary_for_platform.py index 2d29327aad..8c58f39903 100644 --- a/deltachat-rpc-server/npm-package/scripts/pack_binary_for_platform.py +++ b/deltachat-rpc-server/npm-package/scripts/pack_binary_for_platform.py @@ -43,4 +43,4 @@ # make a package.json for it -write_package_json(platform_path, target, my_binary_name) \ No newline at end of file +write_package_json(platform_path, target, my_binary_name) From 5ef46aea4e0548d2468227fbfddda59bbee52fc0 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 11 May 2024 18:08:28 +0000 Subject: [PATCH 45/48] Rename Readme.md into README.md for consistency --- deltachat-rpc-server/npm-package/{Readme.md => README.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename deltachat-rpc-server/npm-package/{Readme.md => README.md} (100%) diff --git a/deltachat-rpc-server/npm-package/Readme.md b/deltachat-rpc-server/npm-package/README.md similarity index 100% rename from deltachat-rpc-server/npm-package/Readme.md rename to deltachat-rpc-server/npm-package/README.md From f8115542eb93cb6b43f20a3402ea0aed55464bda Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Sat, 11 May 2024 20:20:27 +0200 Subject: [PATCH 46/48] do not prioritize cargo bin --- deltachat-rpc-server/npm-package/index.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/deltachat-rpc-server/npm-package/index.js b/deltachat-rpc-server/npm-package/index.js index 12a5900de4..3343341020 100644 --- a/deltachat-rpc-server/npm-package/index.js +++ b/deltachat-rpc-server/npm-package/index.js @@ -66,8 +66,6 @@ export async function getRPCServerPath( // 2. check if it can be found in PATH if (!process.env[SKIP_SEARCH_IN_PATH] && !skipSearchInPath) { const path_dirs = process.env["PATH"].split(/:|;/); - // check cargo dir first - const cargo_dirs = path_dirs.filter((p) => p.endsWith(".cargo/bin")); const findExecutable = async (directory) => { const files = await readdir(directory); const file = files.find((p) => @@ -80,9 +78,6 @@ export async function getRPCServerPath( } }; const executable_search = // TODO make code simpler to read - (await Promise.allSettled(cargo_dirs.map(findExecutable))).find( - ({ status }) => status === "fulfilled" - ) || (await Promise.allSettled(path_dirs.map(findExecutable))).find( ({ status }) => status === "fulfilled" ); From 701b48a2495cde4705bb3ab33549f3b078bdbd09 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Sat, 11 May 2024 20:22:15 +0200 Subject: [PATCH 47/48] rm comment and fmt --- deltachat-rpc-server/npm-package/index.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/deltachat-rpc-server/npm-package/index.js b/deltachat-rpc-server/npm-package/index.js index 3343341020..b707c1c3cb 100644 --- a/deltachat-rpc-server/npm-package/index.js +++ b/deltachat-rpc-server/npm-package/index.js @@ -77,10 +77,9 @@ export async function getRPCServerPath( throw null; } }; - const executable_search = // TODO make code simpler to read - (await Promise.allSettled(path_dirs.map(findExecutable))).find( - ({ status }) => status === "fulfilled" - ); + const executable_search = ( + await Promise.allSettled(path_dirs.map(findExecutable)) + ).find(({ status }) => status === "fulfilled"); // TODO maybe we could the system do this stuff automatically // by just trying to execute it and then use "which" (unix) or "where" (windows) to get the path to the executable if (executable_search.status === "fulfilled") { @@ -148,7 +147,7 @@ export async function startDeltaChat(directory, options) { }; //@ts-expect-error - dc.pathToServerBinary = pathToServerBinary + dc.pathToServerBinary = pathToServerBinary; return dc; } From c203c6faa7c433a21a9f43155c68e1630ea9b408 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Sat, 11 May 2024 20:48:47 +0200 Subject: [PATCH 48/48] use `where` and `command -v` to find deltachat-rpc-server from path --- deltachat-rpc-server/npm-package/index.js | 28 ++++++++--------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/deltachat-rpc-server/npm-package/index.js b/deltachat-rpc-server/npm-package/index.js index b707c1c3cb..d933a4618c 100644 --- a/deltachat-rpc-server/npm-package/index.js +++ b/deltachat-rpc-server/npm-package/index.js @@ -65,25 +65,15 @@ export async function getRPCServerPath( // 2. check if it can be found in PATH if (!process.env[SKIP_SEARCH_IN_PATH] && !skipSearchInPath) { - const path_dirs = process.env["PATH"].split(/:|;/); - const findExecutable = async (directory) => { - const files = await readdir(directory); - const file = files.find((p) => - basename(p).includes(PATH_EXECUTABLE_NAME) - ); - if (file) { - return join(directory, file); - } else { - throw null; - } - }; - const executable_search = ( - await Promise.allSettled(path_dirs.map(findExecutable)) - ).find(({ status }) => status === "fulfilled"); - // TODO maybe we could the system do this stuff automatically - // by just trying to execute it and then use "which" (unix) or "where" (windows) to get the path to the executable - if (executable_search.status === "fulfilled") { - const executable = executable_search.value; + const exec = promisify(execFile); + + const { stdout: executable } = + os.platform() !== "win32" + ? await exec("command", ["-v", PATH_EXECUTABLE_NAME]) + : await exec("where", [PATH_EXECUTABLE_NAME]); + + // by just trying to execute it and then use "command -v deltachat-rpc-server" (unix) or "where deltachat-rpc-server" (windows) to get the path to the executable + if (executable.length > 1) { // test if it is the right version try { // for some unknown reason it is in stderr and not in stdout