Update builder and migrate to ESM #3
@ -1,100 +0,0 @@
|
||||
name: Test
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
|
||||
jobs:
|
||||
linux_test:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
node_version: [ 16.x, 18.x, 19.x, 20.x, 21.x ]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
name: Checkout
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
name: Setup Node.js
|
||||
with:
|
||||
node-version: ${{ matrix.node_version }}
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
echo "Host arch: $(uname -m)"
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
sudo apt update
|
||||
packages=(
|
||||
"binutils-multiarch"
|
||||
"build-essential"
|
||||
);
|
||||
# if [[ $(uname -m) == "x86_64" ]]; then
|
||||
# packages+=(
|
||||
# "libc6-arm64-cross"
|
||||
# "gcc-*aarch64-linux-gnu"
|
||||
# "gcc-*aarch64-linux-gnu-base"
|
||||
# "g++-*aarch64-linux-gnu"
|
||||
# )
|
||||
# else
|
||||
# packages+=(
|
||||
# "libc6-amd64-cross"
|
||||
# "g++-*x86-64-linux-gnu"
|
||||
# "gcc-*x86-64-linux-gnu"
|
||||
# )
|
||||
# if [[ $(uname -m) != "aarch64" ]]; then
|
||||
# packages+=(
|
||||
# "libc6-arm64-cross"
|
||||
# "gcc-*aarch64-linux-gnu"
|
||||
# "gcc-*aarch64-linux-gnu-base"
|
||||
# "g++-*aarch64-linux-gnu"
|
||||
# )
|
||||
# fi
|
||||
# fi
|
||||
sudo apt install -y ${packages[@]}
|
||||
npm install --no-save --ignore-scripts
|
||||
|
||||
- name: Build addon
|
||||
run: npm run dev
|
||||
|
||||
- name: Upload prebuilds interface
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
retention-days: 7
|
||||
name: prebuilds_${{ runner.os }}_${{ matrix.node_version }}
|
||||
path: "prebuilds/**"
|
||||
|
||||
- name: Test
|
||||
run: node --require ts-node/register --loader ts-node/esm ./src/index_test.ts
|
||||
|
||||
pack_package:
|
||||
needs: linux_test
|
||||
runs-on: ubuntu-latest
|
||||
name: Pack npm package
|
||||
env:
|
||||
PACKAGE_VERSION: ${{ github.ref }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
name: Code checkout
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
name: Setup node.js
|
||||
with:
|
||||
node-version: 20.x
|
||||
registry-url: https://registry.npmjs.org/
|
||||
|
||||
- name: Download all artefacts
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
path: ./prebuilds
|
||||
|
||||
- run: npm install --no-save --ignore-scripts
|
||||
- run: npm pack
|
||||
|
||||
- name: Upload npm package
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: Package_Pack
|
||||
path: "*.tgz"
|
90
.github/workflows/test.yml
vendored
90
.github/workflows/test.yml
vendored
@ -13,10 +13,20 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
node_version: [ 16.x, 18.x, 19.x, 20.x, 21.x ]
|
||||
target_arch: [ "x86_64", "aarch64" ]
|
||||
target_os:
|
||||
- "linux"
|
||||
# - "windows"
|
||||
# - "macos"
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
name: Checkout
|
||||
|
||||
- name: "Setup zig"
|
||||
uses: korandoru/setup-zig@v1
|
||||
with:
|
||||
zig-version: "master"
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
name: Setup Node.js
|
||||
with:
|
||||
@ -26,96 +36,24 @@ jobs:
|
||||
run: |
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
sudo apt update
|
||||
sudo apt install -y binutils-multiarch gcc-*aarch64-linux-gnu gcc-*aarch64-linux-gnu-base g++-*aarch64-linux-gnu libc6-arm64-cross
|
||||
sudo apt install -y "binutils-multiarch" "build-essential"
|
||||
npm install --no-save --ignore-scripts
|
||||
|
||||
- name: Build addon
|
||||
run: npm run prebuildify -- -v
|
||||
|
||||
- name: Test
|
||||
run: sudo -E node --require ts-node/register --loader ts-node/esm ./src/index_test.ts
|
||||
run: npm run dev -- --target_zig=${{ matrix.target_arch }}-${{ matrix.target_os }}
|
||||
|
||||
- name: Upload prebuilds interface
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
retention-days: 7
|
||||
name: prebuilds_${{ runner.os }}
|
||||
name: prebuilds_${{ matrix.target_arch }}-${{ matrix.target_os }}_${{ matrix.node_version }}
|
||||
path: "prebuilds/**"
|
||||
|
||||
macos_test:
|
||||
runs-on: macos-latest
|
||||
strategy:
|
||||
matrix:
|
||||
node_version: [ 16.x, 18.x, 19.x, 20.x, 21.x ]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
name: Checkout
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
name: Setup Node.js
|
||||
with:
|
||||
node-version: ${{ matrix.node_version }}
|
||||
|
||||
- name: Setup Go environment
|
||||
uses: actions/setup-go@v5.0.0
|
||||
|
||||
- name: Setup wireguard-go
|
||||
run: |
|
||||
cd ..
|
||||
git clone https://git.zx2c4.com/wireguard-go
|
||||
cd wireguard-go
|
||||
echo "WG_INETRFACE=utun15" >> $GITHUB_ENV
|
||||
go build -v -o "wireguard-go"
|
||||
sudo ./wireguard-go utun15
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm install --no-save --ignore-scripts
|
||||
|
||||
- name: Build addon
|
||||
run: npm run prebuildify -- -v
|
||||
|
||||
- name: Test
|
||||
run: sudo -E node --require ts-node/register --loader ts-node/esm ./src/index_test.ts
|
||||
|
||||
- name: Upload prebuilds interface
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
retention-days: 7
|
||||
name: prebuilds_${{ runner.os }}
|
||||
path: "prebuilds/**"
|
||||
|
||||
win_test:
|
||||
runs-on: windows-latest
|
||||
strategy:
|
||||
matrix:
|
||||
node_version: [ 16.x, 18.x, 19.x, 20.x, 21.x ]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
name: Checkout
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
name: Setup Node.js
|
||||
with:
|
||||
node-version: ${{ matrix.node_version }}
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm install --no-save --ignore-scripts
|
||||
|
||||
- name: Build addon
|
||||
run: npm run prebuildify -- -v
|
||||
|
||||
- name: Test
|
||||
run: node --require ts-node/register --loader ts-node/esm ./src/index_test.ts
|
||||
|
||||
- name: Upload prebuilds interface
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
retention-days: 7
|
||||
name: prebuilds_${{ runner.os }}
|
||||
path: "prebuilds/**"
|
||||
|
||||
pack_package:
|
||||
needs: [ linux_test, macos_test, win_test ]
|
||||
needs: linux_test
|
||||
runs-on: ubuntu-latest
|
||||
name: Pack npm package
|
||||
env:
|
||||
|
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@ -12,8 +12,7 @@
|
||||
"source.organizeImports": "explicit"
|
||||
},
|
||||
"files.exclude": {
|
||||
"**/node_modules/": true,
|
||||
"**/build/": true
|
||||
"**/node_modules/": true
|
||||
},
|
||||
"terminal.integrated.env.windows": {
|
||||
"PATH": "${workspaceFolder}/node_modules/.bin;${env:PATH}"
|
||||
|
@ -1,9 +1,8 @@
|
||||
#include <napi.h>
|
||||
#include <wginterface.hh>
|
||||
#include <net/if.h>
|
||||
|
||||
unsigned long maxName() {
|
||||
return IFNAMSIZ;
|
||||
return 16;
|
||||
}
|
||||
|
||||
std::string versionDrive() {
|
||||
|
@ -24,7 +24,6 @@
|
||||
#include <setupapi.h>
|
||||
#include <cfgmgr32.h>
|
||||
#include <devguid.h>
|
||||
#include <ndisguid.h>
|
||||
#include "wginterface.hh"
|
||||
#include <wgkeys.hh>
|
||||
|
||||
@ -61,14 +60,14 @@ std::string getErrorString(DWORD errorMessageID) {
|
||||
return std::string("Error code: ").append(std::to_string(errorMessageID)).append(", Message: ").append(message);
|
||||
}
|
||||
|
||||
std::string startAddon(const Napi::Env env) {
|
||||
std::string startAddon(const Napi::Env env, Napi::Object exports) {
|
||||
if (!IsRunAsAdmin()) return "Run nodejs with administrator privilegies";
|
||||
auto DLLPATH = env.Global().ToObject().Get("WIREGUARD_DLL_PATH");
|
||||
if (!(DLLPATH.IsString())) return "Require WIREGUARD_DLL_PATH in Global process";
|
||||
auto DLLPATH = exports.Get("WIREGUARD_DLL_PATH");
|
||||
if (!(DLLPATH.IsString())) return "Require WIREGUARD_DLL_PATH in addon load!";
|
||||
LPCWSTR dllPath = toLpcwstr(DLLPATH.ToString());
|
||||
|
||||
HMODULE WireGuardDll = LoadLibraryExW(dllPath, NULL, LOAD_LIBRARY_SEARCH_APPLICATION_DIR | LOAD_LIBRARY_SEARCH_SYSTEM32);
|
||||
if (!WireGuardDll) return ((std::string)"Failed to initialize WireGuardNT, ").append(getErrorString(GetLastError()));;
|
||||
if (!WireGuardDll) return std::string("Failed to initialize WireGuardNT, ").append(getErrorString(GetLastError()));;
|
||||
#define X(Name) ((*(FARPROC *)&Name = GetProcAddress(WireGuardDll, #Name)) == NULL)
|
||||
if (X(WireGuardCreateAdapter) || X(WireGuardOpenAdapter) || X(WireGuardCloseAdapter) || X(WireGuardGetAdapterLUID) || X(WireGuardGetRunningDriverVersion) || X(WireGuardDeleteDriver) || X(WireGuardSetLogger) || X(WireGuardSetAdapterLogging) || X(WireGuardGetAdapterState) || X(WireGuardSetAdapterState) || X(WireGuardGetConfiguration) || X(WireGuardSetConfiguration))
|
||||
#undef X
|
||||
@ -76,7 +75,7 @@ std::string startAddon(const Napi::Env env) {
|
||||
DWORD LastError = GetLastError();
|
||||
FreeLibrary(WireGuardDll);
|
||||
SetLastError(LastError);
|
||||
return ((std::string)"Failed to set Functions from WireGuardNT DLL, ").append(getErrorString(GetLastError()));;
|
||||
return std::string("Failed to set Functions from WireGuardNT DLL, ").append(getErrorString(GetLastError()));;
|
||||
}
|
||||
|
||||
return "";
|
||||
@ -89,10 +88,10 @@ std::string versionDrive() {
|
||||
auto statusErr = GetLastError();
|
||||
WireGuardCloseAdapter(Adapter);
|
||||
if (statusErr == ERROR_FILE_NOT_FOUND) return "Driver not loaded";
|
||||
return ((std::string)"Cannot get version drive, ").append(getErrorString(GetLastError()));
|
||||
return std::string("Cannot get version drive, ").append(getErrorString(GetLastError()));
|
||||
}
|
||||
WireGuardCloseAdapter(Adapter);
|
||||
return ((std::string)"WireGuardNT v").append(std::to_string((Version >> 16) & 0xff)).append(".").append(std::to_string((Version >> 0) & 0xff));
|
||||
return std::string("WireGuardNT v").append(std::to_string((Version >> 16) & 0xff)).append(".").append(std::to_string((Version >> 0) & 0xff));
|
||||
}
|
||||
|
||||
void listDevices::Execute() {
|
||||
@ -197,7 +196,7 @@ void getConfig::Execute() {
|
||||
free(wg_iface);
|
||||
if (GetLastError() != ERROR_MORE_DATA) return SetError((std::string("Failed get interface config, code: ")).append(std::to_string(GetLastError())));
|
||||
wg_iface = (WIREGUARD_INTERFACE *)malloc(buf_len);
|
||||
if (!wg_iface) return SetError(((std::string)"Failed get interface config, ").append(std::to_string(-errno)));
|
||||
if (!wg_iface) return SetError(std::string("Failed get interface config, ").append(std::to_string(-errno)));
|
||||
}
|
||||
|
||||
if (wg_iface->Flags & WIREGUARD_INTERFACE_FLAG::WIREGUARD_INTERFACE_HAS_PRIVATE_KEY) privateKey = wgKeys::toString(wg_iface->PrivateKey);
|
||||
@ -268,7 +267,8 @@ void setConfig::Execute() {
|
||||
wgKeys::stringToKey(wg_peer->PublicKey, peerPublicKey);
|
||||
} catch (std::string &err) {
|
||||
SetError(err);
|
||||
goto outEnd;
|
||||
free(wg_iface);
|
||||
return;
|
||||
}
|
||||
wg_peer->Flags = WIREGUARD_PEER_FLAG::WIREGUARD_PEER_HAS_PUBLIC_KEY;
|
||||
wg_peer->AllowedIPsCount = 0;
|
||||
@ -284,7 +284,8 @@ void setConfig::Execute() {
|
||||
wg_peer->Flags = (WIREGUARD_PEER_FLAG)(wg_peer->Flags|WIREGUARD_PEER_FLAG::WIREGUARD_PEER_HAS_PRESHARED_KEY);
|
||||
} catch (std::string &err) {
|
||||
SetError(err);
|
||||
goto outEnd;
|
||||
free(wg_iface);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@ -297,7 +298,8 @@ void setConfig::Execute() {
|
||||
wg_peer->Flags = (WIREGUARD_PEER_FLAG)(wg_peer->Flags|WIREGUARD_PEER_FLAG::WIREGUARD_PEER_HAS_ENDPOINT);
|
||||
} catch (std::string &err) {
|
||||
SetError(std::string("Cannot parse endpoint, ").append(err));
|
||||
goto outEnd;
|
||||
free(wg_iface);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@ -325,7 +327,7 @@ void setConfig::Execute() {
|
||||
|
||||
WIREGUARD_ADAPTER_HANDLE Adapter = WireGuardOpenAdapter(toLpcwstr(wgName));
|
||||
if (!Adapter) Adapter = WireGuardCreateAdapter(toLpcwstr(wgName), L"Wireguard-tools.js", NULL);
|
||||
if (!Adapter) SetError(((std::string)"Failed to create adapter, ").append(getErrorString(GetLastError())));
|
||||
if (!Adapter) SetError(std::string("Failed to create adapter, ").append(getErrorString(GetLastError())));
|
||||
else if (!WireGuardSetConfiguration(Adapter, reinterpret_cast<WIREGUARD_INTERFACE*>(wg_iface), buf_len)) {
|
||||
auto status = GetLastError();
|
||||
SetError(std::string("Failed to set interface config, ").append(getErrorString(status)));
|
||||
@ -357,6 +359,5 @@ void setConfig::Execute() {
|
||||
}
|
||||
}
|
||||
}
|
||||
outEnd:
|
||||
free(wg_iface);
|
||||
}
|
@ -5,7 +5,7 @@
|
||||
Napi::Object Init(Napi::Env initEnv, Napi::Object exports) {
|
||||
/// Call Addon
|
||||
#ifdef ONSTARTADDON
|
||||
auto status = startAddon(initEnv);
|
||||
auto status = startAddon(initEnv, exports);
|
||||
if (status.length() >= 1) {
|
||||
Napi::Error::New(initEnv, status).ThrowAsJavaScriptException();
|
||||
return exports;
|
||||
|
@ -12,7 +12,7 @@ unsigned long maxName();
|
||||
std::string versionDrive();
|
||||
|
||||
// On start module call this function
|
||||
std::string startAddon(const Napi::Env env);
|
||||
std::string startAddon(const Napi::Env env, Napi::Object exports);
|
||||
|
||||
class deleteInterface : public Napi::AsyncWorker {
|
||||
private:
|
||||
|
110
binding.gyp
110
binding.gyp
@ -1,110 +0,0 @@
|
||||
{
|
||||
"target_defaults": {
|
||||
"cflags!": [ "-fno-exceptions" ],
|
||||
"cflags_cc!": [ "-fno-exceptions" ],
|
||||
"defines": [
|
||||
"NAPI_DISABLE_CPP_EXCEPTIONS"
|
||||
],
|
||||
"conditions": [
|
||||
["OS=='win'", {
|
||||
"defines": [
|
||||
"_HAS_EXCEPTIONS=1"
|
||||
],
|
||||
"msvs_settings": {
|
||||
"VCCLCompilerTool": {
|
||||
"ExceptionHandling": 1
|
||||
},
|
||||
},
|
||||
}],
|
||||
["OS=='mac'", {
|
||||
"xcode_settings": {
|
||||
"GCC_ENABLE_CPP_EXCEPTIONS": "YES"
|
||||
},
|
||||
}],
|
||||
],
|
||||
"include_dirs": [
|
||||
"<!(node -p \"require('node-addon-api').include_dir\")"
|
||||
],
|
||||
"cflags": [
|
||||
"-fpermissive",
|
||||
"-fexceptions",
|
||||
"-w",
|
||||
"-fpermissive",
|
||||
"-fPIC",
|
||||
"-static"
|
||||
],
|
||||
"cflags_cc": [
|
||||
"-fpermissive",
|
||||
"-fexceptions",
|
||||
"-w",
|
||||
"-fpermissive",
|
||||
"-fPIC",
|
||||
"-static"
|
||||
]
|
||||
},
|
||||
"targets": [
|
||||
{
|
||||
"target_name": "wginterface",
|
||||
"include_dirs": [
|
||||
"addons/genKey",
|
||||
"addons/tools"
|
||||
],
|
||||
"sources": [
|
||||
"addons/genKey/wgkeys.cpp",
|
||||
"addons/tools/wginterface.cpp"
|
||||
],
|
||||
"conditions": [
|
||||
["OS=='linux'", {
|
||||
"defines": [
|
||||
"LISTDEV",
|
||||
"GETCONFIG",
|
||||
"SETCONFIG",
|
||||
"DELIFACE"
|
||||
],
|
||||
"sources": [
|
||||
"addons/tools/linux/wireguard.c",
|
||||
"addons/tools/wginterface-linux.cpp"
|
||||
]
|
||||
}],
|
||||
["OS=='mac'", {
|
||||
"cflags!": [ "-fno-exceptions" ],
|
||||
"cflags_cc!": [ "-fno-exceptions" ],
|
||||
"cflags_cc": [ "-fexceptions" ],
|
||||
"cflags": [ "-fexceptions" ],
|
||||
"xcode_settings": {
|
||||
"GCC_ENABLE_CPP_EXCEPTIONS": "YES"
|
||||
}
|
||||
}],
|
||||
["OS=='win'", {
|
||||
"include_dirs": [
|
||||
"addons/tools/win"
|
||||
],
|
||||
"defines": [
|
||||
"ONSTARTADDON",
|
||||
"LISTDEV",
|
||||
"GETCONFIG",
|
||||
"SETCONFIG",
|
||||
"DELIFACE"
|
||||
],
|
||||
"libraries": [
|
||||
"bcrypt.lib",
|
||||
"crypt32.lib",
|
||||
"iphlpapi.lib",
|
||||
"kernel32.lib",
|
||||
"ntdll.lib",
|
||||
"ws2_32.lib",
|
||||
"setupapi.lib"
|
||||
],
|
||||
"sources": [
|
||||
"addons/tools/wginterface-win.cpp"
|
||||
]
|
||||
}],
|
||||
["OS not in 'linux win'", {
|
||||
"sources": [
|
||||
"addons/tools/wginterface-dummy.cpp"
|
||||
]
|
||||
}]
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
67
binding.yaml
Normal file
67
binding.yaml
Normal file
@ -0,0 +1,67 @@
|
||||
- name: wginterface
|
||||
ncflags:
|
||||
- "-fno-exceptions"
|
||||
nflags_cc:
|
||||
- "-fno-exceptions"
|
||||
defines:
|
||||
- "NAPI_DISABLE_CPP_EXCEPTIONS"
|
||||
- "NODE_VERSION=4"
|
||||
cflags:
|
||||
- "-fpermissive"
|
||||
- "-fexceptions"
|
||||
- "-w"
|
||||
- "-fpermissive"
|
||||
flags_cc:
|
||||
- "-fpermissive"
|
||||
- "-fexceptions"
|
||||
- "-w"
|
||||
- "-fpermissive"
|
||||
includes:
|
||||
- addons/genKey
|
||||
- addons/tools
|
||||
- node_modules/node-addon-api
|
||||
sources:
|
||||
- "addons/genKey/wgkeys.cpp"
|
||||
- "addons/tools/wginterface.cpp"
|
||||
- "addons/tools/wginterface-dummy.cpp"
|
||||
target:
|
||||
linux:
|
||||
sources:
|
||||
- "addons/tools/linux/wireguard.c"
|
||||
- "addons/tools/wginterface-linux.cpp"
|
||||
- "!addons/tools/wginterface-dummy.cpp"
|
||||
defines:
|
||||
- "LISTDEV"
|
||||
- "GETCONFIG"
|
||||
- "SETCONFIG"
|
||||
- "DELIFACE"
|
||||
cflags:
|
||||
- "-fPIC"
|
||||
flags_cc:
|
||||
- "-fPIC"
|
||||
macos:
|
||||
cflags_cc:
|
||||
- "-fexceptions"
|
||||
cflags:
|
||||
- "-fexceptions"
|
||||
windows:
|
||||
sources:
|
||||
- "addons/tools/wginterface-win.cpp"
|
||||
- "!addons/tools/wginterface-dummy.cpp"
|
||||
includes:
|
||||
- "addons/tools/win"
|
||||
defines:
|
||||
- "ONSTARTADDON"
|
||||
- "LISTDEV"
|
||||
- "GETCONFIG"
|
||||
- "SETCONFIG"
|
||||
- "DELIFACE"
|
||||
- "_HAS_EXCEPTIONS=1"
|
||||
libraries:
|
||||
- "bcrypt.lib"
|
||||
- "crypt32.lib"
|
||||
- "iphlpapi.lib"
|
||||
- "kernel32.lib"
|
||||
- "ntdll.lib"
|
||||
- "ws2_32.lib"
|
||||
- "setupapi.lib"
|
14
index.mjs
14
index.mjs
@ -1,14 +0,0 @@
|
||||
import * as __wg from "./src/index.js";
|
||||
export const {
|
||||
constants,
|
||||
key,
|
||||
key_experimental,
|
||||
wgQuick,
|
||||
wginterface,
|
||||
getConfig,
|
||||
setConfig,
|
||||
listDevices,
|
||||
deleteInterface,
|
||||
} = __wg;
|
||||
|
||||
export default __wg.default;
|
138
libs/build.mjs
138
libs/build.mjs
@ -1,138 +0,0 @@
|
||||
// @ts-check
|
||||
import child_process from "node:child_process";
|
||||
import { promises as fs } from "node:fs";
|
||||
import { createRequire } from "node:module";
|
||||
import path from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url)); // Fix ESM __dirname
|
||||
const nodeGyp = path.resolve(createRequire(import.meta.url).resolve("node-gyp"), "../../bin/node-gyp.js"); // Node gyp script
|
||||
const env = Object.assign({}, process.env);
|
||||
|
||||
const prebuilds = path.resolve(__dirname, "../prebuilds");
|
||||
const buildDir = path.resolve(__dirname, "../build") /* Build Directory */, buildRelease = path.join(buildDir, "Release"), buildDebug = path.join(buildDir, "Debug");
|
||||
async function exist(path) {
|
||||
return fs.open(path).then(e => e.close().then(() => true, () => true), () => false);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {string} command
|
||||
* @param {string[]} args
|
||||
* @param {Omit<import("child_process").ForkOptions, "stdio">} options
|
||||
*/
|
||||
async function fork(command, args, options) {
|
||||
if (options) options["stdio"] = undefined;
|
||||
console.log("%s", command, ...args);
|
||||
return new Promise((done, reject) => {
|
||||
const child = child_process.fork(command, args, options);
|
||||
child.on("error", reject);
|
||||
if (child.stdout) child.stdout.once("data", function log(data) { process.stdout.write(data); if (child.stdout) child.stdout.once("data", log); });
|
||||
if (child.stderr) child.stderr.once("data", function log(data) { process.stderr.write(data); if (child.stderr) child.stderr.once("data", log); });
|
||||
child.once("exit", (code, sig) => {
|
||||
if (code === 0) return done(0);
|
||||
return reject(new Error(("Process exit with ").concat(String(code), " and signal ", String(sig))));
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// Fix CI prebuild download
|
||||
if (await exist(prebuilds)) {
|
||||
for (const folderLayer1 of await fs.readdir(prebuilds)) {
|
||||
let toRm = false;
|
||||
for (const folderLayer2 of await fs.readdir(path.join(prebuilds, folderLayer1))) {
|
||||
const currentFolder = path.join(prebuilds, folderLayer1, folderLayer2);
|
||||
if ((await fs.lstat(currentFolder)).isDirectory()) {
|
||||
toRm = true;
|
||||
const newFolder = path.join(prebuilds, folderLayer2);
|
||||
console.log("\nMigrate from %O to %O", currentFolder, newFolder);
|
||||
if (await exist(newFolder)) await fs.rm(newFolder, { recursive: true, force: true });
|
||||
await fs.mkdir(newFolder, { recursive: true });
|
||||
await Promise.all((await fs.readdir(currentFolder)).map(async p => {
|
||||
console.log("Copy %O", path.join(currentFolder, p));
|
||||
return fs.copyFile(path.join(currentFolder, p), path.join(newFolder, p))
|
||||
}));
|
||||
await fs.rm(currentFolder, { recursive: true, force: true });
|
||||
}
|
||||
}
|
||||
if (toRm) await fs.rm(path.join(prebuilds, folderLayer1), { recursive: true, force: true });
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {string} platform
|
||||
* @param {string} arch
|
||||
*/
|
||||
async function migrateBuildAddon(platform, arch) {
|
||||
const files = (await fs.readdir(buildRelease)).filter(f => f.endsWith(".node"));
|
||||
const targetPath = path.join(prebuilds, `${platform}_${arch}`);
|
||||
if (await exist(targetPath)) await fs.rm(targetPath, {recursive: true, force: true});
|
||||
await fs.mkdir(targetPath, {recursive: true});
|
||||
for (const file of files) {
|
||||
console.log("Move %O to %O", path.join(buildRelease, file), path.join(targetPath, file));
|
||||
await fs.rename(path.join(buildRelease, file), path.join(targetPath, file));
|
||||
}
|
||||
await fs.rm(buildDir, { recursive: true, force: true });
|
||||
}
|
||||
|
||||
if (process.argv.slice(2).at(0) === "build") {
|
||||
let archs = [];
|
||||
if (process.argv.includes("--clean")) {
|
||||
if (await exist(buildDir)) await fs.rm(buildDir, { recursive: true, force: true });
|
||||
if (await exist(prebuilds)) await fs.rm(prebuilds, { recursive: true, force: true });
|
||||
}
|
||||
if (process.argv.includes("--auto")) {
|
||||
if (process.platform === "linux") archs.push("x64", "arm64");
|
||||
else if (process.platform === "win32") archs.push("x64", "arm64");
|
||||
else if (process.platform === "darwin") archs.push("x64", "arm64");
|
||||
else archs.push(process.arch);
|
||||
} else {
|
||||
process.argv.slice(2).filter(f => f.startsWith("--arch=")).map(arch => arch.slice(7));
|
||||
if (archs.length <= 0) archs.push(process.arch);
|
||||
}
|
||||
for (const arch of Array.from(new Set(archs))) {
|
||||
if (process.platform === "linux" && arch !== process.arch) {
|
||||
if (arch === "x64") {
|
||||
// x86_64-linux-gnu-gcc
|
||||
env.CC = "x86_64-linux-gnu-gcc";
|
||||
env.CXX = "x86_64-linux-gnu-g++";
|
||||
} else if (arch === "arm64") {
|
||||
// aarch64-linux-gnu-gcc
|
||||
env.CC = "aarch64-linux-gnu-gcc";
|
||||
env.CXX = "aarch64-linux-gnu-g++";
|
||||
}
|
||||
} else if (process.platform === "win32" && arch !== process.arch) {
|
||||
let skip = true;
|
||||
for (const vsPath of [ "C:\\Program Files (x86)\\Microsoft Visual Studio", "C:\\Program Files\\Microsoft Visual Studio" ]) {
|
||||
if (!(await exist(vsPath))) continue;
|
||||
const year = ((await fs.readdir(vsPath)).filter(s => !(isNaN(Number(s)))).sort((a, b) => (Number(a) < Number(b)) ? -1 : 0).at(-1));
|
||||
if (!year) continue;
|
||||
for (const vsEdition of await fs.readdir(path.join(vsPath, year))) {
|
||||
if (await exist(path.join(vsPath, year, vsEdition, "MSBuild\\Current\\Bin", arch))) {
|
||||
if (skip) skip = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!skip) break;
|
||||
}
|
||||
if (skip) {
|
||||
console.info("Arch not avaible to copiler!");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
console.log("Bulding to %O\n", arch);
|
||||
await fork(nodeGyp, ["rebuild", ...(process.platform !== "android"?["-j", "max"]:[]), ("--arch=").concat(arch)], {env});
|
||||
console.log("Migrating addons!");
|
||||
await migrateBuildAddon(process.platform, arch);
|
||||
} catch (err) {
|
||||
if (process.platform === "win32" && arch !== process.arch) continue;
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
} else if (!(await exist(path.join(prebuilds, `${process.platform}_${process.arch}`)) || await exist(buildRelease))) {
|
||||
await fork(nodeGyp, ["rebuild", ...(process.platform !== "android"?["-j", "max"]:[])], {env});
|
||||
await migrateBuildAddon(process.platform, process.arch);
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
|
||||
module.exports = main;
|
||||
/**
|
||||
* Load node addon
|
||||
* @param {string|number|undefined} name
|
||||
* @param {string|undefined} path
|
||||
* @returns {any}
|
||||
*/
|
||||
function main(name, pathLocation) {
|
||||
if (!pathLocation) pathLocation = path.resolve(__dirname, "..");
|
||||
else pathLocation = path.resolve(process.cwd(), pathLocation);
|
||||
const folders = [
|
||||
path.join(pathLocation, "build", "Release"),
|
||||
path.join(pathLocation, "build", "Debug"),
|
||||
path.join(pathLocation, "prebuilds", `${process.platform}_${process.arch}`),
|
||||
path.join(pathLocation, "prebuilds", `${process.platform}-${process.arch}`),
|
||||
];
|
||||
for (const folder of folders) {
|
||||
if (fs.existsSync(folder)) {
|
||||
const files = (fs.readdirSync(folder)).filter(file => file.endsWith(".node"));
|
||||
if (typeof name === "number") return require(path.join(folder, files.at(name)));
|
||||
else if (!name) name = files.at(0);
|
||||
if (typeof name === "string") {
|
||||
const bname = name.concat("");
|
||||
if ((name = files.find(s => s.startsWith(name)))) return require(path.join(folder, name));
|
||||
name = bname;
|
||||
}
|
||||
}
|
||||
}
|
||||
throw new Error("Cannot get node addon");
|
||||
}
|
24
package.json
24
package.json
@ -3,17 +3,9 @@
|
||||
"version": "1.8.3",
|
||||
"description": "Control your wireguard interface from node.js, not a wireguard-tools/wg wrapper!",
|
||||
"private": false,
|
||||
"type": "commonjs",
|
||||
"type": "module",
|
||||
"main": "./src/index.js",
|
||||
"types": "./src/index.d.ts",
|
||||
"default": "./index.mjs",
|
||||
"exports": {
|
||||
".": {
|
||||
"require": "./src/index.js",
|
||||
"default": "./index.mjs",
|
||||
"types": "./src/index.d.ts"
|
||||
}
|
||||
},
|
||||
"homepage": "https://sirherobrine23.org/Wireguard/Wireguard-tools.js#readme",
|
||||
"author": "Matheus Sampaio Queiroga <srherobrine20@gmail.com> (https://sirherobrine23.org/)",
|
||||
"license": "GPL-3.0-or-later",
|
||||
@ -41,20 +33,18 @@
|
||||
"node": ">=16.0.0"
|
||||
},
|
||||
"scripts": {
|
||||
"install": "node libs/build.mjs",
|
||||
"test": "node libs/build.mjs build --clean && node --require ts-node/register --loader ts-node/esm --test src/**/*_test.ts",
|
||||
"dev": "node libs/build.mjs build",
|
||||
"prebuildify": "node libs/build.mjs build --auto",
|
||||
"prepack": "tsc --build --clean && tsc --build && node libs/build.mjs",
|
||||
"install": "rebory prebuild",
|
||||
"dev": "rebory build -DP",
|
||||
"prepack": "tsc --build --clean && tsc --build",
|
||||
"postpack": "tsc --build --clean"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^20.11.0",
|
||||
"@types/node": "^20.11.19",
|
||||
"ts-node": "^10.9.2",
|
||||
"typescript": "^5.3.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"node-addon-api": "^7.0.0",
|
||||
"node-gyp": "^10.0.1"
|
||||
"node-addon-api": "^7.1.0",
|
||||
"rebory": "^0.1.10"
|
||||
}
|
||||
}
|
||||
|
10
src/index.ts
10
src/index.ts
@ -1,5 +1,5 @@
|
||||
export * as key from "./key";
|
||||
export * as wgQuick from "./quick";
|
||||
export * from "./wginterface";
|
||||
export * as wginterface from "./wginterface";
|
||||
export * as default from "./wginterface";
|
||||
export * as key from "./key.js";
|
||||
export * as wgQuick from "./quick.js";
|
||||
export * from "./wginterface.js";
|
||||
export * as wginterface from "./wginterface.js";
|
||||
export * as default from "./wginterface.js";
|
||||
|
@ -1,2 +1,2 @@
|
||||
import "./quick_test";
|
||||
import "./key_test";
|
||||
import "./quick_test.js";
|
||||
import "./key_test.js";
|
@ -1,6 +1,6 @@
|
||||
import assert from "node:assert";
|
||||
import test from "node:test";
|
||||
import { presharedKey, privateKey, publicKey } from "./key";
|
||||
import { presharedKey, privateKey, publicKey } from "./key.js";
|
||||
const max = 100, keysArray = Array(max).fill(null);
|
||||
|
||||
test("Generate key in javascript", async (t) => {
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { isIP } from "net";
|
||||
import { format } from "util";
|
||||
import { Peer, WgConfigBase } from "./wginterface";
|
||||
import { Peer, WgConfigBase } from "./wginterface.js";
|
||||
|
||||
export interface QuickConfig extends WgConfigBase<Peer>, Partial<Record<`${"Post" | "Pre"}${"Up" | "Down"}`, string[]>> {
|
||||
DNS?: string[];
|
||||
|
@ -1,6 +1,6 @@
|
||||
import test from "node:test";
|
||||
import assert from "node:assert";
|
||||
import { QuickConfig, parse, stringify } from "./quick";
|
||||
import { QuickConfig, parse, stringify } from "./quick.js";
|
||||
|
||||
const StaticConfig = `[Interface]
|
||||
ListenPort = 38451
|
||||
|
@ -3,10 +3,27 @@ import { isIPv4, createConnection as netConnection } from "net";
|
||||
import path from "path";
|
||||
import readline from "readline";
|
||||
import { finished } from "stream/promises";
|
||||
if (process.platform === "win32") global.WIREGUARD_DLL_PATH = path.join(__dirname, "../addons/tools/win/wireguard-nt/bin", process.arch === "x64" ? "amd64" : process.arch, "wireguard.dll");
|
||||
const addon = require("../libs/prebuildifyLoad.cjs")("wginterface");
|
||||
import rebory from "rebory";
|
||||
import { fileURLToPath } from "url";
|
||||
|
||||
export const { constants } = addon as { constants: { WG_B64_LENGTH: number, WG_LENGTH: number, MAX_NAME_LENGTH: number, driveVersion: string } };
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
||||
const addon = rebory.loadAddon(path.join(__dirname, "../binding.yaml")).wginterface.loadRelease<{
|
||||
listDevices?: () => Promise<{from: "userspace"|"kernel", name: string, path?: string}[]>;
|
||||
deleteInterface?: (wgName: string) => Promise<void>;
|
||||
setConfig?: (wgName: string, config: WgConfigSet) => Promise<void>;
|
||||
getConfig?: (wgName: string) => Promise<WgConfigGet>;
|
||||
constants: {
|
||||
WG_B64_LENGTH: number;
|
||||
WG_LENGTH: number;
|
||||
MAX_NAME_LENGTH: number;
|
||||
driveVersion: string;
|
||||
};
|
||||
}>({
|
||||
WIREGUARD_DLL_PATH: path.resolve(__dirname, "../addons/tools/win/wireguard-nt/bin", ((process.arch === "x64" && "amd64") || (process.arch === "ia32" && "i386"))||process.arch, "wireguard.dll")
|
||||
});
|
||||
export const { constants } = addon;
|
||||
|
||||
console.log(addon);
|
||||
|
||||
/** default location to run socket's */
|
||||
const defaultPath = (process.env.WIRWGUARD_GO_RUN||"").length > 0 ? path.resolve(process.cwd(), process.env.WIRWGUARD_GO_RUN) : process.platform === "win32" ? "\\\\.\\pipe\\WireGuard" : "/var/run/wireguard";
|
||||
|
@ -1,8 +1,8 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"esModuleInterop": true,
|
||||
"module": "CommonJS",
|
||||
"moduleResolution": "Node",
|
||||
"module": "NodeNext",
|
||||
"moduleResolution": "NodeNext",
|
||||
"target": "ESNext",
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"declaration": true,
|
||||
|
Loading…
x
Reference in New Issue
Block a user