mirror of
https://github.com/chatmail/core.git
synced 2026-05-19 14:56:33 +03:00
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:
@@ -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:
|
||||||
|
|||||||
4
deltachat-rpc-server/npm-package/index.d.ts
vendored
4
deltachat-rpc-server/npm-package/index.d.ts
vendored
@@ -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;
|
||||||
|
|||||||
@@ -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: {
|
||||||
|
|||||||
@@ -3,4 +3,3 @@
|
|||||||
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"
|
|
||||||
Reference in New Issue
Block a user