{"_id":"@blackgersain/capacitor-nearby-multipeer","name":"@blackgersain/capacitor-nearby-multipeer","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@blackgersain/capacitor-nearby-multipeer","version":"1.0.0","description":"Capacitor plugin for Google Nearby & iOS Multipeer Connectivity","main":"dist/plugin.cjs.js","module":"dist/esm/index.js","types":"dist/esm/index.d.ts","unpkg":"dist/plugin.js","author":{"name":"Squareetlabs"},"contributors":[{"name":"Alberto Rial Barreiro","email":"alberto@squareet.com","url":"https://squareet.com"},{"name":"Jacobo Cantorna Cigarrán","email":"jacobo@squareet.com.com","url":"https://squareet.com"}],"license":"MIT","repository":{"type":"git","url":"git+https://github.com/squareetlabs/capacitor-nearby-multipeer.git"},"bugs":{"url":"https://github.com/squareetlabs/capacitor-nearby-multipeer/issues"},"keywords":["capacitor","plugin","native","capacitor nearby","capacitor multipeer","multipeer nearby","nearby multipeer"],"scripts":{"verify":"npm run verify:ios && npm run verify:android && npm run verify:web","verify:ios":"xcodebuild -scheme SquareetlabsCapacitorNearbyMultipeer -destination generic/platform=iOS","verify:android":"cd android && ./gradlew clean build test && cd ..","verify:web":"npm run build","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}\"","swiftlint":"node-swiftlint","docgen":"docgen --api NearbyMultipeerPlugin --output-readme README.md --output-json dist/docs.json","build":"npm run clean && npm run docgen && tsc && rollup -c rollup.config.js","clean":"rimraf ./dist","watch":"tsc --watch","prepublishOnly":"npm run build"},"devDependencies":{"@capacitor/android":"^7.0.0","@capacitor/core":"^7.0.0","@capacitor/docgen":"^0.2.2","@capacitor/ios":"^7.0.0","@ionic/eslint-config":"^0.3.0","@ionic/prettier-config":"^1.0.1","@ionic/swiftlint-config":"^1.1.2","eslint":"^7.11.0","prettier":"~2.3.0","prettier-plugin-java":"~1.0.2","rimraf":"^3.0.2","rollup":"^2.32.0","swiftlint":"^1.0.1","typescript":"~4.1.5"},"peerDependencies":{"@capacitor/core":"^7.0.0"},"prettier":"@ionic/prettier-config","swiftlint":"@ionic/swiftlint-config","eslintConfig":{"extends":"@ionic/eslint-config/recommended"},"capacitor":{"ios":{"src":"ios"},"android":{"src":"android"}},"_id":"@blackgersain/capacitor-nearby-multipeer@1.0.0","gitHead":"3980f7ffd844f820c16a4c9cb790c74830f1d57f","homepage":"https://github.com/squareetlabs/capacitor-nearby-multipeer#readme","_nodeVersion":"22.14.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-3mTsOTXhbHTwFMNfvKZ7WjhQX9xZFIGLFaFqlEKdC6LAGjzBFtG3N4Ug1Y6rEkqdlbfpvaUGFE5RCsDy+L/1sg==","shasum":"2a2e3c292d10b206a7c4b42f9cab080cf53929c5","tarball":"https://registry.npmjs.org/@blackgersain/capacitor-nearby-multipeer/-/capacitor-nearby-multipeer-1.0.0.tgz","fileCount":31,"unpackedSize":263244,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCn2TFv/TcdVJXLtnbThOMG4quvuMoIjXjPZZiQvZq/MwIhAO60RonAGOoByRAfT+ElnXiMMMHEVzI0JVVUmHQ4vzWy"}]},"_npmUser":{"name":"blackgersain","email":"black.gersain@gmail.com"},"directories":{},"maintainers":[{"name":"blackgersain","email":"black.gersain@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/capacitor-nearby-multipeer_1.0.0_1761854669569_0.9987130536535973"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-30T20:04:29.467Z","1.0.0":"2025-10-30T20:04:29.790Z","modified":"2025-10-30T20:04:30.118Z"},"maintainers":[{"name":"blackgersain","email":"black.gersain@gmail.com"}],"description":"Capacitor plugin for Google Nearby & iOS Multipeer Connectivity","homepage":"https://github.com/squareetlabs/capacitor-nearby-multipeer#readme","keywords":["capacitor","plugin","native","capacitor nearby","capacitor multipeer","multipeer nearby","nearby multipeer"],"repository":{"type":"git","url":"git+https://github.com/squareetlabs/capacitor-nearby-multipeer.git"},"contributors":[{"name":"Alberto Rial Barreiro","email":"alberto@squareet.com","url":"https://squareet.com"},{"name":"Jacobo Cantorna Cigarrán","email":"jacobo@squareet.com.com","url":"https://squareet.com"}],"author":{"name":"Squareetlabs"},"bugs":{"url":"https://github.com/squareetlabs/capacitor-nearby-multipeer/issues"},"license":"MIT","readme":"# @squareetlabs/capacitor-nearby-multipeer\n\nCapacitor plugin for Google Nearby & iOS Multipeer Connectivity. This plugin enables cross-platform peer-to-peer communication between Android and iOS devices using Google Nearby Connections API on Android and Multipeer Connectivity framework on iOS.\n\n## Features\n\n- Cross-platform communication between Android and iOS devices\n- Bluetooth support for direct device-to-device communication\n- Automatic fallback to Bluetooth when Nearby Connections is not available\n- Simple API for advertising, discovery, and message exchange\n- Proper permission handling for Android 12+ (API 31+)\n- Shared BLE characteristic UUID between Android and iOS for improved cross-platform compatibility\n\n## Install\n\n```bash\nnpm install @squareetlabs/capacitor-nearby-multipeer\nnpx cap sync\n```\n\n## Basic Usage\n\nHere's a simple example of how to use the plugin:\n\n```typescript\nimport { NearbyMultipeer } from '@squareetlabs/capacitor-nearby-multipeer';\n\n// Initialize the plugin\nasync function initializeNearby() {\n  try {\n    // Initialize with a unique service ID\n    await NearbyMultipeer.initialize({ serviceId: 'my-unique-service' });\n\n    // Set the connection strategy (optional)\n    await NearbyMultipeer.setStrategy({ strategy: 'P2P_STAR' });\n\n    // Start advertising this device\n    await NearbyMultipeer.startAdvertising({ displayName: 'My Device' });\n\n    // Start discovering other devices\n    await NearbyMultipeer.startDiscovery();\n\n    console.log('Nearby initialized successfully');\n  } catch (error) {\n    console.error('Error initializing Nearby:', error);\n  }\n}\n\n// Connect to a discovered endpoint\nasync function connectToEndpoint(endpointId: string) {\n  try {\n    await NearbyMultipeer.connect({ \n      endpointId: endpointId,\n      displayName: 'My Device'\n    });\n    console.log('Connection request sent');\n  } catch (error) {\n    console.error('Error connecting to endpoint:', error);\n  }\n}\n\n// Send a message to a connected endpoint\nasync function sendMessage(endpointId: string, message: string) {\n  try {\n    await NearbyMultipeer.sendMessage({\n      endpointId: endpointId,\n      data: message\n    });\n    console.log('Message sent successfully');\n  } catch (error) {\n    console.error('Error sending message:', error);\n  }\n}\n\n// Disconnect from an endpoint\nasync function disconnect(endpointId: string) {\n  await NearbyMultipeer.disconnectFromEndpoint({ endpointId: endpointId });\n  console.log('Disconnected from endpoint');\n}\n\n// Clean up when done\nasync function cleanup() {\n  await NearbyMultipeer.stopAdvertising();\n  await NearbyMultipeer.stopDiscovery();\n  await NearbyMultipeer.disconnect(); // Disconnect from all endpoints\n  console.log('Cleaned up Nearby resources');\n}\n```\n\n## Event Handling\n\nThis plugin uses events to communicate state changes and incoming data. You should listen for these events to properly handle the peer-to-peer communication:\n\n```typescript\nimport { NearbyMultipeer } from '@squareetlabs/capacitor-nearby-multipeer';\n\n// Listen for endpoint discovery\nconst endpointFoundListener = await NearbyMultipeer.addListener('endpointFound', (event) => {\n  console.log('Endpoint found:', event.endpointId, event.endpointName);\n  // You might want to connect to this endpoint\n});\n\n// Listen for connection requests\nconst connectionRequestedListener = await NearbyMultipeer.addListener('connectionRequested', (event) => {\n  console.log('Connection requested from:', event.endpointId, event.endpointName);\n  // Decide whether to accept or reject the connection\n  NearbyMultipeer.acceptConnection({ endpointId: event.endpointId });\n});\n\n// Listen for connection results\nconst connectionResultListener = await NearbyMultipeer.addListener('connectionResult', (event) => {\n  console.log('Connection result for:', event.endpointId, 'Status:', event.status);\n  // Status: 0 = success, -1 = error\n});\n\n// Listen for incoming messages\nconst messageListener = await NearbyMultipeer.addListener('message', (event) => {\n  console.log('Message from:', event.endpointId, 'Data:', event.data);\n  // Process the received message\n});\n\n// Listen for disconnections\nconst endpointLostListener = await NearbyMultipeer.addListener('endpointLost', (event) => {\n  console.log('Disconnected from:', event.endpointId);\n});\n\n// Listen for transfer updates\nconst transferUpdateListener = await NearbyMultipeer.addListener('payloadTransferUpdate', (event) => {\n  console.log('Transfer update:', {\n    endpointId: event.endpointId,\n    bytesTransferred: event.bytesTransferred,\n    totalBytes: event.totalBytes,\n    status: event.status // 2 = in progress, 3 = completed\n  });\n});\n\n// Remove individual listeners when done\nfunction removeListeners() {\n  endpointFoundListener.remove();\n  connectionRequestedListener.remove();\n  connectionResultListener.remove();\n  messageListener.remove();\n  endpointLostListener.remove();\n  transferUpdateListener.remove();\n}\n\n// Or remove all listeners at once\nasync function cleanup() {\n  await NearbyMultipeer.removeAllListeners();\n}\n```\n\n## Platform Configuration\n\n### Android Configuration\n\n#### Permissions\n\nThis plugin requires several permissions to function properly on Android. Add the following permissions to your `AndroidManifest.xml`:\n\n```xml\n<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" />\n<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\" />\n<uses-permission android:maxSdkVersion=\"30\" android:name=\"android.permission.BLUETOOTH\" />\n<uses-permission android:maxSdkVersion=\"30\" android:name=\"android.permission.BLUETOOTH_ADMIN\" />\n<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\" />\n<uses-permission android:minSdkVersion=\"29\" android:name=\"android.permission.ACCESS_FINE_LOCATION\" />\n<uses-permission android:minSdkVersion=\"31\" android:name=\"android.permission.BLUETOOTH_ADVERTISE\" />\n<uses-permission android:minSdkVersion=\"31\" android:name=\"android.permission.BLUETOOTH_CONNECT\" />\n<uses-permission android:minSdkVersion=\"31\" android:name=\"android.permission.BLUETOOTH_SCAN\" />\n<uses-permission android:minSdkVersion=\"32\" android:name=\"android.permission.NEARBY_WIFI_DEVICES\" />\n```\n\n#### Requesting Permissions\n\nFor Android 12+ (API 31+), you need to request Bluetooth permissions at runtime. Here's an example of how to do this:\n\n```typescript\nimport { Permissions } from '@capacitor/core';\n\nasync function requestBluetoothPermissions() {\n  if (Capacitor.getPlatform() === 'android') {\n    const permissions = [\n      'android.permission.BLUETOOTH_SCAN',\n      'android.permission.BLUETOOTH_CONNECT',\n      'android.permission.BLUETOOTH_ADVERTISE'\n    ];\n    \n    for (const permission of permissions) {\n      const status = await Permissions.query({ name: permission });\n      if (status.state !== 'granted') {\n        await Permissions.request({ name: permission });\n      }\n    }\n  }\n}\n\n// Call this before initializing the plugin\nawait requestBluetoothPermissions();\n```\n\n### iOS Configuration\n\nFor iOS, the plugin uses the Multipeer Connectivity framework which doesn't require special permissions. However, you should add a description for Bluetooth usage in your `Info.plist`:\n\n```xml\n<key>NSBluetoothAlwaysUsageDescription</key>\n<string>We use Bluetooth to connect with nearby devices</string>\n<key>NSLocalNetworkUsageDescription</key>\n<string>We use the local network to discover and connect to nearby devices</string>\n```\n\n## Technical Details\n\n### BLE Implementation\n\nThe plugin uses Bluetooth Low Energy (BLE) for cross-platform communication between Android and iOS:\n\n- Both platforms use a common Service UUID: `fa87c0d0-afac-11de-8a39-0800200c9a66`\n- Both platforms use a common Characteristic UUID: `34B1CF4D-1069-4AD6-89B6-E161D79BE4D8`\n\nThese shared identifiers ensure that devices can discover and communicate with each other across platforms.\n\n## API Reference\n\n### Methods\n\n- `initialize(options: { serviceId: string, serviceUUIDString?: string }): Promise<void>`\n- `setStrategy(options: { strategy: string }): Promise<void>`\n- `startAdvertising(options: { displayName?: string }): Promise<void>`\n- `stopAdvertising(): Promise<void>`\n- `startDiscovery(): Promise<void>`\n- `stopDiscovery(): Promise<void>`\n- `connect(options: { endpointId: string, displayName?: string }): Promise<void>`\n- `acceptConnection(options: { endpointId: string }): Promise<void>`\n- `rejectConnection(options: { endpointId: string }): Promise<void>`\n- `disconnectFromEndpoint(options: { endpointId: string }): Promise<void>`\n- `disconnect(): Promise<void>`\n- `sendMessage(options: { endpointId: string, data: string }): Promise<void>`\n\n### Events\n\n- `connectionRequested`: Fired when a connection request is received\n- `connectionResult`: Fired when a connection attempt completes\n- `endpointFound`: Fired when a new endpoint is discovered\n- `endpointLost`: Fired when an endpoint is lost\n- `message`: Fired when a message is received\n- `payloadTransferUpdate`: Fired during payload transfer\n\n### Event Types\n\n```typescript\ninterface ConnectionRequestEvent {\n  endpointId: string;\n  endpointName: string;\n  authenticationToken: string;\n  isIncomingConnection: boolean;\n}\n\ninterface ConnectionResultEvent {\n  endpointId: string;\n  status: number; // 0 = success, -1 = error\n}\n\ninterface EndpointFoundEvent {\n  endpointId: string;\n  endpointName: string;\n  serviceId: string;\n}\n\ninterface EndpointLostEvent {\n  endpointId: string;\n}\n\ninterface MessageReceivedEvent {\n  endpointId: string;\n  data: string;\n}\n\ninterface PayloadTransferUpdateEvent {\n  endpointId: string;\n  bytesTransferred: number;\n  totalBytes: number;\n  status: number; // 2 = in progress, 3 = completed\n}\n```\n\n## Inicialización del plugin\n\n```typescript\nimport { NearbyMultipeer } from '@squareetlabs/capacitor-nearby-multipeer';\n\nawait NearbyMultipeer.initialize({\n  serviceId: 'mi-servicio',\n  serviceUUIDString: 'fa87c0d0-afac-11de-8a39-0800200c9a66' // Opcional, UUID BLE personalizado\n});\n```\n\n- `serviceId`: Identificador lógico del servicio (obligatorio)\n- `serviceUUIDString`: UUID BLE que se usará para el advertising y escaneo (opcional, por defecto: `fa87c0d0-afac-11de-8a39-0800200c9a66`)\n\nEste UUID debe ser el mismo en **Android** e **iOS** para que ambos sistemas puedan descubrirse mutuamente por BLE.\n","readmeFilename":"README.md","_rev":"1-f62b6611b29887edf4b904dbadf2b3fd"}