@vbotma/bridge 2.2.5 → 2.2.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.
@@ -0,0 +1,48 @@
1
+ import { EmitFn, OffFn, OnFn } from '../../events/createEmitter.js';
2
+ import { MethodName, MethodParams } from '../../methods/types/index.js';
3
+ import { EventName, EventPayload } from '../../events/types/events.js';
4
+ import { IsNever } from '@vbotma/toolkit';
5
+ export type HostMethodEvents = {
6
+ [K in MethodName]: IsNever<MethodParams<K>> extends true ? undefined : MethodParams<K>;
7
+ };
8
+ export interface HostBridge {
9
+ /**
10
+ * Sends an event to the Mini App iframe.
11
+ * @param eventType - The event name.
12
+ * @param eventData - The event payload.
13
+ */
14
+ send: <E extends EventName>(eventType: E, eventData?: EventPayload<E>) => void;
15
+ /**
16
+ * Unsubscribes all listeners and removes the window event listener.
17
+ */
18
+ clear: () => void;
19
+ /**
20
+ * Adds a new listener for the specified event.
21
+ */
22
+ on: OnFn<HostMethodEvents>;
23
+ /**
24
+ * Removes a listener from the specified event.
25
+ */
26
+ off: OffFn<HostMethodEvents>;
27
+ /**
28
+ * Emits an event.
29
+ */
30
+ emit: EmitFn<HostMethodEvents>;
31
+ }
32
+ export type HostEventHandler = (event: {
33
+ eventType: string;
34
+ eventData: unknown;
35
+ }) => void;
36
+ /**
37
+ * Sets up a bridge for a Host App to communicate with a Mini App iframe.
38
+ *
39
+ * @param iframe - The target Mini App iframe element.
40
+ * @param targetOrigin - output target origin. Default is '*'.
41
+ * @returns HostBridge instance to send events down to the Mini App.
42
+ */
43
+ export declare function defineHostBridge(iframe: HTMLIFrameElement, targetOrigin?: string): HostBridge;
44
+ /**
45
+ * Retrieves the singleton HostBridge instance.
46
+ * Throws an error if defineHostBridge has not been called.
47
+ */
48
+ export declare function getHostBridge(): HostBridge;
@@ -1,5 +1,6 @@
1
1
  import { If, IsNever, IsUndefined, Or } from '@vbotma/toolkit';
2
- import { Handler } from 'mitt';
2
+ import { Emitter, EventHandlerMap, EventType, Handler } from 'mitt';
3
+ export type { Emitter, EventHandlerMap, EventType, Handler, };
3
4
  export type WildcardHandler<E> = Handler<{
4
5
  [K in keyof E]: {
5
6
  name: K;
@@ -2,6 +2,7 @@ export { hasWebviewProxy } from './env/hasWebviewProxy.js';
2
2
  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
+ export { defineHostBridge, getHostBridge, type HostBridge, type HostEventHandler, } from './env/host/bridge.js';
5
6
  export { off, offAll, on } from './events/emitter.js';
6
7
  export { emitEvent } from './events/emitEvent.js';
7
8
  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 i=require("valibot"),f=require("@vbotma/toolkit"),k=require("better-promises"),a=require("fp-ts"),y=require("error-kid"),d=require("@vbotma/transformers"),b=require("@vbotma/signals"),he=require("mitt");function B(e){return i.is(i.looseObject({VBotWebviewProxy:i.looseObject({postEvent:i.function()})}),e)}function L(){try{return window.self!==window.top}catch{return!0}}class N extends y.errorClass("MethodUnsupportedError",(t,r)=>[`Method "${t}" is unsupported in Mini Apps version ${r}`]){}class H extends y.errorClass("MethodParameterUnsupportedError",(t,r,n)=>[`Parameter "${r}" of "${t}" method is unsupported in Mini Apps version ${n}`]){}class Y extends y.errorClassWithData("LaunchParamsRetrieveError",t=>({errors:t}),t=>[["Unable to retrieve launch parameters from any known source. Perhaps, you have opened your app outside Telegram?","📖 Refer to docs for more information:","https://docs.vbot-mini-apps.com/packages/tma-js-bridge/environment","","Collected errors:",...t.map(({source:r,error:n})=>`Source: ${r} / ${n instanceof Error?n.message:String(n)}`)].join(`
2
- `)]){}class X extends y.errorClass("InvalidLaunchParamsError",(t,r)=>[`Invalid value for launch params: ${t}`,{cause:r}]){}class T extends y.errorClass("UnknownEnvError"){}class Z extends y.errorClass("InvokeCustomMethodError",t=>[`Server returned error: ${t}`]){}const $="launchParams";function z(e){return e.replace(/^[^?#]*[?#]/,"").replace(/[?#]/g,"&")}function ee(){return a.function.pipe(S(),a.either.chainW(d.parseLaunchParamsQueryFp))}const me=f.throwifyFpFn(ee);function te(){return a.function.pipe(S(),a.either.map(e=>{const t=new URLSearchParams(e).get("vbWebAppData");return t?a.option.some(t):a.option.none}))}function de(){return a.function.pipe(te(),a.either.fold(e=>{throw e},e=>e),a.option.match(()=>{},e=>e))}function S(){const e=[];for(const[t,r]of[[()=>z(window.location.href),"window.location.href"],[()=>{const n=performance.getEntriesByType("navigation")[0];return n&&z(n.name)},"performance navigation entries"],[()=>f.getStorageValue($),"local storage"]]){const n=t();if(!n){e.push({source:r,error:new Error("Source is empty")});continue}const s=a.function.pipe(d.parseLaunchParamsQueryFp(n),a.either.foldW(o=>o,()=>!0));if(typeof s!="boolean"){e.push({source:r,error:s});continue}return f.setStorageValue($,n),a.either.right(n)}return a.either.left(new Y(e))}const be=f.throwifyFpFn(S);function we(e,t){const r=new Map,n=he(),s=(o,c,u=!1)=>{const _=r.get(o)||new Map;r.set(o,_);const p=_.get(c)||[];_.set(c,p);const l=p.findIndex(h=>h[1]===u);if(l>=0&&(n.off(o,p[l][0]),p.splice(l,1),!p.length&&(_.delete(c),!_.size))){const h=r.size;r.delete(o),h&&!r.size&&t()}};return{on(o,c,u){!r.size&&e();const _=()=>{s(o,c,u)},p=(...m)=>{u&&_(),o==="*"?c({name:m[0],payload:m[1]}):c(...m)};n.on(o,p);const l=r.get(o)||new Map;r.set(o,l);const h=l.get(c)||[];return l.set(c,h),h.push([p,u||!1]),_},off:s,emit:n.emit,clear(){const o=r.size;n.all.clear(),r.clear(),o&&t()}}}function C(e,t){window.dispatchEvent(new MessageEvent("message",{data:JSON.stringify({eventType:e,eventData:t}),source:window.parent}))}const F=b.signal(!1),V=b.signal("https://web.telegram.org"),ge=e=>{w().log("Event received:",e)},R=b.computed(F);function ye(e){e!==F()&&(F.set(e),(e?x:ne)("*",ge))}const W=b.computed(V);function ve(e){V.set(e),w().log("New target origin set",e)}const g=b.signal((...e)=>{window.parent.postMessage(...e)}),w=b.signal(f.createLogger("Bridge",{bgColor:"#9147ff",textColor:"white",shouldLog:R}));function Ee(){oe(),[g,V,W,F,R,w].forEach(e=>{e.unsubAll(),"reset"in e&&e.reset()})}function A(e,t,r){const n=[r],s=e[t];typeof s=="function"&&n.push(s);const o=(...u)=>{n.forEach(_=>_(...u))},c=Object.assign((...u)=>{o(...u)},{unwrap(){const{length:u}=n;if(u===1){delete e[t];return}if(u===2){G(e,t,n[1]);return}n.unshift(1),G(e,t,o)}});re(e,t,()=>c,u=>n.push(u))}function D(e,t){const r=e[t];re(e,t,()=>r,n=>{Object.entries(n).forEach(([s,o])=>{r[s]=o})})}function re(e,t,r,n){Object.defineProperty(e,t,{enumerable:!0,configurable:!0,get:r,set:n})}function G(e,t,r){Object.defineProperty(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r})}const Pe={clipboard_text_received:i.looseObject({req_id:i.string(),data:i.nullish(i.string())}),custom_method_invoked:i.looseObject({req_id:i.string(),result:i.optional(i.unknown()),error:i.optional(i.string())}),popup_closed:i.nullish(i.looseObject({button_id:i.nullish(i.string(),()=>{})}),{}),viewport_changed:i.nullish(i.looseObject({height:i.number(),width:i.nullish(i.number(),()=>window.innerWidth),is_state_stable:i.boolean(),is_expanded:i.boolean()}),()=>({height:window.innerHeight,is_state_stable:!0,is_expanded:!0})),theme_changed:i.looseObject({theme_params:d.themeParams()})};function J(e){if(e.source!==window.parent)return;let t;try{t=i.parse(d.pipeJsonToSchema(d.miniAppsMessage()),e.data)}catch{return}const{eventType:r,eventData:n}=t,s=Pe[r];let o;try{o=s?i.parse(s,n):n}catch(c){return w().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,c)}ke(r,o)}const{on:x,off:ne,emit:ke,clear:oe}=we(()=>{const e=window;!e.TelegramGameProxy&&(e.TelegramGameProxy={}),A(e.TelegramGameProxy,"receiveEvent",C),D(e,"TelegramGameProxy"),!e.Telegram&&(e.Telegram={}),!e.VBot.WebView&&(e.VBot.WebView={}),A(e.VBot.WebView,"receiveEvent",C),D(e.Telegram,"WebView"),A(e,"TelegramGameProxy_receiveEvent",C),window.addEventListener("message",J)},()=>{[["TelegramGameProxy_receiveEvent"],["TelegramGameProxy","receiveEvent"],["Telegram","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,s]=r;"unwrap"in s&&(s.unwrap(),n&&n!==t&&!Object.keys(n).length&&delete t[e[0]])}),window.removeEventListener("message",J)}),ae=(...e)=>g()(...e);function se(e,t){a.function.pipe(v(e,t),a.either.mapLeft(r=>{throw r}))}function v(e,t){w().log("Posting event:",t?{eventType:e,eventData:t}:{eventType:e});const r=window,n=JSON.stringify({eventType:e,eventData:t});return L()?(ae(n,W()),a.either.right(void 0)):B(r)?(r.VBotWebviewProxy.postEvent(e,JSON.stringify(t)),a.either.right(void 0)):i.is(i.looseObject({external:i.looseObject({notify:i.function()})}),r)?(r.external.notify(n),a.either.right(void 0)):a.either.left(new T)}function M(e,t,r={}){const{capture:n=()=>!0,postEvent:s=v}=r,o=b.signal(),[c,u]=f.createCbCollector();(Array.isArray(t)?t:[t]).forEach(p=>{c(x(p,l=>{const h=Array.isArray(t);n(h?{event:p,payload:l}:l)&&o.set([h?{event:p,payload:l}:l])}))});const _=p=>(u(),p);return a.function.pipe(async()=>s(e,r.params),a.taskEither.chainW(()=>f.BetterTaskEither((p,l,h)=>{const m=o();if(m)return p(m[0]);const E=P=>{P&&p(P[0])},q=()=>{o.unsub(E)};o.sub(E),h.on("finalized",q)},r)),a.taskEither.mapBoth(_,_))}function Se(e,t,r){const{postEvent:n}=r||{};return f.throwifyAnyEither(M(e,t,{...r,postEvent:n?(...s)=>{try{return n(...s),a.either.right(void 0)}catch(o){return a.either.left(o)}}:v}))}function Ce(e,t){const r=ie(e,t);return typeof r=="function"?k.BetterPromise.fn(()=>f.throwifyAnyEither(r)):r}function ie(e,t){const r=B(window);if(!e)return r||a.function.pipe(S(),a.either.match(()=>!1,()=>!0));if(r)return a.taskEither.right(!0);const{timeout:n=100}=t||{};return a.function.pipe(M("web_app_request_theme","theme_changed",{...t,timeout:n}),a.taskEither.match(s=>k.TimeoutError.is(s)||T.is(s)?a.either.right(!1):a.either.left(s),()=>a.either.right(!0)))}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(c){throw new X(o,c)}f.setStorageValue("launchParams",o)}if(L()){if(!t)return;r&&g.reset();const o=g();g.set((...c)=>{const[u]=c,_=()=>{o(...c)};try{const p=i.parse(d.pipeJsonToSchema(d.miniAppsMessage()),u);t({name:p.eventType,params:p.eventData},_)}catch{_()}});return}const n=window.VBotWebviewProxy||{},s=n.postEvent||(()=>{});window.VBotWebviewProxy={...n,postEvent(o,c){const u=()=>{s(o,c)};t?t({name:o,params:c?JSON.parse(c):void 0},u):u()}},w().log("Environment was mocked by the mockVBotEnv function")}function ce(e){return({req_id:t})=>t===e}const Q={"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(Q).find(n=>Q[n].some(s=>t?typeof s=="object"&&s.method===e&&s.param===t:s===e))||null}function K(e){return e.split(".").map(Number)}function pe(e,t){const r=K(e),n=K(t),s=Math.max(r.length,n.length);for(let o=0;o<s;o+=1){const c=r[o]||0,u=n[o]||0;if(c!==u)return c>u?1:-1}return 0}function j(e,t,r){const n=r?O(e,t):O(e);return n?pe(n,r||t)<=0:!1}function xe(e,t="strict"){const r=typeof t=="function"?t:n=>{const{method:s,version:o}=n,c="param"in n?new H(s,n.param,o):new N(s,o);if(t==="strict")throw c;return w().forceWarn(c.message)};return((n,s)=>j(n,e)?n==="web_app_set_header_color"&&i.is(i.looseObject({color:i.any()}),s)&&!j(n,"color",e)?r({version:e,method:n,param:"color"}):se(n,s):r({version:e,method:n}))}function ue(e,t,r,n){return a.function.pipe(M("web_app_invoke_custom_method","custom_method_invoked",{...n||{},params:{method:e,params:t,req_id:r},capture:ce(r)}),a.taskEither.chain(({result:s,error:o})=>o?a.taskEither.left(new Z(o)):a.taskEither.right(s)))}function Me(e,t,r,n){return k.BetterPromise.fn(()=>a.function.pipe(ue(e,t,r,n),a.taskEither.match(s=>{throw s},s=>s))())}function _e(e,t,r={}){const{capture:n=()=>!0,postEvent:s=v}=r,o=b.signal(),[c,u]=f.createCbCollector();(Array.isArray(t)?t:[t]).forEach(p=>{c(x(p,l=>{(Array.isArray(t)?n({event:p,payload:l}):n(l))&&o.set([l])}))});const _=p=>(u(),p);return a.function.pipe(async()=>s(e,r.params),a.taskEither.chainW(()=>f.BetterTaskEither((p,l,h)=>{const m=o();if(m)return p(m[0]);const E=P=>{P&&p(P[0])},q=()=>{o.unsub(E)};o.sub(E),h.on("finalized",q)},r)),a.taskEither.mapBoth(_,_))}function qe(e,t,r){const{postEvent:n}=r||{};return f.throwifyAnyEither(_e(e,t,{...r,postEvent:n?(...s)=>{try{return n(...s),a.either.right(void 0)}catch(o){return a.either.left(o)}}:v}))}function Ae(){Object.hasOwn||(Object.hasOwn=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)})}function U(e){return a.either.tryCatch(()=>decodeURIComponent(atob(e.replace(/-/g,"+").replace(/_/g,"/")).split("").map(t=>"%"+("00"+t.charCodeAt(0).toString(16)).slice(-2)).join("")),t=>t)}const Oe=f.throwifyFpFn(U);function I(e){return btoa(encodeURIComponent(e).replace(/%([0-9A-F]{2})/g,(t,r)=>String.fromCharCode(parseInt(`0x${r}`)))).replace(/\+/g,"-").replace(/\//g,"_")}function le(e){const t=I(typeof e=="string"?e:JSON.stringify(e));return t.length>512?a.either.left(new Error("Value is too long for start parameter")):a.either.right(t)}const je=f.throwifyFpFn(le);function Be(e,t){return f.throwifyAnyEither(fe(e,typeof t=="function"?r=>a.either.tryCatch(()=>t(r),n=>n):t))}function fe(e,t){return a.function.pipe(U(e),a.either.chain(r=>t?typeof t=="function"?t(r):a.json.parse(r):a.either.right(r)))}function Le(e){return I(e).length<=512}Object.defineProperty(exports,"createLogger",{enumerable:!0,get:()=>f.createLogger});Object.defineProperty(exports,"deepSnakeToCamelObjKeys",{enumerable:!0,get:()=>f.deepSnakeToCamelObjKeys});Object.defineProperty(exports,"CancelledError",{enumerable:!0,get:()=>k.CancelledError});Object.defineProperty(exports,"TimeoutError",{enumerable:!0,get:()=>k.TimeoutError});exports.InvalidLaunchParamsError=X;exports.InvokeCustomMethodFailedError=Z;exports.LaunchParamsRetrieveError=Y;exports.MethodParameterUnsupportedError=H;exports.MethodUnsupportedError=N;exports.UnknownEnvError=T;exports.applyPolyfills=Ae;exports.captureSameReq=ce;exports.compareVersions=pe;exports.createPostEvent=xe;exports.createStartParam=je;exports.createStartParamFp=le;exports.debug=R;exports.decodeBase64Url=Oe;exports.decodeBase64UrlFp=U;exports.decodeStartParam=Be;exports.decodeStartParamFp=fe;exports.emitEvent=C;exports.encodeBase64Url=I;exports.getReleaseVersion=O;exports.hasWebviewProxy=B;exports.invokeCustomMethod=Me;exports.invokeCustomMethodFp=ue;exports.isIframe=L;exports.isSafeToCreateStartParam=Le;exports.isVBMA=Ce;exports.isVBMAFp=ie;exports.logger=w;exports.mockVBotEnv=Fe;exports.off=ne;exports.offAll=oe;exports.on=x;exports.postEvent=se;exports.postEventFp=v;exports.postMessage=ae;exports.postMessageImpl=g;exports.request=qe;exports.request2=Se;exports.request2Fp=M;exports.requestFp=_e;exports.resetGlobals=Ee;exports.retrieveLaunchParams=me;exports.retrieveLaunchParamsFp=ee;exports.retrieveRawInitData=de;exports.retrieveRawInitDataFp=te;exports.retrieveRawLaunchParams=be;exports.retrieveRawLaunchParamsFp=S;exports.setDebug=ye;exports.setTargetOrigin=ve;exports.supports=j;exports.targetOrigin=W;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("valibot"),f=require("@vbotma/toolkit"),S=require("better-promises"),s=require("fp-ts"),v=require("error-kid"),m=require("@vbotma/transformers"),w=require("@vbotma/signals"),me=require("mitt");function L(e){return c.is(c.looseObject({VBotWebviewProxy:c.looseObject({postEvent:c.function()})}),e)}function j(){try{return window.self!==window.top}catch{return!0}}class K extends v.errorClass("MethodUnsupportedError",(t,r)=>[`Method "${t}" is unsupported in Mini Apps version ${r}`]){}class Y extends v.errorClass("MethodParameterUnsupportedError",(t,r,n)=>[`Parameter "${r}" of "${t}" method is unsupported in Mini Apps version ${n}`]){}class X extends v.errorClassWithData("LaunchParamsRetrieveError",t=>({errors:t}),t=>[["Unable to retrieve launch parameters from any known source. Perhaps, you have opened your app outside Telegram?","📖 Refer to docs for more information:","https://docs.vbot-mini-apps.com/packages/tma-js-bridge/environment","","Collected errors:",...t.map(({source:r,error:n})=>`Source: ${r} / ${n instanceof Error?n.message:String(n)}`)].join(`
2
+ `)]){}class Z extends v.errorClass("InvalidLaunchParamsError",(t,r)=>[`Invalid value for launch params: ${t}`,{cause:r}]){}class T extends v.errorClass("UnknownEnvError"){}class ee extends v.errorClass("InvokeCustomMethodError",t=>[`Server returned error: ${t}`]){}const z="launchParams";function D(e){return e.replace(/^[^?#]*[?#]/,"").replace(/[?#]/g,"&")}function te(){return s.function.pipe(C(),s.either.chainW(m.parseLaunchParamsQueryFp))}const we=f.throwifyFpFn(te);function re(){return s.function.pipe(C(),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 C(){const e=[];for(const[t,r]of[[()=>D(window.location.href),"window.location.href"],[()=>{const n=performance.getEntriesByType("navigation")[0];return n&&D(n.name)},"performance navigation entries"],[()=>f.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(m.parseLaunchParamsQueryFp(n),s.either.foldW(o=>o,()=>!0));if(typeof a!="boolean"){e.push({source:r,error:a});continue}return f.setStorageValue(z,n),s.either.right(n)}return s.either.left(new X(e))}const ge=f.throwifyFpFn(C);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 l=u.findIndex(d=>d[1]===p);if(l>=0&&(n.off(o,u[l][0]),u.splice(l,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=(...h)=>{p&&_(),o==="*"?i({name:h[0],payload:h[1]}):i(...h)};n.on(o,u);const l=r.get(o)||new Map;r.set(o,l);const d=l.get(i)||[];return l.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 B(e,t){window.dispatchEvent(new MessageEvent("message",{data:JSON.stringify({eventType:e,eventData:t}),source:window.parent}))}const F=w.signal(!1),W=w.signal("https://web.telegram.org"),ve=e=>{b().log("Event received:",e)},R=w.computed(F);function ye(e){e!==F()&&(F.set(e),(e?M:ae)("*",ve))}const U=w.computed(W);function Ee(e){W.set(e),b().log("New target origin set",e)}const g=w.signal((...e)=>{window.parent.postMessage(...e)}),b=w.signal(f.createLogger("Bridge",{bgColor:"#9147ff",textColor:"white",shouldLog:R}));function Pe(){se(),[g,W,U,F,R,b].forEach(e=>{e.unsubAll(),"reset"in e&&e.reset()})}function A(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:m.themeParams()})};function J(e){if(e.source!==window.parent)return;let t;try{t=c.parse(m.pipeJsonToSchema(m.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:M,off:ae,emit:Se,clear:se}=ne(()=>{const e=window;!e.TelegramGameProxy&&(e.TelegramGameProxy={}),A(e.TelegramGameProxy,"receiveEvent",B),G(e,"TelegramGameProxy"),!e.VBot&&(e.VBot={}),!e.VBot.WebView&&(e.VBot.WebView={}),A(e.VBot.WebView,"receiveEvent",B),G(e.VBot,"WebView"),A(e,"TelegramGameProxy_receiveEvent",B),window.addEventListener("message",J)},()=>{[["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",J)}),ie=(...e)=>g()(...e);function ce(e,t){s.function.pipe(y(e,t),s.either.mapLeft(r=>{throw r}))}function y(e,t){b().log("Posting event:",t?{eventType:e,eventData:t}:{eventType:e});const r=window,n=JSON.stringify({eventType:e,eventData:t});return j()?(ie(n,U()),s.either.right(void 0)):L(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 x(e,t,r={}){const{capture:n=()=>!0,postEvent:a=y}=r,o=w.signal(),[i,p]=f.createCbCollector();(Array.isArray(t)?t:[t]).forEach(u=>{i(M(u,l=>{const d=Array.isArray(t);n(d?{event:u,payload:l}:l)&&o.set([d?{event:u,payload:l}:l])}))});const _=u=>(p(),u);return s.function.pipe(async()=>a(e,r.params),s.taskEither.chainW(()=>f.BetterTaskEither((u,l,d)=>{const h=o();if(h)return u(h[0]);const E=P=>{P&&u(P[0])},q=()=>{o.unsub(E)};o.sub(E),d.on("finalized",q)},r)),s.taskEither.mapBoth(_,_))}function Ce(e,t,r){const{postEvent:n}=r||{};return f.throwifyAnyEither(x(e,t,{...r,postEvent:n?(...a)=>{try{return n(...a),s.either.right(void 0)}catch(o){return s.either.left(o)}}:y}))}function Be(e,t){const r=pe(e,t);return typeof r=="function"?S.BetterPromise.fn(()=>f.throwifyAnyEither(r)):r}function pe(e,t){const r=L(window);if(!e)return r||s.function.pipe(C(),s.either.match(()=>!1,()=>!0));if(r)return s.taskEither.right(!0);const{timeout:n=100}=t||{};return s.function.pipe(x("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 Fe({launchParams:e,onEvent:t,resetPostMessage:r}={}){if(e){const o=typeof e=="string"||e instanceof URLSearchParams?e.toString():m.serializeLaunchParamsQuery({...e,vbWebAppData:void 0})+(e.vbWebAppData?`&vbWebAppData=${encodeURIComponent(e.vbWebAppData.toString())}`:"");try{m.parseLaunchParamsQuery(o)}catch(i){throw new Z(o,i)}f.setStorageValue("launchParams",o)}if(j()){if(!t)return;r&&g.reset();const o=g();g.set((...i)=>{const[p]=i,_=()=>{o(...i)};try{const u=c.parse(m.pipeJsonToSchema(m.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 Me(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 xe(){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 Q(e){return e.split(".").map(Number)}function _e(e,t){const r=Q(e),n=Q(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 Y(a,n.param,o):new K(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(x("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 Ae(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=y}=r,o=w.signal(),[i,p]=f.createCbCollector();(Array.isArray(t)?t:[t]).forEach(u=>{i(M(u,l=>{(Array.isArray(t)?n({event:u,payload:l}):n(l))&&o.set([l])}))});const _=u=>(p(),u);return s.function.pipe(async()=>a(e,r.params),s.taskEither.chainW(()=>f.BetterTaskEither((u,l,d)=>{const h=o();if(h)return u(h[0]);const E=P=>{P&&u(P[0])},q=()=>{o.unsub(E)};o.sub(E),d.on("finalized",q)},r)),s.taskEither.mapBoth(_,_))}function Oe(e,t,r){const{postEvent:n}=r||{};return f.throwifyAnyEither(fe(e,t,{...r,postEvent:n?(...a)=>{try{return n(...a),s.either.right(void 0)}catch(o){return s.either.left(o)}}:y}))}function Ve(){Object.hasOwn||(Object.hasOwn=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)})}function I(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 Le=f.throwifyFpFn(I);function $(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=$(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=f.throwifyFpFn(de);function Te(e,t){return f.throwifyAnyEither(he(e,typeof t=="function"?r=>s.either.tryCatch(()=>t(r),n=>n):t))}function he(e,t){return s.function.pipe(I(e),s.either.chain(r=>t?typeof t=="function"?t(r):s.json.parse(r):s.either.right(r)))}function We(e){return $(e).length<=512}Object.defineProperty(exports,"createLogger",{enumerable:!0,get:()=>f.createLogger});Object.defineProperty(exports,"deepSnakeToCamelObjKeys",{enumerable:!0,get:()=>f.deepSnakeToCamelObjKeys});Object.defineProperty(exports,"CancelledError",{enumerable:!0,get:()=>S.CancelledError});Object.defineProperty(exports,"TimeoutError",{enumerable:!0,get:()=>S.TimeoutError});exports.InvalidLaunchParamsError=Z;exports.InvokeCustomMethodFailedError=ee;exports.LaunchParamsRetrieveError=X;exports.MethodParameterUnsupportedError=Y;exports.MethodUnsupportedError=K;exports.UnknownEnvError=T;exports.applyPolyfills=Ve;exports.captureSameReq=ue;exports.compareVersions=_e;exports.createPostEvent=qe;exports.createStartParam=je;exports.createStartParamFp=de;exports.debug=R;exports.decodeBase64Url=Le;exports.decodeBase64UrlFp=I;exports.decodeStartParam=Te;exports.decodeStartParamFp=he;exports.defineHostBridge=Me;exports.emitEvent=B;exports.encodeBase64Url=$;exports.getHostBridge=xe;exports.getReleaseVersion=O;exports.hasWebviewProxy=L;exports.invokeCustomMethod=Ae;exports.invokeCustomMethodFp=le;exports.isIframe=j;exports.isSafeToCreateStartParam=We;exports.isVBMA=Be;exports.isVBMAFp=pe;exports.logger=b;exports.mockVBotEnv=Fe;exports.off=ae;exports.offAll=se;exports.on=M;exports.postEvent=ce;exports.postEventFp=y;exports.postMessage=ie;exports.postMessageImpl=g;exports.request=Oe;exports.request2=Ce;exports.request2Fp=x;exports.requestFp=fe;exports.resetGlobals=Pe;exports.retrieveLaunchParams=we;exports.retrieveLaunchParamsFp=te;exports.retrieveRawInitData=be;exports.retrieveRawInitDataFp=re;exports.retrieveRawLaunchParams=ge;exports.retrieveRawLaunchParamsFp=C;exports.setDebug=ye;exports.setTargetOrigin=Ee;exports.supports=V;exports.targetOrigin=U;
4
4
  //# sourceMappingURL=index.cjs.map