@bota.dev/web-app-sdk 2.0.0-beta.0

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.
Files changed (54) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +517 -0
  3. package/dist/capabilities.d.ts +8 -0
  4. package/dist/capabilities.js +21 -0
  5. package/dist/client.d.ts +39 -0
  6. package/dist/client.js +153 -0
  7. package/dist/controlManager.d.ts +38 -0
  8. package/dist/controlManager.js +344 -0
  9. package/dist/core.d.ts +698 -0
  10. package/dist/core.js +13 -0
  11. package/dist/deviceManager.d.ts +52 -0
  12. package/dist/deviceManager.js +491 -0
  13. package/dist/encryptedUploadV2Host.d.ts +239 -0
  14. package/dist/encryptedUploadV2Host.js +2136 -0
  15. package/dist/errors.d.ts +24 -0
  16. package/dist/errors.js +230 -0
  17. package/dist/gatt.d.ts +39 -0
  18. package/dist/gatt.js +57 -0
  19. package/dist/generated/bota_device_sdk_core.d.ts +202 -0
  20. package/dist/generated/bota_device_sdk_core.js +1025 -0
  21. package/dist/generated/bota_device_sdk_core_bg.wasm +0 -0
  22. package/dist/index.d.ts +13 -0
  23. package/dist/index.js +2 -0
  24. package/dist/indexedDbWorkflowStore.d.ts +52 -0
  25. package/dist/indexedDbWorkflowStore.js +763 -0
  26. package/dist/logManager.d.ts +24 -0
  27. package/dist/logManager.js +205 -0
  28. package/dist/models.d.ts +217 -0
  29. package/dist/models.js +1 -0
  30. package/dist/opfsBlobStore.d.ts +12 -0
  31. package/dist/opfsBlobStore.js +250 -0
  32. package/dist/otaManager.d.ts +49 -0
  33. package/dist/otaManager.js +951 -0
  34. package/dist/providerCancellation.d.ts +2 -0
  35. package/dist/providerCancellation.js +23 -0
  36. package/dist/providers.d.ts +138 -0
  37. package/dist/providers.js +1 -0
  38. package/dist/provisioningManager.d.ts +48 -0
  39. package/dist/provisioningManager.js +753 -0
  40. package/dist/recordingManager.d.ts +53 -0
  41. package/dist/recordingManager.js +1397 -0
  42. package/dist/storage.d.ts +103 -0
  43. package/dist/storage.js +60 -0
  44. package/dist/transport.d.ts +33 -0
  45. package/dist/transport.js +8 -0
  46. package/dist/wasmCore.d.ts +3 -0
  47. package/dist/wasmCore.js +1651 -0
  48. package/dist/webBluetoothTransport.d.ts +23 -0
  49. package/dist/webBluetoothTransport.js +369 -0
  50. package/dist/wifiManager.d.ts +54 -0
  51. package/dist/wifiManager.js +528 -0
  52. package/dist/workflowRuntime.d.ts +115 -0
  53. package/dist/workflowRuntime.js +1508 -0
  54. package/package.json +46 -0
@@ -0,0 +1,103 @@
1
+ import type { CoreIntegrityHasher } from './core.ts';
2
+ import type { RecordingJournalPhase } from './models.ts';
3
+ export { BrowserStorageError } from './indexedDbWorkflowStore.ts';
4
+ export type { BrowserStorageErrorCode } from './indexedDbWorkflowStore.ts';
5
+ export type { RecordingJournalPhase } from './models.ts';
6
+ export interface RecordingJournal {
7
+ schemaVersion: 1;
8
+ operationId: string;
9
+ serialNumber: string;
10
+ recordingUuid: string;
11
+ profile: 'legacy' | 'encrypted_upload_v2';
12
+ phase: RecordingJournalPhase;
13
+ sinkId: string;
14
+ uploadId: string | null;
15
+ cloudCompletionId: string | null;
16
+ confirmationDigestHex: string | null;
17
+ devicePlaintextSha256Hex: string | null;
18
+ updatedAtEpochMs: number;
19
+ }
20
+ export interface FirmwareJournal {
21
+ schemaVersion: 1;
22
+ operationId: string;
23
+ serialNumber: string;
24
+ imageId: string;
25
+ downloadId: bigint;
26
+ version: string;
27
+ sizeBytes: number;
28
+ crc32: number;
29
+ sha256Hex: string;
30
+ blobId: string;
31
+ downloadedBytes: number;
32
+ verified: boolean;
33
+ state?: 'active' | 'cleanup_only';
34
+ updatedAtEpochMs: number;
35
+ }
36
+ export interface VerifiedDeviceHint {
37
+ schemaVersion: 1;
38
+ serialNumber: string;
39
+ browserDeviceId: string;
40
+ name: string | null;
41
+ updatedAtEpochMs: number;
42
+ }
43
+ export interface WorkflowCheckpointRecord {
44
+ schemaVersion: 1;
45
+ operationId: string;
46
+ checkpoint: unknown;
47
+ }
48
+ export interface EncryptedUploadV2CheckpointRecord {
49
+ schemaVersion: 1;
50
+ operationId: string;
51
+ checkpoint: unknown;
52
+ }
53
+ export interface ProvisioningJournal {
54
+ schemaVersion: 1;
55
+ attemptId: string;
56
+ materialId: string | null;
57
+ serialNumber: string;
58
+ phase: 'prepared' | 'device_applied' | 'backend_confirmed' | 'aborted';
59
+ updatedAtEpochMs: number;
60
+ }
61
+ export interface BrowserBlobHandle {
62
+ readonly id: string;
63
+ size(): Promise<number>;
64
+ truncate(size: number): Promise<void>;
65
+ write(offset: number, bytes: Uint8Array): Promise<void>;
66
+ read(offset: number, maximumLength: number): Promise<Uint8Array>;
67
+ stream(chunkSize?: number): AsyncIterable<Uint8Array>;
68
+ delete(): Promise<void>;
69
+ }
70
+ export interface BrowserSdkStorage {
71
+ readonly namespace: string;
72
+ loadVerifiedDevice(serialNumber: string): Promise<VerifiedDeviceHint | null>;
73
+ saveVerifiedDevice(value: VerifiedDeviceHint): Promise<void>;
74
+ deleteVerifiedDevice(serialNumber: string): Promise<void>;
75
+ loadWorkflowCheckpoint(operationId: string): Promise<unknown | null>;
76
+ saveWorkflowCheckpoint(operationId: string, checkpoint: unknown): Promise<void>;
77
+ deleteWorkflowCheckpoint(operationId: string): Promise<void>;
78
+ loadEncryptedUploadV2Checkpoint(operationId: string): Promise<unknown | null>;
79
+ saveEncryptedUploadV2Checkpoint(operationId: string, checkpoint: unknown): Promise<void>;
80
+ deleteEncryptedUploadV2Checkpoint(operationId: string): Promise<void>;
81
+ saveEncryptedUploadV2Operation(operationId: string, checkpoint: unknown, journal: RecordingJournal): Promise<void>;
82
+ deleteEncryptedUploadV2Operation(operationId: string): Promise<void>;
83
+ loadRecordingJournal(operationId: string): Promise<RecordingJournal | null>;
84
+ saveRecordingJournal(journal: RecordingJournal): Promise<void>;
85
+ listRecordingJournals(): Promise<RecordingJournal[]>;
86
+ deleteRecordingJournal(operationId: string): Promise<void>;
87
+ loadProvisioningJournal(attemptId: string): Promise<ProvisioningJournal | null>;
88
+ saveProvisioningJournal(journal: ProvisioningJournal): Promise<void>;
89
+ listProvisioningJournals?(): Promise<ProvisioningJournal[]>;
90
+ deleteProvisioningJournal(attemptId: string): Promise<void>;
91
+ loadFirmwareJournal(operationId: string): Promise<FirmwareJournal | null>;
92
+ saveFirmwareJournal(journal: FirmwareJournal): Promise<void>;
93
+ deleteFirmwareJournal(operationId: string): Promise<void>;
94
+ openBlob(blobId: string): Promise<BrowserBlobHandle>;
95
+ clear(): Promise<void>;
96
+ }
97
+ export interface BrowserStorageDependencies {
98
+ indexedDB?: IDBFactory | null;
99
+ keyRange?: typeof IDBKeyRange | null;
100
+ opfsRoot?: FileSystemDirectoryHandle | null;
101
+ createIntegrityHasher?: (() => CoreIntegrityHasher) | null;
102
+ }
103
+ export declare function createDefaultBrowserStorage(namespace: string, dependencies?: BrowserStorageDependencies): Promise<BrowserSdkStorage>;
@@ -0,0 +1,60 @@
1
+ import { BrowserStorageError, IndexedDbWorkflowStore, mapBrowserStorageError, validateStorageNamespace, } from "./indexedDbWorkflowStore.js";
2
+ import { OpfsBlobStore } from "./opfsBlobStore.js";
3
+ import { loadDefaultCore } from "./wasmCore.js";
4
+ export { BrowserStorageError } from "./indexedDbWorkflowStore.js";
5
+ export async function createDefaultBrowserStorage(namespace, dependencies = {}) {
6
+ validateStorageNamespace(namespace);
7
+ const indexedDB = dependencies.indexedDB === undefined
8
+ ? globalThis.indexedDB
9
+ : dependencies.indexedDB;
10
+ const keyRange = dependencies.keyRange === undefined
11
+ ? globalThis.IDBKeyRange
12
+ : dependencies.keyRange;
13
+ if (!indexedDB || !keyRange) {
14
+ throw new BrowserStorageError('storage_unavailable');
15
+ }
16
+ let opfsRoot = dependencies.opfsRoot;
17
+ if (opfsRoot === undefined) {
18
+ const storage = typeof navigator === 'undefined' ? undefined : navigator.storage;
19
+ if (typeof storage?.getDirectory !== 'function') {
20
+ throw new BrowserStorageError('storage_unavailable');
21
+ }
22
+ try {
23
+ opfsRoot = await storage.getDirectory();
24
+ }
25
+ catch (error) {
26
+ throw mapBrowserStorageError(error);
27
+ }
28
+ }
29
+ if (!opfsRoot)
30
+ throw new BrowserStorageError('storage_unavailable');
31
+ let createIntegrityHasher = dependencies.createIntegrityHasher;
32
+ if (createIntegrityHasher === undefined) {
33
+ try {
34
+ const core = await loadDefaultCore();
35
+ createIntegrityHasher = () => core.createIntegrityHasher();
36
+ }
37
+ catch (error) {
38
+ throw mapBrowserStorageError(error);
39
+ }
40
+ }
41
+ if (!createIntegrityHasher) {
42
+ throw new BrowserStorageError('storage_unavailable');
43
+ }
44
+ const blobs = new OpfsBlobStore(namespace, opfsRoot, createIntegrityHasher);
45
+ return new DefaultBrowserStorage(namespace, indexedDB, keyRange, blobs);
46
+ }
47
+ class DefaultBrowserStorage extends IndexedDbWorkflowStore {
48
+ blobs;
49
+ constructor(namespace, indexedDB, keyRange, blobs) {
50
+ super(namespace, indexedDB, keyRange);
51
+ this.blobs = blobs;
52
+ }
53
+ async openBlob(blobId) {
54
+ return await this.blobs.open(blobId);
55
+ }
56
+ async clear() {
57
+ await super.clear();
58
+ await this.blobs.clear();
59
+ }
60
+ }
@@ -0,0 +1,33 @@
1
+ export interface BrowserDeviceHandle {
2
+ readonly id: string;
3
+ readonly name: string | null;
4
+ readonly nativeValue?: unknown;
5
+ }
6
+ export interface BrowserNotification {
7
+ characteristicUuid: string;
8
+ value: Uint8Array;
9
+ }
10
+ export interface BrowserSubscription {
11
+ remove(): Promise<void>;
12
+ }
13
+ export interface BrowserBluetoothTransport {
14
+ readonly isSupported: boolean;
15
+ readonly supportsAuthorizedDevices: boolean;
16
+ readonly maximumWriteValueLength: number;
17
+ requestDevice(): Promise<BrowserDeviceHandle>;
18
+ getAuthorizedDevices(): Promise<BrowserDeviceHandle[]>;
19
+ connect(device: BrowserDeviceHandle): Promise<void>;
20
+ discoverServices(device: BrowserDeviceHandle): Promise<void>;
21
+ read(device: BrowserDeviceHandle, serviceUuid: string, characteristicUuid: string): Promise<Uint8Array>;
22
+ write(device: BrowserDeviceHandle, serviceUuid: string, characteristicUuid: string, value: Uint8Array, withResponse: boolean): Promise<void>;
23
+ subscribe(device: BrowserDeviceHandle, serviceUuid: string, characteristicUuid: string, listener: (notification: BrowserNotification) => void): Promise<BrowserSubscription>;
24
+ disconnect(device: BrowserDeviceHandle): Promise<void>;
25
+ onDisconnected(device: BrowserDeviceHandle, listener: () => void): () => void;
26
+ }
27
+ export type BrowserTransportErrorCode = 'characteristic_not_found' | 'disconnected' | 'permission_denied' | 'picker_cancelled' | 'unavailable';
28
+ export declare class BrowserTransportError extends Error {
29
+ readonly code: BrowserTransportErrorCode;
30
+ constructor(code: BrowserTransportErrorCode, options?: {
31
+ cause?: unknown;
32
+ });
33
+ }
@@ -0,0 +1,8 @@
1
+ export class BrowserTransportError extends Error {
2
+ code;
3
+ constructor(code, options = {}) {
4
+ super(code, { cause: options.cause });
5
+ this.name = 'BrowserTransportError';
6
+ this.code = code;
7
+ }
8
+ }
@@ -0,0 +1,3 @@
1
+ import type { CoreBridge } from './core.ts';
2
+ export declare function createWasmCore(moduleInput?: unknown): Promise<CoreBridge>;
3
+ export declare const loadDefaultCore: import("./core.ts").CoreLoader;