@deway-ai/web-sdk 0.39.0 → 0.41.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/loader.es.js +37 -37
- package/dist/loader.umd.js +1 -1
- package/package.json +1 -1
package/dist/loader.es.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
const
|
|
1
|
+
const g = "deway-sdk-config", p = ["Understanding intent", "Reading web page", "Browsing the docs", "Enriching context", "Validating understanding", "Crafting response"];
|
|
2
2
|
class S {
|
|
3
3
|
saveConfig(e) {
|
|
4
4
|
if (window?.localStorage)
|
|
5
5
|
try {
|
|
6
6
|
const t = JSON.stringify(e);
|
|
7
|
-
window.localStorage.setItem(
|
|
7
|
+
window.localStorage.setItem(g, t);
|
|
8
8
|
} catch {
|
|
9
9
|
}
|
|
10
10
|
}
|
|
11
11
|
loadConfig() {
|
|
12
12
|
if (window?.localStorage)
|
|
13
13
|
try {
|
|
14
|
-
const e = window.localStorage.getItem(
|
|
14
|
+
const e = window.localStorage.getItem(g);
|
|
15
15
|
return e ? JSON.parse(e) : null;
|
|
16
16
|
} catch {
|
|
17
17
|
return null;
|
|
@@ -31,7 +31,7 @@ class S {
|
|
|
31
31
|
return this.loadConfig()?.thinkingMessages ?? p;
|
|
32
32
|
}
|
|
33
33
|
getTalkToHumanBtnTxt() {
|
|
34
|
-
return this.loadConfig()?.talkToHumanBtnTxt ?? "
|
|
34
|
+
return this.loadConfig()?.talkToHumanBtnTxt ?? "talk to Support";
|
|
35
35
|
}
|
|
36
36
|
getHumanHandoffUrl() {
|
|
37
37
|
return this.loadConfig()?.humanHandoffUrl;
|
|
@@ -42,8 +42,8 @@ class S {
|
|
|
42
42
|
getFeatureFlag(e) {
|
|
43
43
|
return this.getFeatureFlags()[e] ?? !1;
|
|
44
44
|
}
|
|
45
|
-
|
|
46
|
-
return this.loadConfig()?.
|
|
45
|
+
getPromptSuggestions() {
|
|
46
|
+
return this.loadConfig()?.promptSuggestions;
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
class s {
|
|
@@ -54,7 +54,7 @@ class s {
|
|
|
54
54
|
async cacheSDK(e, t, i, n) {
|
|
55
55
|
try {
|
|
56
56
|
const c = (await this.openIndexedDB()).transaction([s.STORE_NAME], "readwrite").objectStore(s.STORE_NAME);
|
|
57
|
-
await new Promise((
|
|
57
|
+
await new Promise((f, y) => {
|
|
58
58
|
const l = c.put({
|
|
59
59
|
id: "latest",
|
|
60
60
|
code: e,
|
|
@@ -63,27 +63,27 @@ class s {
|
|
|
63
63
|
signature: n,
|
|
64
64
|
timestamp: Date.now()
|
|
65
65
|
});
|
|
66
|
-
l.onsuccess = () =>
|
|
66
|
+
l.onsuccess = () => f(l.result), l.onerror = () => y(l.error);
|
|
67
67
|
});
|
|
68
68
|
} catch {
|
|
69
69
|
try {
|
|
70
|
-
const
|
|
70
|
+
const a = JSON.stringify({
|
|
71
71
|
code: e,
|
|
72
72
|
version: t,
|
|
73
73
|
checksum: i,
|
|
74
74
|
signature: n,
|
|
75
75
|
timestamp: Date.now()
|
|
76
76
|
});
|
|
77
|
-
localStorage.setItem(s.CACHE_KEY,
|
|
77
|
+
localStorage.setItem(s.CACHE_KEY, a);
|
|
78
78
|
} catch {
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
82
|
async getCachedSDK() {
|
|
83
83
|
try {
|
|
84
|
-
const i = (await this.openIndexedDB()).transaction([s.STORE_NAME], "readonly").objectStore(s.STORE_NAME), n = await new Promise((
|
|
84
|
+
const i = (await this.openIndexedDB()).transaction([s.STORE_NAME], "readonly").objectStore(s.STORE_NAME), n = await new Promise((o, a) => {
|
|
85
85
|
const c = i.get("latest");
|
|
86
|
-
c.onsuccess = () =>
|
|
86
|
+
c.onsuccess = () => o(c.result || null), c.onerror = () => a(c.error);
|
|
87
87
|
});
|
|
88
88
|
if (n)
|
|
89
89
|
return n;
|
|
@@ -101,23 +101,23 @@ class s {
|
|
|
101
101
|
return new Promise((e, t) => {
|
|
102
102
|
const i = indexedDB.open(s.DB_NAME, s.DB_VERSION);
|
|
103
103
|
i.onerror = () => t(i.error), i.onsuccess = () => e(i.result), i.onupgradeneeded = (n) => {
|
|
104
|
-
const
|
|
105
|
-
|
|
104
|
+
const o = n.target.result;
|
|
105
|
+
o.objectStoreNames.contains(s.STORE_NAME) || o.createObjectStore(s.STORE_NAME, { keyPath: "id" });
|
|
106
106
|
};
|
|
107
107
|
});
|
|
108
108
|
}
|
|
109
109
|
}
|
|
110
|
-
async function
|
|
110
|
+
async function C(r) {
|
|
111
111
|
const t = new TextEncoder().encode(r), i = await crypto.subtle.digest("SHA-256", t);
|
|
112
|
-
return Array.from(new Uint8Array(i)).map((
|
|
112
|
+
return Array.from(new Uint8Array(i)).map((o) => o.toString(16).padStart(2, "0")).join("");
|
|
113
113
|
}
|
|
114
|
-
function
|
|
114
|
+
function w(r) {
|
|
115
115
|
const e = atob(r), t = new Uint8Array(e.length);
|
|
116
116
|
for (let i = 0; i < e.length; i++)
|
|
117
117
|
t[i] = e.charCodeAt(i);
|
|
118
118
|
return t;
|
|
119
119
|
}
|
|
120
|
-
function
|
|
120
|
+
function E(r) {
|
|
121
121
|
const e = new Uint8Array(r.length / 2);
|
|
122
122
|
for (let t = 0; t < r.length; t += 2)
|
|
123
123
|
e[t / 2] = Number.parseInt(r.substr(t, 2), 16);
|
|
@@ -125,8 +125,8 @@ function C(r) {
|
|
|
125
125
|
}
|
|
126
126
|
async function b(r, e, t) {
|
|
127
127
|
try {
|
|
128
|
-
const i =
|
|
129
|
-
return await crypto.subtle.verify("Ed25519",
|
|
128
|
+
const i = w(r), n = E(e), o = w(t), a = await crypto.subtle.importKey("raw", i, { name: "Ed25519" }, !1, ["verify"]);
|
|
129
|
+
return await crypto.subtle.verify("Ed25519", a, o, n);
|
|
130
130
|
} catch {
|
|
131
131
|
return !1;
|
|
132
132
|
}
|
|
@@ -134,7 +134,7 @@ async function b(r, e, t) {
|
|
|
134
134
|
async function D(r, e, t, i) {
|
|
135
135
|
if (!e || !t)
|
|
136
136
|
throw new Error("SDK verification failed: Missing security headers");
|
|
137
|
-
if (await
|
|
137
|
+
if (await C(r) !== e)
|
|
138
138
|
throw new Error("SDK verification failed: Checksum mismatch - content tampered");
|
|
139
139
|
if (!await b(i, e, t))
|
|
140
140
|
throw new Error("SDK verification failed: Invalid signature - content tampered");
|
|
@@ -145,7 +145,7 @@ class A {
|
|
|
145
145
|
}
|
|
146
146
|
async fetchSDK(e, t, i) {
|
|
147
147
|
try {
|
|
148
|
-
const n = this.cleanApiEndpoint(t),
|
|
148
|
+
const n = this.cleanApiEndpoint(t), o = await fetch(`${n}/sdk-serve/sdk/v0`, {
|
|
149
149
|
method: "GET",
|
|
150
150
|
headers: {
|
|
151
151
|
Accept: "application/javascript",
|
|
@@ -153,16 +153,16 @@ class A {
|
|
|
153
153
|
Origin: window?.location?.origin || ""
|
|
154
154
|
}
|
|
155
155
|
});
|
|
156
|
-
return
|
|
156
|
+
return o.ok ? this.handleSuccessfulFetch(o, i) : null;
|
|
157
157
|
} catch {
|
|
158
158
|
return null;
|
|
159
159
|
}
|
|
160
160
|
}
|
|
161
161
|
async handleSuccessfulFetch(e, t) {
|
|
162
|
-
const i = e.headers.get("x-sdk-checksum"), n = e.headers.get("x-sdk-version"),
|
|
163
|
-
if (!n || !
|
|
162
|
+
const i = e.headers.get("x-sdk-checksum"), n = e.headers.get("x-sdk-version"), o = e.headers.get("x-sdk-signature"), a = await e.text();
|
|
163
|
+
if (!n || !a || !i)
|
|
164
164
|
throw Object.fromEntries(e.headers.entries()), new Error("Invalid SDK response: missing version, code, or checksum");
|
|
165
|
-
return await D(
|
|
165
|
+
return await D(a, i, o, t), { code: a, version: n, checksum: i, signature: o || "" };
|
|
166
166
|
}
|
|
167
167
|
}
|
|
168
168
|
class m {
|
|
@@ -279,13 +279,13 @@ class K {
|
|
|
279
279
|
const i = document.createElement("script");
|
|
280
280
|
i.textContent = e, i.type = "text/javascript";
|
|
281
281
|
let n = !1;
|
|
282
|
-
const
|
|
283
|
-
n || (n = !0, this.cleanupScript(i), t(
|
|
282
|
+
const o = (a) => {
|
|
283
|
+
n || (n = !0, this.cleanupScript(i), t(a));
|
|
284
284
|
};
|
|
285
285
|
i.onerror = () => {
|
|
286
|
-
|
|
287
|
-
}, i.onload = () =>
|
|
288
|
-
!n && this.verifySDKLoaded() ?
|
|
286
|
+
o(!1);
|
|
287
|
+
}, i.onload = () => o(!0), document.head.appendChild(i), setTimeout(() => {
|
|
288
|
+
!n && this.verifySDKLoaded() ? o(!0) : n || o(!1);
|
|
289
289
|
}, 100);
|
|
290
290
|
} catch {
|
|
291
291
|
t(!1);
|
|
@@ -317,7 +317,7 @@ class k {
|
|
|
317
317
|
}
|
|
318
318
|
}
|
|
319
319
|
}
|
|
320
|
-
const
|
|
320
|
+
const h = {
|
|
321
321
|
apiEndpoint: "https://service.deway.app",
|
|
322
322
|
publicKey: "9d3dBUvqyUQ7egd5j5uORdHSqZ7VFWOu+ud/SWt9WUY=",
|
|
323
323
|
isDevelopment: !1,
|
|
@@ -349,11 +349,11 @@ class B {
|
|
|
349
349
|
if (!this.configValidator.validateConfig(i))
|
|
350
350
|
return;
|
|
351
351
|
this.isLoading = !0;
|
|
352
|
-
const n = i.apiEndpoint ||
|
|
353
|
-
if (!
|
|
352
|
+
const n = i.apiEndpoint || h.apiEndpoint, o = i.publicKey || h.publicKey, [a, c] = await Promise.all([this.fetchOrLoadSDK(i.appKey, n, o), this.fetchRemoteConfigWithCache(i, n)]);
|
|
353
|
+
if (!a)
|
|
354
354
|
return;
|
|
355
|
-
const
|
|
356
|
-
if (!await this.scriptExecutor.executeSDK(
|
|
355
|
+
const f = t ? e : this.createInitializationPayload(c, i);
|
|
356
|
+
if (!await this.scriptExecutor.executeSDK(a.code) || !this.initializeSDK(f))
|
|
357
357
|
return;
|
|
358
358
|
this.commandQueue.replayQueuedCommands(), this.isLoaded = !0;
|
|
359
359
|
} finally {
|
|
@@ -390,7 +390,7 @@ class B {
|
|
|
390
390
|
return {
|
|
391
391
|
localConfig: t,
|
|
392
392
|
remoteConfig: e?.config ?? null,
|
|
393
|
-
defaults:
|
|
393
|
+
defaults: h
|
|
394
394
|
};
|
|
395
395
|
}
|
|
396
396
|
async fetchOrLoadSDK(e, t, i) {
|
package/dist/loader.umd.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(l,u){typeof exports=="object"&&typeof module<"u"?module.exports=u():typeof define=="function"&&define.amd?define(u):(l=typeof globalThis<"u"?globalThis:l||self,l.Deway=u())})(this,(function(){"use strict";const l="deway-sdk-config",u=["Understanding intent","Reading web page","Browsing the docs","Enriching context","Validating understanding","Crafting response"];class
|
|
1
|
+
(function(l,u){typeof exports=="object"&&typeof module<"u"?module.exports=u():typeof define=="function"&&define.amd?define(u):(l=typeof globalThis<"u"?globalThis:l||self,l.Deway=u())})(this,(function(){"use strict";const l="deway-sdk-config",u=["Understanding intent","Reading web page","Browsing the docs","Enriching context","Validating understanding","Crafting response"];class C{saveConfig(e){if(window?.localStorage)try{const t=JSON.stringify(e);window.localStorage.setItem(l,t)}catch{}}loadConfig(){if(window?.localStorage)try{const e=window.localStorage.getItem(l);return e?JSON.parse(e):null}catch{return null}return null}getExcludedVendors(){return this.loadConfig()?.excludedVendors??[]}getAssistantName(){return this.loadConfig()?.assistantName??"Assistant"}getAiDisclaimer(){return this.loadConfig()?.aiDisclaimer}getThinkingMessages(){return this.loadConfig()?.thinkingMessages??u}getTalkToHumanBtnTxt(){return this.loadConfig()?.talkToHumanBtnTxt??"talk to Support"}getHumanHandoffUrl(){return this.loadConfig()?.humanHandoffUrl}getFeatureFlags(){return this.loadConfig()?.featureFlags??{}}getFeatureFlag(e){return this.getFeatureFlags()[e]??!1}getPromptSuggestions(){return this.loadConfig()?.promptSuggestions}}class s{static CACHE_KEY="deway-sdk-cache";static DB_NAME="DewaySdk";static DB_VERSION=1;static STORE_NAME="sdk";async cacheSDK(e,t,i,n){try{const d=(await this.openIndexedDB()).transaction([s.STORE_NAME],"readwrite").objectStore(s.STORE_NAME);await new Promise((g,S)=>{const f=d.put({id:"latest",code:e,version:t,checksum:i,signature:n,timestamp:Date.now()});f.onsuccess=()=>g(f.result),f.onerror=()=>S(f.error)})}catch{try{const a=JSON.stringify({code:e,version:t,checksum:i,signature:n,timestamp:Date.now()});localStorage.setItem(s.CACHE_KEY,a)}catch{}}}async getCachedSDK(){try{const i=(await this.openIndexedDB()).transaction([s.STORE_NAME],"readonly").objectStore(s.STORE_NAME),n=await new Promise((o,a)=>{const d=i.get("latest");d.onsuccess=()=>o(d.result||null),d.onerror=()=>a(d.error)});if(n)return n}catch{}try{const e=localStorage.getItem(s.CACHE_KEY);if(e)return JSON.parse(e)}catch{}return null}openIndexedDB(){return new Promise((e,t)=>{const i=indexedDB.open(s.DB_NAME,s.DB_VERSION);i.onerror=()=>t(i.error),i.onsuccess=()=>e(i.result),i.onupgradeneeded=n=>{const o=n.target.result;o.objectStoreNames.contains(s.STORE_NAME)||o.createObjectStore(s.STORE_NAME,{keyPath:"id"})}})}}async function E(r){const t=new TextEncoder().encode(r),i=await crypto.subtle.digest("SHA-256",t);return Array.from(new Uint8Array(i)).map(o=>o.toString(16).padStart(2,"0")).join("")}function w(r){const e=atob(r),t=new Uint8Array(e.length);for(let i=0;i<e.length;i++)t[i]=e.charCodeAt(i);return t}function b(r){const e=new Uint8Array(r.length/2);for(let t=0;t<r.length;t+=2)e[t/2]=Number.parseInt(r.substr(t,2),16);return e}async function D(r,e,t){try{const i=w(r),n=b(e),o=w(t),a=await crypto.subtle.importKey("raw",i,{name:"Ed25519"},!1,["verify"]);return await crypto.subtle.verify("Ed25519",a,o,n)}catch{return!1}}async function A(r,e,t,i){if(!e||!t)throw new Error("SDK verification failed: Missing security headers");if(await E(r)!==e)throw new Error("SDK verification failed: Checksum mismatch - content tampered");if(!await D(i,e,t))throw new Error("SDK verification failed: Invalid signature - content tampered")}class v{cleanApiEndpoint(e){return e.trim().replace(/\/+$/,"")}async fetchSDK(e,t,i){try{const n=this.cleanApiEndpoint(t),o=await fetch(`${n}/sdk-serve/sdk/v0`,{method:"GET",headers:{Accept:"application/javascript","deway-app-key":e,Origin:window?.location?.origin||""}});return o.ok?this.handleSuccessfulFetch(o,i):null}catch{return null}}async handleSuccessfulFetch(e,t){const i=e.headers.get("x-sdk-checksum"),n=e.headers.get("x-sdk-version"),o=e.headers.get("x-sdk-signature"),a=await e.text();if(!n||!a||!i)throw Object.fromEntries(e.headers.entries()),new Error("Invalid SDK response: missing version, code, or checksum");return await A(a,i,o,t),{code:a,version:n,checksum:i,signature:o||""}}}class m{static MAX_QUEUE_SIZE=50;commandQueue=[];queueCommand(e,...t){this.commandQueue.length>=m.MAX_QUEUE_SIZE&&this.commandQueue.shift(),this.commandQueue.push({method:e,args:t})}replayQueuedCommands(){if(this.commandQueue.length===0)return;const e=[...this.commandQueue];if(this.commandQueue=[],!!this.isSDKAvailable())for(const t of e)this.replayCommand(t)}clearQueue(){this.commandQueue=[]}isSDKAvailable(){return typeof window<"u"&&"Deway"in window&&!!window.Deway}replayCommand(e){try{const t=window.Deway,i=t?.[e.method];typeof i=="function"&&i.apply(t,e.args)}catch{}}}class h{static CACHE_KEY="deway-remote-config-cache";async cacheRemoteConfig(e,t){try{const i={config:e,ttl_seconds:t,timestamp:Date.now()};localStorage.setItem(h.CACHE_KEY,JSON.stringify(i))}catch{}}async getCachedRemoteConfig(){try{const e=localStorage.getItem(h.CACHE_KEY);return e?JSON.parse(e):null}catch{return null}}isCacheValid(e,t){const i=Date.now(),n=e+t*1e3;return i<n}}class K{cleanApiEndpoint(e){return e.trim().replace(/\/+$/,"")}async fetchRemoteConfig(e,t){try{const i=this.cleanApiEndpoint(t),n=await fetch(`${i}/sdk-remote-config-serve/`,{method:"GET",headers:{Accept:"application/json","deway-app-key":e,Origin:window?.location?.origin||""}});return n.ok?await n.json():null}catch{return null}}}class k{async executeSDK(e){return new Promise(t=>{try{if(!this.isDocumentReady()){t(!1);return}const i=document.createElement("script");i.textContent=e,i.type="text/javascript";let n=!1;const o=a=>{n||(n=!0,this.cleanupScript(i),t(a))};i.onerror=()=>{o(!1)},i.onload=()=>o(!0),document.head.appendChild(i),setTimeout(()=>{!n&&this.verifySDKLoaded()?o(!0):n||o(!1)},100)}catch{t(!1)}})}isDocumentReady(){return typeof document<"u"&&document.head!=null}verifySDKLoaded(){return typeof window<"u"&&"Deway"in window&&!!window.Deway}cleanupScript(e){try{e.parentNode&&e.parentNode.removeChild(e)}catch{}}}class x{validateConfig(e){return!(!e||!e.appKey||e.appKey.trim().length===0||e.apiEndpoint!==void 0&&!this.isValidUrl(e.apiEndpoint)||e.publicKey!==void 0&&e.publicKey.trim().length===0)}isValidUrl(e){try{return new URL(e),!0}catch{return!1}}}const y={apiEndpoint:"https://service.deway.app",publicKey:"9d3dBUvqyUQ7egd5j5uORdHSqZ7VFWOu+ud/SWt9WUY=",isDevelopment:!1,autoShowBubble:!1};class B{isLoaded=!1;isLoading=!1;cacheManager;scriptExecutor;commandQueue;sdkFetcher;configValidator;remoteConfigFetcher;remoteConfigCache;sdkConfigStore;constructor(){this.cacheManager=new s,this.scriptExecutor=new k,this.commandQueue=new m,this.sdkFetcher=new v,this.configValidator=new x,this.sdkConfigStore=new C,this.remoteConfigFetcher=new K,this.remoteConfigCache=new h}init(e){this.performInit(e).catch(t=>{})}async performInit(e){try{if(!this.canInitialize())return;const t=this.isInitializationPayload(e),i=t?e.localConfig:e;if(!this.configValidator.validateConfig(i))return;this.isLoading=!0;const n=i.apiEndpoint||y.apiEndpoint,o=i.publicKey||y.publicKey,[a,d]=await Promise.all([this.fetchOrLoadSDK(i.appKey,n,o),this.fetchRemoteConfigWithCache(i,n)]);if(!a)return;const g=t?e:this.createInitializationPayload(d,i);if(!await this.scriptExecutor.executeSDK(a.code)||!this.initializeSDK(g))return;this.commandQueue.replayQueuedCommands(),this.isLoaded=!0}finally{this.isLoading=!1}}isInitializationPayload(e){return"localConfig"in e&&"remoteConfig"in e&&"defaults"in e}canInitialize(){return!(this.isLoaded||this.isLoading)}async fetchRemoteConfigWithCache(e,t){this.sdkConfigStore.saveConfig(e);const i=await this.remoteConfigFetcher.fetchRemoteConfig(e.appKey,t);if(i)return await this.remoteConfigCache.cacheRemoteConfig(i.config,i.ttl_seconds),i;const n=await this.remoteConfigCache.getCachedRemoteConfig();return n?{config:n.config,ttl_seconds:n.ttl_seconds}:null}createInitializationPayload(e,t){return{localConfig:t,remoteConfig:e?.config??null,defaults:y}}async fetchOrLoadSDK(e,t,i){const n=await this.sdkFetcher.fetchSDK(e,t,i);return n?(await this.cacheManager.cacheSDK(n.code,n.version,n.checksum,n.signature),n):this.loadFromCache()}async loadFromCache(){const e=await this.cacheManager.getCachedSDK();return e?{code:e.code,version:e.version}:null}initializeSDK(e){if(!this.isSDKAvailable())return!1;try{return window.Deway?.init(e),!0}catch{return!1}}identify(e){try{this.isLoaded&&this.isSDKAvailable()?window.Deway?.identify(e):this.commandQueue.queueCommand("identify",e)}catch{}}reportEvent(e,t){try{this.isLoaded&&this.isSDKAvailable()?window.Deway?.reportEvent(e,t):this.commandQueue.queueCommand("reportEvent",e,t)}catch{}}setUserProfile(e){try{this.isLoaded&&this.isSDKAvailable()?window.Deway?.setUserProfile(e):this.commandQueue.queueCommand("setUserProfile",e)}catch{}}showBubble(e){try{this.isLoaded&&this.isSDKAvailable()?window.Deway?.showBubble(e):this.commandQueue.queueCommand("showBubble",e)}catch{}}hideBubble(){try{this.isLoaded&&this.isSDKAvailable()?window.Deway?.hideBubble():this.commandQueue.queueCommand("hideBubble")}catch{}}isBubbleVisible(){try{return this.isLoaded&&this.isSDKAvailable()?window.Deway?.isBubbleVisible()??!1:!1}catch{return!1}}destroy(){try{this.isLoaded&&this.isSDKAvailable()?window.Deway?.destroy():this.commandQueue.queueCommand("destroy"),this.commandQueue.clearQueue()}catch{}}isSDKAvailable(){return typeof window<"u"&&"Deway"in window&&!!window.Deway}}const c=new B,p={init:r=>c.init(r),identify:r=>c.identify(r),reportEvent:(r,e)=>c.reportEvent(r,e),setUserProfile:r=>c.setUserProfile(r),showBubble:r=>c.showBubble(r),hideBubble:()=>c.hideBubble(),isBubbleVisible:()=>c.isBubbleVisible(),destroy:()=>c.destroy()};return typeof window<"u"&&(window.Deway=p),p}));
|