nikolay
nikolay
nikolay
вы хотите в электроне интерфес сделать?
nikolay
у ip телефонии хуки какие то есть
Рамиль
а что сложного
Я не работал раньше на electron. Вот и думаю можно ли такое сделать.
Рамиль
Георгий
Георгий
Yuri
Даже если либы есть, то вопрос - как они могут работать?
Yuri
Это тоже не выгорит, т.к. process.arch и process.platform (как и их алиасы os.arch() и os.platform()) т.к. они возвращают таргетную архитектуру билда (т.к. то, под что собирался билд) но не то, где он запущен фактически
Георгий
Yuri
Хмм, разве таргетную они возвращают?
https://nodejs.org/docs/latest-v22.x/api/process.html#processarch
> The operating system CPU architecture for which the Node.js binary was compiled
Георгий
Yuri
так вот
Георгий
так вот
Есть решение задачи?)
Yuri
ну первое что приходит на ум - через exec
даже если ходить через exec за фактической инфой об архитектуре операционной системы, то по большому счету весь наш пути приведет нас в 2 места:
1) uname для юникс систем
2) GetVersionExW() для винды
Наблюдательные люди заметят, что это именно те места, куда долбится os.machine() так что кажется что даже процесс спавнить не надо - стандартная апишка уже покрывает этот кейс! Хуле думать - вот оно, решение
Георгий
Yuri
Yuri
Но прикол в том, что os.machine() даст нам сырую строку, дернутую с натива. Дальше нам нужно распарсить ее в одну из поддерживаемых нодой архитектур (NodeJS.Architecture)
И тут мы приходит к первому приколу - мы не можем гарантировать корректное обнаружение архитектуры операционной системы в 100% случаев. Как раз из-за нужды парсить сырую строку. Гарантии почти те же самые что получать инфу о машине юзера через парсинг юзерагента.
Yuri
Ну ладно, мы смирились с тем что мир - не совершенен, но готовы сделать все возможное, чтобы покрыть большую часть кейсов. И это приведет нас к гиганскому мапперу возможных значений.
https://pastebin.com/8iaVNNxV
Yuri
И казалось бы - заебумба. Теперь точно все гуд. До тех пор пока мы не выясням что нода нам пиздит. А именно:
1) Значение "i686" дожно по задумке использоваться для обозначения x86 приложений, запущенных на x86_64 операционной системе (пруф1: https://github.com/nodejs/node/issues/56975#issuecomment-2650606500 пруф: https://github.com/nodejs/node/blob/b07ff551db152ccb507e71160ce077e235206b16/deps/uv/src/win/util.c#L1685 )
2) NodeJS имеет баг, не позволяющий в сборке под x86 точно определить разрядность операционной системы средствами его API (пруф https://github.com/nodejs/node/issues/58493)
Yuri
Я нашел и зарепортил этот баг - в итоге это marked as not planend потому что nodejs выпиливает поддержку x86 В будущем LTS релизе :\
Георгий
Yuri
И я понимаю - похоже что я сам по себе в решении этого вопроса. Ну ок, копаю дальше.
И узнаю, что для каждого процесса в Session 1 винде (т.е. для всех пользовательских exe'шников) сеттится переменная окружения PROCESSOR_ARCHITECTURE), как @GeorgKrom уже спойлернул)))
Алелуйя! Вот на нее и завяжемся чтобы разрузить багованную апишку ноды на винде.
Но как всегда, есть ньюанс...
Георгий
Yuri
Насколько я смотрел при каких-то сценариях её может не быть или там ещё нескольких других envов
Именно! В случае, когда ваше x86 приложение запускается на x86_64 или arm64 операционке - в PROCESSOR_ARCHITECTURE хардкодится значение x86, а **настоящее* значение пеезжает в PROCESSOR_ARCHITEW6432. Дока M$ четко об этом говорит (https://learn.microsoft.com/en-us/windows/win32/winprog64/wow64-implementation-details#environment-variables)
Но чего она вам не скажет, так это то, что что переменная PROCESSOR_ARCHITECTURE на Windows для arm64 для сборок под x86_64 имеет значение AMD64, не соответствующее фактической архитектуре операционной системы. Это прозвучит абсолютно контринтуитивно и противоречашее здравому смыслу, но такова картину. Задержитесь на этом абзецце пару минут и подумайте над абсурдностью ситуации.
Георгий
Георгий
Yuri
И это приводит нас к следующей проблеме - мы не можем в полной мере доверять ни апишке ноды, ни переменным среды винды потому что они не всегда работают корректно.
Но мы можем с ними жить, если научимся достоверно чекать что фактическая архитектура винды - arm64. И тут у нас есть целых два варианта:
1) Чекнуть что есть переменная process.env["ProgramFiles(Arm)"]. Да, это смешно, но способ рабочий.
2) Юзнуть малоизвестную апишку electron'а, которую они забиндили в код хромиума app.runningUnderARM64Translation: https://www.electronjs.org/docs/latest/api/app#apprunningunderarm64translation-readonly-macos-windows (имплеменатция в хромиуме: https://source.chromium.org/chromium/chromium/src/+/main:base/win/windows_version.cc;bpv=1;bpt=1;l=132?gsn=IsRunningEmulatedOnArm64&gs=KYTHE%3A%2F%2Fkythe%3A%2F%2Fchromium.googlesource.com%2Fcodesearch%2Fchromium%2Fsrc%2F%2Fmain%3Flang%3Dc%252B%252B%3Fpath%3Dbase%2Fwin%2Fwindows_version.cc%23pl97LyU6QuQZ9YV8bvY2wN5mOhLEbOp8M-1AMM8GYEw)
Yuri
Георгий
Yuri
И вот теперь... Похоже что мы готовы тестить. Мы покрыли все известные нам кейсы и готовы прогнать боевой тест.
Но Parallels Desktop, через который мы на arm маке виртуализируем arm Windows 11 (потому что нет на руках реальность устройства на win arm) говорит нам: "Не так бысто чувак". И через os.machine() возвращает нам строку unknown, которая ВООБЩЕ НИГДЕ НЕ ДОКУМЕНТИРОВАНА, НИ ОПИСАНА В КОДЕ НОДЫ
Это приводит нас к тому, что мы руками пишем при unknown долбится в озвученные ранее переменные среды потому что "а чо делать то?"
Георгий
Георгий
Yuri
И это приводит нас к вот такому архипиздецу, который мы документируем для потомков чтобы помнили
https://gist.github.com/RareScrap/0ba9e5aba0f996a31538f2b7869d57ac
Yuri
И вот так, вопреки несовершенствам NodeJS, вопреки несовершенствам win32 api, вопреки несовершенствам систем виртуалиации мы достигли по-большому счету работающего решения, который без всего контекста этой истории выглядит еще хуже, чем код вашего жпт-джуна
Георгий
Yuri
Yuri
Но есть еще один неприятный ньюанс - существует возможность писать в эти переменные окружение, к которым мы фолбечимся, кастомные значения. В лучшем случае, мы мне сможем определить архитектуру оси. В худшем - определеим ее неверно. Но боюсь, что это лучшее что можно сделать во всей ситуации
Yuri
дисклеймер, пилить свой нативный модуль который будет долбится в win32 апи для минимизации сторонних значений в переменных окружения - жутко дорого для поддержки electron-приложения.
Георгий
Yuri
Георгий
А на маке вообще это ничо не работает, даже с установленным приложением от Microsoft для рдп, они просто половину параметров игнорируют по непонятной причине
Георгий
Yuri
Yuri
Я боюсь что и это решение не бех изъянов
Георгий
Кстати, как дела у deno в этом плане обстоят, допустим
Alexey
Yuri
почему бы тебе не сделать библиотеку для электрона которая покроет все известные кейсы и даст результат
для всего electron сообщества?
По ряду причин:
1) Вырастут мои расходы на мейнтейнерство решения. Сейчас описанное мною решение реализовано в виде локального npm пакеты внутри монорепы основного приложения. Вынос его в публичный npm по-сути означает необходимость переноса в отдельный реп чтобы отдельно версионировать, тестить и релизить. Сейчас же я хочу сконцентрироваться на тасках моей прилки, чем на вклад в сообщество.
2) Мои npm пакеты не собираются в JS за ненадобностью: это делает Electron Forge перед упаковкой прилки. Для пубилкации в npm следует реализовать шаг сборки в JS. Это не звучит как работа, лежащая в моем роадмапе.
3) Все мои репы лежат на приватном self-hosted инстансе гитлаба. И мне придется либо открывать его для публичной сети с разруливанием доступа лишь к одному репу, либо лить это на клауд гитлаба/гитбах, что в моем рабочем флоу выглядит как пятая нога
Поэтому увы, опенсурса не будет
Георгий
Георгий
Yuri
Yuri
Любопытно что в логах
Yuri
🅰️nimeCoder
У меня как то в аргументах у функции была пропущена запятая и при вызове её у меня крашился v8
🅰️nimeCoder
Пока я не понял в чем дело
🅰️nimeCoder
Но это не электрон, просто нода, причём года 17-18
🅰️nimeCoder
Yuri
Yuri
Помню как раз в этих версиях у readdir сломали флаг recursive из-за чего читать полное содержимое директорий стало оч неприятно
Dev_Paszkiewicz
Привет, если кто то хочет в опенсорс, тому будет полезно сообщество единомышленников @OpenSource_Chat
Тьома
Yuri
Продолжение банкета
Yuri
Ребята из Apple тоже обосрались как челики из MS: нативная прилка терминала под arm64 на M2 при выполнении echo $MACHTYPE так же показывает неверное значение - x86_64. И да, Rosetta выключена
🅰️nimeCoder
Ну запускается пакет и запускается, чего бухтеть то
🅰️nimeCoder
А можно напомнить зачем знать? Ну если x86 пакет выполняется, значит это или х86 (i386) или х64 (amd64)
🅰️nimeCoder
Если на маке выполняется arm, значит это только arm и не х86
Если х86 значит или Intel (i386/amd64) или arm
🅰️nimeCoder
🅰️nimeCoder
В основном сам факт потребности вижу только для например выбора того что паковать и запускать из extra ресурсов.
Но если пакет х86 и ресурсы в нем х86, то работать то будет
🅰️nimeCoder
🅰️nimeCoder
Значит нужно выбирать jre с х86