api!(npm rpc server): change api: don't search in path unless options.takeVersionFromPATH is set to true

-remove `DELTA_CHAT_SKIP_PATH` environment variable
- remove version check / search for dc rpc server in $PATH
- remove `options.skipSearchInPath`
- add `options.takeVersionFromPATH`
This commit is contained in:
Simon Laux
2024-05-20 18:36:49 +02:00
committed by Simon Laux
parent ee671836ca
commit 11546a1ce9
4 changed files with 19 additions and 85 deletions

View File

@@ -46,12 +46,11 @@ references:
When you import this package it searches for the rpc server in the following locations and order: When you import this package it searches for the rpc server in the following locations and order:
1. `DELTA_CHAT_RPC_SERVER` environment variable 1. `DELTA_CHAT_RPC_SERVER` environment variable
2. in PATH 2. use the PATH when `{takeVersionFromPATH: true}` is supplied in the options.
- 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 3. prebuilds in npm packages
so by default it uses the prebuilds.
## How do you built this package in CI ## How do you built this package in CI
- To build platform packages, run the `build_platform_package.py` script: - To build platform packages, run the `build_platform_package.py` script:

View File

@@ -1,8 +1,8 @@
import { StdioDeltaChat } from "@deltachat/jsonrpc-client"; import { StdioDeltaChat } from "@deltachat/jsonrpc-client";
export interface SearchOptions { export interface SearchOptions {
/** whether to disable looking for deltachat-rpc-server inside of $PATH */ /** whether take deltachat-rpc-server inside of $PATH*/
skipSearchInPath: boolean; takeVersionFromPATH: boolean;
/** whether to disable the DELTA_CHAT_RPC_SERVER environment variable */ /** whether to disable the DELTA_CHAT_RPC_SERVER environment variable */
disableEnvPath: boolean; disableEnvPath: boolean;

View File

@@ -1,15 +1,9 @@
//@ts-check //@ts-check
import { execFile, spawn } from "node:child_process"; import { spawn } from "node:child_process";
import { stat, readdir } from "node:fs/promises"; import { stat } from "node:fs/promises";
import os from "node:os"; import os from "node:os";
import { join, basename } from "node:path";
import process from "node:process"; import process from "node:process";
import { promisify } from "node:util"; import { ENV_VAR_NAME, PATH_EXECUTABLE_NAME } from "./src/const.js";
import {
ENV_VAR_NAME,
PATH_EXECUTABLE_NAME,
SKIP_SEARCH_IN_PATH,
} from "./src/const.js";
import { import {
ENV_VAR_LOCATION_NOT_FOUND, ENV_VAR_LOCATION_NOT_FOUND,
FAILED_TO_START_SERVER_EXECUTABLE, FAILED_TO_START_SERVER_EXECUTABLE,
@@ -39,38 +33,13 @@ function findRPCServerInNodeModules() {
} }
} }
/**
* @returns {Promise<string>}
*/
async function getLocationInPath() {
const exec = promisify(execFile);
if (os.platform() === "win32") {
const { stdout: executable } = await exec("where", [PATH_EXECUTABLE_NAME], {
shell: true,
});
return executable;
}
try {
const { stdout: executable } = await exec(
"command",
["-v", PATH_EXECUTABLE_NAME],
{ shell: true }
);
return executable;
} catch (error) {
if (error.code > 0) return "";
else throw error;
}
}
/** @type {import("./index").FnTypes.getRPCServerPath} */ /** @type {import("./index").FnTypes.getRPCServerPath} */
export async function getRPCServerPath( export async function getRPCServerPath(options = {}) {
options = { skipSearchInPath: false, disableEnvPath: false } const { takeVersionFromPATH, disableEnvPath } = {
) { takeVersionFromPATH: false,
// @TODO: improve confusing naming of these options disableEnvPath: false,
const { skipSearchInPath, disableEnvPath } = options; ...options,
};
// 1. check if it is set as env var // 1. check if it is set as env var
if (process.env[ENV_VAR_NAME] && !disableEnvPath) { if (process.env[ENV_VAR_NAME] && !disableEnvPath) {
try { try {
@@ -85,35 +54,9 @@ export async function getRPCServerPath(
return process.env[ENV_VAR_NAME]; return process.env[ENV_VAR_NAME];
} }
// 2. check if it can be found in PATH // 2. check if PATH should be used
if (!process.env[SKIP_SEARCH_IN_PATH] && !skipSearchInPath) { if (takeVersionFromPATH) {
const executable = await getLocationInPath(); return 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
const { stderr } = await promisify(execFile)(
executable,
["--version"],
{ shell: true }
);
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})`
);
} else {
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 // 3. check for prebuilds
@@ -123,14 +66,7 @@ export async function getRPCServerPath(
import { StdioDeltaChat } from "@deltachat/jsonrpc-client"; import { StdioDeltaChat } from "@deltachat/jsonrpc-client";
/** @type {import("./index").FnTypes.startDeltaChat} */ /** @type {import("./index").FnTypes.startDeltaChat} */
export async function startDeltaChat( export async function startDeltaChat(directory, options = {}) {
directory,
options = {
skipSearchInPath: false,
disableEnvPath: false,
muteStdErr: false,
}
) {
const pathToServerBinary = await getRPCServerPath(options); const pathToServerBinary = await getRPCServerPath(options);
const server = spawn(pathToServerBinary, { const server = spawn(pathToServerBinary, {
env: { env: {

View File

@@ -2,5 +2,4 @@
export const PATH_EXECUTABLE_NAME = 'deltachat-rpc-server' export const PATH_EXECUTABLE_NAME = 'deltachat-rpc-server'
export const ENV_VAR_NAME = "DELTA_CHAT_RPC_SERVER" export const ENV_VAR_NAME = "DELTA_CHAT_RPC_SERVER"
export const SKIP_SEARCH_IN_PATH = "DELTA_CHAT_SKIP_PATH"