@moldable-ai/ui 0.2.17 → 0.2.19
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/components/chat/chat-panel.d.ts +18 -12
- package/dist/components/chat/chat-panel.d.ts.map +1 -1
- package/dist/components/chat/chat-panel.js +73 -19
- package/dist/components/chat/index.d.ts +2 -1
- package/dist/components/chat/index.d.ts.map +1 -1
- package/dist/components/chat/index.js +2 -1
- package/dist/components/chat/model-effort-power-effects.d.ts +7 -0
- package/dist/components/chat/model-effort-power-effects.d.ts.map +1 -0
- package/dist/components/chat/model-effort-power-effects.js +54 -0
- package/dist/components/chat/model-effort-selector.d.ts +26 -0
- package/dist/components/chat/model-effort-selector.d.ts.map +1 -0
- package/dist/components/chat/model-effort-selector.js +179 -0
- package/dist/components/chat/model-effort-ultra-effects.d.ts +5 -0
- package/dist/components/chat/model-effort-ultra-effects.d.ts.map +1 -0
- package/dist/components/chat/model-effort-ultra-effects.js +56 -0
- package/dist/components/chat/tool-handlers.d.ts.map +1 -1
- package/dist/components/hardware/bluetooth-panel-helpers.d.ts +9 -0
- package/dist/components/hardware/bluetooth-panel-helpers.d.ts.map +1 -0
- package/dist/components/hardware/bluetooth-panel-helpers.js +37 -0
- package/dist/components/hardware/bluetooth-panel.d.ts +56 -0
- package/dist/components/hardware/bluetooth-panel.d.ts.map +1 -0
- package/dist/components/hardware/bluetooth-panel.js +470 -0
- package/dist/components/hardware/camera-preview.d.ts +39 -0
- package/dist/components/hardware/camera-preview.d.ts.map +1 -0
- package/dist/components/hardware/camera-preview.js +228 -0
- package/dist/components/hardware/capability-badge.d.ts +23 -0
- package/dist/components/hardware/capability-badge.d.ts.map +1 -0
- package/dist/components/hardware/capability-badge.js +39 -0
- package/dist/components/hardware/capability-matrix.d.ts +14 -0
- package/dist/components/hardware/capability-matrix.d.ts.map +1 -0
- package/dist/components/hardware/capability-matrix.js +97 -0
- package/dist/components/hardware/clipboard-button.d.ts +26 -0
- package/dist/components/hardware/clipboard-button.d.ts.map +1 -0
- package/dist/components/hardware/clipboard-button.js +114 -0
- package/dist/components/hardware/device-io-controls.d.ts +4 -0
- package/dist/components/hardware/device-io-controls.d.ts.map +1 -0
- package/dist/components/hardware/device-io-controls.js +28 -0
- package/dist/components/hardware/device-list.d.ts +20 -0
- package/dist/components/hardware/device-list.d.ts.map +1 -0
- package/dist/components/hardware/device-list.js +14 -0
- package/dist/components/hardware/display-map.d.ts +23 -0
- package/dist/components/hardware/display-map.d.ts.map +1 -0
- package/dist/components/hardware/display-map.js +114 -0
- package/dist/components/hardware/haptic-button.d.ts +26 -0
- package/dist/components/hardware/haptic-button.d.ts.map +1 -0
- package/dist/components/hardware/haptic-button.js +94 -0
- package/dist/components/hardware/hardware-panel.d.ts +11 -0
- package/dist/components/hardware/hardware-panel.d.ts.map +1 -0
- package/dist/components/hardware/hardware-panel.js +28 -0
- package/dist/components/hardware/hid-panel.d.ts +40 -0
- package/dist/components/hardware/hid-panel.d.ts.map +1 -0
- package/dist/components/hardware/hid-panel.js +373 -0
- package/dist/components/hardware/index.d.ts +27 -0
- package/dist/components/hardware/index.d.ts.map +1 -0
- package/dist/components/hardware/index.js +26 -0
- package/dist/components/hardware/live-indicator.d.ts +15 -0
- package/dist/components/hardware/live-indicator.d.ts.map +1 -0
- package/dist/components/hardware/live-indicator.js +26 -0
- package/dist/components/hardware/local-auth-button.d.ts +33 -0
- package/dist/components/hardware/local-auth-button.d.ts.map +1 -0
- package/dist/components/hardware/local-auth-button.js +115 -0
- package/dist/components/hardware/location-panel.d.ts +29 -0
- package/dist/components/hardware/location-panel.d.ts.map +1 -0
- package/dist/components/hardware/location-panel.js +154 -0
- package/dist/components/hardware/microphone-meter.d.ts +35 -0
- package/dist/components/hardware/microphone-meter.d.ts.map +1 -0
- package/dist/components/hardware/microphone-meter.js +244 -0
- package/dist/components/hardware/midi-monitor.d.ts +54 -0
- package/dist/components/hardware/midi-monitor.d.ts.map +1 -0
- package/dist/components/hardware/midi-monitor.js +534 -0
- package/dist/components/hardware/notification-panel.d.ts +24 -0
- package/dist/components/hardware/notification-panel.d.ts.map +1 -0
- package/dist/components/hardware/notification-panel.js +124 -0
- package/dist/components/hardware/power-blocker-controller.d.ts +19 -0
- package/dist/components/hardware/power-blocker-controller.d.ts.map +1 -0
- package/dist/components/hardware/power-blocker-controller.js +83 -0
- package/dist/components/hardware/power-panel.d.ts +67 -0
- package/dist/components/hardware/power-panel.d.ts.map +1 -0
- package/dist/components/hardware/power-panel.js +309 -0
- package/dist/components/hardware/readout.d.ts +10 -0
- package/dist/components/hardware/readout.d.ts.map +1 -0
- package/dist/components/hardware/readout.js +11 -0
- package/dist/components/hardware/screen-share-preview.d.ts +36 -0
- package/dist/components/hardware/screen-share-preview.d.ts.map +1 -0
- package/dist/components/hardware/screen-share-preview.js +191 -0
- package/dist/components/hardware/secure-storage-panel.d.ts +36 -0
- package/dist/components/hardware/secure-storage-panel.d.ts.map +1 -0
- package/dist/components/hardware/secure-storage-panel.js +193 -0
- package/dist/components/hardware/serial-console.d.ts +64 -0
- package/dist/components/hardware/serial-console.d.ts.map +1 -0
- package/dist/components/hardware/serial-console.js +399 -0
- package/dist/components/hardware/shortcut-recorder.d.ts +35 -0
- package/dist/components/hardware/shortcut-recorder.d.ts.map +1 -0
- package/dist/components/hardware/shortcut-recorder.js +217 -0
- package/dist/components/hardware/stream-log.d.ts +35 -0
- package/dist/components/hardware/stream-log.d.ts.map +1 -0
- package/dist/components/hardware/stream-log.js +65 -0
- package/dist/components/hardware/system-audio-monitor.d.ts +34 -0
- package/dist/components/hardware/system-audio-monitor.d.ts.map +1 -0
- package/dist/components/hardware/system-audio-monitor.js +275 -0
- package/dist/components/hardware/usb-panel.d.ts +54 -0
- package/dist/components/hardware/usb-panel.d.ts.map +1 -0
- package/dist/components/hardware/usb-panel.js +363 -0
- package/dist/components/hardware/use-capability.d.ts +20 -0
- package/dist/components/hardware/use-capability.d.ts.map +1 -0
- package/dist/components/hardware/use-capability.js +61 -0
- package/dist/components/ui/input-group.d.ts +1 -1
- package/dist/components/ui/slider.d.ts +4 -1
- package/dist/components/ui/slider.d.ts.map +1 -1
- package/dist/components/ui/slider.js +2 -2
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/lib/commands.d.ts +59 -0
- package/dist/lib/commands.d.ts.map +1 -1
- package/dist/lib/commands.js +97 -0
- package/dist/lib/native-hardware/bluetooth-access.d.ts +14 -0
- package/dist/lib/native-hardware/bluetooth-access.d.ts.map +1 -0
- package/dist/lib/native-hardware/bluetooth-access.js +40 -0
- package/dist/lib/native-hardware/bluetooth-connection.d.ts +19 -0
- package/dist/lib/native-hardware/bluetooth-connection.d.ts.map +1 -0
- package/dist/lib/native-hardware/bluetooth-connection.js +88 -0
- package/dist/lib/native-hardware/bluetooth-gatt.d.ts +7 -0
- package/dist/lib/native-hardware/bluetooth-gatt.d.ts.map +1 -0
- package/dist/lib/native-hardware/bluetooth-gatt.js +77 -0
- package/dist/lib/native-hardware/bluetooth-internal.d.ts +10 -0
- package/dist/lib/native-hardware/bluetooth-internal.d.ts.map +1 -0
- package/dist/lib/native-hardware/bluetooth-internal.js +105 -0
- package/dist/lib/native-hardware/bluetooth-native-fallback.d.ts +33 -0
- package/dist/lib/native-hardware/bluetooth-native-fallback.d.ts.map +1 -0
- package/dist/lib/native-hardware/bluetooth-native-fallback.js +214 -0
- package/dist/lib/native-hardware/bluetooth-types.d.ts +85 -0
- package/dist/lib/native-hardware/bluetooth-types.d.ts.map +1 -0
- package/dist/lib/native-hardware/bluetooth-types.js +2 -0
- package/dist/lib/native-hardware/bluetooth.d.ts +7 -0
- package/dist/lib/native-hardware/bluetooth.d.ts.map +1 -0
- package/dist/lib/native-hardware/bluetooth.js +4 -0
- package/dist/lib/native-hardware/bridge.d.ts +23 -0
- package/dist/lib/native-hardware/bridge.d.ts.map +1 -0
- package/dist/lib/native-hardware/bridge.js +266 -0
- package/dist/lib/native-hardware/capabilities.d.ts +7 -0
- package/dist/lib/native-hardware/capabilities.d.ts.map +1 -0
- package/dist/lib/native-hardware/capabilities.js +95 -0
- package/dist/lib/native-hardware/clipboard.d.ts +11 -0
- package/dist/lib/native-hardware/clipboard.d.ts.map +1 -0
- package/dist/lib/native-hardware/clipboard.js +55 -0
- package/dist/lib/native-hardware/device-io-errors.d.ts +11 -0
- package/dist/lib/native-hardware/device-io-errors.d.ts.map +1 -0
- package/dist/lib/native-hardware/device-io-errors.js +82 -0
- package/dist/lib/native-hardware/displays.d.ts +38 -0
- package/dist/lib/native-hardware/displays.d.ts.map +1 -0
- package/dist/lib/native-hardware/displays.js +12 -0
- package/dist/lib/native-hardware/global-shortcuts.d.ts +86 -0
- package/dist/lib/native-hardware/global-shortcuts.d.ts.map +1 -0
- package/dist/lib/native-hardware/global-shortcuts.js +351 -0
- package/dist/lib/native-hardware/haptics.d.ts +25 -0
- package/dist/lib/native-hardware/haptics.d.ts.map +1 -0
- package/dist/lib/native-hardware/haptics.js +18 -0
- package/dist/lib/native-hardware/hid-native.d.ts +26 -0
- package/dist/lib/native-hardware/hid-native.d.ts.map +1 -0
- package/dist/lib/native-hardware/hid-native.js +229 -0
- package/dist/lib/native-hardware/hid.d.ts +52 -0
- package/dist/lib/native-hardware/hid.d.ts.map +1 -0
- package/dist/lib/native-hardware/hid.js +160 -0
- package/dist/lib/native-hardware/index.d.ts +38 -0
- package/dist/lib/native-hardware/index.d.ts.map +1 -0
- package/dist/lib/native-hardware/index.js +20 -0
- package/dist/lib/native-hardware/local-authentication.d.ts +32 -0
- package/dist/lib/native-hardware/local-authentication.d.ts.map +1 -0
- package/dist/lib/native-hardware/local-authentication.js +46 -0
- package/dist/lib/native-hardware/location.d.ts +49 -0
- package/dist/lib/native-hardware/location.d.ts.map +1 -0
- package/dist/lib/native-hardware/location.js +114 -0
- package/dist/lib/native-hardware/media-permissions.d.ts +28 -0
- package/dist/lib/native-hardware/media-permissions.d.ts.map +1 -0
- package/dist/lib/native-hardware/media-permissions.js +37 -0
- package/dist/lib/native-hardware/media.d.ts +17 -0
- package/dist/lib/native-hardware/media.d.ts.map +1 -0
- package/dist/lib/native-hardware/media.js +99 -0
- package/dist/lib/native-hardware/midi-access.d.ts +13 -0
- package/dist/lib/native-hardware/midi-access.d.ts.map +1 -0
- package/dist/lib/native-hardware/midi-access.js +66 -0
- package/dist/lib/native-hardware/midi-internal.d.ts +12 -0
- package/dist/lib/native-hardware/midi-internal.d.ts.map +1 -0
- package/dist/lib/native-hardware/midi-internal.js +88 -0
- package/dist/lib/native-hardware/midi-native-fallback.d.ts +27 -0
- package/dist/lib/native-hardware/midi-native-fallback.d.ts.map +1 -0
- package/dist/lib/native-hardware/midi-native-fallback.js +127 -0
- package/dist/lib/native-hardware/midi-ports.d.ts +6 -0
- package/dist/lib/native-hardware/midi-ports.d.ts.map +1 -0
- package/dist/lib/native-hardware/midi-ports.js +115 -0
- package/dist/lib/native-hardware/midi-types.d.ts +25 -0
- package/dist/lib/native-hardware/midi-types.d.ts.map +1 -0
- package/dist/lib/native-hardware/midi-types.js +1 -0
- package/dist/lib/native-hardware/midi.d.ts +6 -0
- package/dist/lib/native-hardware/midi.d.ts.map +1 -0
- package/dist/lib/native-hardware/midi.js +3 -0
- package/dist/lib/native-hardware/native-device-io.d.ts +28 -0
- package/dist/lib/native-hardware/native-device-io.d.ts.map +1 -0
- package/dist/lib/native-hardware/native-device-io.js +91 -0
- package/dist/lib/native-hardware/native-device-lifecycle.d.ts +13 -0
- package/dist/lib/native-hardware/native-device-lifecycle.d.ts.map +1 -0
- package/dist/lib/native-hardware/native-device-lifecycle.js +40 -0
- package/dist/lib/native-hardware/notifications.d.ts +38 -0
- package/dist/lib/native-hardware/notifications.d.ts.map +1 -0
- package/dist/lib/native-hardware/notifications.js +50 -0
- package/dist/lib/native-hardware/power-session.d.ts +113 -0
- package/dist/lib/native-hardware/power-session.d.ts.map +1 -0
- package/dist/lib/native-hardware/power-session.js +264 -0
- package/dist/lib/native-hardware/secure-storage.d.ts +36 -0
- package/dist/lib/native-hardware/secure-storage.d.ts.map +1 -0
- package/dist/lib/native-hardware/secure-storage.js +64 -0
- package/dist/lib/native-hardware/serial-native.d.ts +23 -0
- package/dist/lib/native-hardware/serial-native.d.ts.map +1 -0
- package/dist/lib/native-hardware/serial-native.js +181 -0
- package/dist/lib/native-hardware/serial.d.ts +76 -0
- package/dist/lib/native-hardware/serial.d.ts.map +1 -0
- package/dist/lib/native-hardware/serial.js +212 -0
- package/dist/lib/native-hardware/system-audio.d.ts +127 -0
- package/dist/lib/native-hardware/system-audio.d.ts.map +1 -0
- package/dist/lib/native-hardware/system-audio.js +330 -0
- package/dist/lib/native-hardware/types.d.ts +62 -0
- package/dist/lib/native-hardware/types.d.ts.map +1 -0
- package/dist/lib/native-hardware/types.js +27 -0
- package/dist/lib/native-hardware/usb-native.d.ts +39 -0
- package/dist/lib/native-hardware/usb-native.d.ts.map +1 -0
- package/dist/lib/native-hardware/usb-native.js +217 -0
- package/dist/lib/native-hardware/usb.d.ts +85 -0
- package/dist/lib/native-hardware/usb.d.ts.map +1 -0
- package/dist/lib/native-hardware/usb.js +222 -0
- package/package.json +1 -1
- package/src/styles/index.css +377 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type NativeHardwareBridgeOptions } from './bridge';
|
|
2
|
+
export type MoldableNativeDeviceKind = 'usb' | 'hid' | 'serial';
|
|
3
|
+
export interface MoldableNativeDeviceDescriptor {
|
|
4
|
+
selector: string;
|
|
5
|
+
kind: MoldableNativeDeviceKind;
|
|
6
|
+
label: string;
|
|
7
|
+
vendorId?: number;
|
|
8
|
+
productId?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface MoldableNativeDeviceHandle {
|
|
11
|
+
handle: string;
|
|
12
|
+
kind: MoldableNativeDeviceKind;
|
|
13
|
+
}
|
|
14
|
+
export interface MoldableNativeDeviceFilter {
|
|
15
|
+
vendorId?: number;
|
|
16
|
+
productId?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface MoldableNativeDeviceListOptions extends NativeHardwareBridgeOptions {
|
|
19
|
+
filters?: readonly MoldableNativeDeviceFilter[];
|
|
20
|
+
exclusionFilters?: readonly MoldableNativeDeviceFilter[];
|
|
21
|
+
}
|
|
22
|
+
export declare function listMoldableNativeDevices(kind: MoldableNativeDeviceKind, options?: MoldableNativeDeviceListOptions): Promise<MoldableNativeDeviceDescriptor[]>;
|
|
23
|
+
export declare function openMoldableNativeDevice(kind: MoldableNativeDeviceKind, selector: string, deviceOptions: Record<string, unknown>, options?: NativeHardwareBridgeOptions): Promise<MoldableNativeDeviceHandle>;
|
|
24
|
+
export declare function executeMoldableNativeDeviceOperation(kind: MoldableNativeDeviceKind, handle: string, operation: Record<string, unknown>, options?: NativeHardwareBridgeOptions): Promise<Record<string, unknown>>;
|
|
25
|
+
export declare function closeMoldableNativeDevice(kind: MoldableNativeDeviceKind, handle: string, options?: NativeHardwareBridgeOptions): Promise<void>;
|
|
26
|
+
export declare function bytesFromNativeDeviceResult(result: Record<string, unknown>): Uint8Array;
|
|
27
|
+
export declare function bytesWrittenFromNativeDeviceResult(result: Record<string, unknown>): number;
|
|
28
|
+
//# sourceMappingURL=native-device-io.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-device-io.d.ts","sourceRoot":"","sources":["../../../src/lib/native-hardware/native-device-io.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,2BAA2B,EAEjC,MAAM,UAAU,CAAA;AAOjB,MAAM,MAAM,wBAAwB,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,CAAA;AAE/D,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,wBAAwB,CAAA;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,wBAAwB,CAAA;CAC/B;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,+BACf,SAAQ,2BAA2B;IACnC,OAAO,CAAC,EAAE,SAAS,0BAA0B,EAAE,CAAA;IAC/C,gBAAgB,CAAC,EAAE,SAAS,0BAA0B,EAAE,CAAA;CACzD;AAkCD,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,wBAAwB,EAC9B,OAAO,GAAE,+BAAoC,GAC5C,OAAO,CAAC,8BAA8B,EAAE,CAAC,CAsB3C;AAED,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,wBAAwB,EAC9B,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,0BAA0B,CAAC,CAwBrC;AAED,wBAAsB,oCAAoC,CACxD,IAAI,EAAE,wBAAwB,EAC9B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAalC;AAED,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,wBAAwB,EAC9B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,UAAU,CAYZ;AAED,wBAAgB,kCAAkC,CAChD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,CAUR"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { NativeHardwareBridgeError, callNativeHardwareBridge, } from './bridge';
|
|
2
|
+
const REQUEST_TYPE = 'moldable:native-device-io-request';
|
|
3
|
+
const RESULT_TYPE = 'moldable:native-device-io-result';
|
|
4
|
+
const OPAQUE_ID_PATTERN = /^(selector|device)-[a-f0-9]{36}$/;
|
|
5
|
+
const MAX_TRANSFER_BYTES = 65_536;
|
|
6
|
+
function isRecord(value) {
|
|
7
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
8
|
+
}
|
|
9
|
+
function invalidResponse(message, details) {
|
|
10
|
+
throw new NativeHardwareBridgeError({
|
|
11
|
+
code: 'invalid_response',
|
|
12
|
+
message,
|
|
13
|
+
details,
|
|
14
|
+
retryable: false,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
function isDescriptor(value) {
|
|
18
|
+
return (isRecord(value) &&
|
|
19
|
+
typeof value.selector === 'string' &&
|
|
20
|
+
OPAQUE_ID_PATTERN.test(value.selector) &&
|
|
21
|
+
(value.kind === 'usb' || value.kind === 'hid' || value.kind === 'serial') &&
|
|
22
|
+
typeof value.label === 'string' &&
|
|
23
|
+
value.label.length <= 120 &&
|
|
24
|
+
(value.vendorId === undefined ||
|
|
25
|
+
(Number.isInteger(value.vendorId) &&
|
|
26
|
+
Number(value.vendorId) >= 0 &&
|
|
27
|
+
Number(value.vendorId) <= 0xffff)) &&
|
|
28
|
+
(value.productId === undefined ||
|
|
29
|
+
(Number.isInteger(value.productId) &&
|
|
30
|
+
Number(value.productId) >= 0 &&
|
|
31
|
+
Number(value.productId) <= 0xffff)));
|
|
32
|
+
}
|
|
33
|
+
export async function listMoldableNativeDevices(kind, options = {}) {
|
|
34
|
+
const { filters, exclusionFilters, ...bridgeOptions } = options;
|
|
35
|
+
const result = await callNativeHardwareBridge({
|
|
36
|
+
type: REQUEST_TYPE,
|
|
37
|
+
action: 'list',
|
|
38
|
+
kind,
|
|
39
|
+
...(filters ? { filters: [...filters] } : {}),
|
|
40
|
+
...(exclusionFilters ? { exclusionFilters: [...exclusionFilters] } : {}),
|
|
41
|
+
}, RESULT_TYPE, { timeoutMs: 120_000, ...bridgeOptions });
|
|
42
|
+
if (!Array.isArray(result) ||
|
|
43
|
+
!result.every((descriptor) => isDescriptor(descriptor) && descriptor.kind === kind)) {
|
|
44
|
+
invalidResponse('Moldable returned an invalid native device list.', result);
|
|
45
|
+
}
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
export async function openMoldableNativeDevice(kind, selector, deviceOptions, options = {}) {
|
|
49
|
+
const result = await callNativeHardwareBridge({
|
|
50
|
+
type: REQUEST_TYPE,
|
|
51
|
+
action: 'open',
|
|
52
|
+
kind,
|
|
53
|
+
selector,
|
|
54
|
+
options: deviceOptions,
|
|
55
|
+
}, RESULT_TYPE, { timeoutMs: 120_000, ...options });
|
|
56
|
+
if (!isRecord(result) ||
|
|
57
|
+
typeof result.handle !== 'string' ||
|
|
58
|
+
!OPAQUE_ID_PATTERN.test(result.handle) ||
|
|
59
|
+
(result.kind !== 'usb' && result.kind !== 'hid' && result.kind !== 'serial')) {
|
|
60
|
+
invalidResponse('Moldable returned an invalid native device handle.', result);
|
|
61
|
+
}
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
export async function executeMoldableNativeDeviceOperation(kind, handle, operation, options = {}) {
|
|
65
|
+
const result = await callNativeHardwareBridge({ type: REQUEST_TYPE, action: 'execute', kind, handle, operation }, RESULT_TYPE, { timeoutMs: 35_000, ...options });
|
|
66
|
+
if (!isRecord(result)) {
|
|
67
|
+
invalidResponse('Moldable returned an invalid native device result.', result);
|
|
68
|
+
}
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
export async function closeMoldableNativeDevice(kind, handle, options = {}) {
|
|
72
|
+
await callNativeHardwareBridge({ type: REQUEST_TYPE, action: 'close', kind, handle }, RESULT_TYPE, options);
|
|
73
|
+
}
|
|
74
|
+
export function bytesFromNativeDeviceResult(result) {
|
|
75
|
+
if (result.kind !== 'data' ||
|
|
76
|
+
!Array.isArray(result.data) ||
|
|
77
|
+
result.data.length > MAX_TRANSFER_BYTES ||
|
|
78
|
+
!result.data.every((value) => Number.isInteger(value) && value >= 0 && value <= 255)) {
|
|
79
|
+
invalidResponse('Moldable returned invalid device bytes.', result);
|
|
80
|
+
}
|
|
81
|
+
return Uint8Array.from(result.data);
|
|
82
|
+
}
|
|
83
|
+
export function bytesWrittenFromNativeDeviceResult(result) {
|
|
84
|
+
if (result.kind !== 'written' ||
|
|
85
|
+
!Number.isInteger(result.bytesWritten) ||
|
|
86
|
+
Number(result.bytesWritten) < 0 ||
|
|
87
|
+
Number(result.bytesWritten) > MAX_TRANSFER_BYTES) {
|
|
88
|
+
invalidResponse('Moldable returned an invalid device write result.', result);
|
|
89
|
+
}
|
|
90
|
+
return Number(result.bytesWritten);
|
|
91
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class NativeDeviceLifecycle {
|
|
2
|
+
private open;
|
|
3
|
+
private attached;
|
|
4
|
+
private disconnectDispatched;
|
|
5
|
+
get opened(): boolean;
|
|
6
|
+
get connected(): boolean;
|
|
7
|
+
get disconnected(): boolean;
|
|
8
|
+
didOpen(): void;
|
|
9
|
+
didClose(): void;
|
|
10
|
+
didDisconnect(target: EventTarget, error: unknown): void;
|
|
11
|
+
}
|
|
12
|
+
export declare function isNativeDeviceDisconnect(error: unknown): boolean;
|
|
13
|
+
//# sourceMappingURL=native-device-lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-device-lifecycle.d.ts","sourceRoot":"","sources":["../../../src/lib/native-hardware/native-device-lifecycle.ts"],"names":[],"mappings":"AAEA,qBAAa,qBAAqB;IAChC,OAAO,CAAC,IAAI,CAAQ;IACpB,OAAO,CAAC,QAAQ,CAAO;IACvB,OAAO,CAAC,oBAAoB,CAAQ;IAEpC,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED,OAAO,IAAI,IAAI;IAMf,QAAQ,IAAI,IAAI;IAIhB,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;CASzD;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAMhE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { NativeHardwareBridgeError } from './bridge';
|
|
2
|
+
export class NativeDeviceLifecycle {
|
|
3
|
+
open = false;
|
|
4
|
+
attached = true;
|
|
5
|
+
disconnectDispatched = false;
|
|
6
|
+
get opened() {
|
|
7
|
+
return this.open;
|
|
8
|
+
}
|
|
9
|
+
get connected() {
|
|
10
|
+
return this.attached;
|
|
11
|
+
}
|
|
12
|
+
get disconnected() {
|
|
13
|
+
return !this.attached;
|
|
14
|
+
}
|
|
15
|
+
didOpen() {
|
|
16
|
+
this.open = true;
|
|
17
|
+
this.attached = true;
|
|
18
|
+
this.disconnectDispatched = false;
|
|
19
|
+
}
|
|
20
|
+
didClose() {
|
|
21
|
+
this.open = false;
|
|
22
|
+
}
|
|
23
|
+
didDisconnect(target, error) {
|
|
24
|
+
this.open = false;
|
|
25
|
+
this.attached = false;
|
|
26
|
+
if (this.disconnectDispatched)
|
|
27
|
+
return;
|
|
28
|
+
this.disconnectDispatched = true;
|
|
29
|
+
const event = new Event('disconnect');
|
|
30
|
+
Object.defineProperty(event, 'error', { value: error });
|
|
31
|
+
target.dispatchEvent(event);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export function isNativeDeviceDisconnect(error) {
|
|
35
|
+
if (!(error instanceof NativeHardwareBridgeError))
|
|
36
|
+
return false;
|
|
37
|
+
if (error.code !== 'unavailable')
|
|
38
|
+
return false;
|
|
39
|
+
return /\b(disconnected|no longer available|not connected)\b/i.test(error.message);
|
|
40
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type NativeHardwareBridgeOptions } from './bridge';
|
|
2
|
+
import type { NativeHardwareRequestEnvelope, NativeHardwareResultEnvelope } from './types';
|
|
3
|
+
export declare const NATIVE_NOTIFICATION_REQUEST_TYPE: "moldable:native-notifications";
|
|
4
|
+
export declare const NATIVE_NOTIFICATION_RESULT_TYPE: "moldable:native-notifications-result";
|
|
5
|
+
export declare const NATIVE_NOTIFICATION_MAX_TITLE_LENGTH = 256;
|
|
6
|
+
export declare const NATIVE_NOTIFICATION_MAX_BODY_LENGTH = 4096;
|
|
7
|
+
export declare const NATIVE_NOTIFICATION_MAX_TAG_LENGTH = 128;
|
|
8
|
+
export type MoldableNotificationPermission = 'granted' | 'denied' | 'prompt';
|
|
9
|
+
export interface MoldableNotificationOptions {
|
|
10
|
+
title: string;
|
|
11
|
+
body?: string;
|
|
12
|
+
tag?: string;
|
|
13
|
+
silent?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface MoldableNotificationPermissionResult {
|
|
16
|
+
permission: MoldableNotificationPermission;
|
|
17
|
+
}
|
|
18
|
+
export interface MoldableNotificationSendResult {
|
|
19
|
+
sent: true;
|
|
20
|
+
}
|
|
21
|
+
export type NativeNotificationAction = 'getPermission' | 'requestPermission' | 'send';
|
|
22
|
+
export type NativeNotificationRequest = NativeHardwareRequestEnvelope<typeof NATIVE_NOTIFICATION_REQUEST_TYPE, {
|
|
23
|
+
capability: 'notifications';
|
|
24
|
+
action: 'getPermission';
|
|
25
|
+
} | {
|
|
26
|
+
capability: 'notifications';
|
|
27
|
+
action: 'requestPermission';
|
|
28
|
+
} | {
|
|
29
|
+
capability: 'notifications';
|
|
30
|
+
action: 'send';
|
|
31
|
+
notification: MoldableNotificationOptions;
|
|
32
|
+
}>;
|
|
33
|
+
export type NativeNotificationResult = NativeHardwareResultEnvelope<typeof NATIVE_NOTIFICATION_RESULT_TYPE, MoldableNotificationPermissionResult | MoldableNotificationSendResult>;
|
|
34
|
+
export declare function isMoldableNotificationOptions(value: unknown): value is MoldableNotificationOptions;
|
|
35
|
+
export declare function getMoldableNotificationPermission(options?: NativeHardwareBridgeOptions): Promise<MoldableNotificationPermissionResult>;
|
|
36
|
+
export declare function requestMoldableNotificationPermission(options?: NativeHardwareBridgeOptions): Promise<MoldableNotificationPermissionResult>;
|
|
37
|
+
export declare function sendMoldableNotification(notification: MoldableNotificationOptions, options?: NativeHardwareBridgeOptions): Promise<MoldableNotificationSendResult>;
|
|
38
|
+
//# sourceMappingURL=notifications.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../../src/lib/native-hardware/notifications.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,2BAA2B,EAEjC,MAAM,UAAU,CAAA;AACjB,OAAO,KAAK,EACV,6BAA6B,EAC7B,4BAA4B,EAC7B,MAAM,SAAS,CAAA;AAEhB,eAAO,MAAM,gCAAgC,EAC3C,+BAAwC,CAAA;AAC1C,eAAO,MAAM,+BAA+B,EAC1C,sCAA+C,CAAA;AAEjD,eAAO,MAAM,oCAAoC,MAAM,CAAA;AACvD,eAAO,MAAM,mCAAmC,OAAQ,CAAA;AACxD,eAAO,MAAM,kCAAkC,MAAM,CAAA;AAErD,MAAM,MAAM,8BAA8B,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAE5E,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,oCAAoC;IACnD,UAAU,EAAE,8BAA8B,CAAA;CAC3C;AAED,MAAM,WAAW,8BAA8B;IAC7C,IAAI,EAAE,IAAI,CAAA;CACX;AAED,MAAM,MAAM,wBAAwB,GAChC,eAAe,GACf,mBAAmB,GACnB,MAAM,CAAA;AAEV,MAAM,MAAM,yBAAyB,GAAG,6BAA6B,CACnE,OAAO,gCAAgC,EACrC;IACE,UAAU,EAAE,eAAe,CAAA;IAC3B,MAAM,EAAE,eAAe,CAAA;CACxB,GACD;IACE,UAAU,EAAE,eAAe,CAAA;IAC3B,MAAM,EAAE,mBAAmB,CAAA;CAC5B,GACD;IACE,UAAU,EAAE,eAAe,CAAA;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,2BAA2B,CAAA;CAC1C,CACJ,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG,4BAA4B,CACjE,OAAO,+BAA+B,EACtC,oCAAoC,GAAG,8BAA8B,CACtE,CAAA;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,2BAA2B,CA+BtC;AAED,wBAAgB,iCAAiC,CAC/C,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,oCAAoC,CAAC,CAU/C;AAED,wBAAgB,qCAAqC,CACnD,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,oCAAoC,CAAC,CAU/C;AAED,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,2BAA2B,EACzC,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,8BAA8B,CAAC,CAWzC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { callNativeHardwareBridge, } from './bridge';
|
|
2
|
+
export const NATIVE_NOTIFICATION_REQUEST_TYPE = 'moldable:native-notifications';
|
|
3
|
+
export const NATIVE_NOTIFICATION_RESULT_TYPE = 'moldable:native-notifications-result';
|
|
4
|
+
export const NATIVE_NOTIFICATION_MAX_TITLE_LENGTH = 256;
|
|
5
|
+
export const NATIVE_NOTIFICATION_MAX_BODY_LENGTH = 4_096;
|
|
6
|
+
export const NATIVE_NOTIFICATION_MAX_TAG_LENGTH = 128;
|
|
7
|
+
export function isMoldableNotificationOptions(value) {
|
|
8
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
9
|
+
return false;
|
|
10
|
+
const notification = value;
|
|
11
|
+
const { title, body, tag, silent } = notification;
|
|
12
|
+
if (typeof title !== 'string' ||
|
|
13
|
+
title.trim().length === 0 ||
|
|
14
|
+
title.length > NATIVE_NOTIFICATION_MAX_TITLE_LENGTH) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
if ((body !== undefined && typeof body !== 'string') ||
|
|
18
|
+
(typeof body === 'string' &&
|
|
19
|
+
body.length > NATIVE_NOTIFICATION_MAX_BODY_LENGTH)) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
if ((tag !== undefined &&
|
|
23
|
+
(typeof tag !== 'string' || tag.trim().length === 0)) ||
|
|
24
|
+
(typeof tag === 'string' && tag.length > NATIVE_NOTIFICATION_MAX_TAG_LENGTH)) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
return silent === undefined || typeof silent === 'boolean';
|
|
28
|
+
}
|
|
29
|
+
export function getMoldableNotificationPermission(options = {}) {
|
|
30
|
+
return callNativeHardwareBridge({
|
|
31
|
+
type: NATIVE_NOTIFICATION_REQUEST_TYPE,
|
|
32
|
+
capability: 'notifications',
|
|
33
|
+
action: 'getPermission',
|
|
34
|
+
}, NATIVE_NOTIFICATION_RESULT_TYPE, options);
|
|
35
|
+
}
|
|
36
|
+
export function requestMoldableNotificationPermission(options = {}) {
|
|
37
|
+
return callNativeHardwareBridge({
|
|
38
|
+
type: NATIVE_NOTIFICATION_REQUEST_TYPE,
|
|
39
|
+
capability: 'notifications',
|
|
40
|
+
action: 'requestPermission',
|
|
41
|
+
}, NATIVE_NOTIFICATION_RESULT_TYPE, options);
|
|
42
|
+
}
|
|
43
|
+
export function sendMoldableNotification(notification, options = {}) {
|
|
44
|
+
return callNativeHardwareBridge({
|
|
45
|
+
type: NATIVE_NOTIFICATION_REQUEST_TYPE,
|
|
46
|
+
capability: 'notifications',
|
|
47
|
+
action: 'send',
|
|
48
|
+
notification,
|
|
49
|
+
}, NATIVE_NOTIFICATION_RESULT_TYPE, options);
|
|
50
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { type NativeHardwareBridgeOptions } from './bridge';
|
|
2
|
+
import type { NativeHardwareRequestEnvelope, NativeHardwareResultEnvelope } from './types';
|
|
3
|
+
export declare const NATIVE_POWER_SESSION_REQUEST_TYPE: "moldable:native-power-session";
|
|
4
|
+
export declare const NATIVE_POWER_SESSION_RESULT_TYPE: "moldable:native-power-session-result";
|
|
5
|
+
export declare const NATIVE_POWER_SESSION_EVENT_TYPE: "moldable:native-power-session-event";
|
|
6
|
+
export type MoldablePowerSource = 'ac' | 'battery' | 'unknown';
|
|
7
|
+
export type MoldableBatteryState = 'charging' | 'discharging' | 'empty' | 'full' | 'unknown';
|
|
8
|
+
export interface MoldableBatteryStatus {
|
|
9
|
+
state: MoldableBatteryState;
|
|
10
|
+
chargePercent: number;
|
|
11
|
+
timeToEmptySeconds: number | null;
|
|
12
|
+
timeToFullSeconds: number | null;
|
|
13
|
+
}
|
|
14
|
+
export interface MoldablePowerState {
|
|
15
|
+
source: MoldablePowerSource;
|
|
16
|
+
batteries: MoldableBatteryStatus[];
|
|
17
|
+
}
|
|
18
|
+
export type MoldableSystemIdleState = 'active' | 'idle' | 'locked';
|
|
19
|
+
export type MoldableThermalState = 'nominal' | 'fair' | 'serious' | 'critical' | 'unknown';
|
|
20
|
+
export interface MoldableSystemIdleResult {
|
|
21
|
+
seconds: number;
|
|
22
|
+
state: MoldableSystemIdleState;
|
|
23
|
+
thresholdSeconds: number;
|
|
24
|
+
}
|
|
25
|
+
export type MoldableSleepBlockerType = 'prevent-app-suspension' | 'prevent-display-sleep';
|
|
26
|
+
export type MoldablePowerSessionEvent = {
|
|
27
|
+
kind: 'suspend';
|
|
28
|
+
occurredAt: string;
|
|
29
|
+
} | {
|
|
30
|
+
kind: 'resume';
|
|
31
|
+
occurredAt: string;
|
|
32
|
+
} | {
|
|
33
|
+
kind: 'lock';
|
|
34
|
+
occurredAt: string;
|
|
35
|
+
} | {
|
|
36
|
+
kind: 'unlock';
|
|
37
|
+
occurredAt: string;
|
|
38
|
+
} | {
|
|
39
|
+
kind: 'session-active';
|
|
40
|
+
occurredAt: string;
|
|
41
|
+
} | {
|
|
42
|
+
kind: 'session-inactive';
|
|
43
|
+
occurredAt: string;
|
|
44
|
+
} | {
|
|
45
|
+
kind: 'shutdown';
|
|
46
|
+
occurredAt: string;
|
|
47
|
+
} | {
|
|
48
|
+
kind: 'thermal-state-change';
|
|
49
|
+
occurredAt: string;
|
|
50
|
+
state: MoldableThermalState;
|
|
51
|
+
} | {
|
|
52
|
+
kind: 'power-source-change';
|
|
53
|
+
occurredAt: string;
|
|
54
|
+
powerState: MoldablePowerState;
|
|
55
|
+
};
|
|
56
|
+
export type NativePowerSessionRequest = NativeHardwareRequestEnvelope<typeof NATIVE_POWER_SESSION_REQUEST_TYPE, {
|
|
57
|
+
action: 'getPowerState';
|
|
58
|
+
} | {
|
|
59
|
+
action: 'getCurrentThermalState';
|
|
60
|
+
} | {
|
|
61
|
+
action: 'getIdleState';
|
|
62
|
+
thresholdSeconds: number;
|
|
63
|
+
} | {
|
|
64
|
+
action: 'startSleepBlocker';
|
|
65
|
+
blockerType: MoldableSleepBlockerType;
|
|
66
|
+
} | {
|
|
67
|
+
action: 'stopSleepBlocker';
|
|
68
|
+
blockerId: string;
|
|
69
|
+
} | {
|
|
70
|
+
action: 'isSleepBlockerStarted';
|
|
71
|
+
blockerId: string;
|
|
72
|
+
} | {
|
|
73
|
+
action: 'subscribeEvents';
|
|
74
|
+
} | {
|
|
75
|
+
action: 'unsubscribeEvents';
|
|
76
|
+
subscriptionId: string;
|
|
77
|
+
}>;
|
|
78
|
+
export type NativePowerSessionResult = NativeHardwareResultEnvelope<typeof NATIVE_POWER_SESSION_RESULT_TYPE, MoldablePowerState | MoldableThermalState | MoldableSystemIdleResult | {
|
|
79
|
+
blockerId: string;
|
|
80
|
+
blockerType: MoldableSleepBlockerType;
|
|
81
|
+
} | {
|
|
82
|
+
stopped: true;
|
|
83
|
+
} | {
|
|
84
|
+
started: boolean;
|
|
85
|
+
} | {
|
|
86
|
+
subscriptionId: string;
|
|
87
|
+
} | {
|
|
88
|
+
unsubscribed: true;
|
|
89
|
+
}>;
|
|
90
|
+
export interface WatchMoldablePowerSessionOptions {
|
|
91
|
+
signal?: AbortSignal;
|
|
92
|
+
}
|
|
93
|
+
export type StopWatchingMoldablePowerSession = () => Promise<void>;
|
|
94
|
+
export declare function isMoldablePowerSessionEvent(value: unknown): value is MoldablePowerSessionEvent;
|
|
95
|
+
export declare function getMoldablePowerState(options?: NativeHardwareBridgeOptions): Promise<MoldablePowerState>;
|
|
96
|
+
/** Return the host's current thermal pressure classification. */
|
|
97
|
+
export declare function getMoldableCurrentThermalState(options?: NativeHardwareBridgeOptions): Promise<MoldableThermalState>;
|
|
98
|
+
export declare function getMoldableSystemIdleState(thresholdSeconds: number, options?: NativeHardwareBridgeOptions): Promise<MoldableSystemIdleResult>;
|
|
99
|
+
export declare function getMoldableSystemIdleTime(options?: NativeHardwareBridgeOptions): Promise<number>;
|
|
100
|
+
export interface MoldableSleepBlocker {
|
|
101
|
+
readonly id: string;
|
|
102
|
+
readonly type: MoldableSleepBlockerType;
|
|
103
|
+
readonly stopped: boolean;
|
|
104
|
+
isStarted(options?: NativeHardwareBridgeOptions): Promise<boolean>;
|
|
105
|
+
stop(options?: NativeHardwareBridgeOptions): Promise<void>;
|
|
106
|
+
}
|
|
107
|
+
export declare function startMoldableSleepBlocker(blockerType: MoldableSleepBlockerType, options?: NativeHardwareBridgeOptions): Promise<MoldableSleepBlocker>;
|
|
108
|
+
/** Stop a blocker returned by {@link startMoldableSleepBlocker}. */
|
|
109
|
+
export declare function stopMoldableSleepBlocker(blocker: MoldableSleepBlocker, options?: NativeHardwareBridgeOptions): Promise<void>;
|
|
110
|
+
/** Ask the host whether a blocker still belongs to this active app scope. */
|
|
111
|
+
export declare function isMoldableSleepBlockerStarted(blocker: MoldableSleepBlocker, options?: NativeHardwareBridgeOptions): Promise<boolean>;
|
|
112
|
+
export declare function watchMoldablePowerSession(listener: (event: MoldablePowerSessionEvent) => void, options?: WatchMoldablePowerSessionOptions & NativeHardwareBridgeOptions): Promise<StopWatchingMoldablePowerSession>;
|
|
113
|
+
//# sourceMappingURL=power-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"power-session.d.ts","sourceRoot":"","sources":["../../../src/lib/native-hardware/power-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import { NativeHardwareBridgeError, callNativeHardwareBridge, resolveNativeHardwareParentOrigin, } from './bridge';
|
|
2
|
+
export const NATIVE_POWER_SESSION_REQUEST_TYPE = 'moldable:native-power-session';
|
|
3
|
+
export const NATIVE_POWER_SESSION_RESULT_TYPE = 'moldable:native-power-session-result';
|
|
4
|
+
export const NATIVE_POWER_SESSION_EVENT_TYPE = 'moldable:native-power-session-event';
|
|
5
|
+
function isRecord(value) {
|
|
6
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
7
|
+
}
|
|
8
|
+
function isPowerState(value) {
|
|
9
|
+
if (!isRecord(value))
|
|
10
|
+
return false;
|
|
11
|
+
if (!['ac', 'battery', 'unknown'].includes(String(value.source)))
|
|
12
|
+
return false;
|
|
13
|
+
if (!Array.isArray(value.batteries))
|
|
14
|
+
return false;
|
|
15
|
+
return value.batteries.every((battery) => isRecord(battery) &&
|
|
16
|
+
['charging', 'discharging', 'empty', 'full', 'unknown'].includes(String(battery.state)) &&
|
|
17
|
+
typeof battery.chargePercent === 'number' &&
|
|
18
|
+
Number.isFinite(battery.chargePercent) &&
|
|
19
|
+
battery.chargePercent >= 0 &&
|
|
20
|
+
battery.chargePercent <= 100 &&
|
|
21
|
+
(battery.timeToEmptySeconds === null ||
|
|
22
|
+
(typeof battery.timeToEmptySeconds === 'number' &&
|
|
23
|
+
Number.isFinite(battery.timeToEmptySeconds) &&
|
|
24
|
+
battery.timeToEmptySeconds >= 0)) &&
|
|
25
|
+
(battery.timeToFullSeconds === null ||
|
|
26
|
+
(typeof battery.timeToFullSeconds === 'number' &&
|
|
27
|
+
Number.isFinite(battery.timeToFullSeconds) &&
|
|
28
|
+
battery.timeToFullSeconds >= 0)));
|
|
29
|
+
}
|
|
30
|
+
function isThermalState(value) {
|
|
31
|
+
return ['nominal', 'fair', 'serious', 'critical', 'unknown'].includes(String(value));
|
|
32
|
+
}
|
|
33
|
+
export function isMoldablePowerSessionEvent(value) {
|
|
34
|
+
if (!isRecord(value) || typeof value.occurredAt !== 'string')
|
|
35
|
+
return false;
|
|
36
|
+
if (Number.isNaN(Date.parse(value.occurredAt)))
|
|
37
|
+
return false;
|
|
38
|
+
if (value.kind === 'suspend' ||
|
|
39
|
+
value.kind === 'resume' ||
|
|
40
|
+
value.kind === 'lock' ||
|
|
41
|
+
value.kind === 'unlock' ||
|
|
42
|
+
value.kind === 'session-active' ||
|
|
43
|
+
value.kind === 'session-inactive' ||
|
|
44
|
+
value.kind === 'shutdown') {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
if (value.kind === 'thermal-state-change') {
|
|
48
|
+
return isThermalState(value.state);
|
|
49
|
+
}
|
|
50
|
+
return value.kind === 'power-source-change' && isPowerState(value.powerState);
|
|
51
|
+
}
|
|
52
|
+
export async function getMoldablePowerState(options = {}) {
|
|
53
|
+
const value = await callNativeHardwareBridge({ type: NATIVE_POWER_SESSION_REQUEST_TYPE, action: 'getPowerState' }, NATIVE_POWER_SESSION_RESULT_TYPE, options);
|
|
54
|
+
if (!isPowerState(value)) {
|
|
55
|
+
throw new NativeHardwareBridgeError({
|
|
56
|
+
code: 'invalid_response',
|
|
57
|
+
message: 'Moldable returned an invalid power state.',
|
|
58
|
+
details: value,
|
|
59
|
+
retryable: false,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return value;
|
|
63
|
+
}
|
|
64
|
+
/** Return the host's current thermal pressure classification. */
|
|
65
|
+
export async function getMoldableCurrentThermalState(options = {}) {
|
|
66
|
+
const value = await callNativeHardwareBridge({
|
|
67
|
+
type: NATIVE_POWER_SESSION_REQUEST_TYPE,
|
|
68
|
+
action: 'getCurrentThermalState',
|
|
69
|
+
}, NATIVE_POWER_SESSION_RESULT_TYPE, options);
|
|
70
|
+
if (!isThermalState(value)) {
|
|
71
|
+
throw new NativeHardwareBridgeError({
|
|
72
|
+
code: 'invalid_response',
|
|
73
|
+
message: 'Moldable returned an invalid thermal state.',
|
|
74
|
+
details: value,
|
|
75
|
+
retryable: false,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return value;
|
|
79
|
+
}
|
|
80
|
+
export async function getMoldableSystemIdleState(thresholdSeconds, options = {}) {
|
|
81
|
+
if (!Number.isSafeInteger(thresholdSeconds) ||
|
|
82
|
+
thresholdSeconds < 1 ||
|
|
83
|
+
thresholdSeconds > 86_400) {
|
|
84
|
+
throw new RangeError('thresholdSeconds must be an integer from 1 to 86400.');
|
|
85
|
+
}
|
|
86
|
+
const value = await callNativeHardwareBridge({
|
|
87
|
+
type: NATIVE_POWER_SESSION_REQUEST_TYPE,
|
|
88
|
+
action: 'getIdleState',
|
|
89
|
+
thresholdSeconds,
|
|
90
|
+
}, NATIVE_POWER_SESSION_RESULT_TYPE, options);
|
|
91
|
+
if (!isRecord(value) ||
|
|
92
|
+
typeof value.seconds !== 'number' ||
|
|
93
|
+
!Number.isFinite(value.seconds) ||
|
|
94
|
+
value.seconds < 0 ||
|
|
95
|
+
!['active', 'idle', 'locked'].includes(String(value.state)) ||
|
|
96
|
+
value.thresholdSeconds !== thresholdSeconds) {
|
|
97
|
+
throw new NativeHardwareBridgeError({
|
|
98
|
+
code: 'invalid_response',
|
|
99
|
+
message: 'Moldable returned an invalid system idle state.',
|
|
100
|
+
details: value,
|
|
101
|
+
retryable: false,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
return value;
|
|
105
|
+
}
|
|
106
|
+
export async function getMoldableSystemIdleTime(options = {}) {
|
|
107
|
+
const result = await getMoldableSystemIdleState(86_400, options);
|
|
108
|
+
return result.seconds;
|
|
109
|
+
}
|
|
110
|
+
class MoldableSleepBlockerHandle {
|
|
111
|
+
id;
|
|
112
|
+
type;
|
|
113
|
+
#stopPromise = null;
|
|
114
|
+
#stopped = false;
|
|
115
|
+
constructor(id, type) {
|
|
116
|
+
this.id = id;
|
|
117
|
+
this.type = type;
|
|
118
|
+
}
|
|
119
|
+
get stopped() {
|
|
120
|
+
return this.#stopped;
|
|
121
|
+
}
|
|
122
|
+
async isStarted(options = {}) {
|
|
123
|
+
if (this.#stopped)
|
|
124
|
+
return false;
|
|
125
|
+
const result = await callNativeHardwareBridge({
|
|
126
|
+
type: NATIVE_POWER_SESSION_REQUEST_TYPE,
|
|
127
|
+
action: 'isSleepBlockerStarted',
|
|
128
|
+
blockerId: this.id,
|
|
129
|
+
}, NATIVE_POWER_SESSION_RESULT_TYPE, options);
|
|
130
|
+
if (typeof result.started !== 'boolean') {
|
|
131
|
+
throw new NativeHardwareBridgeError({
|
|
132
|
+
code: 'invalid_response',
|
|
133
|
+
message: 'Moldable returned an invalid sleep blocker state.',
|
|
134
|
+
details: result,
|
|
135
|
+
retryable: false,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
if (!result.started)
|
|
139
|
+
this.#stopped = true;
|
|
140
|
+
return result.started;
|
|
141
|
+
}
|
|
142
|
+
stop(options = {}) {
|
|
143
|
+
if (this.#stopped)
|
|
144
|
+
return Promise.resolve();
|
|
145
|
+
if (this.#stopPromise)
|
|
146
|
+
return this.#stopPromise;
|
|
147
|
+
this.#stopPromise = callNativeHardwareBridge({
|
|
148
|
+
type: NATIVE_POWER_SESSION_REQUEST_TYPE,
|
|
149
|
+
action: 'stopSleepBlocker',
|
|
150
|
+
blockerId: this.id,
|
|
151
|
+
}, NATIVE_POWER_SESSION_RESULT_TYPE, options)
|
|
152
|
+
.then(() => {
|
|
153
|
+
this.#stopped = true;
|
|
154
|
+
})
|
|
155
|
+
.catch((error) => {
|
|
156
|
+
this.#stopPromise = null;
|
|
157
|
+
throw error;
|
|
158
|
+
});
|
|
159
|
+
return this.#stopPromise;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
export async function startMoldableSleepBlocker(blockerType, options = {}) {
|
|
163
|
+
const result = await callNativeHardwareBridge({
|
|
164
|
+
type: NATIVE_POWER_SESSION_REQUEST_TYPE,
|
|
165
|
+
action: 'startSleepBlocker',
|
|
166
|
+
blockerType,
|
|
167
|
+
}, NATIVE_POWER_SESSION_RESULT_TYPE, options);
|
|
168
|
+
if (typeof result.blockerId !== 'string' ||
|
|
169
|
+
result.blockerId.length === 0 ||
|
|
170
|
+
result.blockerType !== blockerType) {
|
|
171
|
+
throw new NativeHardwareBridgeError({
|
|
172
|
+
code: 'invalid_response',
|
|
173
|
+
message: 'Moldable returned an invalid sleep blocker handle.',
|
|
174
|
+
details: result,
|
|
175
|
+
retryable: false,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
return new MoldableSleepBlockerHandle(result.blockerId, blockerType);
|
|
179
|
+
}
|
|
180
|
+
/** Stop a blocker returned by {@link startMoldableSleepBlocker}. */
|
|
181
|
+
export function stopMoldableSleepBlocker(blocker, options = {}) {
|
|
182
|
+
return blocker.stop(options);
|
|
183
|
+
}
|
|
184
|
+
/** Ask the host whether a blocker still belongs to this active app scope. */
|
|
185
|
+
export function isMoldableSleepBlockerStarted(blocker, options = {}) {
|
|
186
|
+
return blocker.isStarted(options);
|
|
187
|
+
}
|
|
188
|
+
export async function watchMoldablePowerSession(listener, options = {}) {
|
|
189
|
+
if (typeof window === 'undefined' || window.parent === window) {
|
|
190
|
+
throw new NativeHardwareBridgeError({
|
|
191
|
+
code: 'not_in_moldable',
|
|
192
|
+
message: 'Power/session events are only available inside Moldable.',
|
|
193
|
+
retryable: false,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
const parentOrigin = resolveNativeHardwareParentOrigin(document.referrer);
|
|
197
|
+
if (!parentOrigin) {
|
|
198
|
+
throw new NativeHardwareBridgeError({
|
|
199
|
+
code: 'not_in_moldable',
|
|
200
|
+
message: 'The power/session event parent could not be verified.',
|
|
201
|
+
retryable: false,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
let active = true;
|
|
205
|
+
const handleMessage = (event) => {
|
|
206
|
+
if (!active ||
|
|
207
|
+
event.source !== window.parent ||
|
|
208
|
+
event.origin !== parentOrigin ||
|
|
209
|
+
!isRecord(event.data)) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
if (event.data.type !== NATIVE_POWER_SESSION_EVENT_TYPE)
|
|
213
|
+
return;
|
|
214
|
+
if (!isMoldablePowerSessionEvent(event.data.event))
|
|
215
|
+
return;
|
|
216
|
+
listener(event.data.event);
|
|
217
|
+
};
|
|
218
|
+
let stopPromise = null;
|
|
219
|
+
let subscriptionId = '';
|
|
220
|
+
const stop = () => {
|
|
221
|
+
if (stopPromise)
|
|
222
|
+
return stopPromise;
|
|
223
|
+
active = false;
|
|
224
|
+
window.removeEventListener('message', handleMessage);
|
|
225
|
+
options.signal?.removeEventListener('abort', handleAbort);
|
|
226
|
+
stopPromise = callNativeHardwareBridge({
|
|
227
|
+
type: NATIVE_POWER_SESSION_REQUEST_TYPE,
|
|
228
|
+
action: 'unsubscribeEvents',
|
|
229
|
+
subscriptionId,
|
|
230
|
+
}, NATIVE_POWER_SESSION_RESULT_TYPE, { timeoutMs: options.timeoutMs })
|
|
231
|
+
.then(() => undefined)
|
|
232
|
+
.catch((error) => {
|
|
233
|
+
stopPromise = null;
|
|
234
|
+
throw error;
|
|
235
|
+
});
|
|
236
|
+
return stopPromise;
|
|
237
|
+
};
|
|
238
|
+
const handleAbort = () => void stop().catch(() => undefined);
|
|
239
|
+
window.addEventListener('message', handleMessage);
|
|
240
|
+
try {
|
|
241
|
+
const result = await callNativeHardwareBridge({
|
|
242
|
+
type: NATIVE_POWER_SESSION_REQUEST_TYPE,
|
|
243
|
+
action: 'subscribeEvents',
|
|
244
|
+
}, NATIVE_POWER_SESSION_RESULT_TYPE, options);
|
|
245
|
+
if (typeof result.subscriptionId !== 'string' || !result.subscriptionId) {
|
|
246
|
+
throw new NativeHardwareBridgeError({
|
|
247
|
+
code: 'invalid_response',
|
|
248
|
+
message: 'Moldable returned an invalid power event subscription.',
|
|
249
|
+
details: result,
|
|
250
|
+
retryable: false,
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
subscriptionId = result.subscriptionId;
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
active = false;
|
|
257
|
+
window.removeEventListener('message', handleMessage);
|
|
258
|
+
throw error;
|
|
259
|
+
}
|
|
260
|
+
options.signal?.addEventListener('abort', handleAbort, { once: true });
|
|
261
|
+
if (options.signal?.aborted)
|
|
262
|
+
handleAbort();
|
|
263
|
+
return stop;
|
|
264
|
+
}
|