protendai/nativephp-wifi-direct
Architecture fit
WifiDirect::isValidNetworkName(), isValidPassphrase()), a native bridge per platform (resources/android/src, resources/ios/Sources), and a JS layer (resources/js/index.js with TypeScript types) exposing one export per bridge function for Inertia/Vue/React. This is the correct shape for a Laravel product team — the domain logic and validation surface live in PHP where they are testable, and the JS layer means no bespoke glue per frontend.FakeBridge macros (assertWifiDirectHosting(), assertWifiDirectJoining(), assertWifiDirectDisconnected(), assertQrScanRequested(), withWifiDirect() answering connect()) are the single most valuable item for a TPM: they make the feature testable in CI without hardware, which is normally the blocker for accepting a native-capability dependency.WifiP2pManager) and can host a group. iOS has no Wi-Fi Direct; it participates by joining an Android-hosted group (SSID + passphrase via NEHotspotConfiguration) or via its own Apple-only path. Android→Android and iOS→iOS are first-class; iPhone joining an Android group is explicitly labelled experimental and failed to associate on a Galaxy A05s host at 2.4 GHz. Any product requirement of "cross-platform local sync" is currently a pilot, not a commitment.Integration feasibility
NSLocalNetworkUsageDescription (now declared by the plugin, good), and platform toolchains. This is a delivery-pipeline cost, not a code cost — budget for it in the first sprint.Technical risk
Connected arriving after ConnectionFailed, permission requests lost to activity recreation. These are fixed, but a first public release carrying that defect density means field behaviour under aggressive OEM battery management should be assumed to have residual edge cases.connect() now returns bool and can return false with no event; parsePairing() now returns null on malformed codes; disconnect() always emits Disconnected even with no link. Callers that ignore return values are unaffected, but any UI state machine keyed on "disconnect fires only if connected" will need review.PermissionResult now carries reason (denied, permanently denied, approximate, interrupted) plus permanentlyDenied. This is a real improvement for UX copy and support triage, but it means the frontend must handle four states, not two.WifiP2pConfig.Builder/P2P calls; network names are no longer written to logs, which removes a privacy review item.NEARBY_WIFI_DEVICES (with neverForLocation), or only the 12/12L location path fixed here? This determines our Play Store permission declaration and review timeline.approx location permission sufficient for discovery on Android 12+, or does precise remain required? Affects permission-rationale copy and grant rates.Stack fit
onWifiDirect(), Events names) that make the pairing UX pleasant.assertQrScanRequested() in the fake API, plus the iOS QR rendering fixes). Assume a scan-to-pair flow rather than automatic discovery.Migration path
parsePairing() null handling, connect() return values, and any logic that assumed Disconnected implies a prior connection.Compatibility
NEARBY_WIFI_DEVICES. Info.plist string is now generic and plugin-declared, so no per-app copy work — but confirm NSLocalNetworkUsageDescription prose meets our App Store review standards.Sequencing
reason values, including permanentlyDenied → settings deep-link.NWPathMonitor + address poll now reports drops).createGroup()/connect() now cancel in flight and replace reported links), and teardown-on-destroy behaviour.Maintenance
Support
reason), cross-platform pairing failures (currently unexplainable without device logs — requires us to build in-app diagnostics), and OEM background-kill symptoms. Pre-write KB articles for each before launch.permanentlyDenied flag is the difference between a self-service fix and a support ticket; make sure the UI surfaces it.Scaling
Failure modes
createGroup()/connect()/disconnect(), but this is exactly the class of bug that reappears.Connected after ConnectionFailed).Ramp-up
How can I help you explore Laravel packages today?