@aippy/runtime 0.2.4-dev.9 → 0.2.4
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/dist/core/index.js +4 -4
- package/dist/device/index.js +247 -226
- package/dist/device/types.d.ts +20 -1
- package/package.json +1 -1
package/dist/core/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as
|
|
1
|
+
import { a as v, A as d, C as u, E as A, R as _, b as m, c as R, p as g } from "../runtime-DjBdOttl.js";
|
|
2
2
|
const s = {
|
|
3
3
|
mode: "development",
|
|
4
4
|
debug: !1,
|
|
@@ -22,7 +22,7 @@ function c(e) {
|
|
|
22
22
|
}
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
|
-
const r = "0.2.4
|
|
25
|
+
const r = "0.2.4", a = {
|
|
26
26
|
version: r
|
|
27
27
|
}, i = a.version, t = "@aippy/runtime";
|
|
28
28
|
function p() {
|
|
@@ -33,8 +33,8 @@ function p() {
|
|
|
33
33
|
};
|
|
34
34
|
}
|
|
35
35
|
export {
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
v as AippyRuntime,
|
|
37
|
+
d as AippyRuntimeError,
|
|
38
38
|
u as Cancellable,
|
|
39
39
|
s as DEFAULT_CONFIG,
|
|
40
40
|
A as ERROR_CODES,
|
package/dist/device/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
import { c as s, b as
|
|
5
|
-
class
|
|
1
|
+
var U = Object.defineProperty;
|
|
2
|
+
var L = (n, t, e) => t in n ? U(n, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[t] = e;
|
|
3
|
+
var S = (n, t, e) => L(n, typeof t != "symbol" ? t + "" : t, e);
|
|
4
|
+
import { c as s, b as D } from "../runtime-DjBdOttl.js";
|
|
5
|
+
class k {
|
|
6
6
|
constructor() {
|
|
7
|
-
|
|
7
|
+
S(this, "stream", null);
|
|
8
8
|
}
|
|
9
9
|
/**
|
|
10
10
|
* Check if camera is supported
|
|
@@ -15,21 +15,21 @@ class _ {
|
|
|
15
15
|
/**
|
|
16
16
|
* Get camera stream
|
|
17
17
|
*/
|
|
18
|
-
async getStream(
|
|
18
|
+
async getStream(t = {}) {
|
|
19
19
|
if (!this.isSupported())
|
|
20
20
|
throw s("Camera API is not supported", "NOT_SUPPORTED");
|
|
21
21
|
try {
|
|
22
|
-
const
|
|
22
|
+
const e = {
|
|
23
23
|
video: {
|
|
24
|
-
width:
|
|
25
|
-
height:
|
|
26
|
-
facingMode:
|
|
24
|
+
width: t.width,
|
|
25
|
+
height: t.height,
|
|
26
|
+
facingMode: t.facingMode || "environment"
|
|
27
27
|
}
|
|
28
28
|
};
|
|
29
|
-
return this.stream = await navigator.mediaDevices.getUserMedia(
|
|
30
|
-
} catch (
|
|
29
|
+
return this.stream = await navigator.mediaDevices.getUserMedia(e), this.stream;
|
|
30
|
+
} catch (e) {
|
|
31
31
|
throw s(
|
|
32
|
-
`Failed to access camera: ${
|
|
32
|
+
`Failed to access camera: ${e instanceof Error ? e.message : "Unknown error"}`,
|
|
33
33
|
"PERMISSION_DENIED"
|
|
34
34
|
);
|
|
35
35
|
}
|
|
@@ -37,30 +37,30 @@ class _ {
|
|
|
37
37
|
/**
|
|
38
38
|
* Capture photo from stream
|
|
39
39
|
*/
|
|
40
|
-
async capturePhoto(
|
|
40
|
+
async capturePhoto(t = {}) {
|
|
41
41
|
if (!this.stream)
|
|
42
42
|
throw s("No camera stream available", "NOT_SUPPORTED");
|
|
43
43
|
try {
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
const
|
|
47
|
-
if (!
|
|
44
|
+
const e = document.createElement("video");
|
|
45
|
+
e.srcObject = this.stream, e.play();
|
|
46
|
+
const i = document.createElement("canvas"), o = i.getContext("2d");
|
|
47
|
+
if (!o)
|
|
48
48
|
throw s("Failed to get canvas context", "UNKNOWN_ERROR");
|
|
49
|
-
|
|
50
|
-
const r =
|
|
51
|
-
|
|
49
|
+
i.width = t.width || e.videoWidth, i.height = t.height || e.videoHeight, o.drawImage(e, 0, 0, i.width, i.height);
|
|
50
|
+
const r = t.format || "jpeg", c = t.quality === "high" ? 0.9 : t.quality === "medium" ? 0.7 : 0.5, a = await new Promise((u, m) => {
|
|
51
|
+
i.toBlob((l) => {
|
|
52
52
|
l ? u(l) : m(new Error("Failed to create blob"));
|
|
53
53
|
}, `image/${r}`, c);
|
|
54
|
-
}), d =
|
|
54
|
+
}), d = i.toDataURL(`image/${r}`, c);
|
|
55
55
|
return {
|
|
56
56
|
blob: a,
|
|
57
57
|
dataUrl: d,
|
|
58
|
-
width:
|
|
59
|
-
height:
|
|
58
|
+
width: i.width,
|
|
59
|
+
height: i.height
|
|
60
60
|
};
|
|
61
|
-
} catch (
|
|
61
|
+
} catch (e) {
|
|
62
62
|
throw s(
|
|
63
|
-
`Failed to capture photo: ${
|
|
63
|
+
`Failed to capture photo: ${e instanceof Error ? e.message : "Unknown error"}`,
|
|
64
64
|
"UNKNOWN_ERROR"
|
|
65
65
|
);
|
|
66
66
|
}
|
|
@@ -69,11 +69,11 @@ class _ {
|
|
|
69
69
|
* Stop camera stream
|
|
70
70
|
*/
|
|
71
71
|
stopStream() {
|
|
72
|
-
this.stream && (this.stream.getTracks().forEach((
|
|
72
|
+
this.stream && (this.stream.getTracks().forEach((t) => t.stop()), this.stream = null);
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
|
-
const
|
|
76
|
-
class
|
|
75
|
+
const W = new k();
|
|
76
|
+
class T {
|
|
77
77
|
/**
|
|
78
78
|
* Check if geolocation is supported
|
|
79
79
|
*/
|
|
@@ -83,14 +83,14 @@ class F {
|
|
|
83
83
|
/**
|
|
84
84
|
* Get current position
|
|
85
85
|
*/
|
|
86
|
-
async getCurrentPosition(
|
|
86
|
+
async getCurrentPosition(t = {}) {
|
|
87
87
|
if (!this.isSupported())
|
|
88
88
|
throw s("Geolocation API is not supported", "NOT_SUPPORTED");
|
|
89
|
-
return new Promise((
|
|
90
|
-
const
|
|
91
|
-
enableHighAccuracy:
|
|
92
|
-
timeout:
|
|
93
|
-
maximumAge:
|
|
89
|
+
return new Promise((e, i) => {
|
|
90
|
+
const o = {
|
|
91
|
+
enableHighAccuracy: t.enableHighAccuracy ?? !0,
|
|
92
|
+
timeout: t.timeout ?? 1e4,
|
|
93
|
+
maximumAge: t.maximumAge ?? 6e4
|
|
94
94
|
};
|
|
95
95
|
navigator.geolocation.getCurrentPosition(
|
|
96
96
|
(r) => {
|
|
@@ -104,7 +104,7 @@ class F {
|
|
|
104
104
|
speed: r.coords.speed ?? void 0,
|
|
105
105
|
timestamp: r.timestamp
|
|
106
106
|
};
|
|
107
|
-
|
|
107
|
+
e(c);
|
|
108
108
|
},
|
|
109
109
|
(r) => {
|
|
110
110
|
let c = "UNKNOWN_ERROR", a = "Unknown geolocation error";
|
|
@@ -119,163 +119,184 @@ class F {
|
|
|
119
119
|
a = "Geolocation timeout";
|
|
120
120
|
break;
|
|
121
121
|
}
|
|
122
|
-
|
|
122
|
+
i(s(a, c));
|
|
123
123
|
},
|
|
124
|
-
|
|
124
|
+
o
|
|
125
125
|
);
|
|
126
126
|
});
|
|
127
127
|
}
|
|
128
128
|
/**
|
|
129
129
|
* Watch position changes
|
|
130
130
|
*/
|
|
131
|
-
watchPosition(
|
|
131
|
+
watchPosition(t, e = {}) {
|
|
132
132
|
if (!this.isSupported())
|
|
133
133
|
throw s("Geolocation API is not supported", "NOT_SUPPORTED");
|
|
134
|
-
const
|
|
135
|
-
enableHighAccuracy:
|
|
136
|
-
timeout:
|
|
137
|
-
maximumAge:
|
|
134
|
+
const i = {
|
|
135
|
+
enableHighAccuracy: e.enableHighAccuracy ?? !0,
|
|
136
|
+
timeout: e.timeout ?? 1e4,
|
|
137
|
+
maximumAge: e.maximumAge ?? 6e4
|
|
138
138
|
};
|
|
139
139
|
return navigator.geolocation.watchPosition(
|
|
140
|
-
(
|
|
140
|
+
(o) => {
|
|
141
141
|
const r = {
|
|
142
|
-
latitude:
|
|
143
|
-
longitude:
|
|
144
|
-
accuracy:
|
|
145
|
-
altitude:
|
|
146
|
-
altitudeAccuracy:
|
|
147
|
-
heading:
|
|
148
|
-
speed:
|
|
149
|
-
timestamp:
|
|
142
|
+
latitude: o.coords.latitude,
|
|
143
|
+
longitude: o.coords.longitude,
|
|
144
|
+
accuracy: o.coords.accuracy,
|
|
145
|
+
altitude: o.coords.altitude ?? void 0,
|
|
146
|
+
altitudeAccuracy: o.coords.altitudeAccuracy ?? void 0,
|
|
147
|
+
heading: o.coords.heading ?? void 0,
|
|
148
|
+
speed: o.coords.speed ?? void 0,
|
|
149
|
+
timestamp: o.timestamp
|
|
150
150
|
};
|
|
151
|
-
|
|
151
|
+
t(r);
|
|
152
152
|
},
|
|
153
|
-
(
|
|
154
|
-
console.error("Geolocation watch error:",
|
|
153
|
+
(o) => {
|
|
154
|
+
console.error("Geolocation watch error:", o);
|
|
155
155
|
},
|
|
156
|
-
|
|
156
|
+
i
|
|
157
157
|
);
|
|
158
158
|
}
|
|
159
159
|
/**
|
|
160
160
|
* Clear position watch
|
|
161
161
|
*/
|
|
162
|
-
clearWatch(
|
|
163
|
-
navigator.geolocation.clearWatch(
|
|
162
|
+
clearWatch(t) {
|
|
163
|
+
navigator.geolocation.clearWatch(t);
|
|
164
164
|
}
|
|
165
165
|
}
|
|
166
|
-
const
|
|
167
|
-
function
|
|
166
|
+
const H = new T();
|
|
167
|
+
function E() {
|
|
168
168
|
return "DeviceMotionEvent" in window;
|
|
169
169
|
}
|
|
170
|
-
function
|
|
170
|
+
function N() {
|
|
171
171
|
return "DeviceOrientationEvent" in window;
|
|
172
172
|
}
|
|
173
|
-
function
|
|
174
|
-
const n = typeof window < "u",
|
|
173
|
+
function R() {
|
|
174
|
+
const n = typeof window < "u", t = n && !!window.webkit, e = t && !!window.webkit?.messageHandlers, i = e && !!window.webkit?.messageHandlers?.aippyListener;
|
|
175
175
|
return console.log("🔍 [Aippy Sensors] hasNativeBridge check:", {
|
|
176
176
|
hasWindow: n,
|
|
177
|
-
hasWebkit:
|
|
178
|
-
hasMessageHandlers:
|
|
179
|
-
hasAippyListener:
|
|
180
|
-
result:
|
|
181
|
-
}),
|
|
177
|
+
hasWebkit: t,
|
|
178
|
+
hasMessageHandlers: e,
|
|
179
|
+
hasAippyListener: i,
|
|
180
|
+
result: i
|
|
181
|
+
}), i;
|
|
182
182
|
}
|
|
183
|
-
function
|
|
183
|
+
function I() {
|
|
184
184
|
return typeof window < "u" && typeof window.orientation < "u" ? window.orientation : typeof window < "u" && window.screen?.orientation?.angle !== void 0 ? window.screen.orientation.angle : 0;
|
|
185
185
|
}
|
|
186
|
-
function
|
|
187
|
-
switch (
|
|
186
|
+
function P(n, t, e) {
|
|
187
|
+
switch (e) {
|
|
188
188
|
case 0:
|
|
189
|
-
return [n,
|
|
189
|
+
return [n, -t];
|
|
190
190
|
case 180:
|
|
191
|
-
return [-n,
|
|
191
|
+
return [-n, t];
|
|
192
192
|
case 90:
|
|
193
|
-
return [
|
|
193
|
+
return [-t, n];
|
|
194
194
|
case -90:
|
|
195
|
-
return [
|
|
195
|
+
return [t, -n];
|
|
196
196
|
default:
|
|
197
|
-
return [n,
|
|
197
|
+
return [n, -t];
|
|
198
198
|
}
|
|
199
199
|
}
|
|
200
|
-
async function
|
|
201
|
-
if (console.log("🔐 [Aippy Sensors] requestMotionPermission called"),
|
|
200
|
+
async function b() {
|
|
201
|
+
if (console.log("🔐 [Aippy Sensors] requestMotionPermission called"), R())
|
|
202
202
|
return console.log("✅ [Aippy Sensors] Native bridge available, skipping permission request"), !0;
|
|
203
|
-
if (!
|
|
203
|
+
if (!E())
|
|
204
204
|
return console.warn("❌ [Aippy Sensors] Device motion not supported"), !1;
|
|
205
205
|
const n = typeof DeviceMotionEvent < "u" && typeof DeviceMotionEvent.requestPermission == "function";
|
|
206
206
|
if (console.log("🔍 [Aippy Sensors] Permission API available:", n), n)
|
|
207
207
|
try {
|
|
208
208
|
console.log("🙏 [Aippy Sensors] Requesting device motion permission...");
|
|
209
|
-
const
|
|
210
|
-
return console.log("📋 [Aippy Sensors] Permission result:",
|
|
211
|
-
} catch (
|
|
212
|
-
return console.warn("❌ [Aippy Sensors] Permission request failed:",
|
|
209
|
+
const t = await DeviceMotionEvent.requestPermission();
|
|
210
|
+
return console.log("📋 [Aippy Sensors] Permission result:", t), t === "granted";
|
|
211
|
+
} catch (t) {
|
|
212
|
+
return console.warn("❌ [Aippy Sensors] Permission request failed:", t), !1;
|
|
213
213
|
}
|
|
214
214
|
return console.log("✅ [Aippy Sensors] No permission needed (granted by default)"), !0;
|
|
215
215
|
}
|
|
216
216
|
function x(n) {
|
|
217
217
|
console.log("🔧 [Aippy Sensors] watchMotionNative - Setting up native bridge listener");
|
|
218
|
-
const
|
|
219
|
-
const
|
|
218
|
+
const t = D.addMotionListener((e) => {
|
|
219
|
+
const i = I(), o = e.gravity?.x ?? 0, r = e.gravity?.y ?? 0, c = e.gravity?.z ?? 0, a = e.userAcceleration?.x ?? 0, d = e.userAcceleration?.y ?? 0, u = e.userAcceleration?.z ?? 0, [m, l] = P(o, r, i), [y, v] = P(a, d, i), g = e.attitude && typeof e.attitude.yaw == "number" && typeof e.attitude.pitch == "number" && typeof e.attitude.roll == "number";
|
|
220
|
+
let w = 0;
|
|
221
|
+
g && (w = e.attitude.yaw * (180 / Math.PI), w < 0 && (w += 360));
|
|
222
|
+
const f = {
|
|
220
223
|
gravity: {
|
|
221
|
-
x:
|
|
222
|
-
y,
|
|
224
|
+
x: m,
|
|
225
|
+
y: l,
|
|
223
226
|
z: c
|
|
224
|
-
// Z
|
|
227
|
+
// Z-axis not affected by screen rotation
|
|
225
228
|
},
|
|
226
229
|
acceleration: {
|
|
227
|
-
x:
|
|
230
|
+
x: y,
|
|
228
231
|
y: v,
|
|
229
232
|
z: u
|
|
230
|
-
// Z
|
|
233
|
+
// Z-axis not affected by screen rotation
|
|
231
234
|
},
|
|
232
235
|
accelerationIncludingGravity: {
|
|
233
|
-
x:
|
|
234
|
-
y:
|
|
236
|
+
x: m + y,
|
|
237
|
+
y: l + v,
|
|
235
238
|
z: c + u
|
|
236
239
|
},
|
|
240
|
+
// iOS native uses rotationRate.x/y/z (rad/s)
|
|
241
|
+
// Convert to rotation.alpha/beta/gamma (deg/s)
|
|
237
242
|
rotation: {
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
243
|
+
// If attitude is available, use yaw for alpha (compass heading)
|
|
244
|
+
// Otherwise fallback to rotationRate.z (angular velocity)
|
|
245
|
+
alpha: g ? w : (e.rotationRate?.z ?? 0) * (180 / Math.PI),
|
|
246
|
+
beta: (e.rotationRate?.x ?? 0) * (180 / Math.PI),
|
|
247
|
+
// x -> beta (around X-axis)
|
|
248
|
+
gamma: (e.rotationRate?.y ?? 0) * (180 / Math.PI)
|
|
249
|
+
// y -> gamma (around Y-axis)
|
|
241
250
|
},
|
|
251
|
+
// Add attitude data for more precise orientation info
|
|
252
|
+
attitude: g ? {
|
|
253
|
+
yaw: w,
|
|
254
|
+
pitch: e.attitude.pitch * (180 / Math.PI),
|
|
255
|
+
roll: e.attitude.roll * (180 / Math.PI),
|
|
256
|
+
quaternion: e.attitude.quaternion ? {
|
|
257
|
+
x: e.attitude.quaternion.x,
|
|
258
|
+
y: e.attitude.quaternion.y,
|
|
259
|
+
z: e.attitude.quaternion.z,
|
|
260
|
+
w: e.attitude.quaternion.w
|
|
261
|
+
} : void 0
|
|
262
|
+
} : void 0,
|
|
242
263
|
timestamp: Date.now()
|
|
243
264
|
};
|
|
244
|
-
n(
|
|
265
|
+
n(f);
|
|
245
266
|
});
|
|
246
|
-
return console.log("✅ [Aippy Sensors] watchMotionNative - Listener setup complete"),
|
|
267
|
+
return console.log("✅ [Aippy Sensors] watchMotionNative - Listener setup complete"), t;
|
|
247
268
|
}
|
|
248
|
-
function
|
|
249
|
-
if (!
|
|
269
|
+
function _(n, t = !0) {
|
|
270
|
+
if (!E())
|
|
250
271
|
throw s("Device motion API is not supported", "NOT_SUPPORTED");
|
|
251
|
-
let
|
|
252
|
-
const
|
|
253
|
-
if (!
|
|
254
|
-
const d =
|
|
272
|
+
let e = !1, i = null;
|
|
273
|
+
const o = (a) => {
|
|
274
|
+
if (!e) return;
|
|
275
|
+
const d = I();
|
|
255
276
|
let u, m, l;
|
|
256
277
|
if (a.acceleration) {
|
|
257
|
-
const
|
|
258
|
-
u = (
|
|
278
|
+
const p = a.accelerationIncludingGravity, h = a.acceleration;
|
|
279
|
+
u = (p?.x ?? 0) - (h?.x ?? 0), m = (p?.y ?? 0) - (h?.y ?? 0), l = (p?.z ?? 0) - (h?.z ?? 0);
|
|
259
280
|
} else {
|
|
260
|
-
const
|
|
261
|
-
u = (
|
|
281
|
+
const p = a.accelerationIncludingGravity, h = 9.8;
|
|
282
|
+
u = (p?.x ?? 0) / h, m = (p?.y ?? 0) / h, l = (p?.z ?? 0) / h;
|
|
262
283
|
}
|
|
263
|
-
const
|
|
284
|
+
const y = a.acceleration?.x ?? 0, v = a.acceleration?.y ?? 0, g = a.acceleration?.z ?? 0, [w, f] = P(u, m, d), [O, A] = P(y, v, d), M = {
|
|
264
285
|
gravity: {
|
|
265
|
-
x:
|
|
266
|
-
y:
|
|
286
|
+
x: w,
|
|
287
|
+
y: f,
|
|
267
288
|
z: l
|
|
268
|
-
// Z
|
|
289
|
+
// Z-axis not affected by screen rotation
|
|
269
290
|
},
|
|
270
291
|
acceleration: {
|
|
271
292
|
x: O,
|
|
272
|
-
y:
|
|
293
|
+
y: A,
|
|
273
294
|
z: g
|
|
274
|
-
// Z
|
|
295
|
+
// Z-axis not affected by screen rotation
|
|
275
296
|
},
|
|
276
297
|
accelerationIncludingGravity: {
|
|
277
|
-
x:
|
|
278
|
-
y:
|
|
298
|
+
x: w + O,
|
|
299
|
+
y: f + A,
|
|
279
300
|
z: l + g
|
|
280
301
|
},
|
|
281
302
|
rotation: {
|
|
@@ -287,54 +308,54 @@ function G(n, e = !0) {
|
|
|
287
308
|
};
|
|
288
309
|
n(M);
|
|
289
310
|
}, r = async () => {
|
|
290
|
-
|
|
311
|
+
t && !await b() || (e = !0, window.addEventListener("devicemotion", o));
|
|
291
312
|
};
|
|
292
313
|
return (async () => {
|
|
293
|
-
if (typeof DeviceMotionEvent < "u" && typeof DeviceMotionEvent.requestPermission == "function" &&
|
|
314
|
+
if (typeof DeviceMotionEvent < "u" && typeof DeviceMotionEvent.requestPermission == "function" && t) {
|
|
294
315
|
const d = async () => {
|
|
295
|
-
|
|
316
|
+
i = null, await r();
|
|
296
317
|
};
|
|
297
|
-
window.addEventListener("click", d, { once: !0 }), window.addEventListener("touchstart", d, { once: !0 }),
|
|
318
|
+
window.addEventListener("click", d, { once: !0 }), window.addEventListener("touchstart", d, { once: !0 }), i = () => {
|
|
298
319
|
window.removeEventListener("click", d), window.removeEventListener("touchstart", d);
|
|
299
320
|
};
|
|
300
321
|
} else
|
|
301
322
|
await r();
|
|
302
323
|
})(), () => {
|
|
303
|
-
|
|
324
|
+
e = !1, window.removeEventListener("devicemotion", o), i && (i(), i = null);
|
|
304
325
|
};
|
|
305
326
|
}
|
|
306
|
-
function
|
|
307
|
-
const
|
|
308
|
-
return console.log(`🎯 [Aippy Sensors] watchMotion - Using ${
|
|
327
|
+
function C(n, t = !0) {
|
|
328
|
+
const e = R();
|
|
329
|
+
return console.log(`🎯 [Aippy Sensors] watchMotion - Using ${e ? "NATIVE BRIDGE" : "WEB API"} mode`), e ? (console.log("📱 [Aippy Sensors] Starting native bridge motion listener"), x(n)) : (console.log("🌐 [Aippy Sensors] Starting Web API motion listener (may require permission)"), _(n, t));
|
|
309
330
|
}
|
|
310
331
|
function B(n) {
|
|
311
|
-
if (!
|
|
332
|
+
if (!N())
|
|
312
333
|
throw s("Device orientation API is not supported", "NOT_SUPPORTED");
|
|
313
|
-
const
|
|
314
|
-
const
|
|
315
|
-
alpha:
|
|
316
|
-
beta:
|
|
317
|
-
gamma:
|
|
334
|
+
const t = (e) => {
|
|
335
|
+
const i = {
|
|
336
|
+
alpha: e.alpha ?? 0,
|
|
337
|
+
beta: e.beta ?? 0,
|
|
338
|
+
gamma: e.gamma ?? 0,
|
|
318
339
|
timestamp: Date.now()
|
|
319
340
|
};
|
|
320
|
-
n(
|
|
341
|
+
n(i);
|
|
321
342
|
};
|
|
322
|
-
return window.addEventListener("deviceorientation",
|
|
323
|
-
window.removeEventListener("deviceorientation",
|
|
343
|
+
return window.addEventListener("deviceorientation", t), () => {
|
|
344
|
+
window.removeEventListener("deviceorientation", t);
|
|
324
345
|
};
|
|
325
346
|
}
|
|
326
|
-
class
|
|
347
|
+
class F {
|
|
327
348
|
/**
|
|
328
349
|
* Check if device orientation is supported
|
|
329
350
|
*/
|
|
330
351
|
isOrientationSupported() {
|
|
331
|
-
return
|
|
352
|
+
return N();
|
|
332
353
|
}
|
|
333
354
|
/**
|
|
334
355
|
* Check if device motion is supported
|
|
335
356
|
*/
|
|
336
357
|
isMotionSupported() {
|
|
337
|
-
return
|
|
358
|
+
return E();
|
|
338
359
|
}
|
|
339
360
|
/**
|
|
340
361
|
* Get device orientation data
|
|
@@ -342,17 +363,17 @@ class z {
|
|
|
342
363
|
async getOrientation() {
|
|
343
364
|
if (!this.isOrientationSupported())
|
|
344
365
|
throw s("Device orientation API is not supported", "NOT_SUPPORTED");
|
|
345
|
-
return new Promise((
|
|
346
|
-
const
|
|
347
|
-
window.removeEventListener("deviceorientation",
|
|
348
|
-
x:
|
|
349
|
-
y:
|
|
350
|
-
z:
|
|
366
|
+
return new Promise((t, e) => {
|
|
367
|
+
const i = (o) => {
|
|
368
|
+
window.removeEventListener("deviceorientation", i), t({
|
|
369
|
+
x: o.alpha ?? 0,
|
|
370
|
+
y: o.beta ?? 0,
|
|
371
|
+
z: o.gamma ?? 0,
|
|
351
372
|
timestamp: Date.now()
|
|
352
373
|
});
|
|
353
374
|
};
|
|
354
|
-
window.addEventListener("deviceorientation",
|
|
355
|
-
window.removeEventListener("deviceorientation",
|
|
375
|
+
window.addEventListener("deviceorientation", i), setTimeout(() => {
|
|
376
|
+
window.removeEventListener("deviceorientation", i), e(s("Device orientation timeout", "UNKNOWN_ERROR"));
|
|
356
377
|
}, 5e3);
|
|
357
378
|
});
|
|
358
379
|
}
|
|
@@ -360,19 +381,19 @@ class z {
|
|
|
360
381
|
* Watch device orientation changes
|
|
361
382
|
* @deprecated Use watchOrientation() function instead
|
|
362
383
|
*/
|
|
363
|
-
watchOrientation(
|
|
384
|
+
watchOrientation(t) {
|
|
364
385
|
if (!this.isOrientationSupported())
|
|
365
386
|
throw s("Device orientation API is not supported", "NOT_SUPPORTED");
|
|
366
|
-
const
|
|
367
|
-
|
|
368
|
-
x:
|
|
369
|
-
y:
|
|
370
|
-
z:
|
|
387
|
+
const e = (i) => {
|
|
388
|
+
t({
|
|
389
|
+
x: i.alpha ?? 0,
|
|
390
|
+
y: i.beta ?? 0,
|
|
391
|
+
z: i.gamma ?? 0,
|
|
371
392
|
timestamp: Date.now()
|
|
372
393
|
});
|
|
373
394
|
};
|
|
374
|
-
return window.addEventListener("deviceorientation",
|
|
375
|
-
window.removeEventListener("deviceorientation",
|
|
395
|
+
return window.addEventListener("deviceorientation", e), () => {
|
|
396
|
+
window.removeEventListener("deviceorientation", e);
|
|
376
397
|
};
|
|
377
398
|
}
|
|
378
399
|
/**
|
|
@@ -381,17 +402,17 @@ class z {
|
|
|
381
402
|
async getMotion() {
|
|
382
403
|
if (!this.isMotionSupported())
|
|
383
404
|
throw s("Device motion API is not supported", "NOT_SUPPORTED");
|
|
384
|
-
return new Promise((
|
|
385
|
-
const
|
|
386
|
-
window.removeEventListener("devicemotion",
|
|
387
|
-
x:
|
|
388
|
-
y:
|
|
389
|
-
z:
|
|
405
|
+
return new Promise((t, e) => {
|
|
406
|
+
const i = (o) => {
|
|
407
|
+
window.removeEventListener("devicemotion", i), t({
|
|
408
|
+
x: o.acceleration?.x ?? 0,
|
|
409
|
+
y: o.acceleration?.y ?? 0,
|
|
410
|
+
z: o.acceleration?.z ?? 0,
|
|
390
411
|
timestamp: Date.now()
|
|
391
412
|
});
|
|
392
413
|
};
|
|
393
|
-
window.addEventListener("devicemotion",
|
|
394
|
-
window.removeEventListener("devicemotion",
|
|
414
|
+
window.addEventListener("devicemotion", i), setTimeout(() => {
|
|
415
|
+
window.removeEventListener("devicemotion", i), e(s("Device motion timeout", "UNKNOWN_ERROR"));
|
|
395
416
|
}, 5e3);
|
|
396
417
|
});
|
|
397
418
|
}
|
|
@@ -399,30 +420,30 @@ class z {
|
|
|
399
420
|
* Watch device motion changes
|
|
400
421
|
* @deprecated Use watchMotion() function instead
|
|
401
422
|
*/
|
|
402
|
-
watchMotion(
|
|
423
|
+
watchMotion(t) {
|
|
403
424
|
if (!this.isMotionSupported())
|
|
404
425
|
throw s("Device motion API is not supported", "NOT_SUPPORTED");
|
|
405
|
-
const
|
|
406
|
-
|
|
407
|
-
x:
|
|
408
|
-
y:
|
|
409
|
-
z:
|
|
426
|
+
const e = (i) => {
|
|
427
|
+
t({
|
|
428
|
+
x: i.acceleration?.x ?? 0,
|
|
429
|
+
y: i.acceleration?.y ?? 0,
|
|
430
|
+
z: i.acceleration?.z ?? 0,
|
|
410
431
|
timestamp: Date.now()
|
|
411
432
|
});
|
|
412
433
|
};
|
|
413
|
-
return window.addEventListener("devicemotion",
|
|
414
|
-
window.removeEventListener("devicemotion",
|
|
434
|
+
return window.addEventListener("devicemotion", e), () => {
|
|
435
|
+
window.removeEventListener("devicemotion", e);
|
|
415
436
|
};
|
|
416
437
|
}
|
|
417
438
|
/**
|
|
418
439
|
* Request permission for motion sensors (iOS 13+)
|
|
419
440
|
*/
|
|
420
441
|
async requestPermission() {
|
|
421
|
-
return
|
|
442
|
+
return b();
|
|
422
443
|
}
|
|
423
444
|
}
|
|
424
|
-
const K = new
|
|
425
|
-
class
|
|
445
|
+
const K = new F();
|
|
446
|
+
class z {
|
|
426
447
|
/**
|
|
427
448
|
* Check if file system access is supported
|
|
428
449
|
*/
|
|
@@ -438,28 +459,28 @@ class W {
|
|
|
438
459
|
/**
|
|
439
460
|
* Open file picker (modern API)
|
|
440
461
|
*/
|
|
441
|
-
async openFilePicker(
|
|
462
|
+
async openFilePicker(t = {}) {
|
|
442
463
|
if (!this.isSupported())
|
|
443
464
|
throw s("File System Access API is not supported", "NOT_SUPPORTED");
|
|
444
465
|
try {
|
|
445
|
-
const
|
|
446
|
-
types:
|
|
466
|
+
const e = {
|
|
467
|
+
types: t.accept ? [{
|
|
447
468
|
description: "Files",
|
|
448
469
|
accept: Object.fromEntries(
|
|
449
|
-
|
|
470
|
+
t.accept.map((r) => [r, [r]])
|
|
450
471
|
)
|
|
451
472
|
}] : void 0,
|
|
452
|
-
multiple:
|
|
453
|
-
},
|
|
454
|
-
|
|
473
|
+
multiple: t.multiple ?? !1
|
|
474
|
+
}, i = await window.showOpenFilePicker(e), o = await Promise.all(
|
|
475
|
+
i.map(async (r) => r.getFile())
|
|
455
476
|
);
|
|
456
477
|
return {
|
|
457
|
-
files:
|
|
458
|
-
paths:
|
|
478
|
+
files: o,
|
|
479
|
+
paths: o.map((r) => r.name)
|
|
459
480
|
};
|
|
460
|
-
} catch (
|
|
461
|
-
throw
|
|
462
|
-
`Failed to open file picker: ${
|
|
481
|
+
} catch (e) {
|
|
482
|
+
throw e instanceof Error && e.name === "AbortError" ? s("File picker was cancelled", "PERMISSION_DENIED") : s(
|
|
483
|
+
`Failed to open file picker: ${e instanceof Error ? e.message : "Unknown error"}`,
|
|
463
484
|
"PERMISSION_DENIED"
|
|
464
485
|
);
|
|
465
486
|
}
|
|
@@ -467,38 +488,38 @@ class W {
|
|
|
467
488
|
/**
|
|
468
489
|
* Open file picker (legacy fallback)
|
|
469
490
|
*/
|
|
470
|
-
async openFilePickerLegacy(
|
|
491
|
+
async openFilePickerLegacy(t = {}) {
|
|
471
492
|
if (!this.isLegacySupported())
|
|
472
493
|
throw s("File input is not supported", "NOT_SUPPORTED");
|
|
473
|
-
return new Promise((
|
|
474
|
-
const
|
|
475
|
-
|
|
494
|
+
return new Promise((e, i) => {
|
|
495
|
+
const o = document.createElement("input");
|
|
496
|
+
o.type = "file", o.multiple = t.multiple ?? !1, o.accept = t.accept?.join(",") ?? "", o.onchange = (r) => {
|
|
476
497
|
const c = r.target, a = Array.from(c.files || []);
|
|
477
|
-
|
|
498
|
+
e({
|
|
478
499
|
files: a,
|
|
479
500
|
paths: a.map((d) => d.name)
|
|
480
501
|
});
|
|
481
|
-
},
|
|
482
|
-
|
|
483
|
-
},
|
|
502
|
+
}, o.oncancel = () => {
|
|
503
|
+
i(s("File picker was cancelled", "PERMISSION_DENIED"));
|
|
504
|
+
}, o.click();
|
|
484
505
|
});
|
|
485
506
|
}
|
|
486
507
|
/**
|
|
487
508
|
* Open file picker with fallback
|
|
488
509
|
*/
|
|
489
|
-
async openFile(
|
|
490
|
-
return this.isSupported() ? await this.openFilePicker(
|
|
510
|
+
async openFile(t = {}) {
|
|
511
|
+
return this.isSupported() ? await this.openFilePicker(t) : await this.openFilePickerLegacy(t);
|
|
491
512
|
}
|
|
492
513
|
/**
|
|
493
514
|
* Save file
|
|
494
515
|
*/
|
|
495
|
-
async saveFile(
|
|
516
|
+
async saveFile(t, e) {
|
|
496
517
|
try {
|
|
497
|
-
const
|
|
498
|
-
|
|
499
|
-
} catch (
|
|
518
|
+
const i = URL.createObjectURL(t), o = document.createElement("a");
|
|
519
|
+
o.href = i, o.download = e, document.body.appendChild(o), o.click(), document.body.removeChild(o), URL.revokeObjectURL(i);
|
|
520
|
+
} catch (i) {
|
|
500
521
|
throw s(
|
|
501
|
-
`Failed to save file: ${
|
|
522
|
+
`Failed to save file: ${i instanceof Error ? i.message : "Unknown error"}`,
|
|
502
523
|
"UNKNOWN_ERROR"
|
|
503
524
|
);
|
|
504
525
|
}
|
|
@@ -506,51 +527,51 @@ class W {
|
|
|
506
527
|
/**
|
|
507
528
|
* Read file as text
|
|
508
529
|
*/
|
|
509
|
-
async readAsText(
|
|
510
|
-
return new Promise((
|
|
511
|
-
const
|
|
512
|
-
|
|
530
|
+
async readAsText(t) {
|
|
531
|
+
return new Promise((e, i) => {
|
|
532
|
+
const o = new FileReader();
|
|
533
|
+
o.onload = () => e(o.result), o.onerror = () => i(s("Failed to read file", "UNKNOWN_ERROR")), o.readAsText(t);
|
|
513
534
|
});
|
|
514
535
|
}
|
|
515
536
|
/**
|
|
516
537
|
* Read file as data URL
|
|
517
538
|
*/
|
|
518
|
-
async readAsDataURL(
|
|
519
|
-
return new Promise((
|
|
520
|
-
const
|
|
521
|
-
|
|
539
|
+
async readAsDataURL(t) {
|
|
540
|
+
return new Promise((e, i) => {
|
|
541
|
+
const o = new FileReader();
|
|
542
|
+
o.onload = () => e(o.result), o.onerror = () => i(s("Failed to read file", "UNKNOWN_ERROR")), o.readAsDataURL(t);
|
|
522
543
|
});
|
|
523
544
|
}
|
|
524
545
|
}
|
|
525
|
-
const
|
|
526
|
-
function
|
|
527
|
-
return new Promise((
|
|
546
|
+
const X = new z();
|
|
547
|
+
function Y(n) {
|
|
548
|
+
return new Promise((t) => {
|
|
528
549
|
if ("vibrate" in navigator)
|
|
529
|
-
navigator.vibrate(n),
|
|
550
|
+
navigator.vibrate(n), t();
|
|
530
551
|
else if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.aippyListener) {
|
|
531
|
-
const
|
|
552
|
+
const e = {
|
|
532
553
|
command: "navigator.vibrate",
|
|
533
554
|
parameters: n
|
|
534
555
|
};
|
|
535
|
-
window.webkit.messageHandlers.aippyListener.postMessage(
|
|
556
|
+
window.webkit.messageHandlers.aippyListener.postMessage(e), t();
|
|
536
557
|
} else
|
|
537
|
-
console.warn("Vibration not supported in this environment"),
|
|
558
|
+
console.warn("Vibration not supported in this environment"), t();
|
|
538
559
|
});
|
|
539
560
|
}
|
|
540
561
|
export {
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
562
|
+
k as CameraAPI,
|
|
563
|
+
z as FileSystemAPI,
|
|
564
|
+
T as GeolocationAPI,
|
|
565
|
+
F as SensorsAPI,
|
|
566
|
+
W as camera,
|
|
567
|
+
X as fileSystem,
|
|
568
|
+
H as geolocation,
|
|
569
|
+
R as hasNativeBridge,
|
|
570
|
+
E as isMotionSupported,
|
|
571
|
+
N as isOrientationSupported,
|
|
572
|
+
b as requestMotionPermission,
|
|
552
573
|
K as sensors,
|
|
553
|
-
|
|
554
|
-
|
|
574
|
+
Y as vibrate,
|
|
575
|
+
C as watchMotion,
|
|
555
576
|
B as watchOrientation
|
|
556
577
|
};
|
package/dist/device/types.d.ts
CHANGED
|
@@ -77,12 +77,31 @@ export interface MotionData {
|
|
|
77
77
|
y: number;
|
|
78
78
|
z: number;
|
|
79
79
|
};
|
|
80
|
-
/** Rotation rate (deg/s) */
|
|
80
|
+
/** Rotation rate (deg/s) - Angular velocity */
|
|
81
81
|
rotation: {
|
|
82
82
|
alpha: number;
|
|
83
83
|
beta: number;
|
|
84
84
|
gamma: number;
|
|
85
85
|
};
|
|
86
|
+
/**
|
|
87
|
+
* Device attitude/orientation (degrees) - Absolute orientation
|
|
88
|
+
* Available when iOS native bridge provides CMDeviceMotion.attitude data
|
|
89
|
+
*/
|
|
90
|
+
attitude?: {
|
|
91
|
+
/** Rotation around Z axis (0-360°) - Compass heading */
|
|
92
|
+
yaw: number;
|
|
93
|
+
/** Rotation around X axis - Forward/backward tilt */
|
|
94
|
+
pitch: number;
|
|
95
|
+
/** Rotation around Y axis - Left/right tilt */
|
|
96
|
+
roll: number;
|
|
97
|
+
/** Quaternion representation (optional) */
|
|
98
|
+
quaternion?: {
|
|
99
|
+
x: number;
|
|
100
|
+
y: number;
|
|
101
|
+
z: number;
|
|
102
|
+
w: number;
|
|
103
|
+
};
|
|
104
|
+
};
|
|
86
105
|
/** Timestamp */
|
|
87
106
|
timestamp: number;
|
|
88
107
|
}
|