@vbotma/bridge 2.2.9 → 2.3.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.
@@ -41,6 +41,13 @@ export type HostEventHandler = (event: {
41
41
  * @returns HostBridge instance to send events down to the Mini App.
42
42
  */
43
43
  export declare function defineHostBridge(iframe: HTMLIFrameElement, targetOrigin?: string): HostBridge;
44
+ /**
45
+ * Sets up a bridge for a Host App to communicate with a Mini App running as a Web Component (UMD)
46
+ * in the same window context (without an iframe).
47
+ *
48
+ * @returns HostBridge instance to send events down to the Mini App.
49
+ */
50
+ export declare function defineWebComponentBridge(): HostBridge;
44
51
  /**
45
52
  * Retrieves the singleton HostBridge instance.
46
53
  * Throws an error if defineHostBridge has not been called.
@@ -3,7 +3,7 @@ export { isIframe } from './env/isIframe.js';
3
3
  export { isVBma, isVBmaFp, type isVBmaError } from './env/isVBma.js';
4
4
  export { mockVBotEnv } from './env/mockVBotEnv.js';
5
5
  export { setLaunchParams } from './env/setLaunchParams.js';
6
- export { defineHostBridge, getHostBridge, type HostBridge, type HostEventHandler, } from './env/host/bridge.js';
6
+ export { defineHostBridge, defineWebComponentBridge, getHostBridge, type HostBridge, type HostEventHandler, } from './env/host/bridge.js';
7
7
  export { off, offAll, on } from './events/emitter.js';
8
8
  export { emitEvent } from './events/emitEvent.js';
9
9
  export type { EventListener, SubscribeListener, Events, WriteAccessRequestedStatus, EmojiStatusAccessRequestedStatus, BiometryAuthRequestStatus, BiometryTokenUpdateStatus, BiometryType, EmojiStatusFailedError, EventName, EventPayload, EventWithoutPayload, EventWithPayload, PhoneRequestedStatus, FullScreenErrorStatus, HomeScreenStatus, InvoiceStatus, SafeAreaInsets, } from './events/types/index.js';
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("valibot"),l=require("@vbotma/toolkit"),S=require("better-promises"),s=require("fp-ts"),y=require("error-kid"),d=require("@vbotma/transformers"),g=require("@vbotma/signals"),me=require("mitt");function W(e){return c.is(c.looseObject({VBotWebviewProxy:c.looseObject({postEvent:c.function()})}),e)}function F(){try{return window.self!==window.top}catch{return!0}}class Y extends y.errorClass("MethodUnsupportedError",(t,r)=>[`Method "${t}" is unsupported in Mini Apps version ${r}`]){}class X extends y.errorClass("MethodParameterUnsupportedError",(t,r,n)=>[`Parameter "${r}" of "${t}" method is unsupported in Mini Apps version ${n}`]){}class Z extends y.errorClassWithData("LaunchParamsRetrieveError",t=>({errors:t}),t=>[["Unable to retrieve launch parameters from any known source. You should pass correct parameters to Mini App","","Collected errors:",...t.map(({source:r,error:n})=>`Source: ${r} / ${n instanceof Error?n.message:String(n)}`)].join(`
2
- `)]){}class j extends y.errorClass("InvalidLaunchParamsError",(t,r)=>[`Invalid value for launch params: ${t}`,{cause:r}]){}class T extends y.errorClass("UnknownEnvError"){}class ee extends y.errorClass("InvokeCustomMethodError",t=>[`Server returned error: ${t}`]){}const z="launchParams";function J(e){return e.replace(/^[^?#]*[?#]/,"").replace(/[?#]/g,"&")}function te(){return s.function.pipe(x(),s.either.chainW(d.parseLaunchParamsQueryFp))}const we=l.throwifyFpFn(te);function re(){return s.function.pipe(x(),s.either.map(e=>{const t=new URLSearchParams(e).get("vbWebAppData");return t?s.option.some(t):s.option.none}))}function be(){return s.function.pipe(re(),s.either.fold(e=>{throw e},e=>e),s.option.match(()=>{},e=>e))}function x(){const e=[];for(const[t,r]of[[()=>J(window.location.href),"window.location.href"],[()=>{const n=performance.getEntriesByType("navigation")[0];return n&&J(n.name)},"performance navigation entries"],[()=>l.getStorageValue(z),"local storage"]]){const n=t();if(!n){e.push({source:r,error:new Error("Source is empty")});continue}const a=s.function.pipe(d.parseLaunchParamsQueryFp(n),s.either.foldW(o=>o,()=>!0));if(typeof a!="boolean"){e.push({source:r,error:a});continue}return l.setStorageValue(z,n),s.either.right(n)}return s.either.left(new Z(e))}const ge=l.throwifyFpFn(x);function ne(e,t){const r=new Map,n=me(),a=(o,i,p=!1)=>{const _=r.get(o)||new Map;r.set(o,_);const u=_.get(i)||[];_.set(i,u);const f=u.findIndex(h=>h[1]===p);if(f>=0&&(n.off(o,u[f][0]),u.splice(f,1),!u.length&&(_.delete(i),!_.size))){const h=r.size;r.delete(o),h&&!r.size&&t()}};return{on(o,i,p){!r.size&&e();const _=()=>{a(o,i,p)},u=(...m)=>{p&&_(),o==="*"?i({name:m[0],payload:m[1]}):i(...m)};n.on(o,u);const f=r.get(o)||new Map;r.set(o,f);const h=f.get(i)||[];return f.set(i,h),h.push([u,p||!1]),_},off:a,emit:n.emit,clear(){const o=r.size;n.all.clear(),r.clear(),o&&t()}}}function B(e,t){window.dispatchEvent(new MessageEvent("message",{data:JSON.stringify({eventType:e,eventData:t}),source:window.parent}))}const C=g.signal(!1),R=g.signal("https://web.telegram.org"),ye=e=>{b().log("Event received:",e)},U=g.computed(C);function ve(e){e!==C()&&(C.set(e),(e?A:ae)("*",ye))}const I=g.computed(R);function Ee(e){R.set(e),b().log("New target origin set",e)}const w=g.signal((...e)=>{window.parent.postMessage(...e)}),b=g.signal(l.createLogger("Bridge",{bgColor:"#9147ff",textColor:"white",shouldLog:U}));function Pe(){se(),[w,R,I,C,U,b].forEach(e=>{e.unsubAll(),"reset"in e&&e.reset()})}function M(e,t,r){const n=[r],a=e[t];typeof a=="function"&&n.push(a);const o=(...p)=>{n.forEach(_=>_(...p))},i=Object.assign((...p)=>{o(...p)},{unwrap(){const{length:p}=n;if(p===1){delete e[t];return}if(p===2){H(e,t,n[1]);return}n.unshift(1),H(e,t,o)}});oe(e,t,()=>i,p=>n.push(p))}function G(e,t){const r=e[t];oe(e,t,()=>r,n=>{Object.entries(n).forEach(([a,o])=>{r[a]=o})})}function oe(e,t,r,n){Object.defineProperty(e,t,{enumerable:!0,configurable:!0,get:r,set:n})}function H(e,t,r){Object.defineProperty(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r})}const ke={clipboard_text_received:c.looseObject({req_id:c.string(),data:c.nullish(c.string())}),custom_method_invoked:c.looseObject({req_id:c.string(),result:c.optional(c.unknown()),error:c.optional(c.string())}),popup_closed:c.nullish(c.looseObject({button_id:c.nullish(c.string(),()=>{})}),{}),viewport_changed:c.nullish(c.looseObject({height:c.number(),width:c.nullish(c.number(),()=>window.innerWidth),is_state_stable:c.boolean(),is_expanded:c.boolean()}),()=>({height:window.innerHeight,is_state_stable:!0,is_expanded:!0})),theme_changed:c.looseObject({theme_params:d.themeParams()})};function Q(e){if(e.source!==window.parent)return;let t;try{t=c.parse(d.pipeJsonToSchema(d.miniAppsMessage()),e.data)}catch{return}const{eventType:r,eventData:n}=t,a=ke[r];let o;try{o=a?c.parse(a,n):n}catch(i){return b().forceError([`An error occurred processing the "${r}" event from the VBot application.`,"Please, file an issue here:","https://github.com/Telegram-Mini-Apps/tma.js/issues/new/choose"].join(`
3
- `),t,i)}Se(r,o)}const{on:A,off:ae,emit:Se,clear:se}=ne(()=>{const e=window;!e.TelegramGameProxy&&(e.TelegramGameProxy={}),M(e.TelegramGameProxy,"receiveEvent",B),G(e,"TelegramGameProxy"),!e.VBot&&(e.VBot={}),!e.VBot.WebView&&(e.VBot.WebView={}),M(e.VBot.WebView,"receiveEvent",B),G(e.VBot,"WebView"),M(e,"TelegramGameProxy_receiveEvent",B),window.addEventListener("message",Q)},()=>{[["TelegramGameProxy_receiveEvent"],["TelegramGameProxy","receiveEvent"],["VBot","WebView","receiveEvent"]].forEach(e=>{const t=window;let r=[void 0,t];for(const o of e)if(r=[r[1],r[1][o]],!r[1])return;const[n,a]=r;"unwrap"in a&&(a.unwrap(),n&&n!==t&&!Object.keys(n).length&&delete t[e[0]])}),window.removeEventListener("message",Q)}),ie=(...e)=>w()(...e);function ce(e,t){s.function.pipe(v(e,t),s.either.mapLeft(r=>{throw r}))}function v(e,t){b().log("Posting event:",t?{eventType:e,eventData:t}:{eventType:e});const r=window,n=JSON.stringify({eventType:e,eventData:t});return F()?(ie(n,I()),s.either.right(void 0)):W(r)?(r.VBotWebviewProxy.postEvent(e,JSON.stringify(t)),s.either.right(void 0)):c.is(c.looseObject({external:c.looseObject({notify:c.function()})}),r)?(r.external.notify(n),s.either.right(void 0)):s.either.left(new T)}function L(e,t,r={}){const{capture:n=()=>!0,postEvent:a=v}=r,o=g.signal(),[i,p]=l.createCbCollector();(Array.isArray(t)?t:[t]).forEach(u=>{i(A(u,f=>{const h=Array.isArray(t);n(h?{event:u,payload:f}:f)&&o.set([h?{event:u,payload:f}:f])}))});const _=u=>(p(),u);return s.function.pipe(async()=>a(e,r.params),s.taskEither.chainW(()=>l.BetterTaskEither((u,f,h)=>{const m=o();if(m)return u(m[0]);const E=P=>{P&&u(P[0])},q=()=>{o.unsub(E)};o.sub(E),h.on("finalized",q)},r)),s.taskEither.mapBoth(_,_))}function xe(e,t,r){const{postEvent:n}=r||{};return l.throwifyAnyEither(L(e,t,{...r,postEvent:n?(...a)=>{try{return n(...a),s.either.right(void 0)}catch(o){return s.either.left(o)}}:v}))}function Be(e,t){const r=pe(e,t);return typeof r=="function"?S.BetterPromise.fn(()=>l.throwifyAnyEither(r)):r}function pe(e,t){const r=W(window);if(!e)return r||s.function.pipe(x(),s.either.match(()=>!1,()=>!0));if(r)return s.taskEither.right(!0);const{timeout:n=100}=t||{};return s.function.pipe(L("web_app_request_theme","theme_changed",{...t,timeout:n}),s.taskEither.match(a=>S.TimeoutError.is(a)||T.is(a)?s.either.right(!1):s.either.left(a),()=>s.either.right(!0)))}function Ce({launchParams:e,onEvent:t,resetPostMessage:r}={}){if(e){const o=typeof e=="string"||e instanceof URLSearchParams?e.toString():d.serializeLaunchParamsQuery({...e,vbWebAppData:void 0})+(e.vbWebAppData?`&vbWebAppData=${encodeURIComponent(e.vbWebAppData.toString())}`:"");try{d.parseLaunchParamsQuery(o)}catch(i){throw new j(o,i)}l.setStorageValue("launchParams",o)}if(F()){if(!t)return;r&&w.reset();const o=w();w.set((...i)=>{const[p]=i,_=()=>{o(...i)};try{const u=c.parse(d.pipeJsonToSchema(d.miniAppsMessage()),p);t({name:u.eventType,params:u.eventData},_)}catch{_()}});return}const n=window.VBotWebviewProxy||{},a=n.postEvent||(()=>{});window.VBotWebviewProxy={...n,postEvent(o,i){const p=()=>{a(o,i)};t?t({name:o,params:i?JSON.parse(i):void 0},p):p()}},b().log("Environment was mocked by the mockVBotEnv function")}function Fe({launchParams:e,onEvent:t,resetPostMessage:r}={}){if(e){const o=typeof e=="string"||e instanceof URLSearchParams?e.toString():d.serializeLaunchParamsQuery({...e,vbWebAppData:void 0})+(e.vbWebAppData?`&vbWebAppData=${encodeURIComponent(e.vbWebAppData.toString())}`:"");try{d.parseLaunchParamsQuery(o)}catch(i){throw new j(o,i)}l.setStorageValue("launchParams",o)}if(F()){if(!t)return;r&&w.reset();const o=w();w.set((...i)=>{const[p]=i,_=()=>{o(...i)};try{const u=c.parse(d.pipeJsonToSchema(d.miniAppsMessage()),p);t({name:u.eventType,params:u.eventData},_)}catch{_()}});return}const n=window.VBotWebviewProxy||{},a=n.postEvent||(()=>{});window.VBotWebviewProxy={...n,postEvent(o,i){const p=()=>{a(o,i)};t?t({name:o,params:i?JSON.parse(i):void 0},p):p()}},b().log("Launch params are injected by the setLaunchParams function")}function Ae(e,t="*"){const r=o=>{if(o.source===e.contentWindow)try{const i=JSON.parse(o.data),{eventType:p,eventData:_}=i;n.emit(p,_)}catch{}},n=ne(()=>{window.addEventListener("message",r)},()=>{window.removeEventListener("message",r)}),a={...n,send:(o,i)=>{if(e.contentWindow){const p=JSON.stringify({eventType:o,eventData:i});e.contentWindow.postMessage(p,t)}},clear:()=>{n.clear(),k===a&&(k=void 0)}};return k=a,a}let k;function Le(){if(!k)throw new Error("HostBridge not initialized. Call defineHostBridge() first.");return k}function ue(e){return({req_id:t})=>t===e}const N={"6.0":["iframe_ready","iframe_will_reload","web_app_close","web_app_data_send","web_app_expand","web_app_open_link","web_app_ready","web_app_request_theme","web_app_request_viewport","web_app_setup_main_button","web_app_setup_closing_behavior"],6.1:["web_app_open_tg_link","web_app_open_invoice","web_app_setup_back_button","web_app_set_background_color","web_app_set_header_color","web_app_trigger_haptic_feedback"],6.2:["web_app_open_popup"],6.4:["web_app_close_scan_qr_popup","web_app_open_scan_qr_popup","web_app_read_text_from_clipboard",{method:"web_app_open_link",param:"try_instant_view"}],6.7:["web_app_switch_inline_query"],6.9:["web_app_invoke_custom_method","web_app_request_write_access","web_app_request_phone",{method:"web_app_set_header_color",param:"color"}],"6.10":["web_app_setup_settings_button"],7.2:["web_app_biometry_get_info","web_app_biometry_open_settings","web_app_biometry_request_access","web_app_biometry_request_auth","web_app_biometry_update_token"],7.6:[{method:"web_app_open_link",param:"try_browser"},{method:"web_app_close",param:"return_back"}],7.7:["web_app_setup_swipe_behavior"],7.8:["web_app_share_to_story"],"7.10":["web_app_setup_secondary_button","web_app_set_bottom_bar_color",{method:"web_app_setup_main_button",param:"has_shine_effect"}],"8.0":["web_app_request_safe_area","web_app_request_content_safe_area","web_app_request_fullscreen","web_app_exit_fullscreen","web_app_set_emoji_status","web_app_add_to_home_screen","web_app_check_home_screen","web_app_request_emoji_status_access","web_app_check_location","web_app_open_location_settings","web_app_request_file_download","web_app_request_location","web_app_send_prepared_message","web_app_start_accelerometer","web_app_start_device_orientation","web_app_start_gyroscope","web_app_stop_accelerometer","web_app_stop_device_orientation","web_app_stop_gyroscope","web_app_toggle_orientation_lock"],"9.0":["web_app_device_storage_clear","web_app_device_storage_get_key","web_app_device_storage_save_key","web_app_secure_storage_clear","web_app_secure_storage_get_key","web_app_secure_storage_restore_key","web_app_secure_storage_save_key"],9.1:["web_app_hide_keyboard"],9.2:["web_app_send_notification","web_app_finish_refresh"]};function O(e,t){return Object.keys(N).find(n=>N[n].some(a=>t?typeof a=="object"&&a.method===e&&a.param===t:a===e))||null}function K(e){return e.split(".").map(Number)}function _e(e,t){const r=K(e),n=K(t),a=Math.max(r.length,n.length);for(let o=0;o<a;o+=1){const i=r[o]||0,p=n[o]||0;if(i!==p)return i>p?1:-1}return 0}function V(e,t,r){const n=r?O(e,t):O(e);return n?_e(n,r||t)<=0:!1}function qe(e,t="strict"){const r=typeof t=="function"?t:n=>{const{method:a,version:o}=n,i="param"in n?new X(a,n.param,o):new Y(a,o);if(t==="strict")throw i;return b().forceWarn(i.message)};return((n,a)=>V(n,e)?n==="web_app_set_header_color"&&c.is(c.looseObject({color:c.any()}),a)&&!V(n,"color",e)?r({version:e,method:n,param:"color"}):ce(n,a):r({version:e,method:n}))}function le(e,t,r,n){return s.function.pipe(L("web_app_invoke_custom_method","custom_method_invoked",{...n||{},params:{method:e,params:t,req_id:r},capture:ue(r)}),s.taskEither.chain(({result:a,error:o})=>o?s.taskEither.left(new ee(o)):s.taskEither.right(a)))}function Me(e,t,r,n){return S.BetterPromise.fn(()=>s.function.pipe(le(e,t,r,n),s.taskEither.match(a=>{throw a},a=>a))())}function fe(e,t,r={}){const{capture:n=()=>!0,postEvent:a=v}=r,o=g.signal(),[i,p]=l.createCbCollector();(Array.isArray(t)?t:[t]).forEach(u=>{i(A(u,f=>{(Array.isArray(t)?n({event:u,payload:f}):n(f))&&o.set([f])}))});const _=u=>(p(),u);return s.function.pipe(async()=>a(e,r.params),s.taskEither.chainW(()=>l.BetterTaskEither((u,f,h)=>{const m=o();if(m)return u(m[0]);const E=P=>{P&&u(P[0])},q=()=>{o.unsub(E)};o.sub(E),h.on("finalized",q)},r)),s.taskEither.mapBoth(_,_))}function Oe(e,t,r){const{postEvent:n}=r||{};return l.throwifyAnyEither(fe(e,t,{...r,postEvent:n?(...a)=>{try{return n(...a),s.either.right(void 0)}catch(o){return s.either.left(o)}}:v}))}function Ve(){Object.hasOwn||(Object.hasOwn=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)})}function D(e){return s.either.tryCatch(()=>decodeURIComponent(atob(e.replace(/-/g,"+").replace(/_/g,"/")).split("").map(t=>"%"+("00"+t.charCodeAt(0).toString(16)).slice(-2)).join("")),t=>t)}const We=l.throwifyFpFn(D);function $(e){return btoa(encodeURIComponent(e).replace(/%([0-9A-F]{2})/g,(t,r)=>String.fromCharCode(parseInt(`0x${r}`)))).replace(/\+/g,"-").replace(/\//g,"_")}function he(e){const t=$(typeof e=="string"?e:JSON.stringify(e));return t.length>512?s.either.left(new Error("Value is too long for start parameter")):s.either.right(t)}const je=l.throwifyFpFn(he);function Te(e,t){return l.throwifyAnyEither(de(e,typeof t=="function"?r=>s.either.tryCatch(()=>t(r),n=>n):t))}function de(e,t){return s.function.pipe(D(e),s.either.chain(r=>t?typeof t=="function"?t(r):s.json.parse(r):s.either.right(r)))}function Re(e){return $(e).length<=512}Object.defineProperty(exports,"createLogger",{enumerable:!0,get:()=>l.createLogger});Object.defineProperty(exports,"deepSnakeToCamelObjKeys",{enumerable:!0,get:()=>l.deepSnakeToCamelObjKeys});Object.defineProperty(exports,"CancelledError",{enumerable:!0,get:()=>S.CancelledError});Object.defineProperty(exports,"TimeoutError",{enumerable:!0,get:()=>S.TimeoutError});exports.InvalidLaunchParamsError=j;exports.InvokeCustomMethodFailedError=ee;exports.LaunchParamsRetrieveError=Z;exports.MethodParameterUnsupportedError=X;exports.MethodUnsupportedError=Y;exports.UnknownEnvError=T;exports.applyPolyfills=Ve;exports.captureSameReq=ue;exports.compareVersions=_e;exports.createPostEvent=qe;exports.createStartParam=je;exports.createStartParamFp=he;exports.debug=U;exports.decodeBase64Url=We;exports.decodeBase64UrlFp=D;exports.decodeStartParam=Te;exports.decodeStartParamFp=de;exports.defineHostBridge=Ae;exports.emitEvent=B;exports.encodeBase64Url=$;exports.getHostBridge=Le;exports.getReleaseVersion=O;exports.hasWebviewProxy=W;exports.invokeCustomMethod=Me;exports.invokeCustomMethodFp=le;exports.isIframe=F;exports.isSafeToCreateStartParam=Re;exports.isVBma=Be;exports.isVBmaFp=pe;exports.logger=b;exports.mockVBotEnv=Ce;exports.off=ae;exports.offAll=se;exports.on=A;exports.postEvent=ce;exports.postEventFp=v;exports.postMessage=ie;exports.postMessageImpl=w;exports.request=Oe;exports.request2=xe;exports.request2Fp=L;exports.requestFp=fe;exports.resetGlobals=Pe;exports.retrieveLaunchParams=we;exports.retrieveLaunchParamsFp=te;exports.retrieveRawInitData=be;exports.retrieveRawInitDataFp=re;exports.retrieveRawLaunchParams=ge;exports.retrieveRawLaunchParamsFp=x;exports.setDebug=ve;exports.setLaunchParams=Fe;exports.setTargetOrigin=Ee;exports.supports=V;exports.targetOrigin=I;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("valibot"),l=require("@vbotma/toolkit"),B=require("better-promises"),s=require("fp-ts"),v=require("error-kid"),h=require("@vbotma/transformers"),y=require("@vbotma/signals"),me=require("mitt");function M(e){return c.is(c.looseObject({VBotWebviewProxy:c.looseObject({postEvent:c.function()})}),e)}function F(){try{return window.self!==window.top}catch{return!0}}class X extends v.errorClass("MethodUnsupportedError",(t,r)=>[`Method "${t}" is unsupported in Mini Apps version ${r}`]){}class Z extends v.errorClass("MethodParameterUnsupportedError",(t,r,n)=>[`Parameter "${r}" of "${t}" method is unsupported in Mini Apps version ${n}`]){}class ee extends v.errorClassWithData("LaunchParamsRetrieveError",t=>({errors:t}),t=>[["Unable to retrieve launch parameters from any known source. You should pass correct parameters to Mini App","","Collected errors:",...t.map(({source:r,error:n})=>`Source: ${r} / ${n instanceof Error?n.message:String(n)}`)].join(`
2
+ `)]){}class j extends v.errorClass("InvalidLaunchParamsError",(t,r)=>[`Invalid value for launch params: ${t}`,{cause:r}]){}class T extends v.errorClass("UnknownEnvError"){}class te extends v.errorClass("InvokeCustomMethodError",t=>[`Server returned error: ${t}`]){}const J="launchParams";function G(e){return e.replace(/^[^?#]*[?#]/,"").replace(/[?#]/g,"&")}function re(){return s.function.pipe(x(),s.either.chainW(h.parseLaunchParamsQueryFp))}const we=l.throwifyFpFn(re);function ne(){return s.function.pipe(x(),s.either.map(e=>{const t=new URLSearchParams(e).get("vbWebAppData");return t?s.option.some(t):s.option.none}))}function be(){return s.function.pipe(ne(),s.either.fold(e=>{throw e},e=>e),s.option.match(()=>{},e=>e))}function x(){const e=[];for(const[t,r]of[[()=>G(window.location.href),"window.location.href"],[()=>{const n=performance.getEntriesByType("navigation")[0];return n&&G(n.name)},"performance navigation entries"],[()=>l.getStorageValue(J),"local storage"]]){const n=t();if(!n){e.push({source:r,error:new Error("Source is empty")});continue}const a=s.function.pipe(h.parseLaunchParamsQueryFp(n),s.either.foldW(o=>o,()=>!0));if(typeof a!="boolean"){e.push({source:r,error:a});continue}return l.setStorageValue(J,n),s.either.right(n)}return s.either.left(new ee(e))}const ge=l.throwifyFpFn(x);function R(e,t){const r=new Map,n=me(),a=(o,i,p=!1)=>{const _=r.get(o)||new Map;r.set(o,_);const u=_.get(i)||[];_.set(i,u);const f=u.findIndex(d=>d[1]===p);if(f>=0&&(n.off(o,u[f][0]),u.splice(f,1),!u.length&&(_.delete(i),!_.size))){const d=r.size;r.delete(o),d&&!r.size&&t()}};return{on(o,i,p){!r.size&&e();const _=()=>{a(o,i,p)},u=(...m)=>{p&&_(),o==="*"?i({name:m[0],payload:m[1]}):i(...m)};n.on(o,u);const f=r.get(o)||new Map;r.set(o,f);const d=f.get(i)||[];return f.set(i,d),d.push([u,p||!1]),_},off:a,emit:n.emit,clear(){const o=r.size;n.all.clear(),r.clear(),o&&t()}}}function S(e,t){window.dispatchEvent(new MessageEvent("message",{data:JSON.stringify({eventType:e,eventData:t}),source:window.parent}))}const C=y.signal(!1),U=y.signal("https://web.telegram.org"),ye=e=>{b().log("Event received:",e)},I=y.computed(C);function ve(e){e!==C()&&(C.set(e),(e?W:ae)("*",ye))}const $=y.computed(U);function Ee(e){U.set(e),b().log("New target origin set",e)}const w=y.signal((...e)=>{window.parent.postMessage(...e)}),b=y.signal(l.createLogger("Bridge",{bgColor:"#9147ff",textColor:"white",shouldLog:I}));function Pe(){se(),[w,U,$,C,I,b].forEach(e=>{e.unsubAll(),"reset"in e&&e.reset()})}function V(e,t,r){const n=[r],a=e[t];typeof a=="function"&&n.push(a);const o=(...p)=>{n.forEach(_=>_(...p))},i=Object.assign((...p)=>{o(...p)},{unwrap(){const{length:p}=n;if(p===1){delete e[t];return}if(p===2){N(e,t,n[1]);return}n.unshift(1),N(e,t,o)}});oe(e,t,()=>i,p=>n.push(p))}function H(e,t){const r=e[t];oe(e,t,()=>r,n=>{Object.entries(n).forEach(([a,o])=>{r[a]=o})})}function oe(e,t,r,n){Object.defineProperty(e,t,{enumerable:!0,configurable:!0,get:r,set:n})}function N(e,t,r){Object.defineProperty(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r})}const ke={clipboard_text_received:c.looseObject({req_id:c.string(),data:c.nullish(c.string())}),custom_method_invoked:c.looseObject({req_id:c.string(),result:c.optional(c.unknown()),error:c.optional(c.string())}),popup_closed:c.nullish(c.looseObject({button_id:c.nullish(c.string(),()=>{})}),{}),viewport_changed:c.nullish(c.looseObject({height:c.number(),width:c.nullish(c.number(),()=>window.innerWidth),is_state_stable:c.boolean(),is_expanded:c.boolean()}),()=>({height:window.innerHeight,is_state_stable:!0,is_expanded:!0})),theme_changed:c.looseObject({theme_params:h.themeParams()})};function Q(e){if(e.source!==window.parent)return;let t;try{t=c.parse(h.pipeJsonToSchema(h.miniAppsMessage()),e.data)}catch{return}const{eventType:r,eventData:n}=t,a=ke[r];let o;try{o=a?c.parse(a,n):n}catch(i){return b().forceError([`An error occurred processing the "${r}" event from the VBot application.`,"Please, file an issue here:","https://github.com/Telegram-Mini-Apps/tma.js/issues/new/choose"].join(`
3
+ `),t,i)}Se(r,o)}const{on:W,off:ae,emit:Se,clear:se}=R(()=>{const e=window;!e.TelegramGameProxy&&(e.TelegramGameProxy={}),V(e.TelegramGameProxy,"receiveEvent",S),H(e,"TelegramGameProxy"),!e.VBot&&(e.VBot={}),!e.VBot.WebView&&(e.VBot.WebView={}),V(e.VBot.WebView,"receiveEvent",S),H(e.VBot,"WebView"),V(e,"TelegramGameProxy_receiveEvent",S),window.addEventListener("message",Q)},()=>{[["TelegramGameProxy_receiveEvent"],["TelegramGameProxy","receiveEvent"],["VBot","WebView","receiveEvent"]].forEach(e=>{const t=window;let r=[void 0,t];for(const o of e)if(r=[r[1],r[1][o]],!r[1])return;const[n,a]=r;"unwrap"in a&&(a.unwrap(),n&&n!==t&&!Object.keys(n).length&&delete t[e[0]])}),window.removeEventListener("message",Q)}),ie=(...e)=>w()(...e);function ce(e,t){s.function.pipe(E(e,t),s.either.mapLeft(r=>{throw r}))}function E(e,t){b().log("Posting event:",t?{eventType:e,eventData:t}:{eventType:e});const r=window,n=JSON.stringify({eventType:e,eventData:t});return F()?(ie(n,$()),s.either.right(void 0)):M(r)?(r.VBotWebviewProxy.postEvent(e,JSON.stringify(t)),s.either.right(void 0)):c.is(c.looseObject({external:c.looseObject({notify:c.function()})}),r)?(r.external.notify(n),s.either.right(void 0)):s.either.left(new T)}function A(e,t,r={}){const{capture:n=()=>!0,postEvent:a=E}=r,o=y.signal(),[i,p]=l.createCbCollector();(Array.isArray(t)?t:[t]).forEach(u=>{i(W(u,f=>{const d=Array.isArray(t);n(d?{event:u,payload:f}:f)&&o.set([d?{event:u,payload:f}:f])}))});const _=u=>(p(),u);return s.function.pipe(async()=>a(e,r.params),s.taskEither.chainW(()=>l.BetterTaskEither((u,f,d)=>{const m=o();if(m)return u(m[0]);const P=k=>{k&&u(k[0])},L=()=>{o.unsub(P)};o.sub(P),d.on("finalized",L)},r)),s.taskEither.mapBoth(_,_))}function Be(e,t,r){const{postEvent:n}=r||{};return l.throwifyAnyEither(A(e,t,{...r,postEvent:n?(...a)=>{try{return n(...a),s.either.right(void 0)}catch(o){return s.either.left(o)}}:E}))}function xe(e,t){const r=pe(e,t);return typeof r=="function"?B.BetterPromise.fn(()=>l.throwifyAnyEither(r)):r}function pe(e,t){const r=M(window);if(!e)return r||s.function.pipe(x(),s.either.match(()=>!1,()=>!0));if(r)return s.taskEither.right(!0);const{timeout:n=100}=t||{};return s.function.pipe(A("web_app_request_theme","theme_changed",{...t,timeout:n}),s.taskEither.match(a=>B.TimeoutError.is(a)||T.is(a)?s.either.right(!1):s.either.left(a),()=>s.either.right(!0)))}function Ce({launchParams:e,onEvent:t,resetPostMessage:r}={}){if(e){const o=typeof e=="string"||e instanceof URLSearchParams?e.toString():h.serializeLaunchParamsQuery({...e,vbWebAppData:void 0})+(e.vbWebAppData?`&vbWebAppData=${encodeURIComponent(e.vbWebAppData.toString())}`:"");try{h.parseLaunchParamsQuery(o)}catch(i){throw new j(o,i)}l.setStorageValue("launchParams",o)}if(F()){if(!t)return;r&&w.reset();const o=w();w.set((...i)=>{const[p]=i,_=()=>{o(...i)};try{const u=c.parse(h.pipeJsonToSchema(h.miniAppsMessage()),p);t({name:u.eventType,params:u.eventData},_)}catch{_()}});return}const n=window.VBotWebviewProxy||{},a=n.postEvent||(()=>{});window.VBotWebviewProxy={...n,postEvent(o,i){const p=()=>{a(o,i)};t?t({name:o,params:i?JSON.parse(i):void 0},p):p()}},b().log("Environment was mocked by the mockVBotEnv function")}function Fe({launchParams:e,onEvent:t,resetPostMessage:r}={}){if(e){const o=typeof e=="string"||e instanceof URLSearchParams?e.toString():h.serializeLaunchParamsQuery({...e,vbWebAppData:void 0})+(e.vbWebAppData?`&vbWebAppData=${encodeURIComponent(e.vbWebAppData.toString())}`:"");try{h.parseLaunchParamsQuery(o)}catch(i){throw new j(o,i)}l.setStorageValue("launchParams",o)}if(F()){if(!t)return;r&&w.reset();const o=w();w.set((...i)=>{const[p]=i,_=()=>{o(...i)};try{const u=c.parse(h.pipeJsonToSchema(h.miniAppsMessage()),p);t({name:u.eventType,params:u.eventData},_)}catch{_()}});return}const n=window.VBotWebviewProxy||{},a=n.postEvent||(()=>{});window.VBotWebviewProxy={...n,postEvent(o,i){const p=()=>{a(o,i)};t?t({name:o,params:i?JSON.parse(i):void 0},p):p()}},b().log("Launch params are injected by the setLaunchParams function")}function We(e,t="*"){const r=o=>{if(o.source===e.contentWindow)try{const i=JSON.parse(o.data),{eventType:p,eventData:_}=i;n.emit(p,_)}catch{}},n=R(()=>{window.addEventListener("message",r)},()=>{window.removeEventListener("message",r)}),a={...n,send:(o,i)=>{if(e.contentWindow){const p=JSON.stringify({eventType:o,eventData:i});e.contentWindow.postMessage(p,t)}},clear:()=>{n.clear(),g===a&&(g=void 0)}};return g=a,a}function Ae(){const e=R(()=>{},()=>{}),t={...e,send:(r,n)=>{S(r,n)},clear:()=>{var r;e.clear(),g===t&&(g=void 0),(r=window.VBotWebviewProxy)!=null&&r.__isWebComponentProxy&&delete window.VBotWebviewProxy}};return window.VBotWebviewProxy={__isWebComponentProxy:!0,postEvent(r,n){let a;try{a=n?JSON.parse(n):void 0}catch{a=n}e.emit(r,a)}},g=t,t}let g;function Le(){if(!g)throw new Error("HostBridge not initialized. Call defineHostBridge() or defineWebComponentBridge() first.");return g}function ue(e){return({req_id:t})=>t===e}const K={"6.0":["iframe_ready","iframe_will_reload","web_app_close","web_app_data_send","web_app_expand","web_app_open_link","web_app_ready","web_app_request_theme","web_app_request_viewport","web_app_setup_main_button","web_app_setup_closing_behavior"],6.1:["web_app_open_tg_link","web_app_open_invoice","web_app_setup_back_button","web_app_set_background_color","web_app_set_header_color","web_app_trigger_haptic_feedback"],6.2:["web_app_open_popup"],6.4:["web_app_close_scan_qr_popup","web_app_open_scan_qr_popup","web_app_read_text_from_clipboard",{method:"web_app_open_link",param:"try_instant_view"}],6.7:["web_app_switch_inline_query"],6.9:["web_app_invoke_custom_method","web_app_request_write_access","web_app_request_phone",{method:"web_app_set_header_color",param:"color"}],"6.10":["web_app_setup_settings_button"],7.2:["web_app_biometry_get_info","web_app_biometry_open_settings","web_app_biometry_request_access","web_app_biometry_request_auth","web_app_biometry_update_token"],7.6:[{method:"web_app_open_link",param:"try_browser"},{method:"web_app_close",param:"return_back"}],7.7:["web_app_setup_swipe_behavior"],7.8:["web_app_share_to_story"],"7.10":["web_app_setup_secondary_button","web_app_set_bottom_bar_color",{method:"web_app_setup_main_button",param:"has_shine_effect"}],"8.0":["web_app_request_safe_area","web_app_request_content_safe_area","web_app_request_fullscreen","web_app_exit_fullscreen","web_app_set_emoji_status","web_app_add_to_home_screen","web_app_check_home_screen","web_app_request_emoji_status_access","web_app_check_location","web_app_open_location_settings","web_app_request_file_download","web_app_request_location","web_app_send_prepared_message","web_app_start_accelerometer","web_app_start_device_orientation","web_app_start_gyroscope","web_app_stop_accelerometer","web_app_stop_device_orientation","web_app_stop_gyroscope","web_app_toggle_orientation_lock"],"9.0":["web_app_device_storage_clear","web_app_device_storage_get_key","web_app_device_storage_save_key","web_app_secure_storage_clear","web_app_secure_storage_get_key","web_app_secure_storage_restore_key","web_app_secure_storage_save_key"],9.1:["web_app_hide_keyboard"],9.2:["web_app_send_notification","web_app_finish_refresh"]};function O(e,t){return Object.keys(K).find(n=>K[n].some(a=>t?typeof a=="object"&&a.method===e&&a.param===t:a===e))||null}function Y(e){return e.split(".").map(Number)}function _e(e,t){const r=Y(e),n=Y(t),a=Math.max(r.length,n.length);for(let o=0;o<a;o+=1){const i=r[o]||0,p=n[o]||0;if(i!==p)return i>p?1:-1}return 0}function q(e,t,r){const n=r?O(e,t):O(e);return n?_e(n,r||t)<=0:!1}function Ve(e,t="strict"){const r=typeof t=="function"?t:n=>{const{method:a,version:o}=n,i="param"in n?new Z(a,n.param,o):new X(a,o);if(t==="strict")throw i;return b().forceWarn(i.message)};return((n,a)=>q(n,e)?n==="web_app_set_header_color"&&c.is(c.looseObject({color:c.any()}),a)&&!q(n,"color",e)?r({version:e,method:n,param:"color"}):ce(n,a):r({version:e,method:n}))}function le(e,t,r,n){return s.function.pipe(A("web_app_invoke_custom_method","custom_method_invoked",{...n||{},params:{method:e,params:t,req_id:r},capture:ue(r)}),s.taskEither.chain(({result:a,error:o})=>o?s.taskEither.left(new te(o)):s.taskEither.right(a)))}function Oe(e,t,r,n){return B.BetterPromise.fn(()=>s.function.pipe(le(e,t,r,n),s.taskEither.match(a=>{throw a},a=>a))())}function fe(e,t,r={}){const{capture:n=()=>!0,postEvent:a=E}=r,o=y.signal(),[i,p]=l.createCbCollector();(Array.isArray(t)?t:[t]).forEach(u=>{i(W(u,f=>{(Array.isArray(t)?n({event:u,payload:f}):n(f))&&o.set([f])}))});const _=u=>(p(),u);return s.function.pipe(async()=>a(e,r.params),s.taskEither.chainW(()=>l.BetterTaskEither((u,f,d)=>{const m=o();if(m)return u(m[0]);const P=k=>{k&&u(k[0])},L=()=>{o.unsub(P)};o.sub(P),d.on("finalized",L)},r)),s.taskEither.mapBoth(_,_))}function qe(e,t,r){const{postEvent:n}=r||{};return l.throwifyAnyEither(fe(e,t,{...r,postEvent:n?(...a)=>{try{return n(...a),s.either.right(void 0)}catch(o){return s.either.left(o)}}:E}))}function Me(){Object.hasOwn||(Object.hasOwn=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)})}function z(e){return s.either.tryCatch(()=>decodeURIComponent(atob(e.replace(/-/g,"+").replace(/_/g,"/")).split("").map(t=>"%"+("00"+t.charCodeAt(0).toString(16)).slice(-2)).join("")),t=>t)}const je=l.throwifyFpFn(z);function D(e){return btoa(encodeURIComponent(e).replace(/%([0-9A-F]{2})/g,(t,r)=>String.fromCharCode(parseInt(`0x${r}`)))).replace(/\+/g,"-").replace(/\//g,"_")}function de(e){const t=D(typeof e=="string"?e:JSON.stringify(e));return t.length>512?s.either.left(new Error("Value is too long for start parameter")):s.either.right(t)}const Te=l.throwifyFpFn(de);function Re(e,t){return l.throwifyAnyEither(he(e,typeof t=="function"?r=>s.either.tryCatch(()=>t(r),n=>n):t))}function he(e,t){return s.function.pipe(z(e),s.either.chain(r=>t?typeof t=="function"?t(r):s.json.parse(r):s.either.right(r)))}function Ue(e){return D(e).length<=512}Object.defineProperty(exports,"createLogger",{enumerable:!0,get:()=>l.createLogger});Object.defineProperty(exports,"deepSnakeToCamelObjKeys",{enumerable:!0,get:()=>l.deepSnakeToCamelObjKeys});Object.defineProperty(exports,"CancelledError",{enumerable:!0,get:()=>B.CancelledError});Object.defineProperty(exports,"TimeoutError",{enumerable:!0,get:()=>B.TimeoutError});exports.InvalidLaunchParamsError=j;exports.InvokeCustomMethodFailedError=te;exports.LaunchParamsRetrieveError=ee;exports.MethodParameterUnsupportedError=Z;exports.MethodUnsupportedError=X;exports.UnknownEnvError=T;exports.applyPolyfills=Me;exports.captureSameReq=ue;exports.compareVersions=_e;exports.createPostEvent=Ve;exports.createStartParam=Te;exports.createStartParamFp=de;exports.debug=I;exports.decodeBase64Url=je;exports.decodeBase64UrlFp=z;exports.decodeStartParam=Re;exports.decodeStartParamFp=he;exports.defineHostBridge=We;exports.defineWebComponentBridge=Ae;exports.emitEvent=S;exports.encodeBase64Url=D;exports.getHostBridge=Le;exports.getReleaseVersion=O;exports.hasWebviewProxy=M;exports.invokeCustomMethod=Oe;exports.invokeCustomMethodFp=le;exports.isIframe=F;exports.isSafeToCreateStartParam=Ue;exports.isVBma=xe;exports.isVBmaFp=pe;exports.logger=b;exports.mockVBotEnv=Ce;exports.off=ae;exports.offAll=se;exports.on=W;exports.postEvent=ce;exports.postEventFp=E;exports.postMessage=ie;exports.postMessageImpl=w;exports.request=qe;exports.request2=Be;exports.request2Fp=A;exports.requestFp=fe;exports.resetGlobals=Pe;exports.retrieveLaunchParams=we;exports.retrieveLaunchParamsFp=re;exports.retrieveRawInitData=be;exports.retrieveRawInitDataFp=ne;exports.retrieveRawLaunchParams=ge;exports.retrieveRawLaunchParamsFp=x;exports.setDebug=ve;exports.setLaunchParams=Fe;exports.setTargetOrigin=Ee;exports.supports=q;exports.targetOrigin=$;
4
4
  //# sourceMappingURL=index.cjs.map