@mentra/sdk 3.0.0-alpha.1 → 3.0.0-alpha.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/app/server/index.d.ts +3 -12
- package/dist/app/server/index.d.ts.map +1 -1
- package/dist/display-utils.js +102 -102
- package/dist/display-utils.js.map +3 -3
- package/dist/index.js +163 -117
- package/dist/index.js.map +16 -16
- package/dist/internal/_SessionManager.d.ts.map +1 -1
- package/dist/session/MentraSession.d.ts.map +1 -1
- package/dist/session/internal/_V2CameraShim.d.ts +0 -1
- package/dist/session/internal/_V2CameraShim.d.ts.map +1 -1
- package/dist/session/internal/_V2EventManagerShim.d.ts +0 -1
- package/dist/session/internal/_V2EventManagerShim.d.ts.map +1 -1
- package/dist/session/internal/_V2SessionShim.d.ts +0 -4
- package/dist/session/internal/_V2SessionShim.d.ts.map +1 -1
- package/dist/session/managers/CameraManager.d.ts +0 -1
- package/dist/session/managers/CameraManager.d.ts.map +1 -1
- package/dist/session/managers/DeviceManager.d.ts +1 -17
- package/dist/session/managers/DeviceManager.d.ts.map +1 -1
- package/dist/session/managers/LedManager.d.ts +19 -4
- package/dist/session/managers/LedManager.d.ts.map +1 -1
- package/dist/session/managers/LocationManager.d.ts +41 -10
- package/dist/session/managers/LocationManager.d.ts.map +1 -1
- package/dist/session/managers/PermissionsManager.d.ts +43 -0
- package/dist/session/managers/PermissionsManager.d.ts.map +1 -1
- package/dist/session/managers/PhoneManager.d.ts +1 -57
- package/dist/session/managers/PhoneManager.d.ts.map +1 -1
- package/dist/session/managers/SpeakerManager.d.ts.map +1 -1
- package/dist/session.js +145 -87
- package/dist/session.js.map +10 -10
- package/node_modules/@mentra/types/src/applet.ts +55 -0
- package/node_modules/@mentra/types/src/capabilities/even-realities-g1.ts +63 -0
- package/node_modules/@mentra/types/src/capabilities/even-realities-g2.ts +70 -0
- package/node_modules/@mentra/types/src/capabilities/mentra-display.ts +63 -0
- package/node_modules/@mentra/types/src/capabilities/mentra-live.ts +103 -0
- package/node_modules/@mentra/types/src/capabilities/none.ts +76 -0
- package/node_modules/@mentra/types/src/capabilities/simulated-glasses.ts +76 -0
- package/node_modules/@mentra/types/src/capabilities/vuzix-z100.ts +60 -0
- package/node_modules/@mentra/types/src/cli.ts +169 -0
- package/node_modules/@mentra/types/src/device.ts +43 -0
- package/node_modules/@mentra/types/src/enums.ts +43 -0
- package/node_modules/@mentra/types/src/hardware.ts +179 -0
- package/node_modules/@mentra/types/src/index.ts +64 -0
- package/node_modules/@mentra/types/tsconfig.json +22 -0
- package/node_modules/@mentra/types/tsconfig.tsbuildinfo +1 -0
- package/package.json +1 -1
package/dist/session.js
CHANGED
|
@@ -164,7 +164,7 @@ function tryCreateBetterStackTransport() {
|
|
|
164
164
|
}
|
|
165
165
|
function createLogger(config) {
|
|
166
166
|
const { pinoLevel, verbose } = resolveConfig(config);
|
|
167
|
-
const NODE_ENV = "
|
|
167
|
+
const NODE_ENV = "isaiah";
|
|
168
168
|
const PORTER_APP_NAME = process.env.PORTER_APP_NAME || "cloud-local";
|
|
169
169
|
const streams = [];
|
|
170
170
|
if (pinoLevel !== "silent") {
|
|
@@ -1144,21 +1144,6 @@ class CameraManager {
|
|
|
1144
1144
|
}
|
|
1145
1145
|
});
|
|
1146
1146
|
}
|
|
1147
|
-
onPhotoTaken(handler) {
|
|
1148
|
-
const streamKey = "photo_taken" /* PHOTO_TAKEN */;
|
|
1149
|
-
this.deps.addSubscription(streamKey);
|
|
1150
|
-
const routerCleanup = this.deps.router.on(streamKey, (_streamType, data) => {
|
|
1151
|
-
try {
|
|
1152
|
-
handler(normalisePhotoData(data));
|
|
1153
|
-
} catch (err) {
|
|
1154
|
-
this.deps.logger.error("[CameraManager] Error in onPhotoTaken handler:", err);
|
|
1155
|
-
}
|
|
1156
|
-
});
|
|
1157
|
-
return () => {
|
|
1158
|
-
routerCleanup();
|
|
1159
|
-
this.deps.removeSubscription(streamKey);
|
|
1160
|
-
};
|
|
1161
|
-
}
|
|
1162
1147
|
async startStream(options) {
|
|
1163
1148
|
const opts = options ?? {};
|
|
1164
1149
|
if (opts.direct) {
|
|
@@ -1265,7 +1250,13 @@ class CameraManager {
|
|
|
1265
1250
|
});
|
|
1266
1251
|
}
|
|
1267
1252
|
async startDirectStream(options) {
|
|
1268
|
-
return this._startDirectStream({
|
|
1253
|
+
return this._startDirectStream({
|
|
1254
|
+
direct: options.rtmpUrl,
|
|
1255
|
+
video: options.video,
|
|
1256
|
+
audio: options.audio,
|
|
1257
|
+
stream: options.stream,
|
|
1258
|
+
sound: options.sound
|
|
1259
|
+
});
|
|
1269
1260
|
}
|
|
1270
1261
|
async startManagedStream(options = {}) {
|
|
1271
1262
|
return this._startManagedStream({
|
|
@@ -1458,15 +1449,6 @@ class CameraManager {
|
|
|
1458
1449
|
this.isManagedStreaming = false;
|
|
1459
1450
|
}
|
|
1460
1451
|
}
|
|
1461
|
-
function normalisePhotoData(raw) {
|
|
1462
|
-
return {
|
|
1463
|
-
url: raw.photoUrl ?? raw.url ?? "",
|
|
1464
|
-
width: raw.width ?? 0,
|
|
1465
|
-
height: raw.height ?? 0,
|
|
1466
|
-
timestamp: raw.timestamp ? new Date(raw.timestamp).getTime() : Date.now(),
|
|
1467
|
-
savedToGallery: raw.savedToGallery ?? false
|
|
1468
|
-
};
|
|
1469
|
-
}
|
|
1470
1452
|
|
|
1471
1453
|
// src/session/managers/DashboardManager.ts
|
|
1472
1454
|
init_message_types();
|
|
@@ -1645,6 +1627,20 @@ class DeviceManager {
|
|
|
1645
1627
|
});
|
|
1646
1628
|
}
|
|
1647
1629
|
onTouchEvent(gestureOrHandler, handler) {
|
|
1630
|
+
if (Array.isArray(gestureOrHandler)) {
|
|
1631
|
+
const gestures = gestureOrHandler;
|
|
1632
|
+
const cleanups = [];
|
|
1633
|
+
for (const gesture2 of gestures) {
|
|
1634
|
+
const gestureStream2 = `${"touch_event" /* TOUCH_EVENT */}:${gesture2}`;
|
|
1635
|
+
cleanups.push(this.addStreamHandler(gestureStream2, (_st, data) => {
|
|
1636
|
+
handler(normaliseTouchEvent(data));
|
|
1637
|
+
}));
|
|
1638
|
+
}
|
|
1639
|
+
return () => {
|
|
1640
|
+
for (const fn of cleanups)
|
|
1641
|
+
fn();
|
|
1642
|
+
};
|
|
1643
|
+
}
|
|
1648
1644
|
if (typeof gestureOrHandler === "function") {
|
|
1649
1645
|
return this.addStreamHandler("touch_event" /* TOUCH_EVENT */, (_st, data) => {
|
|
1650
1646
|
gestureOrHandler(normaliseTouchEvent(data));
|
|
@@ -1656,19 +1652,6 @@ class DeviceManager {
|
|
|
1656
1652
|
handler(normaliseTouchEvent(data));
|
|
1657
1653
|
});
|
|
1658
1654
|
}
|
|
1659
|
-
subscribeToGestures(gestures) {
|
|
1660
|
-
const cleanupFns = [];
|
|
1661
|
-
for (const gesture of gestures) {
|
|
1662
|
-
const gestureStream = `${"touch_event" /* TOUCH_EVENT */}:${gesture}`;
|
|
1663
|
-
const cleanup = this.addStreamHandler(gestureStream, () => {});
|
|
1664
|
-
cleanupFns.push(cleanup);
|
|
1665
|
-
}
|
|
1666
|
-
return () => {
|
|
1667
|
-
for (const fn of cleanupFns) {
|
|
1668
|
-
fn();
|
|
1669
|
-
}
|
|
1670
|
-
};
|
|
1671
|
-
}
|
|
1672
1655
|
onBatteryUpdate(handler) {
|
|
1673
1656
|
return this.addStreamHandler("glasses_battery_update" /* GLASSES_BATTERY_UPDATE */, (_st, data) => {
|
|
1674
1657
|
if (data.level !== undefined) {
|
|
@@ -1711,7 +1694,6 @@ class DeviceManager {
|
|
|
1711
1694
|
this.deps.logger.debug("DeviceManager: Received empty device_state_update");
|
|
1712
1695
|
return;
|
|
1713
1696
|
}
|
|
1714
|
-
this.deps.logger.debug("DeviceManager: Processing device state update");
|
|
1715
1697
|
if (state.connected !== undefined)
|
|
1716
1698
|
this._connected.setValue(state.connected);
|
|
1717
1699
|
if (state.modelName !== undefined)
|
|
@@ -1749,7 +1731,8 @@ class DeviceManager {
|
|
|
1749
1731
|
}
|
|
1750
1732
|
setCapabilities(caps) {
|
|
1751
1733
|
this.capabilities = caps;
|
|
1752
|
-
this.
|
|
1734
|
+
const model = this._modelName.value;
|
|
1735
|
+
this.deps.logger.info({ model: model ?? undefined, hasCamera: !!caps?.camera, hasMicrophone: !!caps?.microphone }, `Glasses capabilities ${caps ? "received" : "cleared"}${model ? ` (${model})` : ""}`);
|
|
1753
1736
|
for (const listener of this.capabilitiesListeners) {
|
|
1754
1737
|
try {
|
|
1755
1738
|
listener(caps);
|
|
@@ -1913,8 +1896,20 @@ class LedManager {
|
|
|
1913
1896
|
constructor(deps) {
|
|
1914
1897
|
this.deps = deps;
|
|
1915
1898
|
}
|
|
1916
|
-
setColor(color,
|
|
1899
|
+
setColor(color, durationOrOptions) {
|
|
1917
1900
|
const requestId = generateRequestId2();
|
|
1901
|
+
let ontime;
|
|
1902
|
+
let offtime;
|
|
1903
|
+
let count;
|
|
1904
|
+
if (typeof durationOrOptions === "object" && durationOrOptions !== null) {
|
|
1905
|
+
ontime = durationOrOptions.onTime;
|
|
1906
|
+
offtime = durationOrOptions.offTime;
|
|
1907
|
+
count = durationOrOptions.count;
|
|
1908
|
+
} else {
|
|
1909
|
+
ontime = durationOrOptions ?? 1000;
|
|
1910
|
+
offtime = 0;
|
|
1911
|
+
count = 1;
|
|
1912
|
+
}
|
|
1918
1913
|
const message = {
|
|
1919
1914
|
type: "rgb_led_control" /* RGB_LED_CONTROL */,
|
|
1920
1915
|
packageName: this.deps.getPackageName(),
|
|
@@ -1923,12 +1918,12 @@ class LedManager {
|
|
|
1923
1918
|
timestamp: new Date,
|
|
1924
1919
|
action: "on",
|
|
1925
1920
|
color,
|
|
1926
|
-
ontime
|
|
1927
|
-
offtime
|
|
1928
|
-
count
|
|
1921
|
+
ontime,
|
|
1922
|
+
offtime,
|
|
1923
|
+
count
|
|
1929
1924
|
};
|
|
1930
1925
|
this.deps.sendMessage(message);
|
|
1931
|
-
this.deps.logger.debug({ requestId, color, ontime
|
|
1926
|
+
this.deps.logger.debug({ requestId, color, ontime, offtime, count }, "\uD83D\uDCA1 LED setColor request sent");
|
|
1932
1927
|
}
|
|
1933
1928
|
off() {
|
|
1934
1929
|
const requestId = generateRequestId2();
|
|
@@ -1952,6 +1947,7 @@ class LedManager {
|
|
|
1952
1947
|
init_types();
|
|
1953
1948
|
var LOCATION_STREAM = "location_stream" /* LOCATION_STREAM */;
|
|
1954
1949
|
var LOCATION_UPDATE = "location_update" /* LOCATION_UPDATE */;
|
|
1950
|
+
var POLL_TIMEOUT_MS = 15000;
|
|
1955
1951
|
function generateCorrelationId() {
|
|
1956
1952
|
if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
|
|
1957
1953
|
return `poll_${crypto.randomUUID()}`;
|
|
@@ -1977,19 +1973,27 @@ class LocationManager {
|
|
|
1977
1973
|
_accuracy = null;
|
|
1978
1974
|
_timestamp = null;
|
|
1979
1975
|
_hasPermission = true;
|
|
1976
|
+
_config = {};
|
|
1977
|
+
pendingPolls = new Map;
|
|
1980
1978
|
locationUpdateCleanup = null;
|
|
1981
1979
|
constructor(deps) {
|
|
1982
1980
|
this.deps = deps;
|
|
1983
1981
|
this.locationUpdateCleanup = this.deps.router.on(LOCATION_UPDATE, (_streamType, data, _message) => {
|
|
1984
1982
|
this.cacheLocation(data);
|
|
1983
|
+
this.resolvePendingPoll(data);
|
|
1985
1984
|
});
|
|
1986
1985
|
}
|
|
1987
|
-
|
|
1986
|
+
configure(config) {
|
|
1987
|
+
this._config = { ...this._config, ...config };
|
|
1988
|
+
}
|
|
1989
|
+
onUpdate(handler) {
|
|
1988
1990
|
const streamKey = LOCATION_STREAM;
|
|
1991
|
+
const accuracy = this._config.accuracy ?? "standard";
|
|
1989
1992
|
const routerCleanup = this.deps.router.on(streamKey, (_streamType, data, _message) => {
|
|
1990
1993
|
try {
|
|
1991
1994
|
const location = normalise(data);
|
|
1992
1995
|
this.cacheLocation(data);
|
|
1996
|
+
this.resolvePendingPoll(data);
|
|
1993
1997
|
handler(location);
|
|
1994
1998
|
} catch (err) {
|
|
1995
1999
|
this.deps.logger.error("[LocationManager] Error in onUpdate handler:", err);
|
|
@@ -1999,6 +2003,7 @@ class LocationManager {
|
|
|
1999
2003
|
try {
|
|
2000
2004
|
const location = normalise(data);
|
|
2001
2005
|
this.cacheLocation(data);
|
|
2006
|
+
this.resolvePendingPoll(data);
|
|
2002
2007
|
handler(location);
|
|
2003
2008
|
} catch (err) {
|
|
2004
2009
|
this.deps.logger.error("[LocationManager] Error in onUpdate handler (location_update):", err);
|
|
@@ -2009,7 +2014,7 @@ class LocationManager {
|
|
|
2009
2014
|
this.streamRefCount++;
|
|
2010
2015
|
if (this.streamRefCount === 1) {
|
|
2011
2016
|
this.deps.addSubscription(streamKey);
|
|
2012
|
-
this.deps.logger.debug({ accuracy
|
|
2017
|
+
this.deps.logger.debug({ accuracy }, `[LocationManager] Subscribed to "${streamKey}".`);
|
|
2013
2018
|
}
|
|
2014
2019
|
return () => {
|
|
2015
2020
|
if (!this.registrations.has(reg))
|
|
@@ -2025,17 +2030,31 @@ class LocationManager {
|
|
|
2025
2030
|
}
|
|
2026
2031
|
};
|
|
2027
2032
|
}
|
|
2028
|
-
requestUpdate(
|
|
2033
|
+
requestUpdate() {
|
|
2029
2034
|
const correlationId = generateCorrelationId();
|
|
2030
|
-
const
|
|
2031
|
-
|
|
2032
|
-
|
|
2033
|
-
|
|
2034
|
-
|
|
2035
|
-
|
|
2036
|
-
|
|
2037
|
-
|
|
2038
|
-
|
|
2035
|
+
const accuracy = this._config.accuracy ?? "standard";
|
|
2036
|
+
return new Promise((resolve, reject) => {
|
|
2037
|
+
const timeoutId = setTimeout(() => {
|
|
2038
|
+
this.pendingPolls.delete(correlationId);
|
|
2039
|
+
reject(new Error(`Location poll timed out after ${POLL_TIMEOUT_MS}ms (correlationId: ${correlationId})`));
|
|
2040
|
+
}, POLL_TIMEOUT_MS);
|
|
2041
|
+
this.pendingPolls.set(correlationId, { resolve, reject, timeoutId });
|
|
2042
|
+
const message = {
|
|
2043
|
+
type: "location_poll_request" /* LOCATION_POLL_REQUEST */,
|
|
2044
|
+
correlationId,
|
|
2045
|
+
packageName: this.deps.getPackageName(),
|
|
2046
|
+
sessionId: this.deps.getSessionId(),
|
|
2047
|
+
accuracy
|
|
2048
|
+
};
|
|
2049
|
+
try {
|
|
2050
|
+
this.deps.sendMessage(message);
|
|
2051
|
+
this.deps.logger.debug({ correlationId, accuracy }, "\uD83D\uDCCD Location poll request sent");
|
|
2052
|
+
} catch (err) {
|
|
2053
|
+
clearTimeout(timeoutId);
|
|
2054
|
+
this.pendingPolls.delete(correlationId);
|
|
2055
|
+
reject(err instanceof Error ? err : new Error(String(err)));
|
|
2056
|
+
}
|
|
2057
|
+
});
|
|
2039
2058
|
}
|
|
2040
2059
|
stop() {
|
|
2041
2060
|
const snapshot = Array.from(this.registrations);
|
|
@@ -2048,6 +2067,11 @@ class LocationManager {
|
|
|
2048
2067
|
this.deps.removeSubscription(LOCATION_STREAM);
|
|
2049
2068
|
}
|
|
2050
2069
|
this.streamRefCount = 0;
|
|
2070
|
+
for (const [id, pending] of this.pendingPolls) {
|
|
2071
|
+
clearTimeout(pending.timeoutId);
|
|
2072
|
+
pending.reject(new Error("LocationManager stopped while poll was pending"));
|
|
2073
|
+
this.pendingPolls.delete(id);
|
|
2074
|
+
}
|
|
2051
2075
|
this.deps.logger.debug("[LocationManager] All subscriptions stopped.");
|
|
2052
2076
|
}
|
|
2053
2077
|
get lat() {
|
|
@@ -2065,6 +2089,17 @@ class LocationManager {
|
|
|
2065
2089
|
get hasPermission() {
|
|
2066
2090
|
return this._hasPermission;
|
|
2067
2091
|
}
|
|
2092
|
+
resolvePendingPoll(raw) {
|
|
2093
|
+
const correlationId = raw?.correlationId;
|
|
2094
|
+
if (!correlationId)
|
|
2095
|
+
return;
|
|
2096
|
+
const pending = this.pendingPolls.get(correlationId);
|
|
2097
|
+
if (!pending)
|
|
2098
|
+
return;
|
|
2099
|
+
clearTimeout(pending.timeoutId);
|
|
2100
|
+
this.pendingPolls.delete(correlationId);
|
|
2101
|
+
pending.resolve(normalise(raw));
|
|
2102
|
+
}
|
|
2068
2103
|
cacheLocation(raw) {
|
|
2069
2104
|
if (typeof raw.lat === "number") {
|
|
2070
2105
|
this._lat = raw.lat;
|
|
@@ -2090,6 +2125,7 @@ class LocationManager {
|
|
|
2090
2125
|
this._lng = null;
|
|
2091
2126
|
this._accuracy = null;
|
|
2092
2127
|
this._timestamp = null;
|
|
2128
|
+
this._config = {};
|
|
2093
2129
|
this.deps.logger.debug("[LocationManager] Destroyed.");
|
|
2094
2130
|
}
|
|
2095
2131
|
}
|
|
@@ -2239,8 +2275,10 @@ class PermissionsManager {
|
|
|
2239
2275
|
permissions;
|
|
2240
2276
|
listeners = new Set;
|
|
2241
2277
|
logger;
|
|
2278
|
+
messageHandlers;
|
|
2242
2279
|
constructor(deps) {
|
|
2243
2280
|
this.logger = deps.logger;
|
|
2281
|
+
this.messageHandlers = deps.messageHandlers;
|
|
2244
2282
|
this.permissions = createDefaultPermissions();
|
|
2245
2283
|
}
|
|
2246
2284
|
has(permission) {
|
|
@@ -2255,6 +2293,26 @@ class PermissionsManager {
|
|
|
2255
2293
|
this.listeners.delete(handler);
|
|
2256
2294
|
};
|
|
2257
2295
|
}
|
|
2296
|
+
onPermissionError(handler) {
|
|
2297
|
+
const cleanup = this.messageHandlers.register("permission_error", (msg) => {
|
|
2298
|
+
try {
|
|
2299
|
+
handler({ message: msg.message ?? "Permission error", deniedPermissions: msg.deniedPermissions });
|
|
2300
|
+
} catch (err) {
|
|
2301
|
+
this.logger.error("[PermissionsManager] Error in onPermissionError handler:", err);
|
|
2302
|
+
}
|
|
2303
|
+
});
|
|
2304
|
+
return cleanup;
|
|
2305
|
+
}
|
|
2306
|
+
onPermissionDenied(handler) {
|
|
2307
|
+
const cleanup = this.messageHandlers.register("permission_denied", (msg) => {
|
|
2308
|
+
try {
|
|
2309
|
+
handler({ message: msg.message ?? "Permission denied", permission: msg.permission, streamType: msg.streamType });
|
|
2310
|
+
} catch (err) {
|
|
2311
|
+
this.logger.error("[PermissionsManager] Error in onPermissionDenied handler:", err);
|
|
2312
|
+
}
|
|
2313
|
+
});
|
|
2314
|
+
return cleanup;
|
|
2315
|
+
}
|
|
2258
2316
|
updateFromSettings(settings) {
|
|
2259
2317
|
if (!settings) {
|
|
2260
2318
|
this.logger.debug("PermissionsManager: No settings provided, skipping update");
|
|
@@ -2425,7 +2483,6 @@ class PhoneManager {
|
|
|
2425
2483
|
deps;
|
|
2426
2484
|
permissions;
|
|
2427
2485
|
tracker;
|
|
2428
|
-
_battery = null;
|
|
2429
2486
|
constructor(deps) {
|
|
2430
2487
|
this.deps = deps;
|
|
2431
2488
|
this.permissions = deps.permissions;
|
|
@@ -2433,29 +2490,8 @@ class PhoneManager {
|
|
|
2433
2490
|
this.notifications = new NotificationSubManager(this.permissions, this.tracker, deps.logger);
|
|
2434
2491
|
this.calendar = new CalendarSubManager(this.permissions, this.tracker, deps.logger);
|
|
2435
2492
|
}
|
|
2436
|
-
get battery() {
|
|
2437
|
-
return this._battery;
|
|
2438
|
-
}
|
|
2439
|
-
onBatteryUpdate(handler) {
|
|
2440
|
-
return this.tracker.add("phone_battery_update" /* PHONE_BATTERY_UPDATE */, (_streamType, data) => {
|
|
2441
|
-
const level = data.level ?? data.batteryLevel ?? data.battery_level;
|
|
2442
|
-
if (level !== undefined) {
|
|
2443
|
-
this._battery = level;
|
|
2444
|
-
}
|
|
2445
|
-
try {
|
|
2446
|
-
handler({
|
|
2447
|
-
level: level ?? 0,
|
|
2448
|
-
charging: data.charging ?? false,
|
|
2449
|
-
timeRemaining: data.timeRemaining ?? data.time_remaining
|
|
2450
|
-
});
|
|
2451
|
-
} catch (err) {
|
|
2452
|
-
this.deps.logger.error(`PhoneManager: Error in battery handler: ${err instanceof Error ? err.message : String(err)}`);
|
|
2453
|
-
}
|
|
2454
|
-
});
|
|
2455
|
-
}
|
|
2456
2493
|
destroy() {
|
|
2457
2494
|
this.tracker.destroyAll();
|
|
2458
|
-
this._battery = null;
|
|
2459
2495
|
this.deps.logger.debug("PhoneManager: Destroyed.");
|
|
2460
2496
|
}
|
|
2461
2497
|
}
|
|
@@ -2465,6 +2501,20 @@ init_message_types();
|
|
|
2465
2501
|
var STREAM_ID_LENGTH = 36;
|
|
2466
2502
|
var STREAM_READY_TIMEOUT_MS = 1e4;
|
|
2467
2503
|
var PLAY_RESPONSE_TIMEOUT_MS = 60000;
|
|
2504
|
+
function createMp3Encoder(channels, sampleRate, bitrate) {
|
|
2505
|
+
globalThis.MPEGMode ??= __require("lamejs/src/js/MPEGMode.js");
|
|
2506
|
+
globalThis.Lame ??= __require("lamejs/src/js/Lame.js");
|
|
2507
|
+
globalThis.BitStream ??= __require("lamejs/src/js/BitStream.js");
|
|
2508
|
+
const lamejs = __require("lamejs");
|
|
2509
|
+
const Encoder = lamejs.Mp3Encoder ?? lamejs.default?.Mp3Encoder;
|
|
2510
|
+
return new Encoder(channels, sampleRate, bitrate);
|
|
2511
|
+
}
|
|
2512
|
+
function toInt16Array(data) {
|
|
2513
|
+
if (data instanceof Int16Array)
|
|
2514
|
+
return data;
|
|
2515
|
+
const buffer = data instanceof ArrayBuffer ? data : data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength);
|
|
2516
|
+
return new Int16Array(buffer);
|
|
2517
|
+
}
|
|
2468
2518
|
|
|
2469
2519
|
class AudioOutputStreamImpl {
|
|
2470
2520
|
id;
|
|
@@ -2474,6 +2524,7 @@ class AudioOutputStreamImpl {
|
|
|
2474
2524
|
options;
|
|
2475
2525
|
stateChangeHandlers = [];
|
|
2476
2526
|
streamUrl = null;
|
|
2527
|
+
encoder = null;
|
|
2477
2528
|
constructor(streamId, deps, opts = {}) {
|
|
2478
2529
|
this.id = streamId;
|
|
2479
2530
|
this.deps = deps;
|
|
@@ -2495,6 +2546,9 @@ class AudioOutputStreamImpl {
|
|
|
2495
2546
|
if (this._state !== "created") {
|
|
2496
2547
|
throw new Error(`Cannot open stream in state "${this._state}"`);
|
|
2497
2548
|
}
|
|
2549
|
+
if (this.options.format === "pcm16") {
|
|
2550
|
+
this.encoder = createMp3Encoder(this.options.channels, this.options.sampleRate, this.options.bitrate);
|
|
2551
|
+
}
|
|
2498
2552
|
const startMessage = {
|
|
2499
2553
|
type: "audio_stream_start" /* AUDIO_STREAM_START */,
|
|
2500
2554
|
packageName: this.deps.getPackageName(),
|
|
@@ -2527,7 +2581,15 @@ class AudioOutputStreamImpl {
|
|
|
2527
2581
|
}
|
|
2528
2582
|
if (chunk.length === 0)
|
|
2529
2583
|
return;
|
|
2530
|
-
this.
|
|
2584
|
+
if (this.options.format === "pcm16" && this.encoder) {
|
|
2585
|
+
const pcm = toInt16Array(chunk);
|
|
2586
|
+
const encoded = this.encoder.encodeBuffer(pcm);
|
|
2587
|
+
if (encoded.length === 0)
|
|
2588
|
+
return;
|
|
2589
|
+
this.sendBinaryFrame(new Uint8Array(encoded));
|
|
2590
|
+
} else {
|
|
2591
|
+
this.sendBinaryFrame(chunk);
|
|
2592
|
+
}
|
|
2531
2593
|
}
|
|
2532
2594
|
async end() {
|
|
2533
2595
|
if (this._state !== "streaming")
|
|
@@ -3794,7 +3856,7 @@ class MentraSession {
|
|
|
3794
3856
|
this.logger.error(error, "MentraSession transport error");
|
|
3795
3857
|
}
|
|
3796
3858
|
});
|
|
3797
|
-
this.permissions = new PermissionsManager({ logger: sdkLogger });
|
|
3859
|
+
this.permissions = new PermissionsManager({ logger: sdkLogger, messageHandlers: this._router.messageHandlers });
|
|
3798
3860
|
const deps = {
|
|
3799
3861
|
router: this._router.dataStreamRouter,
|
|
3800
3862
|
messageHandlers: this._router.messageHandlers,
|
|
@@ -3913,10 +3975,6 @@ class MentraSession {
|
|
|
3913
3975
|
}));
|
|
3914
3976
|
this.cleanupTasks.push(this._router.messageHandlers.register("capabilities_update" /* CAPABILITIES_UPDATE */, (message) => {
|
|
3915
3977
|
this.capabilities = message.capabilities ?? null;
|
|
3916
|
-
this.device.handleCapabilitiesUpdate(message);
|
|
3917
|
-
}));
|
|
3918
|
-
this.cleanupTasks.push(this._router.messageHandlers.register("device_state_update" /* DEVICE_STATE_UPDATE */, (message) => {
|
|
3919
|
-
this.device.handleDeviceStateUpdate(message);
|
|
3920
3978
|
}));
|
|
3921
3979
|
this.cleanupTasks.push(this._router.messageHandlers.register("app_stopped" /* APP_STOPPED */, (message) => {
|
|
3922
3980
|
const reason = message.reason ?? "unknown";
|
|
@@ -4107,4 +4165,4 @@ export {
|
|
|
4107
4165
|
DataStreamRouter
|
|
4108
4166
|
};
|
|
4109
4167
|
|
|
4110
|
-
//# debugId=
|
|
4168
|
+
//# debugId=CD897D9F35B061EF64756E2164756E21
|