@sweidos/eidos 1.0.20 → 1.0.22

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.
@@ -0,0 +1,105 @@
1
+ import { useEidosStore as o } from "./store.js";
2
+ let s = null, u = [];
3
+ function v() {
4
+ return s;
5
+ }
6
+ async function w(t) {
7
+ if (typeof navigator > "u" || !("serviceWorker" in navigator)) {
8
+ o.getState().setSwStatus("unsupported");
9
+ return;
10
+ }
11
+ const e = o.getState();
12
+ e.setSwStatus("registering");
13
+ try {
14
+ s = await navigator.serviceWorker.register(t, { scope: "/" }), await f(s), e.setSwStatus("active"), navigator.serviceWorker.addEventListener("message", S), window.addEventListener("online", () => e.setOnline(!0)), window.addEventListener("offline", () => e.setOnline(!1)), g();
15
+ } catch (n) {
16
+ e.setSwStatus("error", String(n));
17
+ }
18
+ }
19
+ function f(t) {
20
+ return new Promise((e) => {
21
+ if (t.active) {
22
+ e();
23
+ return;
24
+ }
25
+ const n = t.installing ?? t.waiting;
26
+ if (!n) {
27
+ e();
28
+ return;
29
+ }
30
+ const i = setTimeout(e, 1e4);
31
+ n.addEventListener("statechange", function r() {
32
+ n.state === "activated" && (clearTimeout(i), n.removeEventListener("statechange", r), e());
33
+ });
34
+ });
35
+ }
36
+ function d(t) {
37
+ const e = s == null ? void 0 : s.active;
38
+ e ? e.postMessage(t) : u.push(t);
39
+ }
40
+ let a = null;
41
+ function E(t) {
42
+ a = t;
43
+ }
44
+ function p() {
45
+ try {
46
+ return typeof navigator < "u" && "serviceWorker" in navigator && s !== null && "sync" in s;
47
+ } catch {
48
+ return !1;
49
+ }
50
+ }
51
+ function S(t) {
52
+ const e = t.data;
53
+ if (!(e != null && e.type)) return;
54
+ const n = o.getState(), { type: i, url: r } = e;
55
+ if (i === "EIDOS_BACKGROUND_SYNC") {
56
+ a == null || a();
57
+ return;
58
+ }
59
+ if (r)
60
+ switch (i) {
61
+ case "EIDOS_CACHE_HIT": {
62
+ const c = n.resources[r];
63
+ n.updateResource(r, {
64
+ status: "fresh",
65
+ lastEvent: "cache-hit",
66
+ cacheHits: ((c == null ? void 0 : c.cacheHits) ?? 0) + 1
67
+ });
68
+ break;
69
+ }
70
+ case "EIDOS_CACHE_UPDATED": {
71
+ n.updateResource(r, {
72
+ status: "fresh",
73
+ lastEvent: "cache-updated",
74
+ cachedAt: Date.now()
75
+ });
76
+ break;
77
+ }
78
+ case "EIDOS_NETWORK_ERROR": {
79
+ n.updateResource(r, {
80
+ status: "error",
81
+ lastEvent: "network-error"
82
+ });
83
+ break;
84
+ }
85
+ }
86
+ }
87
+ function h(t) {
88
+ d({ type: "EIDOS_SIMULATE_OFFLINE", enabled: t }), o.getState().setOnline(!t);
89
+ }
90
+ function g() {
91
+ const t = s == null ? void 0 : s.active;
92
+ if (t) {
93
+ for (const e of u) t.postMessage(e);
94
+ u = [];
95
+ }
96
+ }
97
+ export {
98
+ v as getSwRegistration,
99
+ p as isBgSyncSupported,
100
+ E as registerBgSyncHandler,
101
+ w as registerServiceWorker,
102
+ d as sendToWorker,
103
+ h as setOfflineSimulation
104
+ };
105
+ //# sourceMappingURL=sw-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sw-bridge.js","sources":["../src/sw-bridge.ts"],"sourcesContent":["import { useEidosStore } from './store'\n\nlet _registration: ServiceWorkerRegistration | null = null\n// Messages sent before the SW activates are buffered here and flushed once\n// the SW is ready. Covers resource registrations, cache clears, offline\n// simulation — anything sent at module scope before EidosProvider mounts.\nlet _pendingMessages: Record<string, unknown>[] = []\n\nexport function getSwRegistration() {\n return _registration\n}\n\nexport async function registerServiceWorker(swPath: string): Promise<void> {\n if (typeof navigator === 'undefined' || !('serviceWorker' in navigator)) {\n useEidosStore.getState().setSwStatus('unsupported')\n return\n }\n\n const store = useEidosStore.getState()\n store.setSwStatus('registering')\n\n try {\n _registration = await navigator.serviceWorker.register(swPath, { scope: '/' })\n\n await waitForActivation(_registration)\n\n store.setSwStatus('active')\n\n // Receive messages from SW\n navigator.serviceWorker.addEventListener('message', onSwMessage)\n\n // Track online/offline\n window.addEventListener('online', () => store.setOnline(true))\n window.addEventListener('offline', () => store.setOnline(false))\n\n flushPendingMessages()\n } catch (err) {\n store.setSwStatus('error', String(err))\n }\n}\n\nfunction waitForActivation(reg: ServiceWorkerRegistration): Promise<void> {\n return new Promise((resolve) => {\n if (reg.active) { resolve(); return }\n const sw = reg.installing ?? reg.waiting\n if (!sw) { resolve(); return }\n\n // Resolve after 10s regardless — another tab may be blocking activation\n const timer = setTimeout(resolve, 10_000)\n\n sw.addEventListener('statechange', function handler() {\n if (sw.state === 'activated') {\n clearTimeout(timer)\n sw.removeEventListener('statechange', handler)\n resolve()\n }\n })\n })\n}\n\nexport function sendToWorker(message: Record<string, unknown>): void {\n const sw = _registration?.active\n if (sw) {\n sw.postMessage(message)\n } else {\n _pendingMessages.push(message)\n }\n}\n\nlet _bgSyncHandler: (() => void) | null = null\n\nexport function registerBgSyncHandler(fn: () => void): void {\n _bgSyncHandler = fn\n}\n\nexport function isBgSyncSupported(): boolean {\n try {\n return (\n typeof navigator !== 'undefined' &&\n 'serviceWorker' in navigator &&\n _registration !== null &&\n 'sync' in _registration\n )\n } catch {\n return false\n }\n}\n\nfunction onSwMessage(event: MessageEvent): void {\n const data = event.data as { type: string; url?: string; strategy?: string }\n if (!data?.type) return\n\n const store = useEidosStore.getState()\n const { type, url } = data\n\n if (type === 'EIDOS_BACKGROUND_SYNC') {\n _bgSyncHandler?.()\n return\n }\n\n if (!url) return\n\n switch (type) {\n case 'EIDOS_CACHE_HIT': {\n const current = store.resources[url]\n store.updateResource(url, {\n status: 'fresh',\n lastEvent: 'cache-hit',\n cacheHits: (current?.cacheHits ?? 0) + 1,\n })\n break\n }\n case 'EIDOS_CACHE_UPDATED': {\n store.updateResource(url, {\n status: 'fresh',\n lastEvent: 'cache-updated',\n cachedAt: Date.now(),\n })\n break\n }\n case 'EIDOS_NETWORK_ERROR': {\n store.updateResource(url, {\n status: 'error',\n lastEvent: 'network-error',\n })\n break\n }\n }\n}\n\nexport function setOfflineSimulation(enabled: boolean): void {\n sendToWorker({ type: 'EIDOS_SIMULATE_OFFLINE', enabled })\n useEidosStore.getState().setOnline(!enabled)\n}\n\nfunction flushPendingMessages(): void {\n const sw = _registration?.active\n if (!sw) return\n for (const msg of _pendingMessages) sw.postMessage(msg)\n _pendingMessages = []\n}\n"],"names":["_registration","_pendingMessages","getSwRegistration","registerServiceWorker","swPath","useEidosStore","store","waitForActivation","onSwMessage","flushPendingMessages","err","reg","resolve","sw","timer","handler","sendToWorker","message","_bgSyncHandler","registerBgSyncHandler","fn","isBgSyncSupported","event","data","type","url","current","setOfflineSimulation","enabled","msg"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ const o = "1.0.12";
2
+ export {
3
+ o as VERSION
4
+ };
5
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sources":["../src/version.ts"],"sourcesContent":["export const VERSION = '1.0.12'\n"],"names":["VERSION"],"mappings":"AAAO,MAAMA,IAAU;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sweidos/eidos",
3
- "version": "1.0.20",
3
+ "version": "1.0.22",
4
4
  "description": "Describe intent. The runtime figures out how. An abstraction layer for offline-first web apps.",
5
5
  "author": "Aditya Raj",
6
6
  "license": "MIT",
@@ -23,11 +23,11 @@
23
23
  "directory": "packages/core"
24
24
  },
25
25
  "main": "./dist/eidos.cjs.js",
26
- "module": "./dist/eidos.es.js",
26
+ "module": "./dist/index.js",
27
27
  "types": "./dist/index.d.ts",
28
28
  "exports": {
29
29
  ".": {
30
- "import": "./dist/eidos.es.js",
30
+ "import": "./dist/index.js",
31
31
  "require": "./dist/eidos.cjs.js",
32
32
  "types": "./dist/index.d.ts"
33
33
  },
@@ -83,7 +83,7 @@
83
83
  "vitest": "^2.1.9"
84
84
  },
85
85
  "scripts": {
86
- "build": "vite build && vite build --config vite.plugin.config.ts && vite build --config vite.query.config.ts && node scripts/copy-sw.mjs",
86
+ "build": "vite build && vite build --config vite.cjs.config.ts && vite build --config vite.plugin.config.ts && vite build --config vite.query.config.ts && node scripts/copy-sw.mjs",
87
87
  "dev": "vite build --watch",
88
88
  "type-check": "tsc --noEmit",
89
89
  "test": "vitest run",