{"_id":"@bs-solutions/bastion-network-plugin","_rev":"3-dafd8072007a4e0743f55f0429cbc574","name":"@bs-solutions/bastion-network-plugin","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.0":{"name":"@bs-solutions/bastion-network-plugin","version":"1.0.0","keywords":["capacitor","plugin","native","tcp","udp","socket"],"author":{"name":"sudondie","email":"ilia.skakov@gmail.com"},"license":"MIT","_id":"@bs-solutions/bastion-network-plugin@1.0.0","maintainers":[{"name":"vperekrestov","email":"bymbarasch@yandex.ru"},{"name":"dmitriy-u","email":"dmitriyushkalov@gmail.com"},{"name":"vladsolyony","email":"solyonyvlad@gmail.com"},{"name":"sudondie","email":"ilia.skakov@gmail.com"}],"homepage":"https://github.com/Bastion-RND/bastion-network-plugin#readme","bugs":{"url":"https://github.com/Bastion-RND/bastion-network-plugin/issues"},"dist":{"shasum":"04b53b41d66a78177f45d8ac977fbbb30df11787","tarball":"https://registry.npmjs.org/@bs-solutions/bastion-network-plugin/-/bastion-network-plugin-1.0.0.tgz","fileCount":12,"integrity":"sha512-ZjZPDppXUvwIe4QgsUv8I4MaeBkW1kdXCeHw7tqYQZfFx+kMOVFzlNkc58NiEwtGE2rhRiDPPKRZISt/P3DfyQ==","signatures":[{"sig":"MEUCIQC5PMJ83uPfR/Vjw51SGRc9Cawl5uRGktcMlJGyA5/HAgIgPdRzQm4WELMLIhcn1Bp+OypK8+9BQgVm/JUH65iAqjg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13324},"main":"dist/plugin.cjs.js","type":"module","types":"dist/esm/index.d.ts","unpkg":"dist/plugin.js","module":"dist/esm/index.js","gitHead":"ad9f70b1b0a311b2afd308e8bd3122a1138bdba5","scripts":{"fmt":"npm run eslint -- --fix && npm run prettier -- --write && npm run swiftlint -- --fix --format","lint":"npm run eslint && npm run prettier -- --check && npm run swiftlint -- lint","build":"npm run clean && tsc && rollup -c rollup.config.mjs","clean":"rimraf ./dist","watch":"tsc --watch","eslint":"eslint . --ext ts","verify":"npm run verify:ios && npm run verify:android","prettier":"prettier \"**/*.{css,html,ts,js,java}\" --plugin=prettier-plugin-java","swiftlint":"node-swiftlint","verify:ios":"xcodebuild -scheme BsSolutionsBastionNetworkPlugin -destination generic/platform=iOS","prepublishOnly":"npm run build","verify:android":"cd android && ./gradlew clean build test && cd .."},"_npmUser":{"name":"sudondie","email":"ilia.skakov@gmail.com"},"prettier":"@ionic/prettier-config","capacitor":{"ios":{"src":"ios"},"android":{"src":"android"}},"swiftlint":"@ionic/swiftlint-config","repository":{"url":"git+https://github.com/Bastion-RND/bastion-network-plugin.git","type":"git"},"_npmVersion":"10.9.2","description":"Raw TCP/UDP socket plugin for Capacitor 6 and higher (LAN device discovery and connection)","directories":{},"_nodeVersion":"22.17.0","eslintConfig":{"extends":"@ionic/eslint-config/recommended"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","rimraf":"^6.0.1","rollup":"^4.30.1","prettier":"^3.4.2","swiftlint":"^2.0.0","typescript":"^5.4.0","@capacitor/ios":">=6.0.0","@capacitor/core":">=6.0.0","@capacitor/android":">=6.0.0","@ionic/eslint-config":"^0.4.0","prettier-plugin-java":"^2.6.6","@ionic/prettier-config":"^4.0.0","@ionic/swiftlint-config":"^2.0.0"},"peerDependencies":{"@capacitor/core":">=6.2.0"},"_npmOperationalInternal":{"tmp":"tmp/bastion-network-plugin_1.0.0_1785920194188_0.808225610760684","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@bs-solutions/bastion-network-plugin","version":"1.0.1","keywords":["capacitor","plugin","native","tcp","udp","socket"],"author":{"name":"sudondie","email":"ilia.skakov@gmail.com"},"license":"MIT","_id":"@bs-solutions/bastion-network-plugin@1.0.1","maintainers":[{"name":"vperekrestov","email":"bymbarasch@yandex.ru"},{"name":"dmitriy-u","email":"dmitriyushkalov@gmail.com"},{"name":"vladsolyony","email":"solyonyvlad@gmail.com"},{"name":"sudondie","email":"ilia.skakov@gmail.com"}],"homepage":"https://github.com/Bastion-RND/bastion-network-plugin#readme","bugs":{"url":"https://github.com/Bastion-RND/bastion-network-plugin/issues"},"dist":{"shasum":"1dae05fbc37363501b1963863895dc90bd62db95","tarball":"https://registry.npmjs.org/@bs-solutions/bastion-network-plugin/-/bastion-network-plugin-1.0.1.tgz","fileCount":23,"integrity":"sha512-Njqdknp9h4DCc8+J4wk43J9kQg4kqwAxOnNBAFB+ri9ZwDrSYSItDBx7+Sr6H96fpLQrxGW8LClzfx6Xj0yQdw==","signatures":[{"sig":"MEUCIQDzPGUVaTwwuGx5Oe81Vi/tOcutgFJ36E4tzLNF/ASLWAIgJ5SXO1YTZZBSJzmMXKc8Tqmow51cTLrojhd/0kFlXk0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":45066},"main":"dist/plugin.cjs.js","type":"module","types":"dist/esm/index.d.ts","unpkg":"dist/plugin.js","module":"dist/esm/index.js","gitHead":"ad9f70b1b0a311b2afd308e8bd3122a1138bdba5","scripts":{"fmt":"npm run eslint -- --fix && npm run prettier -- --write && npm run swiftlint -- --fix --format","lint":"npm run eslint && npm run prettier -- --check && npm run swiftlint -- lint","build":"npm run clean && tsc && rollup -c rollup.config.mjs","clean":"rimraf ./dist","watch":"tsc --watch","eslint":"eslint . --ext ts","verify":"npm run verify:ios && npm run verify:android","prettier":"prettier \"**/*.{css,html,ts,js,java}\" --plugin=prettier-plugin-java","swiftlint":"node-swiftlint","verify:ios":"xcodebuild -scheme BsSolutionsBastionNetworkPlugin -destination generic/platform=iOS","prepublishOnly":"npm run build","verify:android":"cd android && ./gradlew clean build test && cd .."},"_npmUser":{"name":"sudondie","email":"ilia.skakov@gmail.com"},"prettier":"@ionic/prettier-config","capacitor":{"ios":{"src":"ios"},"android":{"src":"android"}},"swiftlint":"@ionic/swiftlint-config","repository":{"url":"git+https://github.com/Bastion-RND/bastion-network-plugin.git","type":"git"},"_npmVersion":"10.9.2","description":"Raw TCP/UDP socket plugin for Capacitor 6 and higher (LAN device discovery and connection)","directories":{},"_nodeVersion":"22.17.0","eslintConfig":{"extends":"@ionic/eslint-config/recommended"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","rimraf":"^6.0.1","rollup":"^4.30.1","prettier":"^3.4.2","swiftlint":"^2.0.0","typescript":"^5.4.0","@capacitor/ios":">=6.0.0","@capacitor/core":">=6.0.0","@capacitor/android":">=6.0.0","@ionic/eslint-config":"^0.4.0","prettier-plugin-java":"^2.6.6","@ionic/prettier-config":"^4.0.0","@ionic/swiftlint-config":"^2.0.0"},"peerDependencies":{"@capacitor/core":">=6.2.0"},"_npmOperationalInternal":{"tmp":"tmp/bastion-network-plugin_1.0.1_1785920872482_0.21676618822135985","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@bs-solutions/bastion-network-plugin","version":"1.0.2","description":"Raw TCP/UDP socket plugin for Capacitor 6 and higher (LAN device discovery and connection)","main":"dist/plugin.cjs.js","module":"dist/esm/index.js","types":"dist/esm/index.d.ts","unpkg":"dist/plugin.js","type":"module","author":{"name":"sudondie","email":"ilia.skakov@gmail.com"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/Bastion-RND/bastion-network-plugin.git"},"keywords":["capacitor","plugin","native","tcp","udp","socket"],"scripts":{"verify":"npm run verify:ios && npm run verify:android","verify:ios":"xcodebuild -scheme BsSolutionsBastionNetworkPlugin -destination generic/platform=iOS","verify:android":"cd android && ./gradlew clean build test && cd ..","lint":"npm run eslint && npm run prettier -- --check && npm run swiftlint -- lint","fmt":"npm run eslint -- --fix && npm run prettier -- --write && npm run swiftlint -- --fix --format","eslint":"eslint . --ext ts","prettier":"prettier \"**/*.{css,html,ts,js,java}\" --plugin=prettier-plugin-java","swiftlint":"node-swiftlint","build":"npm run clean && tsc && rollup -c rollup.config.mjs","clean":"rimraf ./dist","watch":"tsc --watch","prepublishOnly":"npm run build"},"devDependencies":{"@capacitor/android":">=6.0.0","@capacitor/core":">=6.0.0","@capacitor/ios":">=6.0.0","@ionic/eslint-config":"^0.4.0","@ionic/prettier-config":"^4.0.0","@ionic/swiftlint-config":"^2.0.0","eslint":"^8.57.0","prettier":"^3.4.2","prettier-plugin-java":"^2.6.6","rimraf":"^6.0.1","rollup":"^4.30.1","swiftlint":"^2.0.0","typescript":"^5.4.0"},"peerDependencies":{"@capacitor/core":">=6.2.0"},"prettier":"@ionic/prettier-config","swiftlint":"@ionic/swiftlint-config","eslintConfig":{"extends":"@ionic/eslint-config/recommended"},"capacitor":{"ios":{"src":"ios"},"android":{"src":"android"}},"_id":"@bs-solutions/bastion-network-plugin@1.0.2","gitHead":"f119a31020992a2d90bd5124b93ddcbeceee74ba","bugs":{"url":"https://github.com/Bastion-RND/bastion-network-plugin/issues"},"homepage":"https://github.com/Bastion-RND/bastion-network-plugin#readme","_nodeVersion":"22.17.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-X+EqbscFmC+LwXYnrcW2HTfyNklYgNij5zG9y7bFoiRNctNMCLnBc6d/hcBRtF8kEJwg0afZj2O3J6QP+wAwlA==","shasum":"7b7e93611e6c5292e7a422558d7efaa0933db8ce","tarball":"https://registry.npmjs.org/@bs-solutions/bastion-network-plugin/-/bastion-network-plugin-1.0.2.tgz","fileCount":23,"unpackedSize":50388,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDCSmbp/n5O0yz86xn8pNqKSZ7kPt2nlYj+BjcXXwXlDwIhAMpcSx1cyzoE3U/zQWmVJ1CroHOBrEOCZUmUKmclQeyo"}]},"_npmUser":{"name":"sudondie","email":"ilia.skakov@gmail.com"},"directories":{},"maintainers":[{"name":"vperekrestov","email":"bymbarasch@yandex.ru"},{"name":"dmitriy-u","email":"dmitriyushkalov@gmail.com"},{"name":"vladsolyony","email":"solyonyvlad@gmail.com"},{"name":"sudondie","email":"ilia.skakov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/bastion-network-plugin_1.0.2_1785933305104_0.3946656558384418"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-05T08:56:33.693Z","modified":"2026-08-05T12:35:05.457Z","1.0.0":"2026-08-05T08:56:34.322Z","1.0.1":"2026-08-05T09:07:52.602Z","1.0.2":"2026-08-05T12:35:05.248Z"},"bugs":{"url":"https://github.com/Bastion-RND/bastion-network-plugin/issues"},"author":{"name":"sudondie","email":"ilia.skakov@gmail.com"},"license":"MIT","homepage":"https://github.com/Bastion-RND/bastion-network-plugin#readme","keywords":["capacitor","plugin","native","tcp","udp","socket"],"repository":{"type":"git","url":"git+https://github.com/Bastion-RND/bastion-network-plugin.git"},"description":"Raw TCP/UDP socket plugin for Capacitor 6 and higher (LAN device discovery and connection)","maintainers":[{"name":"vperekrestov","email":"bymbarasch@yandex.ru"},{"name":"dmitriy-u","email":"dmitriyushkalov@gmail.com"},{"name":"vladsolyony","email":"solyonyvlad@gmail.com"},{"name":"sudondie","email":"ilia.skakov@gmail.com"}],"readme":"# bastion-network-plugin\n\nRaw TCP/UDP socket plugin for Capacitor 6 and higher. Даёт прямой доступ к сырым\nсокетам из JS: UDP-broadcast для обнаружения устройств в локальной сети и TCP для\nподключения к ним и обмена произвольными данными. Порты и формат данных полностью\nна стороне приложения — плагин ничего не знает о конкретном протоколе.\n\nВеб-платформа не поддерживается (сырые сокеты в браузере недоступны).\n\n## Install\n\n```bash\nnpm i @bs-solutions/bastion-network-plugin\nnpx cap sync\n```\n\n### Android\n\nПлагин объявляет `INTERNET`, `ACCESS_WIFI_STATE`, `CHANGE_WIFI_MULTICAST_STATE` в\nсобственном манифесте — дополнительно ничего добавлять не нужно.\n\n### iOS\n\nНачиная с iOS 14 приложению нужно самому объявить local network permission в\nсвоём `Info.plist` — плагин это сделать не может:\n\n```xml\n<key>NSLocalNetworkUsageDescription</key>\n<string>Нужен доступ к локальной сети для поиска устройств</string>\n```\n\n## Конфигурация\n\nTCP (`connectTCP`/`sendTCP`/`disconnectTCP`) работает всегда без какой-либо\nнастройки. Для UDP (`sendBroadcastUDP`/`receiveUDP`) порты обязательно нужно\nзадать конфигом плагина в `capacitor.config.json` — дефолтов нет намеренно,\nбез конфига UDP-методы отклоняются с понятной ошибкой:\n\n```json\n{\n  \"plugins\": {\n    \"BastionNetworkPlugin\": {\n      \"portListTransmit\": [23629, 47701],\n      \"portListReceive\": [23569, 21913]\n    }\n  }\n}\n```\n\n- `portListTransmit` — порты, на которые уходит `sendBroadcastUDP` (на все локальные подсети). Без этого ключа `sendBroadcastUDP` вернёт reject.\n- `portListReceive` — порты, которые слушаются на входящие UDP-пакеты (`receiveUDP`). Без этого ключа слушатели просто не поднимаются (без ошибки — приложению, которому не нужен UDP, ничего делать не надо).\n\n## API\n\nВсе бинарные данные (UDP-датаграммы, TCP-пакеты) передаются как base64-строки.\n\n```ts\nimport { BastionNetworkPlugin } from '@bs-solutions/bastion-network-plugin';\n\nawait BastionNetworkPlugin.addListener('receiveUDP', ({ ip, port, data }) => {\n  // data — base64\n});\nawait BastionNetworkPlugin.addListener('receiveTCP', ({ linkId, data }) => {});\nawait BastionNetworkPlugin.addListener('disconnectTCP', ({ linkId }) => {});\n\nawait BastionNetworkPlugin.sendBroadcastUDP({ data: base64Data });\n\nconst { linkId } = await BastionNetworkPlugin.connectTCP({\n  ip: '192.168.1.50',\n  port: 1234,\n  data: base64AuthToken,\n});\n\nawait BastionNetworkPlugin.sendTCP({ linkId, data: base64Data });\nawait BastionNetworkPlugin.disconnectTCP({ linkId });\n```\n\n### Методы\n\n| Метод              | Описание                                                             |\n| ------------------ | --------------------------------------------------------------------- |\n| `sendBroadcastUDP` | Разослать UDP broadcast на все локальные подсети (порты из `portListTransmit`) |\n| `connectTCP`       | Открыть TCP-соединение, первым пакетом отправить данные авторизации  |\n| `sendTCP`          | Отправить данные в открытое TCP-соединение                            |\n| `disconnectTCP`    | Закрыть TCP-соединение                                                |\n\n### События\n\n| Событие          | Когда срабатывает                                    |\n| ---------------- | ------------------------------------------------------ |\n| `receiveUDP`     | Пришёл UDP-пакет на один из портов `portListReceive`   |\n| `receiveTCP`     | Пришли данные по открытому TCP-соединению               |\n| `disconnectTCP`  | TCP-соединение закрыто (в т.ч. по инициативе устройства) |\n\n## Maintainer\n\n[sudondie](https://github.com/sudondie)\n\n## Contributing\n\nPlease contribute! [Look at the issues](https://github.com/Bastion-RND/bastion-network-plugin/issues).\n\n## License\n\nMIT © 2026\n","readmeFilename":"README.md"}