@ruvos/client 0.1.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 ADDED
@@ -0,0 +1,194 @@
1
+ # @ruvos/client
2
+
3
+ TypeScript client for the [Ruvos](https://ruvos.io) healthcare data exchange API.
4
+
5
+ Provides typed methods for every tenant-accessible endpoint — connectors, connections, jobs, FHIR queries, webhooks, handlers, hooks, exports, and more.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install @ruvos/client
11
+ ```
12
+
13
+ ## Quick Start
14
+
15
+ ```typescript
16
+ import { RuvosClient } from "@ruvos/client";
17
+
18
+ const ruvos = new RuvosClient({
19
+ baseUrl: "https://api.dev.ruvos.io",
20
+ apiKey: "rk_your_api_key",
21
+ tenantId: "your-tenant-id",
22
+ });
23
+
24
+ // List available data sources
25
+ const connectors = await ruvos.listConnectors();
26
+
27
+ // Create a fetch job
28
+ const job = await ruvos.createJob({
29
+ tenantConnectorId: connectors[0].id,
30
+ connectionId: "conn_abc",
31
+ input: {
32
+ resourceTypes: ["Patient", "Coverage"],
33
+ patientIdentityToken: "eyJhbGciOi...",
34
+ },
35
+ });
36
+
37
+ // Poll until complete and get results in one call
38
+ const { job: completed, result } = await ruvos.createAndPollJob(
39
+ {
40
+ tenantConnectorId: "tc_abc",
41
+ connectionId: "conn_xyz",
42
+ input: { resourceTypes: ["Patient"] },
43
+ },
44
+ { onUpdate: (j) => console.log(`Status: ${j.status}`) },
45
+ );
46
+
47
+ if (result && "resources" in result) {
48
+ console.log(`Got ${result.resources.length} FHIR resources`);
49
+ }
50
+ ```
51
+
52
+ ## API Overview
53
+
54
+ ### Constructor
55
+
56
+ ```typescript
57
+ const ruvos = new RuvosClient({
58
+ baseUrl: string; // Ruvos API URL
59
+ apiKey: string; // Your tenant API key (rk_...)
60
+ tenantId: string; // Your tenant UUID
61
+ fetch?: typeof fetch; // Optional custom fetch (for Node 16 or test mocking)
62
+ });
63
+ ```
64
+
65
+ ### Connectors
66
+
67
+ ```typescript
68
+ ruvos.listConnectors() // Public — no auth needed
69
+ ruvos.listConnectorsAuthenticated() // With auth — full details
70
+ ruvos.getConnector(connectorId)
71
+ ruvos.updateConnector(connectorId, settings)
72
+ ```
73
+
74
+ ### Connections (OAuth)
75
+
76
+ ```typescript
77
+ const { authorizationUrl } = await ruvos.authorize(connectorId, userId, returnUrl);
78
+ // Redirect user to authorizationUrl...
79
+
80
+ ruvos.listConnections()
81
+ ruvos.getConnection(connectionId)
82
+ ruvos.revokeConnection(connectionId)
83
+ ```
84
+
85
+ ### Jobs
86
+
87
+ ```typescript
88
+ ruvos.createJob({ tenantConnectorId, connectionId, input })
89
+ ruvos.getJob(jobId)
90
+ ruvos.listJobs({ limit: 20, cursor: "..." })
91
+ ruvos.getJobResult(jobId)
92
+ ruvos.getJobResult(jobId, { clientPublicKeyPem: pem }) // E2E encrypted
93
+
94
+ // Poll with status updates
95
+ const completed = await ruvos.pollJob(jobId, {
96
+ intervalMs: 3000,
97
+ maxAttempts: 60,
98
+ onUpdate: (job) => console.log(job.status),
99
+ });
100
+
101
+ // Create + poll + get result in one call
102
+ const { job, result } = await ruvos.createAndPollJob(input, pollOptions);
103
+ ```
104
+
105
+ ### FHIR
106
+
107
+ ```typescript
108
+ ruvos.fhirCapabilityStatement()
109
+ ruvos.fhirSearch("Patient", { _count: "10" })
110
+ ruvos.fhirRead("Patient", "patient-123")
111
+ ruvos.fhirImport(connectionId, ["Patient", "Coverage"])
112
+ ```
113
+
114
+ ### Webhooks
115
+
116
+ ```typescript
117
+ const wh = await ruvos.createWebhook({ url: "https://...", events: ["job.completed"] });
118
+ ruvos.listWebhooks()
119
+ ruvos.deleteWebhook(wh.id)
120
+ ```
121
+
122
+ ### Handlers & Hooks
123
+
124
+ ```typescript
125
+ ruvos.upsertHandler("my-handler", { displayName: "My Handler", type: "webhook", webhookUrl: "..." })
126
+ ruvos.listHandlers()
127
+ ruvos.listAvailableHandlers() // Platform + tenant handlers
128
+ ruvos.deleteHandler("my-handler")
129
+
130
+ ruvos.registerHook({ stage: "pre_store", handlerId: "my-handler", handlerScope: "tenant", priority: 10 })
131
+ ruvos.listHooks()
132
+ ruvos.deleteHook("pre_store", "my-handler")
133
+ ```
134
+
135
+ ### API Keys, Export, Stats, Search, Audit
136
+
137
+ ```typescript
138
+ ruvos.createApiKey()
139
+ ruvos.listApiKeys()
140
+ ruvos.revokeApiKey(keyId)
141
+
142
+ ruvos.createExport("admin@example.com")
143
+ ruvos.getExport(exportId)
144
+
145
+ ruvos.getStats()
146
+ ruvos.getMetrics({ groupBy: "connector", from: "2026-01-01" })
147
+
148
+ ruvos.search({ q: "patient", status: "completed" })
149
+ ruvos.getAuditLog({ limit: 50, action: "phi_read" })
150
+ ```
151
+
152
+ ## Error Handling
153
+
154
+ All API errors throw `RuvosError` with structured information:
155
+
156
+ ```typescript
157
+ import { RuvosClient, RuvosError, RuvosTimeoutError } from "@ruvos/client";
158
+
159
+ try {
160
+ await ruvos.getJobResult(jobId);
161
+ } catch (err) {
162
+ if (err instanceof RuvosError) {
163
+ console.error(`API error: ${err.code} (${err.status}): ${err.message}`);
164
+ console.error(`Correlation: ${err.correlationId}`);
165
+ }
166
+ if (err instanceof RuvosTimeoutError) {
167
+ console.error(`Polling timed out for job ${err.jobId} (last: ${err.lastStatus})`);
168
+ }
169
+ }
170
+ ```
171
+
172
+ ## Data Delivery Modes
173
+
174
+ The `getJobResult` method handles all three delivery modes automatically:
175
+
176
+ ```typescript
177
+ const result = await ruvos.getJobResult(jobId);
178
+
179
+ if ("dataDeliveryMode" in result && result.dataDeliveryMode === "metadata") {
180
+ // Tenant configured for metadata-only — no PHI returned
181
+ console.log(`Processed ${result.resourceCount} resources`);
182
+ } else {
183
+ // Full FHIR resources available
184
+ for (const resource of result.resources) {
185
+ console.log(resource.resourceType, resource.id);
186
+ }
187
+ }
188
+ ```
189
+
190
+ If the tenant is set to `none`, `getJobResult` throws a `RuvosError` with code `FORBIDDEN`.
191
+
192
+ ## License
193
+
194
+ MIT
@@ -0,0 +1,77 @@
1
+ import type { RuvosClientOptions, FHIRResource, PaginatedList, ConnectorInfo, Connection, AuthorizeResult, Job, CreateJobInput, JobResultResponse, WebhookSubscription, CreateWebhookInput, ApiKeyInfo, TenantHandler, CreateHandlerInput, HookRegistration, CreateHookInput, ExportInfo, TenantStats, MetricsResult, AuditEntry, PollOptions } from "./types.js";
2
+ export declare class RuvosClient {
3
+ private readonly baseUrl;
4
+ private readonly apiKey;
5
+ private readonly tenantId;
6
+ private readonly _fetch;
7
+ constructor(options: RuvosClientOptions);
8
+ private headers;
9
+ private tenantUrl;
10
+ private request;
11
+ health(): Promise<{
12
+ status: string;
13
+ version: string;
14
+ timestamp: string;
15
+ }>;
16
+ listConnectors(): Promise<ConnectorInfo[]>;
17
+ listConnectorsAuthenticated(): Promise<ConnectorInfo[]>;
18
+ getConnector(connectorId: string): Promise<ConnectorInfo>;
19
+ updateConnector(connectorId: string, settings: Record<string, unknown>): Promise<ConnectorInfo>;
20
+ authorize(connectorId: string, userId: string, returnUrl: string): Promise<AuthorizeResult>;
21
+ listConnections(): Promise<Connection[]>;
22
+ getConnection(connectionId: string): Promise<Connection>;
23
+ revokeConnection(connectionId: string): Promise<{
24
+ status: string;
25
+ }>;
26
+ createJob(input: CreateJobInput): Promise<Job>;
27
+ listJobs(opts?: {
28
+ limit?: number;
29
+ cursor?: string;
30
+ }): Promise<PaginatedList<Job>>;
31
+ getJob(jobId: string): Promise<Job>;
32
+ getJobResult(jobId: string, opts?: {
33
+ clientPublicKeyPem?: string;
34
+ }): Promise<JobResultResponse>;
35
+ pollJob(jobId: string, opts?: PollOptions): Promise<Job>;
36
+ createAndPollJob(input: CreateJobInput, opts?: PollOptions): Promise<{
37
+ job: Job;
38
+ result?: JobResultResponse;
39
+ }>;
40
+ fhirCapabilityStatement(): Promise<FHIRResource>;
41
+ fhirSearch(resourceType: string, params?: Record<string, string>): Promise<FHIRResource>;
42
+ fhirRead(resourceType: string, resourceId: string): Promise<FHIRResource>;
43
+ fhirImport(connectionId: string, resourceTypes: string[], webhookUrl?: string): Promise<FHIRResource>;
44
+ createExport(notifyEmail?: string): Promise<ExportInfo>;
45
+ getExport(exportId: string): Promise<ExportInfo>;
46
+ createWebhook(input: CreateWebhookInput): Promise<WebhookSubscription>;
47
+ listWebhooks(): Promise<WebhookSubscription[]>;
48
+ deleteWebhook(webhookId: string): Promise<void>;
49
+ createApiKey(): Promise<ApiKeyInfo>;
50
+ listApiKeys(): Promise<ApiKeyInfo[]>;
51
+ revokeApiKey(keyId: string): Promise<{
52
+ keyId: string;
53
+ status: string;
54
+ }>;
55
+ upsertHandler(handlerId: string, input: CreateHandlerInput): Promise<TenantHandler>;
56
+ listHandlers(): Promise<TenantHandler[]>;
57
+ deleteHandler(handlerId: string): Promise<void>;
58
+ listAvailableHandlers(): Promise<TenantHandler[]>;
59
+ registerHook(input: CreateHookInput): Promise<HookRegistration>;
60
+ listHooks(): Promise<HookRegistration[]>;
61
+ deleteHook(stage: string, handlerId: string): Promise<void>;
62
+ getStats(): Promise<TenantStats>;
63
+ getMetrics(params?: {
64
+ groupBy?: string;
65
+ from?: string;
66
+ to?: string;
67
+ }): Promise<MetricsResult>;
68
+ search(params: Record<string, string>): Promise<PaginatedList<Record<string, unknown>>>;
69
+ getAuditLog(params?: {
70
+ limit?: number;
71
+ cursor?: string;
72
+ action?: string;
73
+ from?: string;
74
+ to?: string;
75
+ }): Promise<PaginatedList<AuditEntry>>;
76
+ }
77
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js ADDED
@@ -0,0 +1,240 @@
1
+ import { RuvosError, RuvosTimeoutError } from "./errors.js";
2
+ export class RuvosClient {
3
+ baseUrl;
4
+ apiKey;
5
+ tenantId;
6
+ _fetch;
7
+ constructor(options) {
8
+ this.baseUrl = options.baseUrl.replace(/\/+$/, "");
9
+ this.apiKey = options.apiKey;
10
+ this.tenantId = options.tenantId;
11
+ this._fetch = options.fetch ?? globalThis.fetch.bind(globalThis);
12
+ }
13
+ headers(extra) {
14
+ return {
15
+ "Authorization": `ApiKey ${this.apiKey}`,
16
+ "Content-Type": "application/json",
17
+ "Accept": "application/json",
18
+ ...extra,
19
+ };
20
+ }
21
+ tenantUrl(path) {
22
+ return `${this.baseUrl}/v1/tenants/${this.tenantId}${path}`;
23
+ }
24
+ async request(url, init) {
25
+ const res = await this._fetch(url, init);
26
+ if (!res.ok) {
27
+ const body = await res.json().catch(() => ({}));
28
+ throw new RuvosError(res.status, {
29
+ code: body.error?.code ?? `HTTP_${res.status}`,
30
+ message: body.error?.message ?? `Request failed: ${res.status}`,
31
+ correlationId: body.error?.correlationId,
32
+ });
33
+ }
34
+ if (res.status === 204)
35
+ return undefined;
36
+ return res.json();
37
+ }
38
+ // ── Health ──────────────────────────────────────────────────────────
39
+ async health() {
40
+ return this.request(`${this.baseUrl}/v1/health`);
41
+ }
42
+ // ── Connectors ──────────────────────────────────────────────────────
43
+ async listConnectors() {
44
+ const data = await this.request(`${this.baseUrl}/v1/public/tenants/${this.tenantId}/connectors`);
45
+ return data.items;
46
+ }
47
+ async listConnectorsAuthenticated() {
48
+ const data = await this.request(this.tenantUrl("/connectors"), { headers: this.headers() });
49
+ return data.items;
50
+ }
51
+ async getConnector(connectorId) {
52
+ return this.request(this.tenantUrl(`/connectors/${connectorId}`), { headers: this.headers() });
53
+ }
54
+ async updateConnector(connectorId, settings) {
55
+ return this.request(this.tenantUrl(`/connectors/${connectorId}`), { method: "PATCH", headers: this.headers(), body: JSON.stringify(settings) });
56
+ }
57
+ // ── Connections ─────────────────────────────────────────────────────
58
+ async authorize(connectorId, userId, returnUrl) {
59
+ return this.request(this.tenantUrl(`/connectors/${connectorId}/authorize`), { method: "POST", headers: this.headers(), body: JSON.stringify({ userId, returnUrl }) });
60
+ }
61
+ async listConnections() {
62
+ const data = await this.request(this.tenantUrl("/connections"), { headers: this.headers() });
63
+ return data.items;
64
+ }
65
+ async getConnection(connectionId) {
66
+ return this.request(this.tenantUrl(`/connections/${connectionId}`), { headers: this.headers() });
67
+ }
68
+ async revokeConnection(connectionId) {
69
+ return this.request(this.tenantUrl(`/connections/${connectionId}`), { method: "DELETE", headers: this.headers() });
70
+ }
71
+ // ── Jobs ────────────────────────────────────────────────────────────
72
+ async createJob(input) {
73
+ const body = {
74
+ tenantConnectorId: input.tenantConnectorId,
75
+ operation: input.operation ?? "fetch_resources",
76
+ ...(input.connectionId ? { connectionId: input.connectionId } : {}),
77
+ ...(input.webhookUrl ? { webhookUrl: input.webhookUrl } : {}),
78
+ ...(input.input ? { input: input.input } : {}),
79
+ };
80
+ const extraHeaders = {};
81
+ if (input.idempotencyKey)
82
+ extraHeaders["Idempotency-Key"] = input.idempotencyKey;
83
+ return this.request(this.tenantUrl("/jobs"), { method: "POST", headers: this.headers(extraHeaders), body: JSON.stringify(body) });
84
+ }
85
+ async listJobs(opts) {
86
+ const params = new URLSearchParams();
87
+ if (opts?.limit)
88
+ params.set("limit", String(opts.limit));
89
+ if (opts?.cursor)
90
+ params.set("cursor", opts.cursor);
91
+ const qs = params.toString();
92
+ return this.request(this.tenantUrl(`/jobs${qs ? `?${qs}` : ""}`), { headers: this.headers() });
93
+ }
94
+ async getJob(jobId) {
95
+ return this.request(this.tenantUrl(`/jobs/${jobId}`), { headers: this.headers() });
96
+ }
97
+ async getJobResult(jobId, opts) {
98
+ const extra = {};
99
+ if (opts?.clientPublicKeyPem) {
100
+ extra["X-Ruvos-Client-Key"] = Buffer.from(opts.clientPublicKeyPem).toString("base64");
101
+ }
102
+ const data = await this.request(this.tenantUrl(`/jobs/${jobId}/result`), { headers: this.headers(extra) });
103
+ if (data.dataDeliveryMode === "metadata") {
104
+ return data;
105
+ }
106
+ if (data.url && !data.resources) {
107
+ const s3Res = await this._fetch(data.url);
108
+ if (!s3Res.ok)
109
+ throw new RuvosError(s3Res.status, { code: "STORAGE_FETCH_FAILED", message: `Failed to fetch result from storage: ${s3Res.status}` });
110
+ return s3Res.json();
111
+ }
112
+ return data;
113
+ }
114
+ async pollJob(jobId, opts) {
115
+ const intervalMs = opts?.intervalMs ?? 3000;
116
+ const maxAttempts = opts?.maxAttempts ?? 60;
117
+ let lastStatus = "unknown";
118
+ for (let i = 0; i < maxAttempts; i++) {
119
+ const job = await this.getJob(jobId);
120
+ lastStatus = job.status;
121
+ opts?.onUpdate?.(job);
122
+ if (job.status !== "queued" && job.status !== "running")
123
+ return job;
124
+ await new Promise((r) => setTimeout(r, intervalMs));
125
+ }
126
+ throw new RuvosTimeoutError(jobId, lastStatus, maxAttempts);
127
+ }
128
+ async createAndPollJob(input, opts) {
129
+ const job = await this.createJob(input);
130
+ const completed = await this.pollJob(job.id, opts);
131
+ if (completed.status === "completed") {
132
+ const result = await this.getJobResult(job.id);
133
+ return { job: completed, result };
134
+ }
135
+ return { job: completed };
136
+ }
137
+ // ── FHIR ────────────────────────────────────────────────────────────
138
+ async fhirCapabilityStatement() {
139
+ return this.request(this.tenantUrl("/fhir/metadata"));
140
+ }
141
+ async fhirSearch(resourceType, params) {
142
+ const qs = params ? `?${new URLSearchParams(params).toString()}` : "";
143
+ return this.request(this.tenantUrl(`/fhir/${resourceType}${qs}`), { headers: this.headers() });
144
+ }
145
+ async fhirRead(resourceType, resourceId) {
146
+ return this.request(this.tenantUrl(`/fhir/${resourceType}/${resourceId}`), { headers: this.headers() });
147
+ }
148
+ async fhirImport(connectionId, resourceTypes, webhookUrl) {
149
+ return this.request(this.tenantUrl("/fhir/$import-from-connection"), {
150
+ method: "POST",
151
+ headers: this.headers(),
152
+ body: JSON.stringify({ connectionId, resourceTypes, ...(webhookUrl ? { webhookUrl } : {}) }),
153
+ });
154
+ }
155
+ // ── Export ──────────────────────────────────────────────────────────
156
+ async createExport(notifyEmail) {
157
+ return this.request(this.tenantUrl("/export"), { method: "POST", headers: this.headers(), body: JSON.stringify(notifyEmail ? { notifyEmail } : {}) });
158
+ }
159
+ async getExport(exportId) {
160
+ return this.request(this.tenantUrl(`/export/${exportId}`), { headers: this.headers() });
161
+ }
162
+ // ── Webhooks ────────────────────────────────────────────────────────
163
+ async createWebhook(input) {
164
+ return this.request(this.tenantUrl("/webhooks"), { method: "POST", headers: this.headers(), body: JSON.stringify(input) });
165
+ }
166
+ async listWebhooks() {
167
+ const data = await this.request(this.tenantUrl("/webhooks"), { headers: this.headers() });
168
+ return data.items;
169
+ }
170
+ async deleteWebhook(webhookId) {
171
+ await this.request(this.tenantUrl(`/webhooks/${webhookId}`), { method: "DELETE", headers: this.headers() });
172
+ }
173
+ // ── API Keys ────────────────────────────────────────────────────────
174
+ async createApiKey() {
175
+ return this.request(this.tenantUrl("/api-keys"), { method: "POST", headers: this.headers() });
176
+ }
177
+ async listApiKeys() {
178
+ const data = await this.request(this.tenantUrl("/api-keys"), { headers: this.headers() });
179
+ return data.items;
180
+ }
181
+ async revokeApiKey(keyId) {
182
+ return this.request(this.tenantUrl(`/api-keys/${keyId}`), { method: "DELETE", headers: this.headers() });
183
+ }
184
+ // ── Handlers ────────────────────────────────────────────────────────
185
+ async upsertHandler(handlerId, input) {
186
+ return this.request(this.tenantUrl(`/handlers/${handlerId}`), { method: "PUT", headers: this.headers(), body: JSON.stringify(input) });
187
+ }
188
+ async listHandlers() {
189
+ const data = await this.request(this.tenantUrl("/handlers"), { headers: this.headers() });
190
+ return data.items;
191
+ }
192
+ async deleteHandler(handlerId) {
193
+ await this.request(this.tenantUrl(`/handlers/${handlerId}`), { method: "DELETE", headers: this.headers() });
194
+ }
195
+ async listAvailableHandlers() {
196
+ const data = await this.request(this.tenantUrl("/available-handlers"), { headers: this.headers() });
197
+ return data.items;
198
+ }
199
+ // ── Hooks ───────────────────────────────────────────────────────────
200
+ async registerHook(input) {
201
+ return this.request(this.tenantUrl("/hooks"), { method: "PUT", headers: this.headers(), body: JSON.stringify(input) });
202
+ }
203
+ async listHooks() {
204
+ const data = await this.request(this.tenantUrl("/hooks"), { headers: this.headers() });
205
+ return data.items;
206
+ }
207
+ async deleteHook(stage, handlerId) {
208
+ await this.request(this.tenantUrl(`/hooks/${stage}/${handlerId}`), { method: "DELETE", headers: this.headers() });
209
+ }
210
+ // ── Stats & Metrics ─────────────────────────────────────────────────
211
+ async getStats() {
212
+ return this.request(this.tenantUrl("/stats"), { headers: this.headers() });
213
+ }
214
+ async getMetrics(params) {
215
+ const qs = params ? `?${new URLSearchParams(params).toString()}` : "";
216
+ return this.request(this.tenantUrl(`/metrics${qs}`), { headers: this.headers() });
217
+ }
218
+ // ── Search ──────────────────────────────────────────────────────────
219
+ async search(params) {
220
+ const qs = new URLSearchParams(params).toString();
221
+ return this.request(this.tenantUrl(`/search?${qs}`), { headers: this.headers() });
222
+ }
223
+ // ── Audit ───────────────────────────────────────────────────────────
224
+ async getAuditLog(params) {
225
+ const qs = new URLSearchParams();
226
+ if (params?.limit)
227
+ qs.set("limit", String(params.limit));
228
+ if (params?.cursor)
229
+ qs.set("cursor", params.cursor);
230
+ if (params?.action)
231
+ qs.set("action", params.action);
232
+ if (params?.from)
233
+ qs.set("from", params.from);
234
+ if (params?.to)
235
+ qs.set("to", params.to);
236
+ const query = qs.toString();
237
+ return this.request(this.tenantUrl(`/audit${query ? `?${query}` : ""}`), { headers: this.headers() });
238
+ }
239
+ }
240
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { RuvosApiError } from "./types.js";
2
+ export declare class RuvosError extends Error {
3
+ readonly status: number;
4
+ readonly code: string;
5
+ readonly correlationId?: string;
6
+ constructor(status: number, apiError: RuvosApiError);
7
+ }
8
+ export declare class RuvosTimeoutError extends Error {
9
+ readonly jobId: string;
10
+ readonly lastStatus: string;
11
+ readonly attempts: number;
12
+ constructor(jobId: string, lastStatus: string, attempts: number);
13
+ }
14
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,qBAAa,UAAW,SAAQ,KAAK;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;gBAEpB,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa;CAOpD;AAED,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAOhE"}
package/dist/errors.js ADDED
@@ -0,0 +1,25 @@
1
+ export class RuvosError extends Error {
2
+ status;
3
+ code;
4
+ correlationId;
5
+ constructor(status, apiError) {
6
+ super(apiError.message);
7
+ this.name = "RuvosError";
8
+ this.status = status;
9
+ this.code = apiError.code;
10
+ this.correlationId = apiError.correlationId;
11
+ }
12
+ }
13
+ export class RuvosTimeoutError extends Error {
14
+ jobId;
15
+ lastStatus;
16
+ attempts;
17
+ constructor(jobId, lastStatus, attempts) {
18
+ super(`Job ${jobId} polling timed out after ${attempts} attempts (last status: ${lastStatus})`);
19
+ this.name = "RuvosTimeoutError";
20
+ this.jobId = jobId;
21
+ this.lastStatus = lastStatus;
22
+ this.attempts = attempts;
23
+ }
24
+ }
25
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,UAAW,SAAQ,KAAK;IAC1B,MAAM,CAAS;IACf,IAAI,CAAS;IACb,aAAa,CAAU;IAEhC,YAAY,MAAc,EAAE,QAAuB;QACjD,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC;IAC9C,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACjC,KAAK,CAAS;IACd,UAAU,CAAS;IACnB,QAAQ,CAAS;IAE1B,YAAY,KAAa,EAAE,UAAkB,EAAE,QAAgB;QAC7D,KAAK,CAAC,OAAO,KAAK,4BAA4B,QAAQ,2BAA2B,UAAU,GAAG,CAAC,CAAC;QAChG,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ export { RuvosClient } from "./client.js";
2
+ export { RuvosError, RuvosTimeoutError } from "./errors.js";
3
+ export type { RuvosClientOptions, FHIRResource, PaginatedList, ConnectorInfo, Connection, AuthorizeResult, Job, CreateJobInput, JobResultPayload, MetadataOnlyResult, JobResultResponse, WebhookSubscription, CreateWebhookInput, ApiKeyInfo, TenantHandler, CreateHandlerInput, HookStage, HookRegistration, CreateHookInput, ExportInfo, TenantStats, MetricsResult, AuditEntry, PollOptions, RuvosApiError, } from "./types.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC5D,YAAY,EACV,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,aAAa,EACb,UAAU,EACV,eAAe,EACf,GAAG,EACH,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,SAAS,EACT,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,WAAW,EACX,aAAa,EACb,UAAU,EACV,WAAW,EACX,aAAa,GACd,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { RuvosClient } from "./client.js";
2
+ export { RuvosError, RuvosTimeoutError } from "./errors.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,159 @@
1
+ export interface RuvosClientOptions {
2
+ baseUrl: string;
3
+ apiKey: string;
4
+ tenantId: string;
5
+ fetch?: typeof globalThis.fetch;
6
+ }
7
+ export interface FHIRResource {
8
+ resourceType: string;
9
+ id?: string;
10
+ [key: string]: unknown;
11
+ }
12
+ export interface PaginatedList<T> {
13
+ items: T[];
14
+ nextCursor?: string;
15
+ }
16
+ export interface ConnectorInfo {
17
+ id: string;
18
+ connectorType: string;
19
+ displayName: string;
20
+ environment: string;
21
+ authType: string;
22
+ beta: boolean;
23
+ }
24
+ export interface Connection {
25
+ id: string;
26
+ connectorId: string;
27
+ connectorType: string;
28
+ userId: string;
29
+ status: string;
30
+ linkedAt: string;
31
+ }
32
+ export interface AuthorizeResult {
33
+ authorizationUrl: string;
34
+ state: string;
35
+ }
36
+ export interface Job {
37
+ id: string;
38
+ status: "queued" | "running" | "completed" | "failed";
39
+ correlationId?: string;
40
+ result?: {
41
+ resourceCount?: number;
42
+ s3Key?: string;
43
+ metadata?: Record<string, unknown>;
44
+ };
45
+ error?: {
46
+ code: string;
47
+ message: string;
48
+ };
49
+ createdAt: string;
50
+ completedAt?: string;
51
+ }
52
+ export interface CreateJobInput {
53
+ tenantConnectorId: string;
54
+ operation?: string;
55
+ connectionId?: string;
56
+ webhookUrl?: string;
57
+ idempotencyKey?: string;
58
+ input?: Record<string, unknown>;
59
+ }
60
+ export interface JobResultPayload {
61
+ resources: FHIRResource[];
62
+ metadata?: Record<string, unknown>;
63
+ }
64
+ export interface MetadataOnlyResult {
65
+ jobId: string;
66
+ status: string;
67
+ resourceCount?: number;
68
+ metadata?: Record<string, unknown>;
69
+ dataDeliveryMode: "metadata";
70
+ }
71
+ export type JobResultResponse = JobResultPayload | MetadataOnlyResult;
72
+ export interface WebhookSubscription {
73
+ id: string;
74
+ url: string;
75
+ events: string[];
76
+ secret?: string;
77
+ createdAt?: string;
78
+ }
79
+ export interface CreateWebhookInput {
80
+ url: string;
81
+ events: string[];
82
+ }
83
+ export interface ApiKeyInfo {
84
+ keyId: string;
85
+ key?: string;
86
+ createdAt?: string;
87
+ warning?: string;
88
+ }
89
+ export interface TenantHandler {
90
+ id: string;
91
+ tenantId: string;
92
+ handlerId: string;
93
+ displayName: string;
94
+ type: "webhook" | "lambda";
95
+ webhookUrl?: string;
96
+ lambdaArn?: string;
97
+ enabled: boolean;
98
+ timeoutMs: number;
99
+ createdAt: string;
100
+ updatedAt: string;
101
+ }
102
+ export interface CreateHandlerInput {
103
+ displayName: string;
104
+ type: "webhook" | "lambda";
105
+ webhookUrl?: string;
106
+ lambdaArn?: string;
107
+ timeoutMs?: number;
108
+ enabled?: boolean;
109
+ }
110
+ export type HookStage = "post_downstream_fetch" | "pre_store" | "post_store";
111
+ export interface HookRegistration {
112
+ stage: HookStage;
113
+ handlerId: string;
114
+ handlerScope: "platform" | "tenant";
115
+ priority: number;
116
+ enabled: boolean;
117
+ config?: Record<string, unknown>;
118
+ }
119
+ export interface CreateHookInput {
120
+ stage: HookStage;
121
+ handlerId: string;
122
+ handlerScope: "platform" | "tenant";
123
+ priority: number;
124
+ enabled?: boolean;
125
+ config?: Record<string, unknown>;
126
+ }
127
+ export interface ExportInfo {
128
+ exportId: string;
129
+ status: string;
130
+ downloadUrl?: string;
131
+ expiresIn?: number;
132
+ }
133
+ export interface TenantStats {
134
+ [key: string]: unknown;
135
+ }
136
+ export interface MetricsResult {
137
+ totals: Record<string, unknown>;
138
+ breakdown: Array<Record<string, unknown>>;
139
+ }
140
+ export interface AuditEntry {
141
+ id: string;
142
+ action: string;
143
+ actorType: string;
144
+ actorId: string;
145
+ resourceType?: string;
146
+ correlationId?: string;
147
+ timestamp: string;
148
+ }
149
+ export interface PollOptions {
150
+ intervalMs?: number;
151
+ maxAttempts?: number;
152
+ onUpdate?: (job: Job) => void;
153
+ }
154
+ export interface RuvosApiError {
155
+ code: string;
156
+ message: string;
157
+ correlationId?: string;
158
+ }
159
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@ruvos/client",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "sideEffects": false,
6
+ "description": "TypeScript client for the Ruvos healthcare data exchange API",
7
+ "license": "MIT",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://gitlab.com/ruvos/ruvos-platform/ruvos-io.git",
11
+ "directory": "packages/client"
12
+ },
13
+ "keywords": ["ruvos", "healthcare", "fhir", "api", "client", "sdk"],
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/index.d.ts",
17
+ "import": "./dist/index.js"
18
+ }
19
+ },
20
+ "types": "./dist/index.d.ts",
21
+ "files": ["dist", "!dist/.tsbuildinfo"],
22
+ "publishConfig": {
23
+ "registry": "https://gitlab.com/api/v4/projects/81009435/packages/npm/"
24
+ },
25
+ "scripts": {
26
+ "build": "tsc -b",
27
+ "clean": "rm -rf dist .tsbuildinfo"
28
+ },
29
+ "devDependencies": {
30
+ "@types/node": "^25.5.2"
31
+ }
32
+ }