@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,2 @@
1
+ import { type BotaOperation } from './errors.ts';
2
+ export declare function awaitProviderCall<T>(promise: Promise<T>, signal: AbortSignal, operation: BotaOperation): Promise<T>;
@@ -0,0 +1,23 @@
1
+ import { BotaSDKError } from "./errors.js";
2
+ export async function awaitProviderCall(promise, signal, operation) {
3
+ const observed = promise.then((value) => ({ kind: 'fulfilled', value }), (error) => ({ kind: 'rejected', error }));
4
+ let cancel;
5
+ const cancelled = new Promise((resolve) => {
6
+ cancel = () => resolve({
7
+ kind: 'rejected',
8
+ error: new BotaSDKError('cancelled', operation),
9
+ });
10
+ });
11
+ signal.addEventListener('abort', cancel, { once: true });
12
+ if (signal.aborted)
13
+ cancel();
14
+ try {
15
+ const outcome = await Promise.race([observed, cancelled]);
16
+ if (outcome.kind === 'rejected')
17
+ throw outcome.error;
18
+ return outcome.value;
19
+ }
20
+ finally {
21
+ signal.removeEventListener('abort', cancel);
22
+ }
23
+ }
@@ -0,0 +1,138 @@
1
+ import type { DeviceRecording, EncryptedUploadV2Capabilities, FirmwareImageDescriptor } from './models.ts';
2
+ import type { BotaSDKErrorCode } from './errors.ts';
3
+ export interface ProvisioningPrepareContext {
4
+ attemptId: string;
5
+ materialId: string;
6
+ serialNumber: string;
7
+ nonce: Uint8Array;
8
+ devicePublicKey: Uint8Array;
9
+ signal: AbortSignal;
10
+ }
11
+ export interface ProvisioningMaterial {
12
+ materialId: string;
13
+ apiEndpoint: Uint8Array;
14
+ deviceToken: Uint8Array;
15
+ mtu: number;
16
+ }
17
+ export interface ProvisioningProvider {
18
+ prepare(context: ProvisioningPrepareContext): Promise<ProvisioningMaterial>;
19
+ confirm(context: {
20
+ attemptId: string;
21
+ serialNumber: string;
22
+ signal: AbortSignal;
23
+ }): Promise<void>;
24
+ abort(context: {
25
+ attemptId: string;
26
+ serialNumber: string;
27
+ reason: BotaSDKErrorCode;
28
+ signal: AbortSignal;
29
+ }): Promise<void>;
30
+ }
31
+ export interface RecordingControlProvider {
32
+ prepare(context: {
33
+ operationId: string;
34
+ serialNumber: string;
35
+ action: 'start' | 'stop';
36
+ authorityId: string;
37
+ signal: AbortSignal;
38
+ }): Promise<{
39
+ grant: Uint8Array;
40
+ }>;
41
+ }
42
+ export interface FirmwareDownloadProvider {
43
+ resolve(context: {
44
+ operationId: string;
45
+ serialNumber: string;
46
+ image: FirmwareImageDescriptor;
47
+ signal: AbortSignal;
48
+ }): Promise<{
49
+ method: 'GET';
50
+ url: string;
51
+ headers: Readonly<Record<string, string>>;
52
+ }>;
53
+ }
54
+ export interface UploadRequestTemplate {
55
+ method: 'PUT';
56
+ url: string;
57
+ headers: Readonly<Record<string, string>>;
58
+ }
59
+ export interface LegacyUploadContext {
60
+ operationId: string;
61
+ serialNumber: string;
62
+ recording: DeviceRecording;
63
+ sizeBytes: bigint;
64
+ plaintextSha256Hex: string | null;
65
+ stagedBodySha256Hex: string;
66
+ encrypted: boolean;
67
+ signal: AbortSignal;
68
+ }
69
+ export interface EncryptedUploadV2Recording {
70
+ uuid: string;
71
+ generation: number;
72
+ storageFormat: number;
73
+ ciphertextLength: bigint;
74
+ ciphertextSha256: Uint8Array;
75
+ }
76
+ export interface EncryptedUploadV2CheckpointSummary {
77
+ uploadSessionId: string;
78
+ ownerRevision: number;
79
+ checkpointRevision: number;
80
+ nextCiphertextOffset: bigint;
81
+ prefixSha256: Uint8Array;
82
+ transportSessionId: bigint;
83
+ sinkId: string;
84
+ windowPackets: number;
85
+ dataPayloadBytes: number;
86
+ }
87
+ export interface EncryptedUploadV2ProviderContext {
88
+ operationId: string;
89
+ serialNumber: string;
90
+ recording: EncryptedUploadV2Recording;
91
+ capability: {
92
+ rawValue: Uint8Array;
93
+ sha256: Uint8Array;
94
+ decoded: EncryptedUploadV2Capabilities;
95
+ };
96
+ checkpoint: EncryptedUploadV2CheckpointSummary | null;
97
+ signal: AbortSignal;
98
+ }
99
+ export interface EncryptedUploadV2Evidence {
100
+ ciphertextLength: bigint;
101
+ ciphertextSha256: Uint8Array;
102
+ manifestLength: number;
103
+ manifestSha256: Uint8Array;
104
+ blockCount: number;
105
+ }
106
+ export interface EncryptedUploadV2Material {
107
+ materialId: string;
108
+ recordingId: string;
109
+ uploadSessionId: string;
110
+ ownerRevision: number;
111
+ policy: 'legacy_allowed' | 'v2_preferred' | 'v2_required';
112
+ authorization: Uint8Array;
113
+ stagingRequest(evidence: EncryptedUploadV2Evidence, signal: AbortSignal): Promise<UploadRequestTemplate>;
114
+ submitManifest(manifest: Uint8Array, evidence: EncryptedUploadV2Evidence, signal: AbortSignal): Promise<void>;
115
+ finalize(evidence: EncryptedUploadV2Evidence, signal: AbortSignal): Promise<void>;
116
+ completionReceipt(evidence: EncryptedUploadV2Evidence, signal: AbortSignal): Promise<Uint8Array>;
117
+ cancel(signal: AbortSignal): Promise<void>;
118
+ }
119
+ export interface RecordingUploadProvider {
120
+ prepareLegacyUpload(context: LegacyUploadContext): Promise<{
121
+ uploadId: string;
122
+ request: UploadRequestTemplate;
123
+ }>;
124
+ completeLegacyUpload(context: LegacyUploadContext & {
125
+ uploadId: string;
126
+ }): Promise<{
127
+ cloudCompletionId: string;
128
+ }>;
129
+ reconcileLegacyUpload(context: LegacyUploadContext & {
130
+ uploadId: string;
131
+ }): Promise<{
132
+ state: 'not_uploaded';
133
+ } | {
134
+ state: 'cloud_completed';
135
+ cloudCompletionId: string;
136
+ }>;
137
+ prepareEncryptedUploadV2(context: EncryptedUploadV2ProviderContext): Promise<EncryptedUploadV2Material>;
138
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,48 @@
1
+ import type { CoreBridge } from './core.ts';
2
+ import { DeviceManager } from './deviceManager.ts';
3
+ import type { DeprovisionRequest, DeprovisionResult, DeviceConnectionSettings, ProvisionRequest } from './models.ts';
4
+ import type { ProvisioningProvider } from './providers.ts';
5
+ import { type BrowserSdkStorage } from './storage.ts';
6
+ import { type BrowserBluetoothTransport } from './transport.ts';
7
+ import { BrowserWorkflowRuntime } from './workflowRuntime.ts';
8
+ interface ProvisioningManagerOptions {
9
+ core: CoreBridge;
10
+ transport: BrowserBluetoothTransport;
11
+ runtime: BrowserWorkflowRuntime;
12
+ devices: DeviceManager;
13
+ storage?: BrowserSdkStorage | null;
14
+ provider?: ProvisioningProvider | null;
15
+ now?: () => number;
16
+ deprovisionTimeoutMs?: number | undefined;
17
+ }
18
+ export declare class ProvisioningManager {
19
+ private readonly core;
20
+ private readonly transport;
21
+ private readonly runtime;
22
+ private readonly devices;
23
+ private readonly storage;
24
+ private readonly provider;
25
+ private readonly now;
26
+ private readonly deprovisionTimeoutMs;
27
+ private activeProvision;
28
+ private destroyed;
29
+ private destroyPromise;
30
+ constructor(options: ProvisioningManagerOptions);
31
+ provision(request: ProvisionRequest): Promise<void>;
32
+ deprovision(request: DeprovisionRequest): Promise<DeprovisionResult>;
33
+ readConnectionSettings(): Promise<DeviceConnectionSettings>;
34
+ writeConnectionSettings(settings: DeviceConnectionSettings): Promise<void>;
35
+ destroy(): Promise<void>;
36
+ private runProvision;
37
+ private confirmProvisioning;
38
+ private confirmProvisioningWhileOwned;
39
+ private requireProvisioningReconciliation;
40
+ private performDeprovision;
41
+ private verifyConnectedDevice;
42
+ private requireConnected;
43
+ private gattStep;
44
+ private validateProvisionRequest;
45
+ private throwIfProvisionCancelled;
46
+ private disconnectMismatch;
47
+ }
48
+ export {};