@goodo/platform-plugin 0.1.6 → 0.1.7
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.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +48 -66
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +2 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/widget-sdk.d.ts +2 -7
- package/dist/widget-sdk.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("./communicator-DQZOTxOF.cjs");let d=null;function c(t){return d||(d=u.pong(t).catch(e=>{throw d=null,e})),d}function z(t){c().then(e=>e.sendRequest("widget_ready")).then(e=>{t(e)}).catch(e=>{console.error("Failed to initialize widget:",e)})}async function N(t,e){return await(await c()).sendRequest("emit_widget_event",{type:t,args:e})}async function C(t){return await(await c()).sendRequest("set_widget_personalization",t)}function E(t){let e=!1,i=null;return c().then(r=>{e||(i=r.registerHandler("widget_filter_change",a=>{t(a)}))}).catch(r=>{console.error("Failed to initialize communicator for filter change listener:",r)}),()=>{e=!0,i&&i()}}async function g(t){return await(await c()).sendRequest("fetch_node_data",t)}function P(t){async function e(n){return await g({...t,...n})}const i=new Set;let r=null,a=!1,s=null,l=null;async function _(){if(a||s)return;a=!0;const n=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():Math.random().toString(36).substring(2,9);r=n;try{const o=await c();if(l=o,i.size===0||r!==n)return;s=o.registerHandler("widget_data_source_update",m=>{(m==null?void 0:m.identity)===n&&i.forEach(w=>{try{w()}catch(y){console.error("Error in widget data source onChange callback:",y)}})}),await o.sendRequest("add_widget_data_source_listener",{identity:n,config:t})}catch(o){console.error("Failed to initialize communicator for data source listener:",o)}finally{a=!1,i.size===0&&r===n&&f()}}function f(){const n=r;r=null,a=!1,s&&(s(),s=null),l&&n&&l.sendRequest("remove_widget_data_source_listener",{identity:n}).catch(o=>{console.error("Failed to remove data source listener:",o)})}function h(n){return i.add(n),i.size===1&&_(),()=>{i.delete(n),i.size===0&&f()}}return{fetch:e,onChange:h}}exports.Communicator=u.Communicator;exports.PING_TOKEN=u.PING_TOKEN;exports.PONG_TOKEN=u.PONG_TOKEN;exports.pong=u.pong;exports.createDataSource=P;exports.emitWidgetEvent=N;exports.fetchNodeData=g;exports.onWidgetFilterChange=E;exports.onWidgetReady=z;exports.setWidgetPersonalization=C;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/widget-sdk.ts"],"sourcesContent":["import { Communicator, pong, OnPingOptions } from './communicator';\nimport { DataSourceConfig, NodeData, NodeDataRequestPayload, WidgetConfig } from './types';\n\nlet communicatorPromise: Promise<Communicator> | null = null;\n\n/**\n * Get or initialize the Communicator instance for the widget.\n * Caches the connection promise so that multiple calls reuse the same handshake.\n */\nfunction getCommunicator(options?: OnPingOptions): Promise<Communicator> {\n if (!communicatorPromise) {\n communicatorPromise = pong(options).catch((err) => {\n communicatorPromise = null;\n throw err;\n });\n }\n\n return communicatorPromise;\n}\n\n/**\n * Called when the widget is ready to receive configuration from the host.\n */\nexport function onWidgetReady(callback: (config: WidgetConfig) => void) {\n getCommunicator()\n .then((comm) => comm.sendRequest('widget_ready'))\n .then((config) => {\n callback(config);\n })\n .catch((err) => {\n console.error('Failed to initialize widget:', err);\n });\n}\n\n/**\n * Add a reactive data source listener on the host platform.\n * Returns an unsubscribe function.\n */\nexport function addDataSourceListener(config: DataSourceConfig, onChange: (value: any[]) => void): () => void {\n const identity =\n typeof crypto !== 'undefined' && crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).substring(2, 9);\n\n let isCancelled = false;\n\n let unregisterHandler: (() => void) | null = null;\n\n let commInstance: Communicator | null = null;\n\n getCommunicator()\n .then((comm) => {\n commInstance = comm;\n\n if (isCancelled) {\n return;\n }\n\n unregisterHandler = comm.registerHandler('widget_data_source_update', (payload) => {\n if (payload?.identity === identity) {\n onChange(payload.data || []);\n }\n });\n\n comm.sendRequest('add_widget_data_source_listener', { identity, config }).catch((err) => {\n console.error('Failed to add data source listener:', err);\n });\n })\n .catch((err) => {\n console.error('Failed to initialize communicator for data source listener:', err);\n });\n\n return () => {\n isCancelled = true;\n\n if (unregisterHandler) {\n unregisterHandler();\n }\n\n if (commInstance) {\n commInstance.sendRequest('remove_widget_data_source_listener', { identity }).catch((err) => {\n console.error('Failed to remove data source listener:', err);\n });\n }\n };\n}\n\n/**\n * Emit a custom widget event to the host platform.\n */\nexport async function emitWidgetEvent(type: string, args?: Record<string, any>) {\n const comm = await getCommunicator();\n\n return await comm.sendRequest('emit_widget_event', { type, args });\n}\n\n/**\n * Update widget personalization state on the host platform.\n */\nexport async function setWidgetPersonalization(data: any) {\n const comm = await getCommunicator();\n\n return await comm.sendRequest('set_widget_personalization', data);\n}\n\n/**\n * Register a listener for widget filter changes from the host platform.\n * Returns an unsubscribe function.\n */\nexport function onWidgetFilterChange(callback: (condition: string) => void): () => void {\n let isCancelled = false;\n\n let unregisterHandler: (() => void) | null = null;\n\n getCommunicator()\n .then((comm) => {\n if (isCancelled) {\n return;\n }\n\n unregisterHandler = comm.registerHandler('widget_filter_change', (condition) => {\n callback(condition);\n });\n })\n .catch((err) => {\n console.error('Failed to initialize communicator for filter change listener:', err);\n });\n\n return () => {\n isCancelled = true;\n\n if (unregisterHandler) {\n unregisterHandler();\n }\n };\n}\n\nexport async function fetchNodeData(payload: NodeDataRequestPayload): Promise<NodeData> {\n const comm = await getCommunicator();\n\n return await comm.sendRequest('fetch_node_data', payload);\n}\n\nexport function createDataSource(config: Pick<NodeDataRequestPayload, 'node' | 'filterExpression'>) {\n async function fetch(payload?: Omit<NodeDataRequestPayload, 'node' | 'filterExpression'>) {\n return await fetchNodeData({\n ...config,\n ...payload,\n });\n }\n\n const callbacks = new Set<() => void>();\n let identity: string | null = null;\n let isConnecting = false;\n let unregisterHandler: (() => void) | null = null;\n let commInstance: Communicator | null = null;\n\n async function connect() {\n if (isConnecting || unregisterHandler) return;\n isConnecting = true;\n\n const currentIdentity =\n typeof crypto !== 'undefined' && crypto.randomUUID\n ? crypto.randomUUID()\n : Math.random().toString(36).substring(2, 9);\n identity = currentIdentity;\n\n try {\n const comm = await getCommunicator();\n commInstance = comm;\n\n // If all subscribers unsubscribed while connecting, abort\n if (callbacks.size === 0 || identity !== currentIdentity) {\n return;\n }\n\n unregisterHandler = comm.registerHandler('widget_data_source_update', (payload) => {\n if (payload?.identity !== currentIdentity) return;\n\n callbacks.forEach((cb) => {\n try {\n cb();\n } catch (err) {\n console.error('Error in widget data source onChange callback:', err);\n }\n });\n });\n\n await comm.sendRequest('add_widget_data_source_listener', { identity: currentIdentity, config });\n } catch (err) {\n console.error('Failed to initialize communicator for data source listener:', err);\n } finally {\n isConnecting = false;\n // In case subscribers dropped to 0 while add_widget_data_source_listener was in-flight\n if (callbacks.size === 0 && identity === currentIdentity) {\n disconnect();\n }\n }\n }\n\n function disconnect() {\n const activeIdentity = identity;\n identity = null;\n isConnecting = false;\n\n if (unregisterHandler) {\n unregisterHandler();\n unregisterHandler = null;\n }\n\n if (commInstance && activeIdentity) {\n commInstance.sendRequest('remove_widget_data_source_listener', { identity: activeIdentity }).catch((err) => {\n console.error('Failed to remove data source listener:', err);\n });\n }\n }\n\n function onChange(callback: () => void): () => void {\n callbacks.add(callback);\n\n if (callbacks.size === 1) {\n connect();\n }\n\n return () => {\n callbacks.delete(callback);\n\n if (callbacks.size === 0) {\n disconnect();\n }\n };\n }\n\n return {\n fetch,\n onChange,\n };\n}\n\n"],"names":["communicatorPromise","getCommunicator","options","pong","err","onWidgetReady","callback","comm","config","addDataSourceListener","onChange","identity","isCancelled","unregisterHandler","commInstance","payload","emitWidgetEvent","type","args","setWidgetPersonalization","data","onWidgetFilterChange","condition","fetchNodeData","createDataSource","fetch","callbacks","isConnecting","connect","currentIdentity","cb","disconnect","activeIdentity"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/widget-sdk.ts"],"sourcesContent":["import { Communicator, pong, OnPingOptions } from './communicator';\nimport { DataSourceConfig, NodeData, NodeDataRequestPayload, WidgetConfig, WidgetFilter } from './types';\n\nlet communicatorPromise: Promise<Communicator> | null = null;\n\n/**\n * Get or initialize the Communicator instance for the widget.\n * Caches the connection promise so that multiple calls reuse the same handshake.\n */\nfunction getCommunicator(options?: OnPingOptions): Promise<Communicator> {\n if (!communicatorPromise) {\n communicatorPromise = pong(options).catch((err) => {\n communicatorPromise = null;\n throw err;\n });\n }\n\n return communicatorPromise;\n}\n\n/**\n * Called when the widget is ready to receive configuration from the host.\n */\nexport function onWidgetReady(callback: (config: WidgetConfig) => void) {\n getCommunicator()\n .then((comm) => comm.sendRequest('widget_ready'))\n .then((config) => {\n callback(config);\n })\n .catch((err) => {\n console.error('Failed to initialize widget:', err);\n });\n}\n\n/**\n * Emit a custom widget event to the host platform.\n */\nexport async function emitWidgetEvent(type: string, args?: Record<string, any>) {\n const comm = await getCommunicator();\n\n return await comm.sendRequest('emit_widget_event', { type, args });\n}\n\n/**\n * Update widget personalization state on the host platform.\n */\nexport async function setWidgetPersonalization(data: any) {\n const comm = await getCommunicator();\n\n return await comm.sendRequest('set_widget_personalization', data);\n}\n\n/**\n * Register a listener for widget filter changes from the host platform.\n * Returns an unsubscribe function.\n */\nexport function onWidgetFilterChange(callback: (condition: WidgetFilter) => void): () => void {\n let isCancelled = false;\n\n let unregisterHandler: (() => void) | null = null;\n\n getCommunicator()\n .then((comm) => {\n if (isCancelled) {\n return;\n }\n\n unregisterHandler = comm.registerHandler('widget_filter_change', (condition) => {\n callback(condition);\n });\n })\n .catch((err) => {\n console.error('Failed to initialize communicator for filter change listener:', err);\n });\n\n return () => {\n isCancelled = true;\n\n if (unregisterHandler) {\n unregisterHandler();\n }\n };\n}\n\nexport async function fetchNodeData(payload: NodeDataRequestPayload): Promise<NodeData> {\n const comm = await getCommunicator();\n\n return await comm.sendRequest('fetch_node_data', payload);\n}\n\nexport function createDataSource(config: Pick<NodeDataRequestPayload, 'node' | 'filterExpression'>) {\n async function fetch(payload?: Omit<NodeDataRequestPayload, 'node' | 'filterExpression'>) {\n return await fetchNodeData({\n ...config,\n ...payload,\n });\n }\n\n const callbacks = new Set<() => void>();\n let identity: string | null = null;\n let isConnecting = false;\n let unregisterHandler: (() => void) | null = null;\n let commInstance: Communicator | null = null;\n\n async function connect() {\n if (isConnecting || unregisterHandler) return;\n isConnecting = true;\n\n const currentIdentity =\n typeof crypto !== 'undefined' && crypto.randomUUID\n ? crypto.randomUUID()\n : Math.random().toString(36).substring(2, 9);\n identity = currentIdentity;\n\n try {\n const comm = await getCommunicator();\n commInstance = comm;\n\n // If all subscribers unsubscribed while connecting, abort\n if (callbacks.size === 0 || identity !== currentIdentity) {\n return;\n }\n\n unregisterHandler = comm.registerHandler('widget_data_source_update', (payload) => {\n if (payload?.identity !== currentIdentity) return;\n\n callbacks.forEach((cb) => {\n try {\n cb();\n } catch (err) {\n console.error('Error in widget data source onChange callback:', err);\n }\n });\n });\n\n await comm.sendRequest('add_widget_data_source_listener', { identity: currentIdentity, config });\n } catch (err) {\n console.error('Failed to initialize communicator for data source listener:', err);\n } finally {\n isConnecting = false;\n // In case subscribers dropped to 0 while add_widget_data_source_listener was in-flight\n if (callbacks.size === 0 && identity === currentIdentity) {\n disconnect();\n }\n }\n }\n\n function disconnect() {\n const activeIdentity = identity;\n identity = null;\n isConnecting = false;\n\n if (unregisterHandler) {\n unregisterHandler();\n unregisterHandler = null;\n }\n\n if (commInstance && activeIdentity) {\n commInstance.sendRequest('remove_widget_data_source_listener', { identity: activeIdentity }).catch((err) => {\n console.error('Failed to remove data source listener:', err);\n });\n }\n }\n\n function onChange(callback: () => void): () => void {\n callbacks.add(callback);\n\n if (callbacks.size === 1) {\n connect();\n }\n\n return () => {\n callbacks.delete(callback);\n\n if (callbacks.size === 0) {\n disconnect();\n }\n };\n }\n\n return {\n fetch,\n onChange,\n };\n}\n\n"],"names":["communicatorPromise","getCommunicator","options","pong","err","onWidgetReady","callback","comm","config","emitWidgetEvent","type","args","setWidgetPersonalization","data","onWidgetFilterChange","isCancelled","unregisterHandler","condition","fetchNodeData","payload","createDataSource","fetch","callbacks","identity","isConnecting","commInstance","connect","currentIdentity","cb","disconnect","activeIdentity","onChange"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,98 +1,81 @@
|
|
|
1
1
|
import { b as w } from "./communicator-BF77R7Qs.js";
|
|
2
|
-
import { C as
|
|
3
|
-
let
|
|
4
|
-
function
|
|
5
|
-
return
|
|
6
|
-
throw
|
|
7
|
-
})),
|
|
2
|
+
import { C as F, P as N, a as P } from "./communicator-BF77R7Qs.js";
|
|
3
|
+
let u = null;
|
|
4
|
+
function c(t) {
|
|
5
|
+
return u || (u = w(t).catch((e) => {
|
|
6
|
+
throw u = null, e;
|
|
7
|
+
})), u;
|
|
8
8
|
}
|
|
9
9
|
function C(t) {
|
|
10
|
-
|
|
10
|
+
c().then((e) => e.sendRequest("widget_ready")).then((e) => {
|
|
11
11
|
t(e);
|
|
12
12
|
}).catch((e) => {
|
|
13
13
|
console.error("Failed to initialize widget:", e);
|
|
14
14
|
});
|
|
15
15
|
}
|
|
16
|
-
function I(t, e) {
|
|
17
|
-
const n = typeof crypto < "u" && crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).substring(2, 9);
|
|
18
|
-
let i = !1, a = null, c = null;
|
|
19
|
-
return u().then((o) => {
|
|
20
|
-
c = o, !i && (a = o.registerHandler("widget_data_source_update", (s) => {
|
|
21
|
-
(s == null ? void 0 : s.identity) === n && e(s.data || []);
|
|
22
|
-
}), o.sendRequest("add_widget_data_source_listener", { identity: n, config: t }).catch((s) => {
|
|
23
|
-
console.error("Failed to add data source listener:", s);
|
|
24
|
-
}));
|
|
25
|
-
}).catch((o) => {
|
|
26
|
-
console.error("Failed to initialize communicator for data source listener:", o);
|
|
27
|
-
}), () => {
|
|
28
|
-
i = !0, a && a(), c && c.sendRequest("remove_widget_data_source_listener", { identity: n }).catch((o) => {
|
|
29
|
-
console.error("Failed to remove data source listener:", o);
|
|
30
|
-
});
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
16
|
async function R(t, e) {
|
|
34
|
-
return await (await
|
|
17
|
+
return await (await c()).sendRequest("emit_widget_event", { type: t, args: e });
|
|
35
18
|
}
|
|
36
|
-
async function
|
|
37
|
-
return await (await
|
|
19
|
+
async function p(t) {
|
|
20
|
+
return await (await c()).sendRequest("set_widget_personalization", t);
|
|
38
21
|
}
|
|
39
|
-
function
|
|
40
|
-
let e = !1,
|
|
41
|
-
return
|
|
42
|
-
e || (
|
|
22
|
+
function q(t) {
|
|
23
|
+
let e = !1, i = null;
|
|
24
|
+
return c().then((r) => {
|
|
25
|
+
e || (i = r.registerHandler("widget_filter_change", (a) => {
|
|
43
26
|
t(a);
|
|
44
27
|
}));
|
|
45
|
-
}).catch((
|
|
46
|
-
console.error("Failed to initialize communicator for filter change listener:",
|
|
28
|
+
}).catch((r) => {
|
|
29
|
+
console.error("Failed to initialize communicator for filter change listener:", r);
|
|
47
30
|
}), () => {
|
|
48
|
-
e = !0,
|
|
31
|
+
e = !0, i && i();
|
|
49
32
|
};
|
|
50
33
|
}
|
|
51
34
|
async function y(t) {
|
|
52
|
-
return await (await
|
|
35
|
+
return await (await c()).sendRequest("fetch_node_data", t);
|
|
53
36
|
}
|
|
54
|
-
function
|
|
55
|
-
async function e(
|
|
37
|
+
function I(t) {
|
|
38
|
+
async function e(n) {
|
|
56
39
|
return await y({
|
|
57
40
|
...t,
|
|
58
|
-
...
|
|
41
|
+
...n
|
|
59
42
|
});
|
|
60
43
|
}
|
|
61
|
-
const
|
|
62
|
-
let
|
|
63
|
-
async function
|
|
64
|
-
if (a ||
|
|
44
|
+
const i = /* @__PURE__ */ new Set();
|
|
45
|
+
let r = null, a = !1, s = null, l = null;
|
|
46
|
+
async function m() {
|
|
47
|
+
if (a || s) return;
|
|
65
48
|
a = !0;
|
|
66
|
-
const
|
|
67
|
-
|
|
49
|
+
const n = typeof crypto < "u" && crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).substring(2, 9);
|
|
50
|
+
r = n;
|
|
68
51
|
try {
|
|
69
|
-
const
|
|
70
|
-
if (
|
|
52
|
+
const o = await c();
|
|
53
|
+
if (l = o, i.size === 0 || r !== n)
|
|
71
54
|
return;
|
|
72
|
-
|
|
73
|
-
(
|
|
55
|
+
s = o.registerHandler("widget_data_source_update", (d) => {
|
|
56
|
+
(d == null ? void 0 : d.identity) === n && i.forEach((_) => {
|
|
74
57
|
try {
|
|
75
58
|
_();
|
|
76
59
|
} catch (h) {
|
|
77
60
|
console.error("Error in widget data source onChange callback:", h);
|
|
78
61
|
}
|
|
79
62
|
});
|
|
80
|
-
}), await
|
|
81
|
-
} catch (
|
|
82
|
-
console.error("Failed to initialize communicator for data source listener:",
|
|
63
|
+
}), await o.sendRequest("add_widget_data_source_listener", { identity: n, config: t });
|
|
64
|
+
} catch (o) {
|
|
65
|
+
console.error("Failed to initialize communicator for data source listener:", o);
|
|
83
66
|
} finally {
|
|
84
|
-
a = !1,
|
|
67
|
+
a = !1, i.size === 0 && r === n && f();
|
|
85
68
|
}
|
|
86
69
|
}
|
|
87
|
-
function
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
console.error("Failed to remove data source listener:",
|
|
70
|
+
function f() {
|
|
71
|
+
const n = r;
|
|
72
|
+
r = null, a = !1, s && (s(), s = null), l && n && l.sendRequest("remove_widget_data_source_listener", { identity: n }).catch((o) => {
|
|
73
|
+
console.error("Failed to remove data source listener:", o);
|
|
91
74
|
});
|
|
92
75
|
}
|
|
93
|
-
function g(
|
|
94
|
-
return
|
|
95
|
-
|
|
76
|
+
function g(n) {
|
|
77
|
+
return i.add(n), i.size === 1 && m(), () => {
|
|
78
|
+
i.delete(n), i.size === 0 && f();
|
|
96
79
|
};
|
|
97
80
|
}
|
|
98
81
|
return {
|
|
@@ -101,16 +84,15 @@ function U(t) {
|
|
|
101
84
|
};
|
|
102
85
|
}
|
|
103
86
|
export {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
I as
|
|
108
|
-
U as createDataSource,
|
|
87
|
+
F as Communicator,
|
|
88
|
+
N as PING_TOKEN,
|
|
89
|
+
P as PONG_TOKEN,
|
|
90
|
+
I as createDataSource,
|
|
109
91
|
R as emitWidgetEvent,
|
|
110
92
|
y as fetchNodeData,
|
|
111
|
-
|
|
93
|
+
q as onWidgetFilterChange,
|
|
112
94
|
C as onWidgetReady,
|
|
113
95
|
w as pong,
|
|
114
|
-
|
|
96
|
+
p as setWidgetPersonalization
|
|
115
97
|
};
|
|
116
98
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/widget-sdk.ts"],"sourcesContent":["import { Communicator, pong, OnPingOptions } from './communicator';\nimport { DataSourceConfig, NodeData, NodeDataRequestPayload, WidgetConfig } from './types';\n\nlet communicatorPromise: Promise<Communicator> | null = null;\n\n/**\n * Get or initialize the Communicator instance for the widget.\n * Caches the connection promise so that multiple calls reuse the same handshake.\n */\nfunction getCommunicator(options?: OnPingOptions): Promise<Communicator> {\n if (!communicatorPromise) {\n communicatorPromise = pong(options).catch((err) => {\n communicatorPromise = null;\n throw err;\n });\n }\n\n return communicatorPromise;\n}\n\n/**\n * Called when the widget is ready to receive configuration from the host.\n */\nexport function onWidgetReady(callback: (config: WidgetConfig) => void) {\n getCommunicator()\n .then((comm) => comm.sendRequest('widget_ready'))\n .then((config) => {\n callback(config);\n })\n .catch((err) => {\n console.error('Failed to initialize widget:', err);\n });\n}\n\n/**\n * Add a reactive data source listener on the host platform.\n * Returns an unsubscribe function.\n */\nexport function addDataSourceListener(config: DataSourceConfig, onChange: (value: any[]) => void): () => void {\n const identity =\n typeof crypto !== 'undefined' && crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).substring(2, 9);\n\n let isCancelled = false;\n\n let unregisterHandler: (() => void) | null = null;\n\n let commInstance: Communicator | null = null;\n\n getCommunicator()\n .then((comm) => {\n commInstance = comm;\n\n if (isCancelled) {\n return;\n }\n\n unregisterHandler = comm.registerHandler('widget_data_source_update', (payload) => {\n if (payload?.identity === identity) {\n onChange(payload.data || []);\n }\n });\n\n comm.sendRequest('add_widget_data_source_listener', { identity, config }).catch((err) => {\n console.error('Failed to add data source listener:', err);\n });\n })\n .catch((err) => {\n console.error('Failed to initialize communicator for data source listener:', err);\n });\n\n return () => {\n isCancelled = true;\n\n if (unregisterHandler) {\n unregisterHandler();\n }\n\n if (commInstance) {\n commInstance.sendRequest('remove_widget_data_source_listener', { identity }).catch((err) => {\n console.error('Failed to remove data source listener:', err);\n });\n }\n };\n}\n\n/**\n * Emit a custom widget event to the host platform.\n */\nexport async function emitWidgetEvent(type: string, args?: Record<string, any>) {\n const comm = await getCommunicator();\n\n return await comm.sendRequest('emit_widget_event', { type, args });\n}\n\n/**\n * Update widget personalization state on the host platform.\n */\nexport async function setWidgetPersonalization(data: any) {\n const comm = await getCommunicator();\n\n return await comm.sendRequest('set_widget_personalization', data);\n}\n\n/**\n * Register a listener for widget filter changes from the host platform.\n * Returns an unsubscribe function.\n */\nexport function onWidgetFilterChange(callback: (condition: string) => void): () => void {\n let isCancelled = false;\n\n let unregisterHandler: (() => void) | null = null;\n\n getCommunicator()\n .then((comm) => {\n if (isCancelled) {\n return;\n }\n\n unregisterHandler = comm.registerHandler('widget_filter_change', (condition) => {\n callback(condition);\n });\n })\n .catch((err) => {\n console.error('Failed to initialize communicator for filter change listener:', err);\n });\n\n return () => {\n isCancelled = true;\n\n if (unregisterHandler) {\n unregisterHandler();\n }\n };\n}\n\nexport async function fetchNodeData(payload: NodeDataRequestPayload): Promise<NodeData> {\n const comm = await getCommunicator();\n\n return await comm.sendRequest('fetch_node_data', payload);\n}\n\nexport function createDataSource(config: Pick<NodeDataRequestPayload, 'node' | 'filterExpression'>) {\n async function fetch(payload?: Omit<NodeDataRequestPayload, 'node' | 'filterExpression'>) {\n return await fetchNodeData({\n ...config,\n ...payload,\n });\n }\n\n const callbacks = new Set<() => void>();\n let identity: string | null = null;\n let isConnecting = false;\n let unregisterHandler: (() => void) | null = null;\n let commInstance: Communicator | null = null;\n\n async function connect() {\n if (isConnecting || unregisterHandler) return;\n isConnecting = true;\n\n const currentIdentity =\n typeof crypto !== 'undefined' && crypto.randomUUID\n ? crypto.randomUUID()\n : Math.random().toString(36).substring(2, 9);\n identity = currentIdentity;\n\n try {\n const comm = await getCommunicator();\n commInstance = comm;\n\n // If all subscribers unsubscribed while connecting, abort\n if (callbacks.size === 0 || identity !== currentIdentity) {\n return;\n }\n\n unregisterHandler = comm.registerHandler('widget_data_source_update', (payload) => {\n if (payload?.identity !== currentIdentity) return;\n\n callbacks.forEach((cb) => {\n try {\n cb();\n } catch (err) {\n console.error('Error in widget data source onChange callback:', err);\n }\n });\n });\n\n await comm.sendRequest('add_widget_data_source_listener', { identity: currentIdentity, config });\n } catch (err) {\n console.error('Failed to initialize communicator for data source listener:', err);\n } finally {\n isConnecting = false;\n // In case subscribers dropped to 0 while add_widget_data_source_listener was in-flight\n if (callbacks.size === 0 && identity === currentIdentity) {\n disconnect();\n }\n }\n }\n\n function disconnect() {\n const activeIdentity = identity;\n identity = null;\n isConnecting = false;\n\n if (unregisterHandler) {\n unregisterHandler();\n unregisterHandler = null;\n }\n\n if (commInstance && activeIdentity) {\n commInstance.sendRequest('remove_widget_data_source_listener', { identity: activeIdentity }).catch((err) => {\n console.error('Failed to remove data source listener:', err);\n });\n }\n }\n\n function onChange(callback: () => void): () => void {\n callbacks.add(callback);\n\n if (callbacks.size === 1) {\n connect();\n }\n\n return () => {\n callbacks.delete(callback);\n\n if (callbacks.size === 0) {\n disconnect();\n }\n };\n }\n\n return {\n fetch,\n onChange,\n };\n}\n\n"],"names":["communicatorPromise","getCommunicator","options","pong","err","onWidgetReady","callback","comm","config","addDataSourceListener","onChange","identity","isCancelled","unregisterHandler","commInstance","payload","emitWidgetEvent","type","args","setWidgetPersonalization","data","onWidgetFilterChange","condition","fetchNodeData","createDataSource","fetch","callbacks","isConnecting","connect","currentIdentity","cb","disconnect","activeIdentity"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/widget-sdk.ts"],"sourcesContent":["import { Communicator, pong, OnPingOptions } from './communicator';\nimport { DataSourceConfig, NodeData, NodeDataRequestPayload, WidgetConfig, WidgetFilter } from './types';\n\nlet communicatorPromise: Promise<Communicator> | null = null;\n\n/**\n * Get or initialize the Communicator instance for the widget.\n * Caches the connection promise so that multiple calls reuse the same handshake.\n */\nfunction getCommunicator(options?: OnPingOptions): Promise<Communicator> {\n if (!communicatorPromise) {\n communicatorPromise = pong(options).catch((err) => {\n communicatorPromise = null;\n throw err;\n });\n }\n\n return communicatorPromise;\n}\n\n/**\n * Called when the widget is ready to receive configuration from the host.\n */\nexport function onWidgetReady(callback: (config: WidgetConfig) => void) {\n getCommunicator()\n .then((comm) => comm.sendRequest('widget_ready'))\n .then((config) => {\n callback(config);\n })\n .catch((err) => {\n console.error('Failed to initialize widget:', err);\n });\n}\n\n/**\n * Emit a custom widget event to the host platform.\n */\nexport async function emitWidgetEvent(type: string, args?: Record<string, any>) {\n const comm = await getCommunicator();\n\n return await comm.sendRequest('emit_widget_event', { type, args });\n}\n\n/**\n * Update widget personalization state on the host platform.\n */\nexport async function setWidgetPersonalization(data: any) {\n const comm = await getCommunicator();\n\n return await comm.sendRequest('set_widget_personalization', data);\n}\n\n/**\n * Register a listener for widget filter changes from the host platform.\n * Returns an unsubscribe function.\n */\nexport function onWidgetFilterChange(callback: (condition: WidgetFilter) => void): () => void {\n let isCancelled = false;\n\n let unregisterHandler: (() => void) | null = null;\n\n getCommunicator()\n .then((comm) => {\n if (isCancelled) {\n return;\n }\n\n unregisterHandler = comm.registerHandler('widget_filter_change', (condition) => {\n callback(condition);\n });\n })\n .catch((err) => {\n console.error('Failed to initialize communicator for filter change listener:', err);\n });\n\n return () => {\n isCancelled = true;\n\n if (unregisterHandler) {\n unregisterHandler();\n }\n };\n}\n\nexport async function fetchNodeData(payload: NodeDataRequestPayload): Promise<NodeData> {\n const comm = await getCommunicator();\n\n return await comm.sendRequest('fetch_node_data', payload);\n}\n\nexport function createDataSource(config: Pick<NodeDataRequestPayload, 'node' | 'filterExpression'>) {\n async function fetch(payload?: Omit<NodeDataRequestPayload, 'node' | 'filterExpression'>) {\n return await fetchNodeData({\n ...config,\n ...payload,\n });\n }\n\n const callbacks = new Set<() => void>();\n let identity: string | null = null;\n let isConnecting = false;\n let unregisterHandler: (() => void) | null = null;\n let commInstance: Communicator | null = null;\n\n async function connect() {\n if (isConnecting || unregisterHandler) return;\n isConnecting = true;\n\n const currentIdentity =\n typeof crypto !== 'undefined' && crypto.randomUUID\n ? crypto.randomUUID()\n : Math.random().toString(36).substring(2, 9);\n identity = currentIdentity;\n\n try {\n const comm = await getCommunicator();\n commInstance = comm;\n\n // If all subscribers unsubscribed while connecting, abort\n if (callbacks.size === 0 || identity !== currentIdentity) {\n return;\n }\n\n unregisterHandler = comm.registerHandler('widget_data_source_update', (payload) => {\n if (payload?.identity !== currentIdentity) return;\n\n callbacks.forEach((cb) => {\n try {\n cb();\n } catch (err) {\n console.error('Error in widget data source onChange callback:', err);\n }\n });\n });\n\n await comm.sendRequest('add_widget_data_source_listener', { identity: currentIdentity, config });\n } catch (err) {\n console.error('Failed to initialize communicator for data source listener:', err);\n } finally {\n isConnecting = false;\n // In case subscribers dropped to 0 while add_widget_data_source_listener was in-flight\n if (callbacks.size === 0 && identity === currentIdentity) {\n disconnect();\n }\n }\n }\n\n function disconnect() {\n const activeIdentity = identity;\n identity = null;\n isConnecting = false;\n\n if (unregisterHandler) {\n unregisterHandler();\n unregisterHandler = null;\n }\n\n if (commInstance && activeIdentity) {\n commInstance.sendRequest('remove_widget_data_source_listener', { identity: activeIdentity }).catch((err) => {\n console.error('Failed to remove data source listener:', err);\n });\n }\n }\n\n function onChange(callback: () => void): () => void {\n callbacks.add(callback);\n\n if (callbacks.size === 1) {\n connect();\n }\n\n return () => {\n callbacks.delete(callback);\n\n if (callbacks.size === 0) {\n disconnect();\n }\n };\n }\n\n return {\n fetch,\n onChange,\n };\n}\n\n"],"names":["communicatorPromise","getCommunicator","options","pong","err","onWidgetReady","callback","comm","config","emitWidgetEvent","type","args","setWidgetPersonalization","data","onWidgetFilterChange","isCancelled","unregisterHandler","condition","fetchNodeData","payload","createDataSource","fetch","callbacks","identity","isConnecting","commInstance","connect","currentIdentity","cb","disconnect","activeIdentity","onChange"],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -53,7 +53,8 @@ export interface ActionMap {
|
|
|
53
53
|
}>;
|
|
54
54
|
}) => void;
|
|
55
55
|
set_widget_personalization: (payload: any) => void;
|
|
56
|
-
widget_filter_change: (payload:
|
|
56
|
+
widget_filter_change: (payload: WidgetFilter) => void;
|
|
57
57
|
fetch_node_data: (payload: NodeDataRequestPayload) => NodeData;
|
|
58
58
|
}
|
|
59
|
+
export type WidgetFilter = Record<string, string>;
|
|
59
60
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,eAAe,CAAC,EAAE,GAAG,CAAC;IACtB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE;QACX,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACb,UAAU,CAAC,EAAE;QACX,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,GAAG,EAAE,CAAC;CACb;AAED,MAAM,WAAW,OAAO,CAAC,CAAC,SAAS,MAAM,SAAS,GAAG,MAAM,SAAS;IAClE,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,GAAG,UAAU,CAAC;IAC7B,MAAM,EAAE,CAAC,CAAC;IACV,OAAO,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,YAAY,CAAC;IACjC,yBAAyB,EAAE,CAAC,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IACjF,+BAA+B,EAAE,CAAC,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,IAAI,CAAC,sBAAsB,EAAE,MAAM,GAAG,kBAAkB,CAAC,CAAA;KAAE,KAAK,IAAI,CAAC;IAC5I,kCAAkC,EAAE,CAAC,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC5E,iBAAiB,EAAE,CAAC,OAAO,EAAE;QAC3B,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CACX,MAAM,EACN;YACE,IAAI,EAAE,GAAG,CAAC;YACV,QAAQ,EAAE,MAAM,CAAC;SAClB,CACF,CAAC;KACH,KAAK,IAAI,CAAC;IACX,0BAA0B,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IACnD,oBAAoB,EAAE,CAAC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,eAAe,CAAC,EAAE,GAAG,CAAC;IACtB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE;QACX,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACb,UAAU,CAAC,EAAE;QACX,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,GAAG,EAAE,CAAC;CACb;AAED,MAAM,WAAW,OAAO,CAAC,CAAC,SAAS,MAAM,SAAS,GAAG,MAAM,SAAS;IAClE,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,GAAG,UAAU,CAAC;IAC7B,MAAM,EAAE,CAAC,CAAC;IACV,OAAO,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,YAAY,CAAC;IACjC,yBAAyB,EAAE,CAAC,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IACjF,+BAA+B,EAAE,CAAC,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,IAAI,CAAC,sBAAsB,EAAE,MAAM,GAAG,kBAAkB,CAAC,CAAA;KAAE,KAAK,IAAI,CAAC;IAC5I,kCAAkC,EAAE,CAAC,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC5E,iBAAiB,EAAE,CAAC,OAAO,EAAE;QAC3B,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CACX,MAAM,EACN;YACE,IAAI,EAAE,GAAG,CAAC;YACV,QAAQ,EAAE,MAAM,CAAC;SAClB,CACF,CAAC;KACH,KAAK,IAAI,CAAC;IACX,0BAA0B,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IACnD,oBAAoB,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;IACtD,eAAe,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,QAAQ,CAAC;CAChE;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA"}
|
package/dist/widget-sdk.d.ts
CHANGED
|
@@ -1,13 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { NodeData, NodeDataRequestPayload, WidgetConfig, WidgetFilter } from './types';
|
|
2
2
|
/**
|
|
3
3
|
* Called when the widget is ready to receive configuration from the host.
|
|
4
4
|
*/
|
|
5
5
|
export declare function onWidgetReady(callback: (config: WidgetConfig) => void): void;
|
|
6
|
-
/**
|
|
7
|
-
* Add a reactive data source listener on the host platform.
|
|
8
|
-
* Returns an unsubscribe function.
|
|
9
|
-
*/
|
|
10
|
-
export declare function addDataSourceListener(config: DataSourceConfig, onChange: (value: any[]) => void): () => void;
|
|
11
6
|
/**
|
|
12
7
|
* Emit a custom widget event to the host platform.
|
|
13
8
|
*/
|
|
@@ -20,7 +15,7 @@ export declare function setWidgetPersonalization(data: any): Promise<void>;
|
|
|
20
15
|
* Register a listener for widget filter changes from the host platform.
|
|
21
16
|
* Returns an unsubscribe function.
|
|
22
17
|
*/
|
|
23
|
-
export declare function onWidgetFilterChange(callback: (condition:
|
|
18
|
+
export declare function onWidgetFilterChange(callback: (condition: WidgetFilter) => void): () => void;
|
|
24
19
|
export declare function fetchNodeData(payload: NodeDataRequestPayload): Promise<NodeData>;
|
|
25
20
|
export declare function createDataSource(config: Pick<NodeDataRequestPayload, 'node' | 'filterExpression'>): {
|
|
26
21
|
fetch: (payload?: Omit<NodeDataRequestPayload, "node" | "filterExpression">) => Promise<NodeData>;
|
package/dist/widget-sdk.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widget-sdk.d.ts","sourceRoot":"","sources":["../src/widget-sdk.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"widget-sdk.d.ts","sourceRoot":"","sources":["../src/widget-sdk.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,QAAQ,EAAE,sBAAsB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAmBzG;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,QASrE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,iBAI7E;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,GAAG,iBAIvD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,YAAY,KAAK,IAAI,GAAG,MAAM,IAAI,CA0B5F;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAItF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,sBAAsB,EAAE,MAAM,GAAG,kBAAkB,CAAC;sBACjE,IAAI,CAAC,sBAAsB,EAAE,MAAM,GAAG,kBAAkB,CAAC;yBAyE5D,MAAM,IAAI,KAAG,MAAM,IAAI;EAoBpD"}
|