@elizaos/capacitor-wifi 2.0.0-beta.1 → 2.0.3-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +80 -0
- package/android/build.gradle +8 -0
- package/android/src/main/java/ai/eliza/plugins/wifi/WiFiPlugin.kt +1 -1
- package/dist/esm/definitions.d.ts +1 -1
- package/dist/esm/definitions.d.ts.map +1 -1
- package/dist/esm/web.d.ts +2 -2
- package/dist/esm/web.d.ts.map +1 -1
- package/dist/esm/web.js +38 -2
- package/dist/esm/web.js.map +1 -1
- package/dist/esm/web.test.d.ts +2 -0
- package/dist/esm/web.test.d.ts.map +1 -0
- package/dist/esm/web.test.js +79 -0
- package/dist/esm/web.test.js.map +1 -0
- package/dist/plugin.cjs.js +38 -2
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +38 -2
- package/dist/plugin.js.map +1 -1
- package/package.json +12 -8
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Shaw Walters and elizaOS Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# @elizaos/capacitor-wifi
|
|
2
|
+
|
|
3
|
+
Android Wi-Fi bridge for elizaOS apps built on Capacitor. Exposes `WifiManager` and `ConnectivityManager` APIs to JavaScript running inside a Capacitor Android shell.
|
|
4
|
+
|
|
5
|
+
## What this plugin does
|
|
6
|
+
|
|
7
|
+
This Capacitor plugin gives a Capacitor-hosted elizaOS app access to the Android Wi-Fi stack from JavaScript/TypeScript:
|
|
8
|
+
|
|
9
|
+
- Read the current Wi-Fi radio state (enabled, connected, signal strength).
|
|
10
|
+
- Retrieve the active connection details (SSID, BSSID, frequency, RSSI).
|
|
11
|
+
- Scan for nearby networks and receive a deduplicated list sorted by signal strength.
|
|
12
|
+
- Connect to a network by SSID (open or WPA2-protected, visible or hidden).
|
|
13
|
+
- Disconnect from the current network.
|
|
14
|
+
|
|
15
|
+
On web/desktop, all methods resolve safely with empty data and a one-time console warning — the app compiles and runs without errors, but real Wi-Fi operations only work on Android.
|
|
16
|
+
|
|
17
|
+
## Capabilities
|
|
18
|
+
|
|
19
|
+
| Method | What it does |
|
|
20
|
+
|--------|-------------|
|
|
21
|
+
| `WiFi.getWifiState()` | Returns `{ enabled, connected, rssi }` for the Wi-Fi radio. |
|
|
22
|
+
| `WiFi.getConnectedNetwork()` | Returns the active `WiFiNetwork` or `null`. |
|
|
23
|
+
| `WiFi.listAvailableNetworks(opts?)` | Triggers (or reuses) a scan and returns a deduplicated `WiFiNetwork[]`. |
|
|
24
|
+
| `WiFi.connectToNetwork({ ssid, password?, hidden? })` | Requests a connection; uses `WifiNetworkSuggestion` on Android 10+ and the legacy `WifiConfiguration` path on Android 6–9. |
|
|
25
|
+
| `WiFi.disconnectFromNetwork()` | Disconnects the active network. |
|
|
26
|
+
|
|
27
|
+
## Requirements
|
|
28
|
+
|
|
29
|
+
- Android only. Minimum SDK: 23 (Android 6.0).
|
|
30
|
+
- `@capacitor/core ^8.3.1` as a peer dependency.
|
|
31
|
+
|
|
32
|
+
### Android permissions
|
|
33
|
+
|
|
34
|
+
Declared in the plugin's `AndroidManifest.xml`; the host app must request runtime grants where required:
|
|
35
|
+
|
|
36
|
+
| Permission | Required by |
|
|
37
|
+
|-----------|-------------|
|
|
38
|
+
| `ACCESS_WIFI_STATE` | `getConnectedNetwork`, `listAvailableNetworks` |
|
|
39
|
+
| `CHANGE_WIFI_STATE` | `connectToNetwork`, `disconnectFromNetwork` |
|
|
40
|
+
| `ACCESS_FINE_LOCATION` | `listAvailableNetworks` on Android 8+ (API 26+) — without it the plugin rejects with an error (does NOT silently return an empty list) |
|
|
41
|
+
| `ACCESS_NETWORK_STATE`, `CHANGE_NETWORK_STATE` | `connectToNetwork` on Android 10+ (`WifiNetworkSuggestion` path) |
|
|
42
|
+
|
|
43
|
+
## Installation
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
npm install @elizaos/capacitor-wifi
|
|
47
|
+
npx cap sync android
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Then sync the Capacitor project so Gradle includes the plugin:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
npx cap sync
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Usage
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
import { WiFi } from '@elizaos/capacitor-wifi';
|
|
60
|
+
|
|
61
|
+
// Read radio state
|
|
62
|
+
const state = await WiFi.getWifiState();
|
|
63
|
+
console.log('Wi-Fi enabled:', state.enabled, 'Connected:', state.connected);
|
|
64
|
+
|
|
65
|
+
// List nearby networks
|
|
66
|
+
const { networks } = await WiFi.listAvailableNetworks({ maxAge: 15000, limit: 20 });
|
|
67
|
+
for (const net of networks) {
|
|
68
|
+
console.log(net.ssid, net.rssi, 'dBm', net.secured ? '(secured)' : '(open)');
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Connect
|
|
72
|
+
const result = await WiFi.connectToNetwork({ ssid: 'MyNetwork', password: 'secret' });
|
|
73
|
+
if (!result.success) console.error(result.message);
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Notes
|
|
77
|
+
|
|
78
|
+
- `connectToNetwork` on Android 10+ submits a `WifiNetworkSuggestion`. The call resolving with `success: true` means the suggestion was accepted by the system, not that the device is connected. Poll `getConnectedNetwork()` to observe connection state.
|
|
79
|
+
- Wi-Fi scanning is rate-limited by Android (roughly 4 scans per 2 minutes in the foreground). Use the `maxAge` option to reuse a recent scan and avoid hitting the throttle.
|
|
80
|
+
- The plugin rejects `listAvailableNetworks` with a clear error on API 26+ when `ACCESS_FINE_LOCATION` is not granted, rather than silently returning an empty list.
|
package/android/build.gradle
CHANGED
|
@@ -3,6 +3,11 @@ ext {
|
|
|
3
3
|
}
|
|
4
4
|
|
|
5
5
|
apply plugin: 'com.android.library'
|
|
6
|
+
// Apply the Kotlin Android plugin so the plugin's .kt class is bundled into the
|
|
7
|
+
// library AAR. Without it AGP's built-in kotlinc compiles the sources but does
|
|
8
|
+
// NOT bundle the .class files, so the Capacitor plugin class is absent from the
|
|
9
|
+
// app dex at runtime (PluginLoadException -> the whole plugin set fails to load).
|
|
10
|
+
apply plugin: 'org.jetbrains.kotlin.android'
|
|
6
11
|
android {
|
|
7
12
|
namespace = "ai.eliza.plugins.wifi"
|
|
8
13
|
compileSdk project.hasProperty('compileSdkVersion') ? rootProject.ext.compileSdkVersion : 34
|
|
@@ -14,6 +19,9 @@ android {
|
|
|
14
19
|
sourceCompatibility JavaVersion.VERSION_17
|
|
15
20
|
targetCompatibility JavaVersion.VERSION_17
|
|
16
21
|
}
|
|
22
|
+
kotlinOptions {
|
|
23
|
+
jvmTarget = "17"
|
|
24
|
+
}
|
|
17
25
|
}
|
|
18
26
|
|
|
19
27
|
repositories {
|
|
@@ -296,6 +296,6 @@ class WiFiPlugin : Plugin() {
|
|
|
296
296
|
upper.contains("SAE")
|
|
297
297
|
}
|
|
298
298
|
|
|
299
|
-
/**
|
|
299
|
+
/** Empty callback for the `requestNetwork` call — connection state is queried separately. */
|
|
300
300
|
private object NoOpNetworkCallback : ConnectivityManager.NetworkCallback()
|
|
301
301
|
}
|
|
@@ -68,7 +68,7 @@ export interface ConnectResult {
|
|
|
68
68
|
/** Optional human-readable message, populated on failure. */
|
|
69
69
|
message?: string;
|
|
70
70
|
}
|
|
71
|
-
/** Public Capacitor plugin contract — implemented natively on Android
|
|
71
|
+
/** Public Capacitor plugin contract — implemented natively on Android with an empty-data web fallback. */
|
|
72
72
|
export interface WiFiPlugin {
|
|
73
73
|
/** Read radio + active connection state. */
|
|
74
74
|
getWifiState(): Promise<WifiStateResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,mFAAmF;AACnF,MAAM,WAAW,WAAW;IAC1B,sFAAsF;IACtF,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,iEAAiE;AACjE,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,yCAAyC;AACzC,MAAM,WAAW,cAAc;IAC7B,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,yCAAyC;AACzC,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,gDAAgD;IAChD,SAAS,EAAE,OAAO,CAAC;IACnB,uEAAuE;IACvE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,gDAAgD;AAChD,MAAM,WAAW,sBAAsB;IACrC,iEAAiE;IACjE,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;CAC7B;AAED,kDAAkD;AAClD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,yEAAyE;AACzE,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,
|
|
1
|
+
{"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,mFAAmF;AACnF,MAAM,WAAW,WAAW;IAC1B,sFAAsF;IACtF,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,iEAAiE;AACjE,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,yCAAyC;AACzC,MAAM,WAAW,cAAc;IAC7B,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,yCAAyC;AACzC,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,gDAAgD;IAChD,SAAS,EAAE,OAAO,CAAC;IACnB,uEAAuE;IACvE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,gDAAgD;AAChD,MAAM,WAAW,sBAAsB;IACrC,iEAAiE;IACjE,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;CAC7B;AAED,kDAAkD;AAClD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,yEAAyE;AACzE,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,0GAA0G;AAC1G,MAAM,WAAW,UAAU;IACzB,4CAA4C;IAC5C,YAAY,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;IACzC,sCAAsC;IACtC,mBAAmB,IAAI,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACvD,yEAAyE;IACzE,qBAAqB,CACnB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC/B,8DAA8D;IAC9D,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAClE,kDAAkD;IAClD,qBAAqB,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;CACjD"}
|
package/dist/esm/web.d.ts
CHANGED
|
@@ -10,8 +10,8 @@ import type { ConnectedNetworkResult, ConnectOptions, ConnectResult, ListNetwork
|
|
|
10
10
|
export declare class WiFiWeb extends WebPlugin implements WiFiPlugin {
|
|
11
11
|
getWifiState(): Promise<WifiStateResult>;
|
|
12
12
|
getConnectedNetwork(): Promise<ConnectedNetworkResult>;
|
|
13
|
-
listAvailableNetworks(
|
|
14
|
-
connectToNetwork(
|
|
13
|
+
listAvailableNetworks(options?: ListNetworksOptions): Promise<ListNetworksResult>;
|
|
14
|
+
connectToNetwork(options: ConnectOptions): Promise<ConnectResult>;
|
|
15
15
|
disconnectFromNetwork(): Promise<ConnectResult>;
|
|
16
16
|
}
|
|
17
17
|
//# sourceMappingURL=web.d.ts.map
|
package/dist/esm/web.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,KAAK,EACV,sBAAsB,EACtB,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,EACV,eAAe,EAChB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,KAAK,EACV,sBAAsB,EACtB,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,EACV,eAAe,EAChB,MAAM,eAAe,CAAC;AAmDvB;;;;;;GAMG;AACH,qBAAa,OAAQ,SAAQ,SAAU,YAAW,UAAU;IACpD,YAAY,IAAI,OAAO,CAAC,eAAe,CAAC;IAKxC,mBAAmB,IAAI,OAAO,CAAC,sBAAsB,CAAC;IAKtD,qBAAqB,CACzB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,kBAAkB,CAAC;IAMxB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAMjE,qBAAqB,IAAI,OAAO,CAAC,aAAa,CAAC;CAItD"}
|
package/dist/esm/web.js
CHANGED
|
@@ -7,6 +7,40 @@ function warnOnce() {
|
|
|
7
7
|
warned = true;
|
|
8
8
|
console.warn(`[ElizaWiFi] ${UNAVAILABLE_MESSAGE}`);
|
|
9
9
|
}
|
|
10
|
+
function isRecord(value) {
|
|
11
|
+
return typeof value === "object" && value !== null;
|
|
12
|
+
}
|
|
13
|
+
function normalizeListOptions(options) {
|
|
14
|
+
if (options === undefined)
|
|
15
|
+
return;
|
|
16
|
+
if (!isRecord(options)) {
|
|
17
|
+
throw new Error("options must be an object");
|
|
18
|
+
}
|
|
19
|
+
if (options?.maxAge !== undefined) {
|
|
20
|
+
if (typeof options.maxAge !== "number" ||
|
|
21
|
+
!Number.isFinite(options.maxAge) ||
|
|
22
|
+
options.maxAge < 0) {
|
|
23
|
+
throw new Error("maxAge must be a non-negative finite number");
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (options?.limit !== undefined) {
|
|
27
|
+
if (typeof options.limit !== "number" ||
|
|
28
|
+
!Number.isFinite(options.limit) ||
|
|
29
|
+
!Number.isInteger(options.limit) ||
|
|
30
|
+
options.limit < 0) {
|
|
31
|
+
throw new Error("limit must be a non-negative finite integer");
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function validateConnectOptions(options) {
|
|
36
|
+
const ssid = typeof options?.ssid === "string" ? options.ssid.trim() : "";
|
|
37
|
+
if (!ssid) {
|
|
38
|
+
throw new Error("ssid is required");
|
|
39
|
+
}
|
|
40
|
+
if (options?.password !== undefined && typeof options.password !== "string") {
|
|
41
|
+
throw new Error("password must be a string");
|
|
42
|
+
}
|
|
43
|
+
}
|
|
10
44
|
/**
|
|
11
45
|
* Web fallback — every method resolves with empty / disabled data so the
|
|
12
46
|
* full TypeScript interface is satisfied without throwing during normal
|
|
@@ -23,11 +57,13 @@ export class WiFiWeb extends WebPlugin {
|
|
|
23
57
|
warnOnce();
|
|
24
58
|
return { network: null };
|
|
25
59
|
}
|
|
26
|
-
async listAvailableNetworks(
|
|
60
|
+
async listAvailableNetworks(options) {
|
|
61
|
+
normalizeListOptions(options);
|
|
27
62
|
warnOnce();
|
|
28
63
|
return { networks: [] };
|
|
29
64
|
}
|
|
30
|
-
async connectToNetwork(
|
|
65
|
+
async connectToNetwork(options) {
|
|
66
|
+
validateConnectOptions(options);
|
|
31
67
|
warnOnce();
|
|
32
68
|
return { success: false, message: UNAVAILABLE_MESSAGE };
|
|
33
69
|
}
|
package/dist/esm/web.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAY5C,MAAM,mBAAmB,GAAG,+CAA+C,CAAC;AAE5E,IAAI,MAAM,GAAG,KAAK,CAAC;AACnB,SAAS,QAAQ;IACf,IAAI,MAAM;QAAE,OAAO;IACnB,MAAM,GAAG,IAAI,CAAC;IACd,OAAO,CAAC,IAAI,CAAC,eAAe,mBAAmB,EAAE,CAAC,CAAC;AACrD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,OAAO,OAAQ,SAAQ,SAAS;IACpC,KAAK,CAAC,YAAY;QAChB,QAAQ,EAAE,CAAC;QACX,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,QAAQ,EAAE,CAAC;QACX,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,qBAAqB,CACzB,
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.test.d.ts","sourceRoot":"","sources":["../../src/web.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { WiFiWeb } from "./web";
|
|
3
|
+
describe("WiFiWeb fallback", () => {
|
|
4
|
+
afterEach(() => {
|
|
5
|
+
vi.restoreAllMocks();
|
|
6
|
+
});
|
|
7
|
+
it("returns disabled fallback state and warns once", async () => {
|
|
8
|
+
const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
9
|
+
const wifi = new WiFiWeb();
|
|
10
|
+
await expect(wifi.getWifiState()).resolves.toEqual({
|
|
11
|
+
enabled: false,
|
|
12
|
+
connected: false,
|
|
13
|
+
rssi: null,
|
|
14
|
+
});
|
|
15
|
+
await expect(wifi.getConnectedNetwork()).resolves.toEqual({
|
|
16
|
+
network: null,
|
|
17
|
+
});
|
|
18
|
+
await expect(wifi.listAvailableNetworks({ limit: 10 })).resolves.toEqual({
|
|
19
|
+
networks: [],
|
|
20
|
+
});
|
|
21
|
+
expect(warn).toHaveBeenCalledTimes(1);
|
|
22
|
+
});
|
|
23
|
+
it.each([
|
|
24
|
+
{ maxAge: -1 },
|
|
25
|
+
{ maxAge: Number.POSITIVE_INFINITY },
|
|
26
|
+
{ limit: -1 },
|
|
27
|
+
{ limit: 1.5 },
|
|
28
|
+
{ limit: Number.NaN },
|
|
29
|
+
])("rejects malformed scan options %#", async (options) => {
|
|
30
|
+
const wifi = new WiFiWeb();
|
|
31
|
+
await expect(wifi.listAvailableNetworks(options)).rejects.toThrow(/must be a non-negative/);
|
|
32
|
+
});
|
|
33
|
+
it.each([
|
|
34
|
+
null,
|
|
35
|
+
"limit=1",
|
|
36
|
+
1,
|
|
37
|
+
false,
|
|
38
|
+
])("rejects non-object scan options %# without warning", async (options) => {
|
|
39
|
+
const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
40
|
+
const wifi = new WiFiWeb();
|
|
41
|
+
await expect(wifi.listAvailableNetworks(options)).rejects.toThrow("options must be an object");
|
|
42
|
+
expect(warn).not.toHaveBeenCalled();
|
|
43
|
+
});
|
|
44
|
+
it("rejects malformed connect options before Android-only fallback responses", async () => {
|
|
45
|
+
const wifi = new WiFiWeb();
|
|
46
|
+
await expect(wifi.connectToNetwork({ ssid: " \t\n " })).rejects.toThrow("ssid is required");
|
|
47
|
+
await expect(wifi.connectToNetwork({
|
|
48
|
+
ssid: ["home"],
|
|
49
|
+
password: { value: "secret" },
|
|
50
|
+
})).rejects.toThrow("ssid is required");
|
|
51
|
+
await expect(wifi.connectToNetwork({
|
|
52
|
+
ssid: "home",
|
|
53
|
+
password: { value: "secret" },
|
|
54
|
+
})).rejects.toThrow("password must be a string");
|
|
55
|
+
await expect(wifi.connectToNetwork({ ssid: "home" })).resolves.toEqual({
|
|
56
|
+
success: false,
|
|
57
|
+
message: "Wi-Fi controls are only available on Android.",
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
it("keeps fallback state stable across repeated unavailable operations", async () => {
|
|
61
|
+
const wifi = new WiFiWeb();
|
|
62
|
+
await expect(Promise.all([
|
|
63
|
+
wifi.listAvailableNetworks({ limit: 0 }),
|
|
64
|
+
wifi.connectToNetwork({ ssid: "__proto__", password: "" }),
|
|
65
|
+
wifi.disconnectFromNetwork(),
|
|
66
|
+
])).resolves.toEqual([
|
|
67
|
+
{ networks: [] },
|
|
68
|
+
{
|
|
69
|
+
success: false,
|
|
70
|
+
message: "Wi-Fi controls are only available on Android.",
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
success: false,
|
|
74
|
+
message: "Wi-Fi controls are only available on Android.",
|
|
75
|
+
},
|
|
76
|
+
]);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
//# sourceMappingURL=web.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.test.js","sourceRoot":"","sources":["../../src/web.test.ts"],"names":[],"mappings":"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"}
|
package/dist/plugin.cjs.js
CHANGED
|
@@ -15,6 +15,40 @@ function warnOnce() {
|
|
|
15
15
|
warned = true;
|
|
16
16
|
console.warn(`[ElizaWiFi] ${UNAVAILABLE_MESSAGE}`);
|
|
17
17
|
}
|
|
18
|
+
function isRecord(value) {
|
|
19
|
+
return typeof value === "object" && value !== null;
|
|
20
|
+
}
|
|
21
|
+
function normalizeListOptions(options) {
|
|
22
|
+
if (options === undefined)
|
|
23
|
+
return;
|
|
24
|
+
if (!isRecord(options)) {
|
|
25
|
+
throw new Error("options must be an object");
|
|
26
|
+
}
|
|
27
|
+
if (options?.maxAge !== undefined) {
|
|
28
|
+
if (typeof options.maxAge !== "number" ||
|
|
29
|
+
!Number.isFinite(options.maxAge) ||
|
|
30
|
+
options.maxAge < 0) {
|
|
31
|
+
throw new Error("maxAge must be a non-negative finite number");
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (options?.limit !== undefined) {
|
|
35
|
+
if (typeof options.limit !== "number" ||
|
|
36
|
+
!Number.isFinite(options.limit) ||
|
|
37
|
+
!Number.isInteger(options.limit) ||
|
|
38
|
+
options.limit < 0) {
|
|
39
|
+
throw new Error("limit must be a non-negative finite integer");
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function validateConnectOptions(options) {
|
|
44
|
+
const ssid = typeof options?.ssid === "string" ? options.ssid.trim() : "";
|
|
45
|
+
if (!ssid) {
|
|
46
|
+
throw new Error("ssid is required");
|
|
47
|
+
}
|
|
48
|
+
if (options?.password !== undefined && typeof options.password !== "string") {
|
|
49
|
+
throw new Error("password must be a string");
|
|
50
|
+
}
|
|
51
|
+
}
|
|
18
52
|
/**
|
|
19
53
|
* Web fallback — every method resolves with empty / disabled data so the
|
|
20
54
|
* full TypeScript interface is satisfied without throwing during normal
|
|
@@ -31,11 +65,13 @@ class WiFiWeb extends core.WebPlugin {
|
|
|
31
65
|
warnOnce();
|
|
32
66
|
return { network: null };
|
|
33
67
|
}
|
|
34
|
-
async listAvailableNetworks(
|
|
68
|
+
async listAvailableNetworks(options) {
|
|
69
|
+
normalizeListOptions(options);
|
|
35
70
|
warnOnce();
|
|
36
71
|
return { networks: [] };
|
|
37
72
|
}
|
|
38
|
-
async connectToNetwork(
|
|
73
|
+
async connectToNetwork(options) {
|
|
74
|
+
validateConnectOptions(options);
|
|
39
75
|
warnOnce();
|
|
40
76
|
return { success: false, message: UNAVAILABLE_MESSAGE };
|
|
41
77
|
}
|
package/dist/plugin.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.cjs.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from \"@capacitor/core\";\nexport * from \"./definitions\";\nconst loadWeb = () => import(\"./web\").then((m) => new m.WiFiWeb());\nexport const WiFi = registerPlugin(\"ElizaWiFi\", {\n web: loadWeb,\n});\n//# sourceMappingURL=index.js.map","import { WebPlugin } from \"@capacitor/core\";\nconst UNAVAILABLE_MESSAGE = \"Wi-Fi controls are only available on Android.\";\nlet warned = false;\nfunction warnOnce() {\n if (warned)\n return;\n warned = true;\n console.warn(`[ElizaWiFi] ${UNAVAILABLE_MESSAGE}`);\n}\n/**\n * Web fallback — every method resolves with empty / disabled data so the\n * full TypeScript interface is satisfied without throwing during normal\n * desktop or browser dev sessions. `connectToNetwork` and\n * `disconnectFromNetwork` resolve with `{ success: false }` because there is\n * no meaningful action to take on the web side.\n */\nexport class WiFiWeb extends WebPlugin {\n async getWifiState() {\n warnOnce();\n return { enabled: false, connected: false, rssi: null };\n }\n async getConnectedNetwork() {\n warnOnce();\n return { network: null };\n }\n async listAvailableNetworks(
|
|
1
|
+
{"version":3,"file":"plugin.cjs.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from \"@capacitor/core\";\nexport * from \"./definitions\";\nconst loadWeb = () => import(\"./web\").then((m) => new m.WiFiWeb());\nexport const WiFi = registerPlugin(\"ElizaWiFi\", {\n web: loadWeb,\n});\n//# sourceMappingURL=index.js.map","import { WebPlugin } from \"@capacitor/core\";\nconst UNAVAILABLE_MESSAGE = \"Wi-Fi controls are only available on Android.\";\nlet warned = false;\nfunction warnOnce() {\n if (warned)\n return;\n warned = true;\n console.warn(`[ElizaWiFi] ${UNAVAILABLE_MESSAGE}`);\n}\nfunction isRecord(value) {\n return typeof value === \"object\" && value !== null;\n}\nfunction normalizeListOptions(options) {\n if (options === undefined)\n return;\n if (!isRecord(options)) {\n throw new Error(\"options must be an object\");\n }\n if (options?.maxAge !== undefined) {\n if (typeof options.maxAge !== \"number\" ||\n !Number.isFinite(options.maxAge) ||\n options.maxAge < 0) {\n throw new Error(\"maxAge must be a non-negative finite number\");\n }\n }\n if (options?.limit !== undefined) {\n if (typeof options.limit !== \"number\" ||\n !Number.isFinite(options.limit) ||\n !Number.isInteger(options.limit) ||\n options.limit < 0) {\n throw new Error(\"limit must be a non-negative finite integer\");\n }\n }\n}\nfunction validateConnectOptions(options) {\n const ssid = typeof options?.ssid === \"string\" ? options.ssid.trim() : \"\";\n if (!ssid) {\n throw new Error(\"ssid is required\");\n }\n if (options?.password !== undefined && typeof options.password !== \"string\") {\n throw new Error(\"password must be a string\");\n }\n}\n/**\n * Web fallback — every method resolves with empty / disabled data so the\n * full TypeScript interface is satisfied without throwing during normal\n * desktop or browser dev sessions. `connectToNetwork` and\n * `disconnectFromNetwork` resolve with `{ success: false }` because there is\n * no meaningful action to take on the web side.\n */\nexport class WiFiWeb extends WebPlugin {\n async getWifiState() {\n warnOnce();\n return { enabled: false, connected: false, rssi: null };\n }\n async getConnectedNetwork() {\n warnOnce();\n return { network: null };\n }\n async listAvailableNetworks(options) {\n normalizeListOptions(options);\n warnOnce();\n return { networks: [] };\n }\n async connectToNetwork(options) {\n validateConnectOptions(options);\n warnOnce();\n return { success: false, message: UNAVAILABLE_MESSAGE };\n }\n async disconnectFromNetwork() {\n warnOnce();\n return { success: false, message: UNAVAILABLE_MESSAGE };\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":"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"}
|
package/dist/plugin.js
CHANGED
|
@@ -14,6 +14,40 @@ var capacitorWifi = (function (exports, core) {
|
|
|
14
14
|
warned = true;
|
|
15
15
|
console.warn(`[ElizaWiFi] ${UNAVAILABLE_MESSAGE}`);
|
|
16
16
|
}
|
|
17
|
+
function isRecord(value) {
|
|
18
|
+
return typeof value === "object" && value !== null;
|
|
19
|
+
}
|
|
20
|
+
function normalizeListOptions(options) {
|
|
21
|
+
if (options === undefined)
|
|
22
|
+
return;
|
|
23
|
+
if (!isRecord(options)) {
|
|
24
|
+
throw new Error("options must be an object");
|
|
25
|
+
}
|
|
26
|
+
if (options?.maxAge !== undefined) {
|
|
27
|
+
if (typeof options.maxAge !== "number" ||
|
|
28
|
+
!Number.isFinite(options.maxAge) ||
|
|
29
|
+
options.maxAge < 0) {
|
|
30
|
+
throw new Error("maxAge must be a non-negative finite number");
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (options?.limit !== undefined) {
|
|
34
|
+
if (typeof options.limit !== "number" ||
|
|
35
|
+
!Number.isFinite(options.limit) ||
|
|
36
|
+
!Number.isInteger(options.limit) ||
|
|
37
|
+
options.limit < 0) {
|
|
38
|
+
throw new Error("limit must be a non-negative finite integer");
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function validateConnectOptions(options) {
|
|
43
|
+
const ssid = typeof options?.ssid === "string" ? options.ssid.trim() : "";
|
|
44
|
+
if (!ssid) {
|
|
45
|
+
throw new Error("ssid is required");
|
|
46
|
+
}
|
|
47
|
+
if (options?.password !== undefined && typeof options.password !== "string") {
|
|
48
|
+
throw new Error("password must be a string");
|
|
49
|
+
}
|
|
50
|
+
}
|
|
17
51
|
/**
|
|
18
52
|
* Web fallback — every method resolves with empty / disabled data so the
|
|
19
53
|
* full TypeScript interface is satisfied without throwing during normal
|
|
@@ -30,11 +64,13 @@ var capacitorWifi = (function (exports, core) {
|
|
|
30
64
|
warnOnce();
|
|
31
65
|
return { network: null };
|
|
32
66
|
}
|
|
33
|
-
async listAvailableNetworks(
|
|
67
|
+
async listAvailableNetworks(options) {
|
|
68
|
+
normalizeListOptions(options);
|
|
34
69
|
warnOnce();
|
|
35
70
|
return { networks: [] };
|
|
36
71
|
}
|
|
37
|
-
async connectToNetwork(
|
|
72
|
+
async connectToNetwork(options) {
|
|
73
|
+
validateConnectOptions(options);
|
|
38
74
|
warnOnce();
|
|
39
75
|
return { success: false, message: UNAVAILABLE_MESSAGE };
|
|
40
76
|
}
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from \"@capacitor/core\";\nexport * from \"./definitions\";\nconst loadWeb = () => import(\"./web\").then((m) => new m.WiFiWeb());\nexport const WiFi = registerPlugin(\"ElizaWiFi\", {\n web: loadWeb,\n});\n//# sourceMappingURL=index.js.map","import { WebPlugin } from \"@capacitor/core\";\nconst UNAVAILABLE_MESSAGE = \"Wi-Fi controls are only available on Android.\";\nlet warned = false;\nfunction warnOnce() {\n if (warned)\n return;\n warned = true;\n console.warn(`[ElizaWiFi] ${UNAVAILABLE_MESSAGE}`);\n}\n/**\n * Web fallback — every method resolves with empty / disabled data so the\n * full TypeScript interface is satisfied without throwing during normal\n * desktop or browser dev sessions. `connectToNetwork` and\n * `disconnectFromNetwork` resolve with `{ success: false }` because there is\n * no meaningful action to take on the web side.\n */\nexport class WiFiWeb extends WebPlugin {\n async getWifiState() {\n warnOnce();\n return { enabled: false, connected: false, rssi: null };\n }\n async getConnectedNetwork() {\n warnOnce();\n return { network: null };\n }\n async listAvailableNetworks(
|
|
1
|
+
{"version":3,"file":"plugin.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from \"@capacitor/core\";\nexport * from \"./definitions\";\nconst loadWeb = () => import(\"./web\").then((m) => new m.WiFiWeb());\nexport const WiFi = registerPlugin(\"ElizaWiFi\", {\n web: loadWeb,\n});\n//# sourceMappingURL=index.js.map","import { WebPlugin } from \"@capacitor/core\";\nconst UNAVAILABLE_MESSAGE = \"Wi-Fi controls are only available on Android.\";\nlet warned = false;\nfunction warnOnce() {\n if (warned)\n return;\n warned = true;\n console.warn(`[ElizaWiFi] ${UNAVAILABLE_MESSAGE}`);\n}\nfunction isRecord(value) {\n return typeof value === \"object\" && value !== null;\n}\nfunction normalizeListOptions(options) {\n if (options === undefined)\n return;\n if (!isRecord(options)) {\n throw new Error(\"options must be an object\");\n }\n if (options?.maxAge !== undefined) {\n if (typeof options.maxAge !== \"number\" ||\n !Number.isFinite(options.maxAge) ||\n options.maxAge < 0) {\n throw new Error(\"maxAge must be a non-negative finite number\");\n }\n }\n if (options?.limit !== undefined) {\n if (typeof options.limit !== \"number\" ||\n !Number.isFinite(options.limit) ||\n !Number.isInteger(options.limit) ||\n options.limit < 0) {\n throw new Error(\"limit must be a non-negative finite integer\");\n }\n }\n}\nfunction validateConnectOptions(options) {\n const ssid = typeof options?.ssid === \"string\" ? options.ssid.trim() : \"\";\n if (!ssid) {\n throw new Error(\"ssid is required\");\n }\n if (options?.password !== undefined && typeof options.password !== \"string\") {\n throw new Error(\"password must be a string\");\n }\n}\n/**\n * Web fallback — every method resolves with empty / disabled data so the\n * full TypeScript interface is satisfied without throwing during normal\n * desktop or browser dev sessions. `connectToNetwork` and\n * `disconnectFromNetwork` resolve with `{ success: false }` because there is\n * no meaningful action to take on the web side.\n */\nexport class WiFiWeb extends WebPlugin {\n async getWifiState() {\n warnOnce();\n return { enabled: false, connected: false, rssi: null };\n }\n async getConnectedNetwork() {\n warnOnce();\n return { network: null };\n }\n async listAvailableNetworks(options) {\n normalizeListOptions(options);\n warnOnce();\n return { networks: [] };\n }\n async connectToNetwork(options) {\n validateConnectOptions(options);\n warnOnce();\n return { success: false, message: UNAVAILABLE_MESSAGE };\n }\n async disconnectFromNetwork() {\n warnOnce();\n return { success: false, message: UNAVAILABLE_MESSAGE };\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elizaos/capacitor-wifi",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.3-beta.2",
|
|
4
4
|
"description": "Android Wi-Fi (WifiManager) bridge for ElizaOS.",
|
|
5
5
|
"main": "./dist/plugin.cjs.js",
|
|
6
6
|
"module": "./dist/esm/index.js",
|
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
"exports": {
|
|
9
9
|
".": {
|
|
10
10
|
"types": "./dist/esm/index.d.ts",
|
|
11
|
+
"bun": "./src/index.ts",
|
|
12
|
+
"development": "./src/index.ts",
|
|
11
13
|
"import": "./dist/esm/index.js",
|
|
12
14
|
"require": "./dist/plugin.cjs.js"
|
|
13
15
|
},
|
|
@@ -20,9 +22,11 @@
|
|
|
20
22
|
"dist"
|
|
21
23
|
],
|
|
22
24
|
"scripts": {
|
|
23
|
-
"build": "
|
|
24
|
-
"clean": "node
|
|
25
|
-
"
|
|
25
|
+
"build": "node ../../packages/scripts/with-package-build-lock.mjs plugins/plugin-native-wifi -- bun run build:unlocked",
|
|
26
|
+
"clean": "node ../../packages/scripts/rm-path-recursive.mjs dist",
|
|
27
|
+
"test": "vitest run",
|
|
28
|
+
"prepublishOnly": "bun run build",
|
|
29
|
+
"build:unlocked": "bun run clean && tsc && bunx rollup -c rollup.config.mjs"
|
|
26
30
|
},
|
|
27
31
|
"license": "MIT",
|
|
28
32
|
"capacitor": {
|
|
@@ -31,11 +35,10 @@
|
|
|
31
35
|
}
|
|
32
36
|
},
|
|
33
37
|
"devDependencies": {
|
|
34
|
-
"@capacitor/cli": "^8.0.0",
|
|
35
38
|
"@capacitor/core": "^8.3.1",
|
|
36
|
-
"rimraf": "^6.0.0",
|
|
37
39
|
"rollup": "^4.60.2",
|
|
38
|
-
"typescript": "^6.0.3"
|
|
40
|
+
"typescript": "^6.0.3",
|
|
41
|
+
"vitest": "^4.0.0"
|
|
39
42
|
},
|
|
40
43
|
"peerDependencies": {
|
|
41
44
|
"@capacitor/core": "^8.3.1"
|
|
@@ -53,5 +56,6 @@
|
|
|
53
56
|
},
|
|
54
57
|
"publishConfig": {
|
|
55
58
|
"access": "public"
|
|
56
|
-
}
|
|
59
|
+
},
|
|
60
|
+
"gitHead": "82fe0f44215954c2417328203f5bd6510985c1fc"
|
|
57
61
|
}
|