@rawdash/sdk-client 0.27.0 → 0.28.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/dist/index.d.ts +1 -0
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -250,8 +250,13 @@ function inProcess(engine, options = {}) {
|
|
|
250
250
|
}
|
|
251
251
|
};
|
|
252
252
|
}
|
|
253
|
+
|
|
254
|
+
// src/index.ts
|
|
255
|
+
import { mergeSeries, mergeSeriesScalar } from "@rawdash/core";
|
|
253
256
|
export {
|
|
254
257
|
http,
|
|
255
|
-
inProcess
|
|
258
|
+
inProcess,
|
|
259
|
+
mergeSeries,
|
|
260
|
+
mergeSeriesScalar
|
|
256
261
|
};
|
|
257
262
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/http.ts","../src/in-process.ts"],"sourcesContent":["import type {\n CachedWidget,\n DataSource,\n HealthResponse,\n SyncState,\n TriggerSyncResponse,\n WidgetsListResponse,\n} from '@rawdash/core';\nimport { isSyncActive } from '@rawdash/core';\n\nexport interface HttpOptions {\n baseUrl: string;\n apiKey?: string;\n fetch?: typeof globalThis.fetch;\n timeoutMs?: number;\n syncTimeoutMs?: number;\n syncPollIntervalMs?: number;\n}\n\nconst KNOWN_SYNC_STATUSES = new Set([\n 'idle',\n 'queued',\n 'running',\n 'succeeded',\n 'failed',\n]);\n\nexport function http(opts: HttpOptions): DataSource {\n const {\n baseUrl,\n apiKey,\n fetch: fetchFn = globalThis.fetch,\n timeoutMs = 5000,\n syncTimeoutMs = 30_000,\n syncPollIntervalMs = 500,\n } = opts;\n\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new Error(\n `http: timeoutMs must be a finite positive number (received ${timeoutMs})`,\n );\n }\n if (!Number.isFinite(syncTimeoutMs) || syncTimeoutMs <= 0) {\n throw new Error(\n `http: syncTimeoutMs must be a finite positive number (received ${syncTimeoutMs})`,\n );\n }\n if (!Number.isFinite(syncPollIntervalMs) || syncPollIntervalMs <= 0) {\n throw new Error(\n `http: syncPollIntervalMs must be a finite positive number (received ${syncPollIntervalMs})`,\n );\n }\n\n const baseHeaders: Record<string, string> = apiKey\n ? { Authorization: `Bearer ${apiKey}` }\n : {};\n\n async function fetchWithTimeout(\n input: string,\n init: RequestInit = {},\n ): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await fetchFn(input, {\n ...init,\n headers: { ...baseHeaders, ...(init.headers ?? {}) },\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timer);\n }\n }\n\n async function get<T>(path: string, init: RequestInit = {}): Promise<T> {\n const res = await fetchWithTimeout(`${baseUrl}${path}`, init);\n if (!res.ok) {\n throw new Error(`Rawdash API error ${res.status}: ${res.statusText}`);\n }\n return res.json() as Promise<T>;\n }\n\n async function getSyncState(): Promise<SyncState> {\n const state = await get<SyncState>('/sync/state', { cache: 'no-store' });\n if (!KNOWN_SYNC_STATUSES.has(state.status)) {\n throw new Error(\n `Rawdash returned unrecognized sync status \"${String(state.status)}\" — the server is likely speaking a different protocol version.`,\n );\n }\n return state;\n }\n\n async function waitForSyncToSettle(): Promise<SyncState> {\n const deadline = Date.now() + syncTimeoutMs;\n for (;;) {\n const state = await getSyncState();\n if (!isSyncActive(state.status)) {\n return state;\n }\n if (Date.now() >= deadline) {\n throw new Error(\n `Rawdash sync did not settle within ${syncTimeoutMs}ms (last status: ${state.status})`,\n );\n }\n await new Promise<void>((resolve) =>\n setTimeout(resolve, syncPollIntervalMs),\n );\n }\n }\n\n const widgetEtagCache = new Map<\n string,\n { etag: string; body: CachedWidget }\n >();\n\n return {\n async getWidgets(dashboardId) {\n const { widgets } = await get<WidgetsListResponse>(\n `/dashboards/${encodeURIComponent(dashboardId)}/widgets`,\n );\n return widgets;\n },\n\n async getWidget(dashboardId, widgetId) {\n const key = `${dashboardId}\u0000${widgetId}`;\n const cached = widgetEtagCache.get(key);\n const headers: Record<string, string> = {};\n if (cached) {\n headers['If-None-Match'] = cached.etag;\n }\n const res = await fetchWithTimeout(\n `${baseUrl}/dashboards/${encodeURIComponent(dashboardId)}/widgets/${encodeURIComponent(widgetId)}`,\n { headers },\n );\n if (res.status === 304 && cached) {\n return cached.body;\n }\n if (!res.ok) {\n throw new Error(`Rawdash API error ${res.status}: ${res.statusText}`);\n }\n const body = (await res.json()) as CachedWidget;\n const etag = res.headers.get('ETag') ?? res.headers.get('etag');\n if (etag) {\n widgetEtagCache.set(key, { etag, body });\n } else {\n widgetEtagCache.delete(key);\n }\n return body;\n },\n\n getHealth() {\n return get<HealthResponse>('/health', { cache: 'no-store' });\n },\n\n getSyncState,\n\n async triggerSync() {\n const res = await fetchWithTimeout(`${baseUrl}/sync`, { method: 'POST' });\n if (!res.ok) {\n throw new Error(`Rawdash sync error ${res.status}: ${res.statusText}`);\n }\n return res.json() as Promise<TriggerSyncResponse>;\n },\n\n async ensureFresh(maxAgeMs = 5 * 60 * 1000) {\n const state = await getSyncState();\n\n if (isSyncActive(state.status)) {\n const settled = await waitForSyncToSettle();\n if (settled.status === 'failed') {\n throw new Error(\n `Rawdash sync failed: ${settled.lastError ?? 'unknown error'}`,\n );\n }\n return true;\n }\n\n const lastSyncMs = state.lastSyncAt\n ? new Date(state.lastSyncAt).getTime()\n : null;\n const isFresh = lastSyncMs !== null && Date.now() - lastSyncMs < maxAgeMs;\n if (isFresh) {\n return false;\n }\n\n const trigger = await this.triggerSync();\n if (!trigger.queued) {\n const settled = await waitForSyncToSettle();\n if (settled.status === 'failed') {\n throw new Error(\n `Rawdash sync failed: ${settled.lastError ?? 'unknown error'}`,\n );\n }\n return true;\n }\n\n const settled = await waitForSyncToSettle();\n if (settled.status === 'failed') {\n throw new Error(\n `Rawdash sync failed: ${settled.lastError ?? 'unknown error'}`,\n );\n }\n return true;\n },\n };\n}\n","import type { DataSource, ServerDataSource, SyncState } from '@rawdash/core';\nimport { isSyncActive } from '@rawdash/core';\n\nexport interface InProcessOptions {\n syncTimeoutMs?: number;\n syncPollIntervalMs?: number;\n}\n\nconst KNOWN_SYNC_STATUSES = new Set([\n 'idle',\n 'queued',\n 'running',\n 'succeeded',\n 'failed',\n]);\n\nexport function inProcess(\n engine: ServerDataSource,\n options: InProcessOptions = {},\n): DataSource {\n const syncTimeoutMs = options.syncTimeoutMs ?? 30_000;\n const syncPollIntervalMs = options.syncPollIntervalMs ?? 500;\n\n if (!Number.isFinite(syncTimeoutMs) || syncTimeoutMs <= 0) {\n throw new Error(\n `inProcess: syncTimeoutMs must be a finite positive number (received ${syncTimeoutMs})`,\n );\n }\n if (!Number.isFinite(syncPollIntervalMs) || syncPollIntervalMs <= 0) {\n throw new Error(\n `inProcess: syncPollIntervalMs must be a finite positive number (received ${syncPollIntervalMs})`,\n );\n }\n\n async function getSyncStateGuarded(): Promise<SyncState> {\n const state = await engine.getSyncState();\n if (!KNOWN_SYNC_STATUSES.has(state.status)) {\n throw new Error(\n `Rawdash engine returned unrecognized sync status \"${String(state.status)}\"`,\n );\n }\n return state;\n }\n\n async function waitForSyncToSettle(): Promise<SyncState> {\n const deadline = Date.now() + syncTimeoutMs;\n for (;;) {\n const state = await getSyncStateGuarded();\n if (!isSyncActive(state.status)) {\n return state;\n }\n if (Date.now() >= deadline) {\n throw new Error(\n `Rawdash sync did not settle within ${syncTimeoutMs}ms (last status: ${state.status})`,\n );\n }\n await new Promise<void>((resolve) =>\n setTimeout(resolve, syncPollIntervalMs),\n );\n }\n }\n\n return {\n getWidget: (dashboardId, widgetId) =>\n engine.getWidget(dashboardId, widgetId),\n\n getWidgets: (dashboardId) => engine.getWidgets(dashboardId),\n\n getHealth: () => engine.getHealth(),\n\n getSyncState: () => getSyncStateGuarded(),\n\n triggerSync: () => engine.triggerSync(),\n\n async ensureFresh(maxAgeMs = 5 * 60 * 1000) {\n const state = await getSyncStateGuarded();\n\n if (isSyncActive(state.status)) {\n const settled = await waitForSyncToSettle();\n if (settled.status === 'failed') {\n throw new Error(\n `Rawdash sync failed: ${settled.lastError ?? 'unknown error'}`,\n );\n }\n return true;\n }\n\n const lastSyncMs = state.lastSyncAt\n ? new Date(state.lastSyncAt).getTime()\n : null;\n const isFresh = lastSyncMs !== null && Date.now() - lastSyncMs < maxAgeMs;\n if (isFresh) {\n return false;\n }\n\n const trigger = await engine.triggerSync();\n if (!trigger.queued) {\n const settled = await waitForSyncToSettle();\n if (settled.status === 'failed') {\n throw new Error(\n `Rawdash sync failed: ${settled.lastError ?? 'unknown error'}`,\n );\n }\n return true;\n }\n\n const settled = await waitForSyncToSettle();\n if (settled.status === 'failed') {\n throw new Error(\n `Rawdash sync failed: ${settled.lastError ?? 'unknown error'}`,\n );\n }\n return true;\n },\n };\n}\n"],"mappings":"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","names":["settled","isSyncActive","KNOWN_SYNC_STATUSES","settled"]}
|
|
1
|
+
{"version":3,"sources":["../src/http.ts","../src/in-process.ts","../src/index.ts"],"sourcesContent":["import type {\n CachedWidget,\n DataSource,\n HealthResponse,\n SyncState,\n TriggerSyncResponse,\n WidgetsListResponse,\n} from '@rawdash/core';\nimport { isSyncActive } from '@rawdash/core';\n\nexport interface HttpOptions {\n baseUrl: string;\n apiKey?: string;\n fetch?: typeof globalThis.fetch;\n timeoutMs?: number;\n syncTimeoutMs?: number;\n syncPollIntervalMs?: number;\n}\n\nconst KNOWN_SYNC_STATUSES = new Set([\n 'idle',\n 'queued',\n 'running',\n 'succeeded',\n 'failed',\n]);\n\nexport function http(opts: HttpOptions): DataSource {\n const {\n baseUrl,\n apiKey,\n fetch: fetchFn = globalThis.fetch,\n timeoutMs = 5000,\n syncTimeoutMs = 30_000,\n syncPollIntervalMs = 500,\n } = opts;\n\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new Error(\n `http: timeoutMs must be a finite positive number (received ${timeoutMs})`,\n );\n }\n if (!Number.isFinite(syncTimeoutMs) || syncTimeoutMs <= 0) {\n throw new Error(\n `http: syncTimeoutMs must be a finite positive number (received ${syncTimeoutMs})`,\n );\n }\n if (!Number.isFinite(syncPollIntervalMs) || syncPollIntervalMs <= 0) {\n throw new Error(\n `http: syncPollIntervalMs must be a finite positive number (received ${syncPollIntervalMs})`,\n );\n }\n\n const baseHeaders: Record<string, string> = apiKey\n ? { Authorization: `Bearer ${apiKey}` }\n : {};\n\n async function fetchWithTimeout(\n input: string,\n init: RequestInit = {},\n ): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await fetchFn(input, {\n ...init,\n headers: { ...baseHeaders, ...(init.headers ?? {}) },\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timer);\n }\n }\n\n async function get<T>(path: string, init: RequestInit = {}): Promise<T> {\n const res = await fetchWithTimeout(`${baseUrl}${path}`, init);\n if (!res.ok) {\n throw new Error(`Rawdash API error ${res.status}: ${res.statusText}`);\n }\n return res.json() as Promise<T>;\n }\n\n async function getSyncState(): Promise<SyncState> {\n const state = await get<SyncState>('/sync/state', { cache: 'no-store' });\n if (!KNOWN_SYNC_STATUSES.has(state.status)) {\n throw new Error(\n `Rawdash returned unrecognized sync status \"${String(state.status)}\" — the server is likely speaking a different protocol version.`,\n );\n }\n return state;\n }\n\n async function waitForSyncToSettle(): Promise<SyncState> {\n const deadline = Date.now() + syncTimeoutMs;\n for (;;) {\n const state = await getSyncState();\n if (!isSyncActive(state.status)) {\n return state;\n }\n if (Date.now() >= deadline) {\n throw new Error(\n `Rawdash sync did not settle within ${syncTimeoutMs}ms (last status: ${state.status})`,\n );\n }\n await new Promise<void>((resolve) =>\n setTimeout(resolve, syncPollIntervalMs),\n );\n }\n }\n\n const widgetEtagCache = new Map<\n string,\n { etag: string; body: CachedWidget }\n >();\n\n return {\n async getWidgets(dashboardId) {\n const { widgets } = await get<WidgetsListResponse>(\n `/dashboards/${encodeURIComponent(dashboardId)}/widgets`,\n );\n return widgets;\n },\n\n async getWidget(dashboardId, widgetId) {\n const key = `${dashboardId}\u0000${widgetId}`;\n const cached = widgetEtagCache.get(key);\n const headers: Record<string, string> = {};\n if (cached) {\n headers['If-None-Match'] = cached.etag;\n }\n const res = await fetchWithTimeout(\n `${baseUrl}/dashboards/${encodeURIComponent(dashboardId)}/widgets/${encodeURIComponent(widgetId)}`,\n { headers },\n );\n if (res.status === 304 && cached) {\n return cached.body;\n }\n if (!res.ok) {\n throw new Error(`Rawdash API error ${res.status}: ${res.statusText}`);\n }\n const body = (await res.json()) as CachedWidget;\n const etag = res.headers.get('ETag') ?? res.headers.get('etag');\n if (etag) {\n widgetEtagCache.set(key, { etag, body });\n } else {\n widgetEtagCache.delete(key);\n }\n return body;\n },\n\n getHealth() {\n return get<HealthResponse>('/health', { cache: 'no-store' });\n },\n\n getSyncState,\n\n async triggerSync() {\n const res = await fetchWithTimeout(`${baseUrl}/sync`, { method: 'POST' });\n if (!res.ok) {\n throw new Error(`Rawdash sync error ${res.status}: ${res.statusText}`);\n }\n return res.json() as Promise<TriggerSyncResponse>;\n },\n\n async ensureFresh(maxAgeMs = 5 * 60 * 1000) {\n const state = await getSyncState();\n\n if (isSyncActive(state.status)) {\n const settled = await waitForSyncToSettle();\n if (settled.status === 'failed') {\n throw new Error(\n `Rawdash sync failed: ${settled.lastError ?? 'unknown error'}`,\n );\n }\n return true;\n }\n\n const lastSyncMs = state.lastSyncAt\n ? new Date(state.lastSyncAt).getTime()\n : null;\n const isFresh = lastSyncMs !== null && Date.now() - lastSyncMs < maxAgeMs;\n if (isFresh) {\n return false;\n }\n\n const trigger = await this.triggerSync();\n if (!trigger.queued) {\n const settled = await waitForSyncToSettle();\n if (settled.status === 'failed') {\n throw new Error(\n `Rawdash sync failed: ${settled.lastError ?? 'unknown error'}`,\n );\n }\n return true;\n }\n\n const settled = await waitForSyncToSettle();\n if (settled.status === 'failed') {\n throw new Error(\n `Rawdash sync failed: ${settled.lastError ?? 'unknown error'}`,\n );\n }\n return true;\n },\n };\n}\n","import type { DataSource, ServerDataSource, SyncState } from '@rawdash/core';\nimport { isSyncActive } from '@rawdash/core';\n\nexport interface InProcessOptions {\n syncTimeoutMs?: number;\n syncPollIntervalMs?: number;\n}\n\nconst KNOWN_SYNC_STATUSES = new Set([\n 'idle',\n 'queued',\n 'running',\n 'succeeded',\n 'failed',\n]);\n\nexport function inProcess(\n engine: ServerDataSource,\n options: InProcessOptions = {},\n): DataSource {\n const syncTimeoutMs = options.syncTimeoutMs ?? 30_000;\n const syncPollIntervalMs = options.syncPollIntervalMs ?? 500;\n\n if (!Number.isFinite(syncTimeoutMs) || syncTimeoutMs <= 0) {\n throw new Error(\n `inProcess: syncTimeoutMs must be a finite positive number (received ${syncTimeoutMs})`,\n );\n }\n if (!Number.isFinite(syncPollIntervalMs) || syncPollIntervalMs <= 0) {\n throw new Error(\n `inProcess: syncPollIntervalMs must be a finite positive number (received ${syncPollIntervalMs})`,\n );\n }\n\n async function getSyncStateGuarded(): Promise<SyncState> {\n const state = await engine.getSyncState();\n if (!KNOWN_SYNC_STATUSES.has(state.status)) {\n throw new Error(\n `Rawdash engine returned unrecognized sync status \"${String(state.status)}\"`,\n );\n }\n return state;\n }\n\n async function waitForSyncToSettle(): Promise<SyncState> {\n const deadline = Date.now() + syncTimeoutMs;\n for (;;) {\n const state = await getSyncStateGuarded();\n if (!isSyncActive(state.status)) {\n return state;\n }\n if (Date.now() >= deadline) {\n throw new Error(\n `Rawdash sync did not settle within ${syncTimeoutMs}ms (last status: ${state.status})`,\n );\n }\n await new Promise<void>((resolve) =>\n setTimeout(resolve, syncPollIntervalMs),\n );\n }\n }\n\n return {\n getWidget: (dashboardId, widgetId) =>\n engine.getWidget(dashboardId, widgetId),\n\n getWidgets: (dashboardId) => engine.getWidgets(dashboardId),\n\n getHealth: () => engine.getHealth(),\n\n getSyncState: () => getSyncStateGuarded(),\n\n triggerSync: () => engine.triggerSync(),\n\n async ensureFresh(maxAgeMs = 5 * 60 * 1000) {\n const state = await getSyncStateGuarded();\n\n if (isSyncActive(state.status)) {\n const settled = await waitForSyncToSettle();\n if (settled.status === 'failed') {\n throw new Error(\n `Rawdash sync failed: ${settled.lastError ?? 'unknown error'}`,\n );\n }\n return true;\n }\n\n const lastSyncMs = state.lastSyncAt\n ? new Date(state.lastSyncAt).getTime()\n : null;\n const isFresh = lastSyncMs !== null && Date.now() - lastSyncMs < maxAgeMs;\n if (isFresh) {\n return false;\n }\n\n const trigger = await engine.triggerSync();\n if (!trigger.queued) {\n const settled = await waitForSyncToSettle();\n if (settled.status === 'failed') {\n throw new Error(\n `Rawdash sync failed: ${settled.lastError ?? 'unknown error'}`,\n );\n }\n return true;\n }\n\n const settled = await waitForSyncToSettle();\n if (settled.status === 'failed') {\n throw new Error(\n `Rawdash sync failed: ${settled.lastError ?? 'unknown error'}`,\n );\n }\n return true;\n },\n };\n}\n","export { http } from './http';\nexport type { HttpOptions } from './http';\n\nexport { inProcess } from './in-process';\nexport type { InProcessOptions } from './in-process';\n\nexport { mergeSeries, mergeSeriesScalar } from '@rawdash/core';\nexport type {\n CachedWidget,\n MergedPoint,\n MergeSeriesOptions,\n WidgetSeries,\n} from '@rawdash/core';\n"],"mappings":"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","names":["settled","isSyncActive","KNOWN_SYNC_STATUSES","settled"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rawdash/sdk-client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.28.0",
|
|
4
4
|
"description": "Rawdash framework-agnostic data sources",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
}
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@rawdash/core": "0.
|
|
25
|
+
"@rawdash/core": "0.28.0"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"tsup": "^8.0.0",
|