@rawdash/sdk-runtime 0.15.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,5 @@
1
+ # @rawdash/sdk-runtime
2
+
3
+ Framework-agnostic auto-polling subscription engine for Rawdash dashboards.
4
+
5
+ Used as a transitive dependency of framework SDK packages (e.g. `@rawdash/sdk-nextjs`). Application code should import hooks from the framework SDK rather than from this package directly.
@@ -0,0 +1,52 @@
1
+ import { CachedWidget, WidgetSyncState, DataSource } from '@rawdash/core';
2
+
3
+ interface SubscribeCallbacks {
4
+ onWidgetUpdated: (widget: CachedWidget) => void;
5
+ onWidgetUnchanged?: (widget: CachedWidget) => void;
6
+ onWidgetFailing?: (widget: CachedWidget) => void;
7
+ onError?: (error: unknown) => void;
8
+ }
9
+ interface SubscribeOptions {
10
+ syncingPollMs?: number;
11
+ syncingPollMaxMs?: number;
12
+ unsyncedPollMs?: number;
13
+ failingBackoffMs?: number;
14
+ lateRetryStartMs?: number;
15
+ lateRetryMaxMs?: number;
16
+ defaultIntervalSeconds?: number;
17
+ jitterMs?: number;
18
+ now?: () => number;
19
+ setTimeout?: (cb: () => void, ms: number) => unknown;
20
+ clearTimeout?: (handle: unknown) => void;
21
+ random?: () => number;
22
+ visibility?: VisibilitySource | null;
23
+ }
24
+ interface VisibilitySource {
25
+ isHidden(): boolean;
26
+ onChange(listener: () => void): () => void;
27
+ }
28
+ interface ResolvedOptions {
29
+ syncingPollMs: number;
30
+ syncingPollMaxMs: number;
31
+ unsyncedPollMs: number;
32
+ failingBackoffMs: number;
33
+ lateRetryStartMs: number;
34
+ lateRetryMaxMs: number;
35
+ defaultIntervalSeconds: number;
36
+ jitterMs: number;
37
+ }
38
+ type Timer = unknown;
39
+ interface WidgetTracker {
40
+ widgetId: string;
41
+ lastSyncAtMs: number | null;
42
+ lastSyncState: WidgetSyncState | undefined;
43
+ failingNotified: boolean;
44
+ lateRetryDelayMs: number | null;
45
+ syncingSinceMs: number | null;
46
+ timer: Timer | null;
47
+ }
48
+ type Unsubscribe = () => void;
49
+ declare function subscribe(source: DataSource, dashboardId: string, callbacks: SubscribeCallbacks, options?: SubscribeOptions): Unsubscribe;
50
+ declare function handleWidget(t: WidgetTracker, widget: CachedWidget, nowMs: number, opts: ResolvedOptions, callbacks: SubscribeCallbacks): number;
51
+
52
+ export { type SubscribeCallbacks, type SubscribeOptions, type Unsubscribe, type VisibilitySource, handleWidget, subscribe };
package/dist/index.js ADDED
@@ -0,0 +1,245 @@
1
+ // src/engine.ts
2
+ var DEFAULT_OPTIONS = {
3
+ syncingPollMs: 3e3,
4
+ syncingPollMaxMs: 6e4,
5
+ unsyncedPollMs: 1e4,
6
+ failingBackoffMs: 6e4,
7
+ lateRetryStartMs: 3e3,
8
+ lateRetryMaxMs: 3e4,
9
+ defaultIntervalSeconds: 300,
10
+ jitterMs: 2e3
11
+ };
12
+ function subscribe(source, dashboardId, callbacks, options = {}) {
13
+ const opts = {
14
+ ...DEFAULT_OPTIONS,
15
+ ...options
16
+ };
17
+ const now = opts.now ?? (() => Date.now());
18
+ const setTimer = opts.setTimeout ?? ((cb, ms) => setTimeout(cb, ms));
19
+ const clearTimer = opts.clearTimeout ?? ((h) => clearTimeout(h));
20
+ const random = opts.random ?? Math.random;
21
+ const visibility = opts.visibility ?? defaultVisibility();
22
+ const trackers = /* @__PURE__ */ new Map();
23
+ let stopped = false;
24
+ let visibilityCleanup = null;
25
+ function schedule(t, delayMs) {
26
+ if (stopped) {
27
+ return;
28
+ }
29
+ if (t.timer !== null) {
30
+ clearTimer(t.timer);
31
+ t.timer = null;
32
+ }
33
+ if (visibility && visibility.isHidden()) {
34
+ return;
35
+ }
36
+ const jitter = Math.floor(random() * opts.jitterMs);
37
+ t.timer = setTimer(
38
+ () => {
39
+ t.timer = null;
40
+ void poll(t);
41
+ },
42
+ Math.max(0, delayMs + jitter)
43
+ );
44
+ }
45
+ function tracker(widgetId) {
46
+ let t = trackers.get(widgetId);
47
+ if (!t) {
48
+ t = {
49
+ widgetId,
50
+ lastSyncAtMs: null,
51
+ lastSyncState: void 0,
52
+ failingNotified: false,
53
+ lateRetryDelayMs: null,
54
+ syncingSinceMs: null,
55
+ timer: null
56
+ };
57
+ trackers.set(widgetId, t);
58
+ }
59
+ return t;
60
+ }
61
+ function applyWidget(widget) {
62
+ const t = tracker(widget.widgetId);
63
+ const nextDelay = handleWidget(t, widget, now(), opts, callbacks);
64
+ schedule(t, nextDelay);
65
+ }
66
+ async function poll(t) {
67
+ if (stopped) {
68
+ return;
69
+ }
70
+ try {
71
+ const widget = await source.getWidget(dashboardId, t.widgetId);
72
+ if (stopped) {
73
+ return;
74
+ }
75
+ const nextDelay = handleWidget(t, widget, now(), opts, callbacks);
76
+ schedule(t, nextDelay);
77
+ } catch (err) {
78
+ if (stopped) {
79
+ return;
80
+ }
81
+ callbacks.onError?.(err);
82
+ schedule(t, opts.failingBackoffMs);
83
+ }
84
+ }
85
+ async function bootstrap() {
86
+ try {
87
+ const widgets = await source.getWidgets(dashboardId);
88
+ if (stopped) {
89
+ return;
90
+ }
91
+ for (const widget of widgets) {
92
+ applyWidget(widget);
93
+ }
94
+ } catch (err) {
95
+ if (stopped) {
96
+ return;
97
+ }
98
+ callbacks.onError?.(err);
99
+ const handle = setTimer(() => {
100
+ if (!stopped) {
101
+ void bootstrap();
102
+ }
103
+ }, opts.failingBackoffMs);
104
+ onStopHandlers.push(() => clearTimer(handle));
105
+ }
106
+ }
107
+ const onStopHandlers = [];
108
+ if (visibility) {
109
+ visibilityCleanup = visibility.onChange(() => {
110
+ if (stopped) {
111
+ return;
112
+ }
113
+ if (visibility.isHidden()) {
114
+ for (const t of trackers.values()) {
115
+ if (t.timer !== null) {
116
+ clearTimer(t.timer);
117
+ t.timer = null;
118
+ }
119
+ }
120
+ } else {
121
+ for (const t of trackers.values()) {
122
+ schedule(t, 0);
123
+ }
124
+ }
125
+ });
126
+ }
127
+ void bootstrap();
128
+ return () => {
129
+ stopped = true;
130
+ for (const t of trackers.values()) {
131
+ if (t.timer !== null) {
132
+ clearTimer(t.timer);
133
+ t.timer = null;
134
+ }
135
+ }
136
+ for (const cleanup of onStopHandlers) {
137
+ cleanup();
138
+ }
139
+ if (visibilityCleanup) {
140
+ visibilityCleanup();
141
+ }
142
+ };
143
+ }
144
+ function handleWidget(t, widget, nowMs, opts, callbacks) {
145
+ const incomingSyncAtMs = widget.cachedAt ? new Date(widget.cachedAt).getTime() : null;
146
+ const intervalMs = (widget.syncIntervalSeconds ?? opts.defaultIntervalSeconds) * 1e3;
147
+ const state = widget.syncState;
148
+ const previousSyncAtMs = t.lastSyncAtMs;
149
+ const advanced = incomingSyncAtMs !== null && incomingSyncAtMs !== previousSyncAtMs;
150
+ switch (state) {
151
+ case "fresh": {
152
+ if (advanced || previousSyncAtMs === null) {
153
+ t.lastSyncAtMs = incomingSyncAtMs;
154
+ t.lastSyncState = state;
155
+ t.failingNotified = false;
156
+ t.lateRetryDelayMs = null;
157
+ t.syncingSinceMs = null;
158
+ callbacks.onWidgetUpdated(widget);
159
+ if (incomingSyncAtMs === null) {
160
+ return intervalMs;
161
+ }
162
+ const expected2 = incomingSyncAtMs + intervalMs;
163
+ return Math.max(0, expected2 - nowMs);
164
+ }
165
+ callbacks.onWidgetUnchanged?.(widget);
166
+ const expected = (incomingSyncAtMs ?? nowMs) + intervalMs;
167
+ const baseDelay = Math.max(0, expected - nowMs);
168
+ const giveUpAtMs = (incomingSyncAtMs ?? nowMs) + 2 * intervalMs;
169
+ if (nowMs >= giveUpAtMs) {
170
+ t.lateRetryDelayMs = null;
171
+ return Math.max(baseDelay, intervalMs);
172
+ }
173
+ const prev = t.lateRetryDelayMs ?? 0;
174
+ const next = prev === 0 ? opts.lateRetryStartMs : Math.min(prev * 2, opts.lateRetryMaxMs);
175
+ t.lateRetryDelayMs = next;
176
+ t.lastSyncState = state;
177
+ return next;
178
+ }
179
+ case "syncing": {
180
+ t.lastSyncState = state;
181
+ if (t.syncingSinceMs === null) {
182
+ t.syncingSinceMs = nowMs;
183
+ }
184
+ callbacks.onWidgetUnchanged?.(widget);
185
+ const elapsed = nowMs - t.syncingSinceMs;
186
+ if (elapsed >= opts.syncingPollMaxMs) {
187
+ return intervalMs;
188
+ }
189
+ return opts.syncingPollMs;
190
+ }
191
+ case "failing":
192
+ case "stale": {
193
+ t.lastSyncState = state;
194
+ if (!t.failingNotified) {
195
+ t.failingNotified = true;
196
+ callbacks.onWidgetFailing?.(widget);
197
+ } else {
198
+ callbacks.onWidgetUnchanged?.(widget);
199
+ }
200
+ return opts.failingBackoffMs;
201
+ }
202
+ case "unsynced": {
203
+ t.lastSyncState = state;
204
+ callbacks.onWidgetUnchanged?.(widget);
205
+ return opts.unsyncedPollMs;
206
+ }
207
+ default: {
208
+ if (advanced || previousSyncAtMs === null) {
209
+ t.lastSyncAtMs = incomingSyncAtMs;
210
+ callbacks.onWidgetUpdated(widget);
211
+ } else {
212
+ callbacks.onWidgetUnchanged?.(widget);
213
+ }
214
+ t.lastSyncState = state;
215
+ return intervalMs;
216
+ }
217
+ }
218
+ }
219
+ function defaultVisibility() {
220
+ if (typeof document === "undefined") {
221
+ return null;
222
+ }
223
+ const doc = document;
224
+ return {
225
+ isHidden: () => doc.hidden === true,
226
+ onChange: (listener) => {
227
+ const handler = () => listener();
228
+ doc.addEventListener("visibilitychange", handler);
229
+ if (typeof window !== "undefined") {
230
+ window.addEventListener("focus", handler);
231
+ }
232
+ return () => {
233
+ doc.removeEventListener("visibilitychange", handler);
234
+ if (typeof window !== "undefined") {
235
+ window.removeEventListener("focus", handler);
236
+ }
237
+ };
238
+ }
239
+ };
240
+ }
241
+ export {
242
+ handleWidget,
243
+ subscribe
244
+ };
245
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/engine.ts"],"sourcesContent":["import type { CachedWidget, DataSource, WidgetSyncState } from '@rawdash/core';\n\nexport interface SubscribeCallbacks {\n onWidgetUpdated: (widget: CachedWidget) => void;\n onWidgetUnchanged?: (widget: CachedWidget) => void;\n onWidgetFailing?: (widget: CachedWidget) => void;\n onError?: (error: unknown) => void;\n}\n\nexport interface SubscribeOptions {\n syncingPollMs?: number;\n syncingPollMaxMs?: number;\n unsyncedPollMs?: number;\n failingBackoffMs?: number;\n lateRetryStartMs?: number;\n lateRetryMaxMs?: number;\n defaultIntervalSeconds?: number;\n jitterMs?: number;\n now?: () => number;\n setTimeout?: (cb: () => void, ms: number) => unknown;\n clearTimeout?: (handle: unknown) => void;\n random?: () => number;\n visibility?: VisibilitySource | null;\n}\n\nexport interface VisibilitySource {\n isHidden(): boolean;\n onChange(listener: () => void): () => void;\n}\n\ninterface ResolvedOptions {\n syncingPollMs: number;\n syncingPollMaxMs: number;\n unsyncedPollMs: number;\n failingBackoffMs: number;\n lateRetryStartMs: number;\n lateRetryMaxMs: number;\n defaultIntervalSeconds: number;\n jitterMs: number;\n}\n\nconst DEFAULT_OPTIONS: ResolvedOptions = {\n syncingPollMs: 3_000,\n syncingPollMaxMs: 60_000,\n unsyncedPollMs: 10_000,\n failingBackoffMs: 60_000,\n lateRetryStartMs: 3_000,\n lateRetryMaxMs: 30_000,\n defaultIntervalSeconds: 300,\n jitterMs: 2_000,\n};\n\ntype Timer = unknown;\n\ninterface WidgetTracker {\n widgetId: string;\n lastSyncAtMs: number | null;\n lastSyncState: WidgetSyncState | undefined;\n failingNotified: boolean;\n lateRetryDelayMs: number | null;\n syncingSinceMs: number | null;\n timer: Timer | null;\n}\n\nexport type Unsubscribe = () => void;\n\nexport function subscribe(\n source: DataSource,\n dashboardId: string,\n callbacks: SubscribeCallbacks,\n options: SubscribeOptions = {},\n): Unsubscribe {\n const opts = {\n ...DEFAULT_OPTIONS,\n ...options,\n };\n const now = opts.now ?? (() => Date.now());\n const setTimer = opts.setTimeout ?? ((cb, ms) => setTimeout(cb, ms));\n const clearTimer = opts.clearTimeout ?? ((h) => clearTimeout(h as never));\n const random = opts.random ?? Math.random;\n const visibility = opts.visibility ?? defaultVisibility();\n\n const trackers = new Map<string, WidgetTracker>();\n let stopped = false;\n let visibilityCleanup: (() => void) | null = null;\n\n function schedule(t: WidgetTracker, delayMs: number): void {\n if (stopped) {\n return;\n }\n if (t.timer !== null) {\n clearTimer(t.timer);\n t.timer = null;\n }\n if (visibility && visibility.isHidden()) {\n return;\n }\n const jitter = Math.floor(random() * opts.jitterMs);\n t.timer = setTimer(\n () => {\n t.timer = null;\n void poll(t);\n },\n Math.max(0, delayMs + jitter),\n );\n }\n\n function tracker(widgetId: string): WidgetTracker {\n let t = trackers.get(widgetId);\n if (!t) {\n t = {\n widgetId,\n lastSyncAtMs: null,\n lastSyncState: undefined,\n failingNotified: false,\n lateRetryDelayMs: null,\n syncingSinceMs: null,\n timer: null,\n };\n trackers.set(widgetId, t);\n }\n return t;\n }\n\n function applyWidget(widget: CachedWidget): void {\n const t = tracker(widget.widgetId);\n const nextDelay = handleWidget(t, widget, now(), opts, callbacks);\n schedule(t, nextDelay);\n }\n\n async function poll(t: WidgetTracker): Promise<void> {\n if (stopped) {\n return;\n }\n try {\n const widget = await source.getWidget(dashboardId, t.widgetId);\n if (stopped) {\n return;\n }\n const nextDelay = handleWidget(t, widget, now(), opts, callbacks);\n schedule(t, nextDelay);\n } catch (err) {\n if (stopped) {\n return;\n }\n callbacks.onError?.(err);\n schedule(t, opts.failingBackoffMs);\n }\n }\n\n async function bootstrap(): Promise<void> {\n try {\n const widgets = await source.getWidgets(dashboardId);\n if (stopped) {\n return;\n }\n for (const widget of widgets) {\n applyWidget(widget);\n }\n } catch (err) {\n if (stopped) {\n return;\n }\n callbacks.onError?.(err);\n const handle = setTimer(() => {\n if (!stopped) {\n void bootstrap();\n }\n }, opts.failingBackoffMs);\n onStopHandlers.push(() => clearTimer(handle));\n }\n }\n\n const onStopHandlers: Array<() => void> = [];\n\n if (visibility) {\n visibilityCleanup = visibility.onChange(() => {\n if (stopped) {\n return;\n }\n if (visibility.isHidden()) {\n for (const t of trackers.values()) {\n if (t.timer !== null) {\n clearTimer(t.timer);\n t.timer = null;\n }\n }\n } else {\n for (const t of trackers.values()) {\n schedule(t, 0);\n }\n }\n });\n }\n\n void bootstrap();\n\n return () => {\n stopped = true;\n for (const t of trackers.values()) {\n if (t.timer !== null) {\n clearTimer(t.timer);\n t.timer = null;\n }\n }\n for (const cleanup of onStopHandlers) {\n cleanup();\n }\n if (visibilityCleanup) {\n visibilityCleanup();\n }\n };\n}\n\nexport function handleWidget(\n t: WidgetTracker,\n widget: CachedWidget,\n nowMs: number,\n opts: ResolvedOptions,\n callbacks: SubscribeCallbacks,\n): number {\n const incomingSyncAtMs = widget.cachedAt\n ? new Date(widget.cachedAt).getTime()\n : null;\n const intervalMs =\n (widget.syncIntervalSeconds ?? opts.defaultIntervalSeconds) * 1000;\n const state = widget.syncState;\n\n const previousSyncAtMs = t.lastSyncAtMs;\n const advanced =\n incomingSyncAtMs !== null && incomingSyncAtMs !== previousSyncAtMs;\n\n switch (state) {\n case 'fresh': {\n if (advanced || previousSyncAtMs === null) {\n t.lastSyncAtMs = incomingSyncAtMs;\n t.lastSyncState = state;\n t.failingNotified = false;\n t.lateRetryDelayMs = null;\n t.syncingSinceMs = null;\n callbacks.onWidgetUpdated(widget);\n if (incomingSyncAtMs === null) {\n return intervalMs;\n }\n const expected = incomingSyncAtMs + intervalMs;\n return Math.max(0, expected - nowMs);\n }\n callbacks.onWidgetUnchanged?.(widget);\n const expected = (incomingSyncAtMs ?? nowMs) + intervalMs;\n const baseDelay = Math.max(0, expected - nowMs);\n const giveUpAtMs = (incomingSyncAtMs ?? nowMs) + 2 * intervalMs;\n if (nowMs >= giveUpAtMs) {\n t.lateRetryDelayMs = null;\n return Math.max(baseDelay, intervalMs);\n }\n const prev = t.lateRetryDelayMs ?? 0;\n const next =\n prev === 0\n ? opts.lateRetryStartMs\n : Math.min(prev * 2, opts.lateRetryMaxMs);\n t.lateRetryDelayMs = next;\n t.lastSyncState = state;\n return next;\n }\n case 'syncing': {\n t.lastSyncState = state;\n if (t.syncingSinceMs === null) {\n t.syncingSinceMs = nowMs;\n }\n callbacks.onWidgetUnchanged?.(widget);\n const elapsed = nowMs - t.syncingSinceMs;\n if (elapsed >= opts.syncingPollMaxMs) {\n return intervalMs;\n }\n return opts.syncingPollMs;\n }\n case 'failing':\n case 'stale': {\n t.lastSyncState = state;\n if (!t.failingNotified) {\n t.failingNotified = true;\n callbacks.onWidgetFailing?.(widget);\n } else {\n callbacks.onWidgetUnchanged?.(widget);\n }\n return opts.failingBackoffMs;\n }\n case 'unsynced': {\n t.lastSyncState = state;\n callbacks.onWidgetUnchanged?.(widget);\n return opts.unsyncedPollMs;\n }\n default: {\n if (advanced || previousSyncAtMs === null) {\n t.lastSyncAtMs = incomingSyncAtMs;\n callbacks.onWidgetUpdated(widget);\n } else {\n callbacks.onWidgetUnchanged?.(widget);\n }\n t.lastSyncState = state;\n return intervalMs;\n }\n }\n}\n\nfunction defaultVisibility(): VisibilitySource | null {\n if (typeof document === 'undefined') {\n return null;\n }\n const doc = document;\n return {\n isHidden: () => doc.hidden === true,\n onChange: (listener) => {\n const handler = () => listener();\n doc.addEventListener('visibilitychange', handler);\n if (typeof window !== 'undefined') {\n window.addEventListener('focus', handler);\n }\n return () => {\n doc.removeEventListener('visibilitychange', handler);\n if (typeof window !== 'undefined') {\n window.removeEventListener('focus', handler);\n }\n };\n },\n };\n}\n"],"mappings":"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","names":["expected"]}
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@rawdash/sdk-runtime",
3
+ "version": "0.15.0",
4
+ "description": "Rawdash auto-polling subscription engine for client-side dashboards",
5
+ "license": "Apache-2.0",
6
+ "type": "module",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/rawdash/rawdash.git",
10
+ "directory": "packages/sdk-runtime"
11
+ },
12
+ "files": [
13
+ "dist",
14
+ "README.md",
15
+ "LICENSE"
16
+ ],
17
+ "exports": {
18
+ ".": {
19
+ "@rawdash/source": "./src/index.ts",
20
+ "types": "./dist/index.d.ts",
21
+ "import": "./dist/index.js"
22
+ }
23
+ },
24
+ "scripts": {
25
+ "build": "tsup",
26
+ "typecheck": "tsc --noEmit",
27
+ "lint": "eslint src",
28
+ "test": "vitest run"
29
+ },
30
+ "dependencies": {
31
+ "@rawdash/core": "workspace:*",
32
+ "@rawdash/sdk-client": "workspace:*"
33
+ },
34
+ "devDependencies": {
35
+ "tsup": "^8.0.0",
36
+ "typescript": "^5.7.2"
37
+ }
38
+ }