nikolay
вы хотите в электроне интерфес сделать?
nikolay
у ip телефонии хуки какие то есть
Рамиль
а что сложного
Я не работал раньше на electron. Вот и думаю можно ли такое сделать.
Георгий
Привет, если я правильно понял, то должно хватать process.arch и process.platform
И ещё какие-нибудь системные энвы могут быть, на которые можно опираться
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
И ещё какие-нибудь системные энвы могут быть, на которые можно опираться
Во!) Вот это уже больше похоже на решения, однако тяжело отделаться от мысли что все таки это не труъ - хочется решить вопрос стандартными апишками NodeJS
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, не соответствующее фактической архитектуре операционной системы. Это прозвучит абсолютно контринтуитивно и противоречашее здравому смыслу, но такова картину. Задержитесь на этом абзецце пару минут и подумайте над абсурдностью ситуации.
Георгий
Именно! В случае, когда ваше 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, не соответствующее фактической архитектуре операционной системы. Это прозвучит абсолютно контринтуитивно и противоречашее здравому смыслу, но такова картину. Задержитесь на этом абзецце пару минут и подумайте над абсурдностью ситуации.
Вот бы мне такое рассказал кто-нибудь, когда я это расследование год назад проводил. Хуже было только понять, что нельзя .dmg файлы через телегу перекидывать, иначе они с каким то шансом могут сломаться (меня спасли тут в чате)
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
И вот теперь... Похоже что мы готовы тестить. Мы покрыли все известные нам кейсы и готовы прогнать боевой тест. Но Parallels Desktop, через который мы на arm маке виртуализируем arm Windows 11 (потому что нет на руках реальность устройства на win arm) говорит нам: "Не так бысто чувак". И через os.machine() возвращает нам строку unknown, которая ВООБЩЕ НИГДЕ НЕ ДОКУМЕНТИРОВАНА, НИ ОПИСАНА В КОДЕ НОДЫ Это приводит нас к тому, что мы руками пишем при unknown долбится в озвученные ранее переменные среды потому что "а чо делать то?"
Yuri
И это приводит нас к вот такому архипиздецу, который мы документируем для потомков чтобы помнили https://gist.github.com/RareScrap/0ba9e5aba0f996a31538f2b7869d57ac
Yuri
И вот так, вопреки несовершенствам NodeJS, вопреки несовершенствам win32 api, вопреки несовершенствам систем виртуалиации мы достигли по-большому счету работающего решения, который без всего контекста этой истории выглядит еще хуже, чем код вашего жпт-джуна
Георгий
Осталось теперь разобраться с тем же самым на macOS
Если там, конечно, всё также плохо, я сам не смотрел вообще
Yuri
Yuri
Если там, конечно, всё также плохо, я сам не смотрел вообще
Я все еще не собираю под MacOS так что быть может у истории будет сиквел))0
Yuri
Но есть еще один неприятный ньюанс - существует возможность писать в эти переменные окружение, к которым мы фолбечимся, кастомные значения. В лучшем случае, мы мне сможем определить архитектуру оси. В худшем - определеим ее неверно. Но боюсь, что это лучшее что можно сделать во всей ситуации
Yuri
дисклеймер, пилить свой нативный модуль который будет долбится в win32 апи для минимизации сторонних значений в переменных окружения - жутко дорого для поддержки electron-приложения.
Георгий
Но есть еще один неприятный ньюанс - существует возможность писать в эти переменные окружение, к которым мы фолбечимся, кастомные значения. В лучшем случае, мы мне сможем определить архитектуру оси. В худшем - определеим ее неверно. Но боюсь, что это лучшее что можно сделать во всей ситуации
Ещё для затравочки в 2 предложениях 1 прикол расскажу. При подключении по рдп на винде всегда тянется последний сохраненный пароль и логин, если ты включил в конфиге рдп параметр prompt for credentials, даже если ты его уже поменять хочешь. Просто потому что так mstsc.exe работает и ему вообще плевать что ты там хочешь сделать на самом деле. Поэтому нашёлся костыль тысячелетия: просто ходить и в Windows Credentials Manager для нужного тебе gateway при подключении подставлять туда логин и пароль, а потом его стирать )))))
Георгий
А на маке вообще это ничо не работает, даже с установленным приложением от Microsoft для рдп, они просто половину параметров игнорируют по непонятной причине
Yuri
:D
Я боюсь что и это решение не бех изъянов
Георгий
Я боюсь что и это решение не бех изъянов
Вероятно, но думаю не хуже, чем на ноде 0)
Георгий
Кстати, как дела у deno в этом плане обстоят, допустим
Yuri
почему бы тебе не сделать библиотеку для электрона которая покроет все известные кейсы и даст результат для всего electron сообщества?
По ряду причин: 1) Вырастут мои расходы на мейнтейнерство решения. Сейчас описанное мною решение реализовано в виде локального npm пакеты внутри монорепы основного приложения. Вынос его в публичный npm по-сути означает необходимость переноса в отдельный реп чтобы отдельно версионировать, тестить и релизить. Сейчас же я хочу сконцентрироваться на тасках моей прилки, чем на вклад в сообщество. 2) Мои npm пакеты не собираются в JS за ненадобностью: это делает Electron Forge перед упаковкой прилки. Для пубилкации в npm следует реализовать шаг сборки в JS. Это не звучит как работа, лежащая в моем роадмапе. 3) Все мои репы лежат на приватном self-hosted инстансе гитлаба. И мне придется либо открывать его для публичной сети с разруливанием доступа лишь к одному репу, либо лить это на клауд гитлаба/гитбах, что в моем рабочем флоу выглядит как пятая нога Поэтому увы, опенсурса не будет
Георгий
По ряду причин: 1) Вырастут мои расходы на мейнтейнерство решения. Сейчас описанное мною решение реализовано в виде локального npm пакеты внутри монорепы основного приложения. Вынос его в публичный npm по-сути означает необходимость переноса в отдельный реп чтобы отдельно версионировать, тестить и релизить. Сейчас же я хочу сконцентрироваться на тасках моей прилки, чем на вклад в сообщество. 2) Мои npm пакеты не собираются в JS за ненадобностью: это делает Electron Forge перед упаковкой прилки. Для пубилкации в npm следует реализовать шаг сборки в JS. Это не звучит как работа, лежащая в моем роадмапе. 3) Все мои репы лежат на приватном self-hosted инстансе гитлаба. И мне придется либо открывать его для публичной сети с разруливанием доступа лишь к одному репу, либо лить это на клауд гитлаба/гитбах, что в моем рабочем флоу выглядит как пятая нога Поэтому увы, опенсурса не будет
В продолжение сегодняшней шизы, хоть и не относится к обсуждаемому
Георгий
В продолжение сегодняшней шизы, хоть и не относится к обсуждаемому
* 1000 только на iOS приводит к крашу всего приложения
Георгий
* 1000 только на iOS приводит к крашу всего приложения
То есть только WebKit на iOS и iPadOS не справился числом видимо UPD: Любое вычисление в этой строке ломает всё на iOS/iPadOS, в этом и оказалась проблема
Yuri
Любопытно что в логах
Георгий
Любопытно что в логах
пусто полностью было
🅰️nimeCoder
У меня как то в аргументах у функции была пропущена запятая и при вызове её у меня крашился v8
🅰️nimeCoder
Пока я не понял в чем дело
🅰️nimeCoder
Но это не электрон, просто нода, причём года 17-18
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
В основном сам факт потребности вижу только для например выбора того что паковать и запускать из extra ресурсов. Но если пакет х86 и ресурсы в нем х86, то работать то будет
Yuri
А можно напомнить зачем знать? Ну если x86 пакет выполняется, значит это или х86 (i386) или х64 (amd64)
1) Мне нужно формировать список JRE, которые можно запустить на машине юзера. Для этого мне нужно знать фактическую архитектуру оси. 2) x86 приложение может быть запущено и на arm64. Это и делает винда на arm
🅰️nimeCoder
Значит нужно выбирать jre с х86