@ohm_studio/sdk-react-native 0.5.3 → 0.7.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.
- package/README.md +34 -0
- package/dist/index.d.ts +14 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +96 -2
- package/dist/index.js.map +1 -1
- package/dist/queue.d.ts +114 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/queue.js +165 -0
- package/dist/queue.js.map +1 -0
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +19 -1
- package/dist/react/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -66,6 +66,40 @@ export default function App() {
|
|
|
66
66
|
}
|
|
67
67
|
```
|
|
68
68
|
|
|
69
|
+
## Cancellation, upload progress, and discovery (v0.6+)
|
|
70
|
+
|
|
71
|
+
Every method accepts `signal?: AbortSignal`. `audio.transcribe` and
|
|
72
|
+
`audio.extract` accept `onProgress`. `ohm.apis.list()` enumerates
|
|
73
|
+
published APIs.
|
|
74
|
+
|
|
75
|
+
```tsx
|
|
76
|
+
const controller = new AbortController();
|
|
77
|
+
|
|
78
|
+
const { data } = await ohm.audio.extract({
|
|
79
|
+
apiSlug: "opd-clinic",
|
|
80
|
+
file: { uri, name: "rec.m4a", type: "audio/mp4" },
|
|
81
|
+
signal: controller.signal,
|
|
82
|
+
onProgress: ({ percent }) => setProgress(percent),
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
const apis = await ohm.apis.list();
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
The React hooks (`useOhmExtract`, `useOhmAudioExtract`,
|
|
89
|
+
`useOhmSummarize`, `useRecorder`) auto-abort on unmount and on the next
|
|
90
|
+
mutation. Aborts surface as `OHMAbortError` (`code: "aborted"`) —
|
|
91
|
+
pattern match to ignore them.
|
|
92
|
+
|
|
93
|
+
## Typed `data` with the Studio CLI
|
|
94
|
+
|
|
95
|
+
Pair with [`@ohm_studio/cli`](https://www.npmjs.com/package/@ohm_studio/cli)
|
|
96
|
+
to generate TypeScript interfaces from your Studio schemas:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
npm install -D @ohm_studio/cli
|
|
100
|
+
npx ohm-studio pull-all --out src/ohm
|
|
101
|
+
```
|
|
102
|
+
|
|
69
103
|
## Production: proxy your backend
|
|
70
104
|
|
|
71
105
|
Don't ship live keys. Run a tiny proxy on your backend that holds the live key and forwards requests from your RN app (authenticated with your existing session token). Documented at [docs.ohm.doctor/security/rn-key-handling](https://docs.ohm.doctor/security/rn-key-handling).
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { OHMCoreClient } from "@ohm_studio/sdk-core";
|
|
2
|
-
import type { OHMInit } from "@ohm_studio/sdk-core";
|
|
2
|
+
import type { OHMInit, UploadProgressEvent } from "@ohm_studio/sdk-core";
|
|
3
3
|
export * from "@ohm_studio/sdk-core";
|
|
4
4
|
export { ExpoRecorder, RecorderError, isExpoAvAvailable, } from "./recorder";
|
|
5
5
|
export type { ExpoRecorderOptions, RNFile, RecorderState, RecorderErrorCode, } from "./recorder";
|
|
6
6
|
export { BareRecorder } from "./bare-recorder";
|
|
7
7
|
export type { BareRecorderOptions } from "./bare-recorder";
|
|
8
|
+
export { OhmQueue, makeAsyncStorageAdapter } from "./queue";
|
|
9
|
+
export type { QueueEntry, QueueStorage } from "./queue";
|
|
8
10
|
/**
|
|
9
11
|
* OHM Studio SDK for React Native.
|
|
10
12
|
*
|
|
@@ -33,7 +35,18 @@ export declare class OHM extends OHMCoreClient {
|
|
|
33
35
|
path: string;
|
|
34
36
|
file: any;
|
|
35
37
|
fields?: Record<string, string>;
|
|
38
|
+
signal?: AbortSignal;
|
|
39
|
+
idempotencyKey?: string;
|
|
40
|
+
onProgress?: (event: UploadProgressEvent) => void;
|
|
36
41
|
}): Promise<T>;
|
|
42
|
+
/**
|
|
43
|
+
* RN doesn't expose upload progress through `fetch`, so when the
|
|
44
|
+
* caller wants progress we fall back to XMLHttpRequest. Mirrors the
|
|
45
|
+
* sdk-js implementation byte-for-byte; kept duplicated rather than
|
|
46
|
+
* lifted into core because the FormData body type differs by platform
|
|
47
|
+
* and we want zero-cost when the caller doesn't request progress.
|
|
48
|
+
*/
|
|
49
|
+
private runMultipartXhr;
|
|
37
50
|
protected buildMultipartBody(file: unknown, fields?: Record<string, string>): Promise<unknown>;
|
|
38
51
|
}
|
|
39
52
|
export default OHM;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,aAAa,EAId,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAEV,OAAO,EACP,mBAAmB,EACpB,MAAM,sBAAsB,CAAC;AAE9B,cAAc,sBAAsB,CAAC;AACrC,OAAO,EACL,YAAY,EACZ,aAAa,EACb,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,mBAAmB,EACnB,MAAM,EACN,aAAa,EACb,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,YAAY,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAC5D,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAYxD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,GAAI,SAAQ,aAAa;gBACxB,IAAI,EAAE,OAAO;cAiBT,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE;QACpC,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,GAAG,CAAC;QACV,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,MAAM,CAAC,EAAE,WAAW,CAAC;QACrB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;KACnD,GAAG,OAAO,CAAC,CAAC,CAAC;IAsBd;;;;;;OAMG;IACH,OAAO,CAAC,eAAe;cAsFP,kBAAkB,CAChC,IAAI,EAAE,OAAO,EACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,OAAO,CAAC,OAAO,CAAC;CAuBpB;AAED,eAAe,GAAG,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { OHMConfigError, OHMCoreClient } from "@ohm_studio/sdk-core";
|
|
1
|
+
import { OHMAbortError, OHMAuthError, OHMConfigError, OHMCoreClient, OHMRateLimitError, OHMServerError, OHMValidationError, } from "@ohm_studio/sdk-core";
|
|
2
2
|
export * from "@ohm_studio/sdk-core";
|
|
3
3
|
export { ExpoRecorder, RecorderError, isExpoAvAvailable, } from "./recorder";
|
|
4
4
|
export { BareRecorder } from "./bare-recorder";
|
|
5
|
+
export { OhmQueue, makeAsyncStorageAdapter } from "./queue";
|
|
5
6
|
/** Detect React Native runtime — used to gate the bundled-key safeguard. */
|
|
6
7
|
function isReactNative() {
|
|
7
8
|
return (
|
|
@@ -47,7 +48,100 @@ export class OHM extends OHMCoreClient {
|
|
|
47
48
|
}
|
|
48
49
|
async runMultipart(opts) {
|
|
49
50
|
const fd = (await this.buildMultipartBody(opts.file, opts.fields));
|
|
50
|
-
|
|
51
|
+
if (opts.onProgress && typeof XMLHttpRequest !== "undefined") {
|
|
52
|
+
return this.runMultipartXhr({
|
|
53
|
+
path: opts.path,
|
|
54
|
+
body: fd,
|
|
55
|
+
signal: opts.signal,
|
|
56
|
+
idempotencyKey: opts.idempotencyKey,
|
|
57
|
+
onProgress: opts.onProgress,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
return this.requestRaw("POST", opts.path, { body: fd }, { signal: opts.signal, idempotencyKey: opts.idempotencyKey });
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* RN doesn't expose upload progress through `fetch`, so when the
|
|
64
|
+
* caller wants progress we fall back to XMLHttpRequest. Mirrors the
|
|
65
|
+
* sdk-js implementation byte-for-byte; kept duplicated rather than
|
|
66
|
+
* lifted into core because the FormData body type differs by platform
|
|
67
|
+
* and we want zero-cost when the caller doesn't request progress.
|
|
68
|
+
*/
|
|
69
|
+
runMultipartXhr(opts) {
|
|
70
|
+
const url = `${this.baseUrl}${opts.path}`;
|
|
71
|
+
const apiKey = this.apiKey;
|
|
72
|
+
const jwt = this.jwt;
|
|
73
|
+
return new Promise((resolve, reject) => {
|
|
74
|
+
if (opts.signal?.aborted) {
|
|
75
|
+
reject(new OHMAbortError());
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const xhr = new XMLHttpRequest();
|
|
79
|
+
xhr.open("POST", url, true);
|
|
80
|
+
if (apiKey)
|
|
81
|
+
xhr.setRequestHeader("Authorization", `Bearer ${apiKey}`);
|
|
82
|
+
else if (jwt)
|
|
83
|
+
xhr.setRequestHeader("Authorization", `Bearer ${jwt}`);
|
|
84
|
+
xhr.setRequestHeader("X-OHM-Client", "@ohm_studio/sdk-react-native@0.7.0");
|
|
85
|
+
if (opts.idempotencyKey) {
|
|
86
|
+
xhr.setRequestHeader("Idempotency-Key", opts.idempotencyKey);
|
|
87
|
+
}
|
|
88
|
+
xhr.upload.onprogress = (ev) => {
|
|
89
|
+
const total = ev.lengthComputable ? ev.total : 0;
|
|
90
|
+
const loaded = ev.loaded;
|
|
91
|
+
const percent = total > 0 ? Math.round((loaded / total) * 1000) / 10 : 0;
|
|
92
|
+
opts.onProgress({ loaded, total, percent });
|
|
93
|
+
};
|
|
94
|
+
xhr.onerror = () => reject(new OHMServerError({
|
|
95
|
+
message: "Network error during upload",
|
|
96
|
+
status: 0,
|
|
97
|
+
}));
|
|
98
|
+
xhr.onabort = () => reject(new OHMAbortError());
|
|
99
|
+
xhr.onload = () => {
|
|
100
|
+
const status = xhr.status;
|
|
101
|
+
const requestId = xhr.getResponseHeader("x-request-id") ||
|
|
102
|
+
xhr.getResponseHeader("x-ohm-request-id") ||
|
|
103
|
+
undefined;
|
|
104
|
+
let body = {};
|
|
105
|
+
try {
|
|
106
|
+
body = xhr.responseText ? JSON.parse(xhr.responseText) : {};
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
body = { message: xhr.responseText };
|
|
110
|
+
}
|
|
111
|
+
if (status >= 200 && status < 300) {
|
|
112
|
+
resolve(body);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const message = body?.message || `HTTP ${status}`;
|
|
116
|
+
if (status === 401 || status === 403) {
|
|
117
|
+
reject(new OHMAuthError({ message, status, requestId }));
|
|
118
|
+
}
|
|
119
|
+
else if (status === 422 || status === 400) {
|
|
120
|
+
reject(new OHMValidationError({
|
|
121
|
+
message,
|
|
122
|
+
status,
|
|
123
|
+
requestId,
|
|
124
|
+
fields: body?.fields,
|
|
125
|
+
}));
|
|
126
|
+
}
|
|
127
|
+
else if (status === 429) {
|
|
128
|
+
const retryAfter = xhr.getResponseHeader("retry-after");
|
|
129
|
+
reject(new OHMRateLimitError({
|
|
130
|
+
message,
|
|
131
|
+
status,
|
|
132
|
+
requestId,
|
|
133
|
+
retryAfterSec: retryAfter ? Number(retryAfter) : body?.retryAfterSec,
|
|
134
|
+
}));
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
reject(new OHMServerError({ message, status, requestId }));
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
if (opts.signal) {
|
|
141
|
+
opts.signal.addEventListener("abort", () => xhr.abort(), { once: true });
|
|
142
|
+
}
|
|
143
|
+
xhr.send(opts.body);
|
|
144
|
+
});
|
|
51
145
|
}
|
|
52
146
|
async buildMultipartBody(file, fields) {
|
|
53
147
|
const fd = new FormData();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/queue.d.ts
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ─────────────────────────────────────────────────────────────────────
|
|
3
|
+
* Offline queue for OHM extractions on React Native — for flaky wifi
|
|
4
|
+
* ─────────────────────────────────────────────────────────────────────
|
|
5
|
+
*
|
|
6
|
+
* Hospital basements / OT lifts / ICU corridors lose network mid-call.
|
|
7
|
+
* If a clinician records vitals during a network blip, we don't want
|
|
8
|
+
* the recording to disappear — we want it queued and replayed when
|
|
9
|
+
* connectivity returns.
|
|
10
|
+
*
|
|
11
|
+
* This module is a tiny BYO-storage queue. The customer plugs in their
|
|
12
|
+
* own storage adapter (typically AsyncStorage from
|
|
13
|
+
* @react-native-async-storage/async-storage) — we don't bundle the
|
|
14
|
+
* dependency to keep peer-dep churn low. The pattern:
|
|
15
|
+
*
|
|
16
|
+
* import { OhmQueue, makeAsyncStorageAdapter } from "@ohm_studio/sdk-react-native";
|
|
17
|
+
* import AsyncStorage from "@react-native-async-storage/async-storage";
|
|
18
|
+
*
|
|
19
|
+
* const queue = new OhmQueue({
|
|
20
|
+
* storage: makeAsyncStorageAdapter(AsyncStorage),
|
|
21
|
+
* client: ohm,
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* // When a network call fails, enqueue:
|
|
25
|
+
* try {
|
|
26
|
+
* await ohm.audio.extract({ apiSlug, file, ... });
|
|
27
|
+
* } catch (e) {
|
|
28
|
+
* if (e instanceof OHMServerError && e.status === 0) {
|
|
29
|
+
* // network down — queue for later
|
|
30
|
+
* await queue.enqueue("audio.extract", { apiSlug, file, patientHash });
|
|
31
|
+
* }
|
|
32
|
+
* }
|
|
33
|
+
*
|
|
34
|
+
* // On app foreground / network reconnect, replay:
|
|
35
|
+
* await queue.flush(); // sequential, stops on first non-recoverable
|
|
36
|
+
*
|
|
37
|
+
* What's NOT here: automatic detection of network state. Customers wire
|
|
38
|
+
* NetInfo from @react-native-community/netinfo to call queue.flush()
|
|
39
|
+
* when connectivity returns. We don't bundle NetInfo for the same
|
|
40
|
+
* peer-dep reason.
|
|
41
|
+
*
|
|
42
|
+
* Persistence shape: one JSON-serialisable entry per call. Audio file
|
|
43
|
+
* URIs are stored AS PATHS, not as binary blobs — the file at the URI
|
|
44
|
+
* must still exist when flush runs. Customers should keep the file
|
|
45
|
+
* on disk until queue.markComplete(id) succeeds.
|
|
46
|
+
*/
|
|
47
|
+
import type { OHMCoreClient } from "@ohm_studio/sdk-core";
|
|
48
|
+
/**
|
|
49
|
+
* Minimal storage interface — `getItem` / `setItem` / `removeItem`
|
|
50
|
+
* matches AsyncStorage exactly. Pass any KV store with this shape.
|
|
51
|
+
*/
|
|
52
|
+
export interface QueueStorage {
|
|
53
|
+
getItem: (key: string) => Promise<string | null>;
|
|
54
|
+
setItem: (key: string, value: string) => Promise<void>;
|
|
55
|
+
removeItem: (key: string) => Promise<void>;
|
|
56
|
+
}
|
|
57
|
+
export interface QueueEntry {
|
|
58
|
+
id: string;
|
|
59
|
+
/** When the entry was enqueued (ISO-8601). */
|
|
60
|
+
enqueuedAt: string;
|
|
61
|
+
/** Which OHM method to call on flush. */
|
|
62
|
+
method: "extract" | "audio.extract" | "audio.transcribe";
|
|
63
|
+
/** Method-specific input. Audio inputs MUST keep `file` as { uri, name, type }. */
|
|
64
|
+
input: Record<string, unknown>;
|
|
65
|
+
/** How many times we've tried to flush this entry. */
|
|
66
|
+
attempts: number;
|
|
67
|
+
/** Last error message (truncated) — diagnostic only. */
|
|
68
|
+
lastError?: string;
|
|
69
|
+
}
|
|
70
|
+
export declare class OhmQueue {
|
|
71
|
+
private readonly opts;
|
|
72
|
+
constructor(opts: {
|
|
73
|
+
storage: QueueStorage;
|
|
74
|
+
client: OHMCoreClient;
|
|
75
|
+
});
|
|
76
|
+
/**
|
|
77
|
+
* Enqueue an entry for later replay. Returns the entry id so the
|
|
78
|
+
* caller can correlate (e.g. "show pending uploads" UI).
|
|
79
|
+
*/
|
|
80
|
+
enqueue(method: QueueEntry["method"], input: Record<string, unknown>): Promise<string>;
|
|
81
|
+
/**
|
|
82
|
+
* Read all queued entries. Useful for showing "X uploads pending"
|
|
83
|
+
* status in the UI.
|
|
84
|
+
*/
|
|
85
|
+
list(): Promise<QueueEntry[]>;
|
|
86
|
+
/** Drop a single entry by id. Used internally + after manual abandons. */
|
|
87
|
+
remove(id: string): Promise<void>;
|
|
88
|
+
/** Clear the entire queue. Used after a manual reset. */
|
|
89
|
+
clear(): Promise<void>;
|
|
90
|
+
/**
|
|
91
|
+
* Replay all queued entries sequentially. Stops on the first
|
|
92
|
+
* unrecoverable error so a permanent auth failure doesn't burn
|
|
93
|
+
* through every entry. Returns a summary of what happened.
|
|
94
|
+
*/
|
|
95
|
+
flush(): Promise<{
|
|
96
|
+
replayed: number;
|
|
97
|
+
failed: number;
|
|
98
|
+
skipped: number;
|
|
99
|
+
}>;
|
|
100
|
+
private replayOne;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Convenience adapter — turns @react-native-async-storage/async-storage
|
|
104
|
+
* (and any other AsyncStorage-shaped lib) into a QueueStorage.
|
|
105
|
+
*
|
|
106
|
+
* import AsyncStorage from "@react-native-async-storage/async-storage";
|
|
107
|
+
* const storage = makeAsyncStorageAdapter(AsyncStorage);
|
|
108
|
+
*/
|
|
109
|
+
export declare function makeAsyncStorageAdapter(asyncStorage: {
|
|
110
|
+
getItem: (k: string) => Promise<string | null>;
|
|
111
|
+
setItem: (k: string, v: string) => Promise<void>;
|
|
112
|
+
removeItem: (k: string) => Promise<void>;
|
|
113
|
+
}): QueueStorage;
|
|
114
|
+
//# sourceMappingURL=queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACjD,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,MAAM,EAAE,SAAS,GAAG,eAAe,GAAG,kBAAkB,CAAC;IACzD,mFAAmF;IACnF,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,sDAAsD;IACtD,QAAQ,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAKD,qBAAa,QAAQ;IAEjB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE;QACrB,OAAO,EAAE,YAAY,CAAC;QACtB,MAAM,EAAE,aAAa,CAAC;KACvB;IAGH;;;OAGG;IACG,OAAO,CACX,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,EAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,MAAM,CAAC;IAclB;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAWnC,0EAA0E;IACpE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvC,yDAAyD;IACnD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;YAiCY,SAAS;CAgBxB;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE;IACpD,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC/C,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C,GAAG,YAAY,CAMf"}
|
package/dist/queue.js
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ─────────────────────────────────────────────────────────────────────
|
|
3
|
+
* Offline queue for OHM extractions on React Native — for flaky wifi
|
|
4
|
+
* ─────────────────────────────────────────────────────────────────────
|
|
5
|
+
*
|
|
6
|
+
* Hospital basements / OT lifts / ICU corridors lose network mid-call.
|
|
7
|
+
* If a clinician records vitals during a network blip, we don't want
|
|
8
|
+
* the recording to disappear — we want it queued and replayed when
|
|
9
|
+
* connectivity returns.
|
|
10
|
+
*
|
|
11
|
+
* This module is a tiny BYO-storage queue. The customer plugs in their
|
|
12
|
+
* own storage adapter (typically AsyncStorage from
|
|
13
|
+
* @react-native-async-storage/async-storage) — we don't bundle the
|
|
14
|
+
* dependency to keep peer-dep churn low. The pattern:
|
|
15
|
+
*
|
|
16
|
+
* import { OhmQueue, makeAsyncStorageAdapter } from "@ohm_studio/sdk-react-native";
|
|
17
|
+
* import AsyncStorage from "@react-native-async-storage/async-storage";
|
|
18
|
+
*
|
|
19
|
+
* const queue = new OhmQueue({
|
|
20
|
+
* storage: makeAsyncStorageAdapter(AsyncStorage),
|
|
21
|
+
* client: ohm,
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* // When a network call fails, enqueue:
|
|
25
|
+
* try {
|
|
26
|
+
* await ohm.audio.extract({ apiSlug, file, ... });
|
|
27
|
+
* } catch (e) {
|
|
28
|
+
* if (e instanceof OHMServerError && e.status === 0) {
|
|
29
|
+
* // network down — queue for later
|
|
30
|
+
* await queue.enqueue("audio.extract", { apiSlug, file, patientHash });
|
|
31
|
+
* }
|
|
32
|
+
* }
|
|
33
|
+
*
|
|
34
|
+
* // On app foreground / network reconnect, replay:
|
|
35
|
+
* await queue.flush(); // sequential, stops on first non-recoverable
|
|
36
|
+
*
|
|
37
|
+
* What's NOT here: automatic detection of network state. Customers wire
|
|
38
|
+
* NetInfo from @react-native-community/netinfo to call queue.flush()
|
|
39
|
+
* when connectivity returns. We don't bundle NetInfo for the same
|
|
40
|
+
* peer-dep reason.
|
|
41
|
+
*
|
|
42
|
+
* Persistence shape: one JSON-serialisable entry per call. Audio file
|
|
43
|
+
* URIs are stored AS PATHS, not as binary blobs — the file at the URI
|
|
44
|
+
* must still exist when flush runs. Customers should keep the file
|
|
45
|
+
* on disk until queue.markComplete(id) succeeds.
|
|
46
|
+
*/
|
|
47
|
+
const STORAGE_KEY = "@ohm_studio/queue/v1";
|
|
48
|
+
const MAX_ATTEMPTS = 5;
|
|
49
|
+
export class OhmQueue {
|
|
50
|
+
opts;
|
|
51
|
+
constructor(opts) {
|
|
52
|
+
this.opts = opts;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Enqueue an entry for later replay. Returns the entry id so the
|
|
56
|
+
* caller can correlate (e.g. "show pending uploads" UI).
|
|
57
|
+
*/
|
|
58
|
+
async enqueue(method, input) {
|
|
59
|
+
const id = `q_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
|
|
60
|
+
const entries = await this.list();
|
|
61
|
+
entries.push({
|
|
62
|
+
id,
|
|
63
|
+
enqueuedAt: new Date().toISOString(),
|
|
64
|
+
method,
|
|
65
|
+
input,
|
|
66
|
+
attempts: 0,
|
|
67
|
+
});
|
|
68
|
+
await this.opts.storage.setItem(STORAGE_KEY, JSON.stringify(entries));
|
|
69
|
+
return id;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Read all queued entries. Useful for showing "X uploads pending"
|
|
73
|
+
* status in the UI.
|
|
74
|
+
*/
|
|
75
|
+
async list() {
|
|
76
|
+
const raw = await this.opts.storage.getItem(STORAGE_KEY);
|
|
77
|
+
if (!raw)
|
|
78
|
+
return [];
|
|
79
|
+
try {
|
|
80
|
+
const parsed = JSON.parse(raw);
|
|
81
|
+
return Array.isArray(parsed) ? parsed : [];
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/** Drop a single entry by id. Used internally + after manual abandons. */
|
|
88
|
+
async remove(id) {
|
|
89
|
+
const entries = (await this.list()).filter((e) => e.id !== id);
|
|
90
|
+
await this.opts.storage.setItem(STORAGE_KEY, JSON.stringify(entries));
|
|
91
|
+
}
|
|
92
|
+
/** Clear the entire queue. Used after a manual reset. */
|
|
93
|
+
async clear() {
|
|
94
|
+
await this.opts.storage.removeItem(STORAGE_KEY);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Replay all queued entries sequentially. Stops on the first
|
|
98
|
+
* unrecoverable error so a permanent auth failure doesn't burn
|
|
99
|
+
* through every entry. Returns a summary of what happened.
|
|
100
|
+
*/
|
|
101
|
+
async flush() {
|
|
102
|
+
let replayed = 0;
|
|
103
|
+
let failed = 0;
|
|
104
|
+
let skipped = 0;
|
|
105
|
+
const entries = await this.list();
|
|
106
|
+
const remaining = [];
|
|
107
|
+
for (const entry of entries) {
|
|
108
|
+
if (entry.attempts >= MAX_ATTEMPTS) {
|
|
109
|
+
skipped++;
|
|
110
|
+
remaining.push(entry); // keep for visibility — user must clear manually
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
await this.replayOne(entry);
|
|
115
|
+
replayed++;
|
|
116
|
+
}
|
|
117
|
+
catch (e) {
|
|
118
|
+
entry.attempts++;
|
|
119
|
+
entry.lastError = String(e?.message || e).slice(0, 200);
|
|
120
|
+
// Auth errors are unrecoverable without user action — stop the
|
|
121
|
+
// flush, keep the entry so the customer's UI can prompt.
|
|
122
|
+
if (e?.code === "auth_error") {
|
|
123
|
+
remaining.push(entry, ...entries.slice(entries.indexOf(entry) + 1));
|
|
124
|
+
failed++;
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
remaining.push(entry);
|
|
128
|
+
failed++;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
await this.opts.storage.setItem(STORAGE_KEY, JSON.stringify(remaining));
|
|
132
|
+
return { replayed, failed, skipped };
|
|
133
|
+
}
|
|
134
|
+
async replayOne(entry) {
|
|
135
|
+
const c = this.opts.client;
|
|
136
|
+
switch (entry.method) {
|
|
137
|
+
case "extract":
|
|
138
|
+
await c.extract(entry.input);
|
|
139
|
+
return;
|
|
140
|
+
case "audio.extract":
|
|
141
|
+
await c.audio.extract(entry.input);
|
|
142
|
+
return;
|
|
143
|
+
case "audio.transcribe":
|
|
144
|
+
await c.audio.transcribe(entry.input);
|
|
145
|
+
return;
|
|
146
|
+
default:
|
|
147
|
+
throw new Error(`Unknown queued method: ${entry.method}`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Convenience adapter — turns @react-native-async-storage/async-storage
|
|
153
|
+
* (and any other AsyncStorage-shaped lib) into a QueueStorage.
|
|
154
|
+
*
|
|
155
|
+
* import AsyncStorage from "@react-native-async-storage/async-storage";
|
|
156
|
+
* const storage = makeAsyncStorageAdapter(AsyncStorage);
|
|
157
|
+
*/
|
|
158
|
+
export function makeAsyncStorageAdapter(asyncStorage) {
|
|
159
|
+
return {
|
|
160
|
+
getItem: (k) => asyncStorage.getItem(k),
|
|
161
|
+
setItem: (k, v) => asyncStorage.setItem(k, v),
|
|
162
|
+
removeItem: (k) => asyncStorage.removeItem(k),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,cAAc,EACd,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAEL,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,MAAM,EACZ,MAAM,aAAa,CAAC;AAarB,wBAAgB,WAAW,CAAC,EAC1B,MAAM,EACN,QAAQ,GACT,EAAE;IACD,MAAM,EAAE,GAAG,CAAC;IACZ,QAAQ,EAAE,SAAS,CAAC;CACrB,uFAEA;AAoDD,wBAAgB,aAAa,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE;IAC/D,OAAO,EAAE,MAAM,CAAC;CACjB;;;;;WAxCQ,KAAK,GAAG,IAAI;eACR,OAAO;EA4CnB;AAED,wBAAgB,kBAAkB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE;IACpE,OAAO,EAAE,MAAM,CAAC;CACjB;;;;;WAjDQ,KAAK,GAAG,IAAI;eACR,OAAO;EAqDnB;AAED,wBAAgB,eAAe;;;;;WAxDtB,KAAK,GAAG,IAAI;eACR,OAAO;EA2DnB;AAID,MAAM,WAAW,kBACf,SAAQ,IAAI,CAAC,mBAAmB,EAAE,eAAe,GAAG,SAAS,GAAG,SAAS,CAAC;IAC1E;;;;;OAKG;IACH,KAAK,EAAE,GAAG,CAAC;IAEX;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,KAAK,EAAE,aAAa,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACnC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,KAAK,EAAE,MAAM,IAAI,CAAC;IAElB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,YAAY,EAAE,KAAK,GAAG,IAAI,CAAC;CAC5B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrD,IAAI,EAAE,kBAAkB,GACvB,iBAAiB,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,cAAc,EACd,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAEL,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,MAAM,EACZ,MAAM,aAAa,CAAC;AAarB,wBAAgB,WAAW,CAAC,EAC1B,MAAM,EACN,QAAQ,GACT,EAAE;IACD,MAAM,EAAE,GAAG,CAAC;IACZ,QAAQ,EAAE,SAAS,CAAC;CACrB,uFAEA;AAoDD,wBAAgB,aAAa,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE;IAC/D,OAAO,EAAE,MAAM,CAAC;CACjB;;;;;WAxCQ,KAAK,GAAG,IAAI;eACR,OAAO;EA4CnB;AAED,wBAAgB,kBAAkB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE;IACpE,OAAO,EAAE,MAAM,CAAC;CACjB;;;;;WAjDQ,KAAK,GAAG,IAAI;eACR,OAAO;EAqDnB;AAED,wBAAgB,eAAe;;;;;WAxDtB,KAAK,GAAG,IAAI;eACR,OAAO;EA2DnB;AAID,MAAM,WAAW,kBACf,SAAQ,IAAI,CAAC,mBAAmB,EAAE,eAAe,GAAG,SAAS,GAAG,SAAS,CAAC;IAC1E;;;;;OAKG;IACH,KAAK,EAAE,GAAG,CAAC;IAEX;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,KAAK,EAAE,aAAa,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACnC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,KAAK,EAAE,MAAM,IAAI,CAAC;IAElB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,YAAY,EAAE,KAAK,GAAG,IAAI,CAAC;CAC5B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrD,IAAI,EAAE,kBAAkB,GACvB,iBAAiB,CAAC,CAAC,CAAC,CA2JtB"}
|
package/dist/react/index.js
CHANGED
|
@@ -97,11 +97,22 @@ export function useRecorder(opts) {
|
|
|
97
97
|
recRef.current = r;
|
|
98
98
|
return r;
|
|
99
99
|
}, []);
|
|
100
|
+
// Track the auto-extract abort controller so we can cancel the
|
|
101
|
+
// in-flight extraction on unmount (RN parity with the web hook).
|
|
102
|
+
// Without this, a user navigating away mid-extract leaks the network
|
|
103
|
+
// request and the recorder retains its callback closure.
|
|
104
|
+
const extractAcRef = useRef(null);
|
|
100
105
|
useEffect(() => {
|
|
101
106
|
return () => {
|
|
102
107
|
void recRef.current?.cancel().catch(() => {
|
|
103
108
|
/* ignore */
|
|
104
109
|
});
|
|
110
|
+
try {
|
|
111
|
+
extractAcRef.current?.abort();
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
/* ignore */
|
|
115
|
+
}
|
|
105
116
|
recRef.current = null;
|
|
106
117
|
};
|
|
107
118
|
}, []);
|
|
@@ -122,6 +133,8 @@ export function useRecorder(opts) {
|
|
|
122
133
|
const f = await r.stop();
|
|
123
134
|
setFile(f);
|
|
124
135
|
if (optsRef.current.apiSlug && client) {
|
|
136
|
+
const ac = new AbortController();
|
|
137
|
+
extractAcRef.current = ac;
|
|
125
138
|
setExtracting(true);
|
|
126
139
|
try {
|
|
127
140
|
const res = await client.audio.extract({
|
|
@@ -129,14 +142,19 @@ export function useRecorder(opts) {
|
|
|
129
142
|
file: f,
|
|
130
143
|
inputs: optsRef.current.extractInputs,
|
|
131
144
|
language: optsRef.current.extractLanguage,
|
|
145
|
+
signal: ac.signal,
|
|
132
146
|
});
|
|
133
147
|
setTranscript(res.transcript ?? null);
|
|
134
148
|
setData(res.data);
|
|
135
149
|
}
|
|
136
150
|
catch (e) {
|
|
137
|
-
|
|
151
|
+
// Aborts on unmount are not real errors — leave state alone.
|
|
152
|
+
if (e?.code !== "aborted")
|
|
153
|
+
setExtractError(e);
|
|
138
154
|
}
|
|
139
155
|
finally {
|
|
156
|
+
if (extractAcRef.current === ac)
|
|
157
|
+
extractAcRef.current = null;
|
|
140
158
|
setExtracting(false);
|
|
141
159
|
}
|
|
142
160
|
}
|
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ohm_studio/sdk-react-native",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "OHM Studio SDK for React Native. Voice-to-structured-JSON clinical extraction APIs in your mobile app.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"access": "public"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@ohm_studio/sdk-core": "0.
|
|
44
|
+
"@ohm_studio/sdk-core": "0.5.0"
|
|
45
45
|
},
|
|
46
46
|
"peerDependencies": {
|
|
47
47
|
"react": ">=17",
|