@bota.dev/react-native-app-sdk 2.0.0-beta.10 → 2.0.0-beta.12
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/README.md +18 -8
- package/android/src/main/java/dev/bota/sdk/reactnative/BotaDeviceSDKPackage.kt +9 -0
- package/android/src/main/java/dev/bota/sdk/reactnative/upload/BotaUploadV2BackendModule.kt +66 -0
- package/android/src/main/java/dev/bota/sdk/reactnative/upload/NativeUpload.kt +400 -0
- package/android/src/main/java/dev/bota/sdk/reactnative/upload/UploadHttp.kt +158 -0
- package/android/src/main/java/dev/bota/sdk/reactnative/upload/UploadJournal.kt +112 -0
- package/android/src/main/java/dev/bota/sdk/reactnative/upload/UploadModels.kt +171 -0
- package/generated/codegen-contract.json +167 -8
- package/ios/BotaUploadV2Backend.mm +49 -0
- package/ios/UploadBackend/BotaUploadV2BackendBridge.swift +98 -0
- package/ios/UploadBackend/UploadCoordinator.swift +84 -0
- package/ios/UploadBackend/UploadHTTP.swift +82 -0
- package/ios/UploadBackend/UploadJournal.swift +187 -0
- package/ios/UploadBackend/UploadModels.swift +273 -0
- package/ios/UploadBackend/UploadOperation.swift +391 -0
- package/lib/commonjs/encryptedUploadV2Backend.js +200 -0
- package/lib/commonjs/encryptedUploadV2Backend.js.map +1 -0
- package/lib/commonjs/index.js +5 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/sdkIdentity.js +1 -1
- package/lib/commonjs/specs/NativeBotaUploadV2Backend.js +11 -0
- package/lib/commonjs/specs/NativeBotaUploadV2Backend.js.map +1 -0
- package/lib/module/encryptedUploadV2Backend.js +196 -0
- package/lib/module/encryptedUploadV2Backend.js.map +1 -0
- package/lib/module/index.js +3 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/sdkIdentity.js +1 -1
- package/lib/module/specs/NativeBotaUploadV2Backend.js +9 -0
- package/lib/module/specs/NativeBotaUploadV2Backend.js.map +1 -0
- package/lib/typescript/encryptedUploadV2Backend.d.ts +41 -0
- package/lib/typescript/encryptedUploadV2Backend.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +3 -0
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/sdkIdentity.d.ts +1 -1
- package/lib/typescript/specs/NativeBotaUploadV2Backend.d.ts +18 -0
- package/lib/typescript/specs/NativeBotaUploadV2Backend.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/encryptedUploadV2Backend.ts +171 -0
- package/src/index.ts +6 -0
- package/src/sdkIdentity.ts +1 -1
- package/src/specs/NativeBotaUploadV2Backend.ts +19 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createManagedEncryptedUploadV2Backend = createManagedEncryptedUploadV2Backend;
|
|
7
|
+
/** @internal Dependency injection keeps the public facade and host tests on the same implementation. */
|
|
8
|
+
function createManagedEncryptedUploadV2Backend(native, recordings, options) {
|
|
9
|
+
// Capture identity once; mutating the caller's object cannot repoint an active request.
|
|
10
|
+
const config = {
|
|
11
|
+
...options
|
|
12
|
+
};
|
|
13
|
+
const url = new URL(config.baseUrl);
|
|
14
|
+
const path = url.pathname.replace(/\/$/, '');
|
|
15
|
+
if (url.protocol !== 'https:' || url.username || url.password || url.search || url.hash || !/^(\/[A-Za-z0-9_-]+)+$/.test(path) || !config.scopeKey || !config.signal) {
|
|
16
|
+
throw new Error('Invalid encrypted upload backend configuration');
|
|
17
|
+
}
|
|
18
|
+
const apiOrigin = url.origin;
|
|
19
|
+
const attempts = new Set();
|
|
20
|
+
let disposed = false;
|
|
21
|
+
const backend = {
|
|
22
|
+
async sync(device, recording, target) {
|
|
23
|
+
device = {
|
|
24
|
+
...device
|
|
25
|
+
};
|
|
26
|
+
recording = {
|
|
27
|
+
...recording
|
|
28
|
+
};
|
|
29
|
+
target = {
|
|
30
|
+
...target,
|
|
31
|
+
priorUpload: target.priorUpload && {
|
|
32
|
+
...target.priorUpload
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
if (!native) throw new Error('Encrypted upload backend requires the matching native SDK binary');
|
|
36
|
+
if (disposed || config.signal.aborted || target.signal?.aborted) throw new Error('Encrypted upload cancelled');
|
|
37
|
+
const signal = new AbortController();
|
|
38
|
+
let operationId;
|
|
39
|
+
let selected;
|
|
40
|
+
let cancelTask;
|
|
41
|
+
let completed = false;
|
|
42
|
+
const check = () => {
|
|
43
|
+
if (disposed || signal.signal.aborted || config.signal.aborted || target.signal?.aborted) {
|
|
44
|
+
throw new Error('Encrypted upload cancelled');
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
const cancel = () => {
|
|
48
|
+
signal.abort();
|
|
49
|
+
if (operationId) cancelTask ??= Promise.resolve().then(() => native.cancel(operationId));
|
|
50
|
+
return cancelTask ?? Promise.resolve();
|
|
51
|
+
};
|
|
52
|
+
// Event callbacks must not create unhandled rejections; disposal awaits the same task.
|
|
53
|
+
const abort = () => {
|
|
54
|
+
void cancel().catch(() => {});
|
|
55
|
+
};
|
|
56
|
+
let settle;
|
|
57
|
+
const settled = new Promise(resolve => {
|
|
58
|
+
settle = resolve;
|
|
59
|
+
});
|
|
60
|
+
const attempt = {
|
|
61
|
+
cancel,
|
|
62
|
+
settled
|
|
63
|
+
};
|
|
64
|
+
attempts.add(attempt);
|
|
65
|
+
let subscription;
|
|
66
|
+
try {
|
|
67
|
+
config.signal.addEventListener('abort', abort, {
|
|
68
|
+
once: true
|
|
69
|
+
});
|
|
70
|
+
target.signal?.addEventListener('abort', abort, {
|
|
71
|
+
once: true
|
|
72
|
+
});
|
|
73
|
+
subscription = native.onCredentialsRequested(event => {
|
|
74
|
+
if (!operationId || event.operationId !== operationId) return;
|
|
75
|
+
void (async () => {
|
|
76
|
+
try {
|
|
77
|
+
check();
|
|
78
|
+
const token = await config.getAccessToken(signal.signal);
|
|
79
|
+
check();
|
|
80
|
+
await native.resolveCredentials(event.requestId, token);
|
|
81
|
+
} catch {
|
|
82
|
+
await native.rejectCredentials(event.requestId).catch(() => {});
|
|
83
|
+
}
|
|
84
|
+
})();
|
|
85
|
+
});
|
|
86
|
+
check();
|
|
87
|
+
await recordings.syncEncryptedRecordingV2(device, recording, async context => {
|
|
88
|
+
check();
|
|
89
|
+
if (!context.operationId || operationId && operationId !== context.operationId) {
|
|
90
|
+
throw new Error('Encrypted upload operation changed');
|
|
91
|
+
}
|
|
92
|
+
operationId = context.operationId;
|
|
93
|
+
const value = JSON.parse(await native.prepare(JSON.stringify({
|
|
94
|
+
operationId,
|
|
95
|
+
scope: {
|
|
96
|
+
apiOrigin,
|
|
97
|
+
apiBasePath: path,
|
|
98
|
+
scopeKey: config.scopeKey,
|
|
99
|
+
accountId: config.accountId,
|
|
100
|
+
projectId: config.projectId,
|
|
101
|
+
endUserId: config.endUserId,
|
|
102
|
+
organizationId: config.organizationId ?? '',
|
|
103
|
+
environment: config.environment,
|
|
104
|
+
deviceId: target.deviceId,
|
|
105
|
+
bindingGeneration: target.bindingGeneration,
|
|
106
|
+
serialNumber: device.serialNumber,
|
|
107
|
+
nativeDeviceId: device.id
|
|
108
|
+
},
|
|
109
|
+
recording: {
|
|
110
|
+
uuid: context.recording.uuid,
|
|
111
|
+
generation: context.recording.generation,
|
|
112
|
+
ciphertextLength: context.recording.ciphertextLength,
|
|
113
|
+
ciphertextSha256: context.recording.ciphertextSha256,
|
|
114
|
+
startedAtMs: context.recording.startedAtMs,
|
|
115
|
+
durationMs: context.recording.durationMs,
|
|
116
|
+
plaintextLength: context.recording.plaintextLength,
|
|
117
|
+
storageFormat: context.recording.storageFormat
|
|
118
|
+
},
|
|
119
|
+
capability: {
|
|
120
|
+
rawValueHex: context.capability.rawValueHex,
|
|
121
|
+
flags: context.capability.flags
|
|
122
|
+
},
|
|
123
|
+
...(context.checkpoint === undefined ? {} : {
|
|
124
|
+
checkpoint: {
|
|
125
|
+
version: context.checkpoint.version,
|
|
126
|
+
uploadSessionId: context.checkpoint.uploadSessionId,
|
|
127
|
+
ownerRevision: context.checkpoint.ownerRevision,
|
|
128
|
+
revision: context.checkpoint.revision,
|
|
129
|
+
nextCiphertextOffset: context.checkpoint.nextCiphertextOffset,
|
|
130
|
+
prefixSha256: context.checkpoint.prefixSha256,
|
|
131
|
+
highestContiguousSequence: context.checkpoint.highestContiguousSequence,
|
|
132
|
+
transportSessionId: context.checkpoint.transportSessionId,
|
|
133
|
+
sinkRegistrationId: context.checkpoint.sinkRegistrationId,
|
|
134
|
+
windowPackets: context.checkpoint.windowPackets,
|
|
135
|
+
dataPayloadBytes: context.checkpoint.dataPayloadBytes
|
|
136
|
+
}
|
|
137
|
+
}),
|
|
138
|
+
...(target.priorUpload === undefined ? {} : {
|
|
139
|
+
priorJournalEntry: {
|
|
140
|
+
recordingId: target.priorUpload.recordingId,
|
|
141
|
+
sessionId: target.priorUpload.sessionId,
|
|
142
|
+
ownerRevision: target.priorUpload.ownerRevision
|
|
143
|
+
}
|
|
144
|
+
})
|
|
145
|
+
})));
|
|
146
|
+
check();
|
|
147
|
+
const result = value;
|
|
148
|
+
if (!result || result.profile !== 'encrypted_upload_v2' || !/^rec_[A-Za-z0-9_-]+$/.test(result.recordingId) || !/^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/.test(result.uploadSessionId) || !Number.isSafeInteger(result.ownerRevision) || result.ownerRevision < 1 || !result.materialRegistrationId || !['legacy_allowed', 'v2_preferred', 'v2_required'].includes(result.securityPolicy)) {
|
|
149
|
+
throw new Error('Invalid encrypted upload backend response');
|
|
150
|
+
}
|
|
151
|
+
selected = result;
|
|
152
|
+
return {
|
|
153
|
+
profile: result.profile,
|
|
154
|
+
uploadSessionId: result.uploadSessionId,
|
|
155
|
+
ownerRevision: result.ownerRevision,
|
|
156
|
+
securityPolicy: result.securityPolicy,
|
|
157
|
+
materialRegistrationId: result.materialRegistrationId
|
|
158
|
+
};
|
|
159
|
+
}, progress => {
|
|
160
|
+
if (!signal.signal.aborted) target.onProgress?.(progress);
|
|
161
|
+
}, {
|
|
162
|
+
signal: signal.signal
|
|
163
|
+
});
|
|
164
|
+
check();
|
|
165
|
+
if (!operationId || !selected) throw new Error('Encrypted upload confirmation is missing');
|
|
166
|
+
// The native sync only resolves after signed receipt/CONFIRM. Never infer this from HTTP 2xx.
|
|
167
|
+
await native.complete(operationId);
|
|
168
|
+
completed = true;
|
|
169
|
+
return {
|
|
170
|
+
recordingId: selected.recordingId
|
|
171
|
+
};
|
|
172
|
+
} finally {
|
|
173
|
+
// Native complete already releases the operation. A later bridge cancellation
|
|
174
|
+
// failure must not turn confirmed device cleanup into a retryable sync failure.
|
|
175
|
+
try {
|
|
176
|
+
if (completed) signal.abort();else await cancel();
|
|
177
|
+
} finally {
|
|
178
|
+
attempts.delete(attempt);
|
|
179
|
+
config.signal.removeEventListener('abort', abort);
|
|
180
|
+
target.signal?.removeEventListener('abort', abort);
|
|
181
|
+
subscription?.remove();
|
|
182
|
+
settle();
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
async dispose() {
|
|
187
|
+
disposed = true;
|
|
188
|
+
const results = await Promise.allSettled([...attempts].map(async attempt => {
|
|
189
|
+
try {
|
|
190
|
+
await attempt.cancel();
|
|
191
|
+
} finally {
|
|
192
|
+
await attempt.settled;
|
|
193
|
+
}
|
|
194
|
+
}));
|
|
195
|
+
if (results.some(result => result.status === 'rejected')) throw new Error('Encrypted upload cancellation failed');
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
return backend;
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=encryptedUploadV2Backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createManagedEncryptedUploadV2Backend","native","recordings","options","config","url","URL","baseUrl","path","pathname","replace","protocol","username","password","search","hash","test","scopeKey","signal","Error","apiOrigin","origin","attempts","Set","disposed","backend","sync","device","recording","target","priorUpload","aborted","AbortController","operationId","selected","cancelTask","completed","check","cancel","abort","Promise","resolve","then","catch","settle","settled","attempt","add","subscription","addEventListener","once","onCredentialsRequested","event","token","getAccessToken","resolveCredentials","requestId","rejectCredentials","syncEncryptedRecordingV2","context","value","JSON","parse","prepare","stringify","scope","apiBasePath","accountId","projectId","endUserId","organizationId","environment","deviceId","bindingGeneration","serialNumber","nativeDeviceId","id","uuid","generation","ciphertextLength","ciphertextSha256","startedAtMs","durationMs","plaintextLength","storageFormat","capability","rawValueHex","flags","checkpoint","undefined","version","uploadSessionId","ownerRevision","revision","nextCiphertextOffset","prefixSha256","highestContiguousSequence","transportSessionId","sinkRegistrationId","windowPackets","dataPayloadBytes","priorJournalEntry","recordingId","sessionId","result","profile","Number","isSafeInteger","materialRegistrationId","includes","securityPolicy","progress","onProgress","complete","delete","removeEventListener","remove","dispose","results","allSettled","map","some","status"],"sourceRoot":"../../src","sources":["encryptedUploadV2Backend.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -101,6 +101,7 @@ Object.defineProperty(exports, "createBotaDeviceSDK", {
|
|
|
101
101
|
return _client.createBotaDeviceSDK;
|
|
102
102
|
}
|
|
103
103
|
});
|
|
104
|
+
exports.createEncryptedUploadV2Backend = void 0;
|
|
104
105
|
Object.defineProperty(exports, "createUploadRecoveryProvider", {
|
|
105
106
|
enumerable: true,
|
|
106
107
|
get: function () {
|
|
@@ -133,6 +134,8 @@ Object.defineProperty(exports, "readClientPresenceObservation", {
|
|
|
133
134
|
});
|
|
134
135
|
var _NativeBotaDeviceSDK = _interopRequireDefault(require("./specs/NativeBotaDeviceSDK"));
|
|
135
136
|
var _client = require("./client");
|
|
137
|
+
var _NativeBotaUploadV2Backend = _interopRequireDefault(require("./specs/NativeBotaUploadV2Backend"));
|
|
138
|
+
var _encryptedUploadV2Backend = require("./encryptedUploadV2Backend");
|
|
136
139
|
var _runtime = require("./compatibility/runtime");
|
|
137
140
|
var _BotaClient = require("./BotaClient");
|
|
138
141
|
var _clientPresence = require("./clientPresence");
|
|
@@ -147,6 +150,8 @@ var _errors = require("./utils/errors");
|
|
|
147
150
|
var _syncStatus = require("./sync/syncStatus");
|
|
148
151
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
149
152
|
const BotaDeviceSDK = exports.BotaDeviceSDK = (0, _client.createBotaDeviceSDK)(_NativeBotaDeviceSDK.default);
|
|
153
|
+
const createEncryptedUploadV2Backend = options => (0, _encryptedUploadV2Backend.createManagedEncryptedUploadV2Backend)(_NativeBotaUploadV2Backend.default, BotaDeviceSDK.recordings, options);
|
|
154
|
+
exports.createEncryptedUploadV2Backend = createEncryptedUploadV2Backend;
|
|
150
155
|
(0, _runtime.setDefaultCompatibilityClient)(BotaDeviceSDK);
|
|
151
156
|
const UPLOAD_RECOVERY_VERSION = exports.UPLOAD_RECOVERY_VERSION = 1;
|
|
152
157
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_NativeBotaDeviceSDK","_interopRequireDefault","require","_client","_runtime","_BotaClient","_clientPresence","_uploadRecovery","_deviceLogs","_deviceDiagnostics","_DeviceManager","_OTAManager","_RecordingManager","_StreamingSession","_errors","_syncStatus","e","__esModule","default","BotaDeviceSDK","exports","createBotaDeviceSDK","NativeBotaDeviceSDK","setDefaultCompatibilityClient","UPLOAD_RECOVERY_VERSION"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"
|
|
1
|
+
{"version":3,"names":["_NativeBotaDeviceSDK","_interopRequireDefault","require","_client","_NativeBotaUploadV2Backend","_encryptedUploadV2Backend","_runtime","_BotaClient","_clientPresence","_uploadRecovery","_deviceLogs","_deviceDiagnostics","_DeviceManager","_OTAManager","_RecordingManager","_StreamingSession","_errors","_syncStatus","e","__esModule","default","BotaDeviceSDK","exports","createBotaDeviceSDK","NativeBotaDeviceSDK","createEncryptedUploadV2Backend","options","createManagedEncryptedUploadV2Backend","NativeBotaUploadV2Backend","recordings","setDefaultCompatibilityClient","UPLOAD_RECOVERY_VERSION"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,oBAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,0BAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,yBAAA,GAAAH,OAAA;AAEA,IAAAI,QAAA,GAAAJ,OAAA;AAyDA,IAAAK,WAAA,GAAAL,OAAA;AAEA,IAAAM,eAAA,GAAAN,OAAA;AACA,IAAAO,eAAA,GAAAP,OAAA;AAgFA,IAAAQ,WAAA,GAAAR,OAAA;AACA,IAAAS,kBAAA,GAAAT,OAAA;AACA,IAAAU,cAAA,GAAAV,OAAA;AACA,IAAAW,WAAA,GAAAX,OAAA;AACA,IAAAY,iBAAA,GAAAZ,OAAA;AAEA,IAAAa,iBAAA,GAAAb,OAAA;AACA,IAAAc,OAAA,GAAAd,OAAA;AAWA,IAAAe,WAAA,GAAAf,OAAA;AAAqD,SAAAD,uBAAAiB,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AA3G9C,MAAMG,aAAa,GAAAC,OAAA,CAAAD,aAAA,GAAG,IAAAE,2BAAmB,EAACC,4BAAmB,CAAC;AAC9D,MAAMC,8BAA8B,GAAIC,OAAwC,IACrF,IAAAC,+DAAqC,EAACC,kCAAyB,EAAEP,aAAa,CAACQ,UAAU,EAAEH,OAAO,CAAC;AAACJ,OAAA,CAAAG,8BAAA,GAAAA,8BAAA;AAEtG,IAAAK,sCAA6B,EAACT,aAAa,CAAC;AA0FrC,MAAMU,uBAAuB,GAAAT,OAAA,CAAAS,uBAAA,GAAG,CAAC","ignoreList":[]}
|
|
@@ -6,5 +6,5 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.SDK_VERSION = exports.SDK_PACKAGE = void 0;
|
|
7
7
|
// Generated by cargo xtask client-identity generate. Do not edit.
|
|
8
8
|
const SDK_PACKAGE = exports.SDK_PACKAGE = '@bota.dev/react-native-app-sdk';
|
|
9
|
-
const SDK_VERSION = exports.SDK_VERSION = '2.0.0-beta.
|
|
9
|
+
const SDK_VERSION = exports.SDK_VERSION = '2.0.0-beta.12';
|
|
10
10
|
//# sourceMappingURL=sdkIdentity.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _reactNative = require("react-native");
|
|
8
|
+
/** Preparation/result JSON contains only bounded identity metadata. Signed
|
|
9
|
+
* documents and recording bytes stay in the native backend adapter. */
|
|
10
|
+
var _default = exports.default = _reactNative.TurboModuleRegistry.get('BotaUploadV2Backend');
|
|
11
|
+
//# sourceMappingURL=NativeBotaUploadV2Backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","get"],"sourceRoot":"../../../src","sources":["specs/NativeBotaUploadV2Backend.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAGA;AACA;AADA,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAceC,gCAAmB,CAACC,GAAG,CAAO,qBAAqB,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/** @internal Dependency injection keeps the public facade and host tests on the same implementation. */
|
|
4
|
+
export function createManagedEncryptedUploadV2Backend(native, recordings, options) {
|
|
5
|
+
// Capture identity once; mutating the caller's object cannot repoint an active request.
|
|
6
|
+
const config = {
|
|
7
|
+
...options
|
|
8
|
+
};
|
|
9
|
+
const url = new URL(config.baseUrl);
|
|
10
|
+
const path = url.pathname.replace(/\/$/, '');
|
|
11
|
+
if (url.protocol !== 'https:' || url.username || url.password || url.search || url.hash || !/^(\/[A-Za-z0-9_-]+)+$/.test(path) || !config.scopeKey || !config.signal) {
|
|
12
|
+
throw new Error('Invalid encrypted upload backend configuration');
|
|
13
|
+
}
|
|
14
|
+
const apiOrigin = url.origin;
|
|
15
|
+
const attempts = new Set();
|
|
16
|
+
let disposed = false;
|
|
17
|
+
const backend = {
|
|
18
|
+
async sync(device, recording, target) {
|
|
19
|
+
device = {
|
|
20
|
+
...device
|
|
21
|
+
};
|
|
22
|
+
recording = {
|
|
23
|
+
...recording
|
|
24
|
+
};
|
|
25
|
+
target = {
|
|
26
|
+
...target,
|
|
27
|
+
priorUpload: target.priorUpload && {
|
|
28
|
+
...target.priorUpload
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
if (!native) throw new Error('Encrypted upload backend requires the matching native SDK binary');
|
|
32
|
+
if (disposed || config.signal.aborted || target.signal?.aborted) throw new Error('Encrypted upload cancelled');
|
|
33
|
+
const signal = new AbortController();
|
|
34
|
+
let operationId;
|
|
35
|
+
let selected;
|
|
36
|
+
let cancelTask;
|
|
37
|
+
let completed = false;
|
|
38
|
+
const check = () => {
|
|
39
|
+
if (disposed || signal.signal.aborted || config.signal.aborted || target.signal?.aborted) {
|
|
40
|
+
throw new Error('Encrypted upload cancelled');
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
const cancel = () => {
|
|
44
|
+
signal.abort();
|
|
45
|
+
if (operationId) cancelTask ??= Promise.resolve().then(() => native.cancel(operationId));
|
|
46
|
+
return cancelTask ?? Promise.resolve();
|
|
47
|
+
};
|
|
48
|
+
// Event callbacks must not create unhandled rejections; disposal awaits the same task.
|
|
49
|
+
const abort = () => {
|
|
50
|
+
void cancel().catch(() => {});
|
|
51
|
+
};
|
|
52
|
+
let settle;
|
|
53
|
+
const settled = new Promise(resolve => {
|
|
54
|
+
settle = resolve;
|
|
55
|
+
});
|
|
56
|
+
const attempt = {
|
|
57
|
+
cancel,
|
|
58
|
+
settled
|
|
59
|
+
};
|
|
60
|
+
attempts.add(attempt);
|
|
61
|
+
let subscription;
|
|
62
|
+
try {
|
|
63
|
+
config.signal.addEventListener('abort', abort, {
|
|
64
|
+
once: true
|
|
65
|
+
});
|
|
66
|
+
target.signal?.addEventListener('abort', abort, {
|
|
67
|
+
once: true
|
|
68
|
+
});
|
|
69
|
+
subscription = native.onCredentialsRequested(event => {
|
|
70
|
+
if (!operationId || event.operationId !== operationId) return;
|
|
71
|
+
void (async () => {
|
|
72
|
+
try {
|
|
73
|
+
check();
|
|
74
|
+
const token = await config.getAccessToken(signal.signal);
|
|
75
|
+
check();
|
|
76
|
+
await native.resolveCredentials(event.requestId, token);
|
|
77
|
+
} catch {
|
|
78
|
+
await native.rejectCredentials(event.requestId).catch(() => {});
|
|
79
|
+
}
|
|
80
|
+
})();
|
|
81
|
+
});
|
|
82
|
+
check();
|
|
83
|
+
await recordings.syncEncryptedRecordingV2(device, recording, async context => {
|
|
84
|
+
check();
|
|
85
|
+
if (!context.operationId || operationId && operationId !== context.operationId) {
|
|
86
|
+
throw new Error('Encrypted upload operation changed');
|
|
87
|
+
}
|
|
88
|
+
operationId = context.operationId;
|
|
89
|
+
const value = JSON.parse(await native.prepare(JSON.stringify({
|
|
90
|
+
operationId,
|
|
91
|
+
scope: {
|
|
92
|
+
apiOrigin,
|
|
93
|
+
apiBasePath: path,
|
|
94
|
+
scopeKey: config.scopeKey,
|
|
95
|
+
accountId: config.accountId,
|
|
96
|
+
projectId: config.projectId,
|
|
97
|
+
endUserId: config.endUserId,
|
|
98
|
+
organizationId: config.organizationId ?? '',
|
|
99
|
+
environment: config.environment,
|
|
100
|
+
deviceId: target.deviceId,
|
|
101
|
+
bindingGeneration: target.bindingGeneration,
|
|
102
|
+
serialNumber: device.serialNumber,
|
|
103
|
+
nativeDeviceId: device.id
|
|
104
|
+
},
|
|
105
|
+
recording: {
|
|
106
|
+
uuid: context.recording.uuid,
|
|
107
|
+
generation: context.recording.generation,
|
|
108
|
+
ciphertextLength: context.recording.ciphertextLength,
|
|
109
|
+
ciphertextSha256: context.recording.ciphertextSha256,
|
|
110
|
+
startedAtMs: context.recording.startedAtMs,
|
|
111
|
+
durationMs: context.recording.durationMs,
|
|
112
|
+
plaintextLength: context.recording.plaintextLength,
|
|
113
|
+
storageFormat: context.recording.storageFormat
|
|
114
|
+
},
|
|
115
|
+
capability: {
|
|
116
|
+
rawValueHex: context.capability.rawValueHex,
|
|
117
|
+
flags: context.capability.flags
|
|
118
|
+
},
|
|
119
|
+
...(context.checkpoint === undefined ? {} : {
|
|
120
|
+
checkpoint: {
|
|
121
|
+
version: context.checkpoint.version,
|
|
122
|
+
uploadSessionId: context.checkpoint.uploadSessionId,
|
|
123
|
+
ownerRevision: context.checkpoint.ownerRevision,
|
|
124
|
+
revision: context.checkpoint.revision,
|
|
125
|
+
nextCiphertextOffset: context.checkpoint.nextCiphertextOffset,
|
|
126
|
+
prefixSha256: context.checkpoint.prefixSha256,
|
|
127
|
+
highestContiguousSequence: context.checkpoint.highestContiguousSequence,
|
|
128
|
+
transportSessionId: context.checkpoint.transportSessionId,
|
|
129
|
+
sinkRegistrationId: context.checkpoint.sinkRegistrationId,
|
|
130
|
+
windowPackets: context.checkpoint.windowPackets,
|
|
131
|
+
dataPayloadBytes: context.checkpoint.dataPayloadBytes
|
|
132
|
+
}
|
|
133
|
+
}),
|
|
134
|
+
...(target.priorUpload === undefined ? {} : {
|
|
135
|
+
priorJournalEntry: {
|
|
136
|
+
recordingId: target.priorUpload.recordingId,
|
|
137
|
+
sessionId: target.priorUpload.sessionId,
|
|
138
|
+
ownerRevision: target.priorUpload.ownerRevision
|
|
139
|
+
}
|
|
140
|
+
})
|
|
141
|
+
})));
|
|
142
|
+
check();
|
|
143
|
+
const result = value;
|
|
144
|
+
if (!result || result.profile !== 'encrypted_upload_v2' || !/^rec_[A-Za-z0-9_-]+$/.test(result.recordingId) || !/^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/.test(result.uploadSessionId) || !Number.isSafeInteger(result.ownerRevision) || result.ownerRevision < 1 || !result.materialRegistrationId || !['legacy_allowed', 'v2_preferred', 'v2_required'].includes(result.securityPolicy)) {
|
|
145
|
+
throw new Error('Invalid encrypted upload backend response');
|
|
146
|
+
}
|
|
147
|
+
selected = result;
|
|
148
|
+
return {
|
|
149
|
+
profile: result.profile,
|
|
150
|
+
uploadSessionId: result.uploadSessionId,
|
|
151
|
+
ownerRevision: result.ownerRevision,
|
|
152
|
+
securityPolicy: result.securityPolicy,
|
|
153
|
+
materialRegistrationId: result.materialRegistrationId
|
|
154
|
+
};
|
|
155
|
+
}, progress => {
|
|
156
|
+
if (!signal.signal.aborted) target.onProgress?.(progress);
|
|
157
|
+
}, {
|
|
158
|
+
signal: signal.signal
|
|
159
|
+
});
|
|
160
|
+
check();
|
|
161
|
+
if (!operationId || !selected) throw new Error('Encrypted upload confirmation is missing');
|
|
162
|
+
// The native sync only resolves after signed receipt/CONFIRM. Never infer this from HTTP 2xx.
|
|
163
|
+
await native.complete(operationId);
|
|
164
|
+
completed = true;
|
|
165
|
+
return {
|
|
166
|
+
recordingId: selected.recordingId
|
|
167
|
+
};
|
|
168
|
+
} finally {
|
|
169
|
+
// Native complete already releases the operation. A later bridge cancellation
|
|
170
|
+
// failure must not turn confirmed device cleanup into a retryable sync failure.
|
|
171
|
+
try {
|
|
172
|
+
if (completed) signal.abort();else await cancel();
|
|
173
|
+
} finally {
|
|
174
|
+
attempts.delete(attempt);
|
|
175
|
+
config.signal.removeEventListener('abort', abort);
|
|
176
|
+
target.signal?.removeEventListener('abort', abort);
|
|
177
|
+
subscription?.remove();
|
|
178
|
+
settle();
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
async dispose() {
|
|
183
|
+
disposed = true;
|
|
184
|
+
const results = await Promise.allSettled([...attempts].map(async attempt => {
|
|
185
|
+
try {
|
|
186
|
+
await attempt.cancel();
|
|
187
|
+
} finally {
|
|
188
|
+
await attempt.settled;
|
|
189
|
+
}
|
|
190
|
+
}));
|
|
191
|
+
if (results.some(result => result.status === 'rejected')) throw new Error('Encrypted upload cancellation failed');
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
return backend;
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=encryptedUploadV2Backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createManagedEncryptedUploadV2Backend","native","recordings","options","config","url","URL","baseUrl","path","pathname","replace","protocol","username","password","search","hash","test","scopeKey","signal","Error","apiOrigin","origin","attempts","Set","disposed","backend","sync","device","recording","target","priorUpload","aborted","AbortController","operationId","selected","cancelTask","completed","check","cancel","abort","Promise","resolve","then","catch","settle","settled","attempt","add","subscription","addEventListener","once","onCredentialsRequested","event","token","getAccessToken","resolveCredentials","requestId","rejectCredentials","syncEncryptedRecordingV2","context","value","JSON","parse","prepare","stringify","scope","apiBasePath","accountId","projectId","endUserId","organizationId","environment","deviceId","bindingGeneration","serialNumber","nativeDeviceId","id","uuid","generation","ciphertextLength","ciphertextSha256","startedAtMs","durationMs","plaintextLength","storageFormat","capability","rawValueHex","flags","checkpoint","undefined","version","uploadSessionId","ownerRevision","revision","nextCiphertextOffset","prefixSha256","highestContiguousSequence","transportSessionId","sinkRegistrationId","windowPackets","dataPayloadBytes","priorJournalEntry","recordingId","sessionId","result","profile","Number","isSafeInteger","materialRegistrationId","includes","securityPolicy","progress","onProgress","complete","delete","removeEventListener","remove","dispose","results","allSettled","map","some","status"],"sourceRoot":"../../src","sources":["encryptedUploadV2Backend.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -2,9 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
import NativeBotaDeviceSDK from './specs/NativeBotaDeviceSDK';
|
|
4
4
|
import { createBotaDeviceSDK } from './client';
|
|
5
|
+
import NativeBotaUploadV2Backend from './specs/NativeBotaUploadV2Backend';
|
|
6
|
+
import { createManagedEncryptedUploadV2Backend } from './encryptedUploadV2Backend';
|
|
5
7
|
import { setDefaultCompatibilityClient } from './compatibility/runtime';
|
|
6
8
|
export { BotaNativeModuleError, createBotaDeviceSDK } from './client';
|
|
7
9
|
export const BotaDeviceSDK = createBotaDeviceSDK(NativeBotaDeviceSDK);
|
|
10
|
+
export const createEncryptedUploadV2Backend = options => createManagedEncryptedUploadV2Backend(NativeBotaUploadV2Backend, BotaDeviceSDK.recordings, options);
|
|
8
11
|
setDefaultCompatibilityClient(BotaDeviceSDK);
|
|
9
12
|
export { BotaClient } from './BotaClient';
|
|
10
13
|
export { readClientPresenceObservation } from './clientPresence';
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NativeBotaDeviceSDK","createBotaDeviceSDK","setDefaultCompatibilityClient","BotaNativeModuleError","BotaDeviceSDK","BotaClient","readClientPresenceObservation","createUploadRecoveryProvider","DeviceLogDecoder","DeviceDiagnosticsDecoder","diagnosticEventIdCommand","DeviceManager","OTAManager","RecordingManager","UPLOAD_RECOVERY_VERSION","StreamingSession","BotaError","BluetoothError","DeviceError","ProvisioningError","SdkError","TransferError","UploadError","isBotaError","deriveSyncStatus"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,OAAOA,mBAAmB,MAAM,6BAA6B;AAC7D,SAASC,mBAAmB,QAAQ,UAAU;AAC9C,SAASC,6BAA6B,QAAQ,yBAAyB;AAEvE,SACEC,qBAAqB,
|
|
1
|
+
{"version":3,"names":["NativeBotaDeviceSDK","createBotaDeviceSDK","NativeBotaUploadV2Backend","createManagedEncryptedUploadV2Backend","setDefaultCompatibilityClient","BotaNativeModuleError","BotaDeviceSDK","createEncryptedUploadV2Backend","options","recordings","BotaClient","readClientPresenceObservation","createUploadRecoveryProvider","DeviceLogDecoder","DeviceDiagnosticsDecoder","diagnosticEventIdCommand","DeviceManager","OTAManager","RecordingManager","UPLOAD_RECOVERY_VERSION","StreamingSession","BotaError","BluetoothError","DeviceError","ProvisioningError","SdkError","TransferError","UploadError","isBotaError","deriveSyncStatus"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,OAAOA,mBAAmB,MAAM,6BAA6B;AAC7D,SAASC,mBAAmB,QAAQ,UAAU;AAC9C,OAAOC,yBAAyB,MAAM,mCAAmC;AACzE,SAASC,qCAAqC,QAAQ,4BAA4B;AAElF,SAASC,6BAA6B,QAAQ,yBAAyB;AAEvE,SACEC,qBAAqB,EACrBJ,mBAAmB,QACd,UAAU;AA8CjB,OAAO,MAAMK,aAAa,GAAGL,mBAAmB,CAACD,mBAAmB,CAAC;AACrE,OAAO,MAAMO,8BAA8B,GAAIC,OAAwC,IACrFL,qCAAqC,CAACD,yBAAyB,EAAEI,aAAa,CAACG,UAAU,EAAED,OAAO,CAAC;AAErGJ,6BAA6B,CAACE,aAAa,CAAC;AAE5C,SAASI,UAAU,QAAQ,cAAc;AAEzC,SAASC,6BAA6B,QAAQ,kBAAkB;AAChE,SAASC,4BAA4B,QAAQ,kBAAkB;AAgF/D,SAASC,gBAAgB,QAAQ,kBAAkB;AACnD,SAASC,wBAAwB,EAAEC,wBAAwB,QAAQ,yBAAyB;AAC5F,SAASC,aAAa,QAAQ,0BAA0B;AACxD,SAASC,UAAU,QAAQ,uBAAuB;AAClD,SAASC,gBAAgB,QAAQ,6BAA6B;AAC9D,OAAO,MAAMC,uBAAuB,GAAG,CAAC;AACxC,SAASC,gBAAgB,QAAQ,6BAA6B;AAC9D,SACEC,SAAS,EACTC,cAAc,EACdC,WAAW,EACXC,iBAAiB,EACjBC,QAAQ,EACRC,aAAa,EACbC,WAAW,EACXC,WAAW,QACN,gBAAgB;AAEvB,SAASC,gBAAgB,QAAQ,mBAAmB","ignoreList":[]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { TurboModuleRegistry } from 'react-native';
|
|
4
|
+
|
|
5
|
+
/** Preparation/result JSON contains only bounded identity metadata. Signed
|
|
6
|
+
* documents and recording bytes stay in the native backend adapter. */
|
|
7
|
+
|
|
8
|
+
export default TurboModuleRegistry.get('BotaUploadV2Backend');
|
|
9
|
+
//# sourceMappingURL=NativeBotaUploadV2Backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["TurboModuleRegistry","get"],"sourceRoot":"../../../src","sources":["specs/NativeBotaUploadV2Backend.ts"],"mappings":";;AACA,SAASA,mBAAmB,QAAQ,cAAc;;AAGlD;AACA;;AAaA,eAAeA,mBAAmB,CAACC,GAAG,CAAO,qBAAqB,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { BotaDeviceSDKRecordingClient, BotaEncryptedUploadV2Recording, BotaEncryptedUploadV2Progress } from './client';
|
|
2
|
+
import type { ConnectedDevice } from './models/Device';
|
|
3
|
+
import type { Spec } from './specs/NativeBotaUploadV2Backend';
|
|
4
|
+
export interface EncryptedUploadV2BackendOptions {
|
|
5
|
+
/** Customer-authenticated HTTPS proxy exposing the v2 routes, e.g. https://api.example.com/v1. */
|
|
6
|
+
baseUrl: string;
|
|
7
|
+
/** Stable, non-secret account/project/environment identity. */
|
|
8
|
+
scopeKey: string;
|
|
9
|
+
accountId: string;
|
|
10
|
+
projectId: string;
|
|
11
|
+
endUserId: string;
|
|
12
|
+
environment: string;
|
|
13
|
+
/** Only needed by an organization-scoped backend bridge. */
|
|
14
|
+
organizationId?: string;
|
|
15
|
+
/** Abort permanently on logout or any account/project/binding change. */
|
|
16
|
+
signal: AbortSignal;
|
|
17
|
+
/** Return an application access token, never a Bota secret API key. */
|
|
18
|
+
getAccessToken(signal: AbortSignal): Promise<string>;
|
|
19
|
+
}
|
|
20
|
+
export interface EncryptedUploadV2SyncTarget {
|
|
21
|
+
deviceId: string;
|
|
22
|
+
bindingGeneration: number;
|
|
23
|
+
signal?: AbortSignal;
|
|
24
|
+
onProgress?: (progress: BotaEncryptedUploadV2Progress) => void;
|
|
25
|
+
/** Optional import of an existing integration's exact cloud identity. */
|
|
26
|
+
priorUpload?: {
|
|
27
|
+
recordingId: string;
|
|
28
|
+
sessionId?: string;
|
|
29
|
+
ownerRevision?: number;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export interface EncryptedUploadV2Backend {
|
|
33
|
+
/** Reinvoking after restart/reconnect resumes the native journal for this exact recording. */
|
|
34
|
+
sync(device: ConnectedDevice, recording: BotaEncryptedUploadV2Recording, target: EncryptedUploadV2SyncTarget): Promise<{
|
|
35
|
+
recordingId: string;
|
|
36
|
+
}>;
|
|
37
|
+
dispose(): Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
/** @internal Dependency injection keeps the public facade and host tests on the same implementation. */
|
|
40
|
+
export declare function createManagedEncryptedUploadV2Backend(native: Spec | null, recordings: BotaDeviceSDKRecordingClient, options: EncryptedUploadV2BackendOptions): EncryptedUploadV2Backend;
|
|
41
|
+
//# sourceMappingURL=encryptedUploadV2Backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryptedUploadV2Backend.d.ts","sourceRoot":"","sources":["../../src/encryptedUploadV2Backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,8BAA8B,EAClC,6BAA6B,EAAE,MAAM,UAAU,CAAC;AACxF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mCAAmC,CAAC;AAE9D,MAAM,WAAW,+BAA+B;IAC9C,kGAAkG;IAClG,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,MAAM,EAAE,WAAW,CAAC;IACpB,uEAAuE;IACvE,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,6BAA6B,KAAK,IAAI,CAAC;IAC/D,yEAAyE;IACzE,WAAW,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACnF;AAED,MAAM,WAAW,wBAAwB;IACvC,8FAA8F;IAC9F,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,8BAA8B,EACrE,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,wGAAwG;AACxG,wBAAgB,qCAAqC,CACnD,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE,UAAU,EAAE,4BAA4B,EAC7D,OAAO,EAAE,+BAA+B,GACvC,wBAAwB,CAgI1B"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import type { EncryptedUploadV2BackendOptions } from './encryptedUploadV2Backend';
|
|
1
2
|
export { BotaNativeModuleError, createBotaDeviceSDK, } from './client';
|
|
2
3
|
export type { BotaClientPresenceContext, BotaClientPresence, BotaAsyncEventSubscription, BotaDeviceSDKCapabilities, BotaDeviceSDKClient, BotaDeviceSDKConfiguration, BotaEncryptedUploadV2Capability, BotaEncryptedUploadV2Checkpoint, BotaEncryptedUploadV2ProfileDecision, BotaEncryptedUploadV2ProfileProvider, BotaEncryptedUploadV2Progress, BotaEncryptedUploadV2ProgressPhase, BotaEncryptedUploadV2ProviderContext, BotaEncryptedUploadV2Recording, BotaEncryptedUploadV2PendingRecording, BotaEncryptedUploadV2SyncOptions, BotaEncryptedUploadV2SecurityPolicy, BotaDeprovisionResult, BotaDeviceSDKDeviceClient, BotaDeviceSDKFactoryResetClient, BotaDeviceSDKLogClient, BotaDeviceSDKWiFiClient, BotaDeviceSDKProvisioningClient, BotaDeviceSDKRecordingClient, BotaDeviceSDKStreamingClient, BotaDeviceSDKState, BotaEventSubscription, BotaFactoryResetCompletion, BotaFactoryResetGrantProvider, BotaFactoryResetGrantRequest, BotaFactoryResetOptions, BotaFirmwareImage, BotaFirmwareUpdatePhase, BotaFirmwareUpdateProgress, BotaLogLevel, BotaDeviceSDKOTAClient, BotaProvisioningMaterial, BotaProvisioningMaterialProvider, BotaProvisioningMaterialRequest, BotaRecordingTransferProgress, BotaUploadOwnershipRequest, BotaUploadOwnershipResult, } from './client';
|
|
3
4
|
export declare const BotaDeviceSDK: import("./client").BotaDeviceSDKClient;
|
|
5
|
+
export declare const createEncryptedUploadV2Backend: (options: EncryptedUploadV2BackendOptions) => import("./encryptedUploadV2Backend").EncryptedUploadV2Backend;
|
|
6
|
+
export type { EncryptedUploadV2BackendOptions, EncryptedUploadV2Backend, EncryptedUploadV2SyncTarget } from './encryptedUploadV2Backend';
|
|
4
7
|
export { BotaClient } from './BotaClient';
|
|
5
8
|
export type { ClientPresence, SdkClientContext } from './clientPresence';
|
|
6
9
|
export { readClientPresenceObservation } from './clientPresence';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,UAAU,CAAC;AAClB,YAAY,EACV,yBAAyB,EACzB,kBAAkB,EAClB,0BAA0B,EAC1B,yBAAyB,EACzB,mBAAmB,EACnB,0BAA0B,EAC1B,+BAA+B,EAC/B,+BAA+B,EAC/B,oCAAoC,EACpC,oCAAoC,EACpC,6BAA6B,EAC7B,kCAAkC,EAClC,oCAAoC,EACpC,8BAA8B,EAC9B,qCAAqC,EACrC,gCAAgC,EAChC,mCAAmC,EACnC,qBAAqB,EACrB,yBAAyB,EACzB,+BAA+B,EAC/B,sBAAsB,EACtB,uBAAuB,EACvB,+BAA+B,EAC/B,4BAA4B,EAC5B,4BAA4B,EAC5B,kBAAkB,EAClB,qBAAqB,EACrB,0BAA0B,EAC1B,6BAA6B,EAC7B,4BAA4B,EAC5B,uBAAuB,EACvB,iBAAiB,EACjB,uBAAuB,EACvB,0BAA0B,EAC1B,YAAY,EACZ,sBAAsB,EACtB,wBAAwB,EACxB,gCAAgC,EAChC,+BAA+B,EAC/B,6BAA6B,EAC7B,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,UAAU,CAAC;AAElB,eAAO,MAAM,aAAa,wCAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|