@tma.js/bridge 1.3.2 → 1.3.3
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/lib/browser.js +1 -1
- package/dist/lib/browser.js.map +1 -1
- package/dist/lib/index.cjs +1 -1
- package/dist/lib/index.cjs.map +1 -1
- package/dist/lib/index.mjs +1 -1
- package/dist/lib/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/events/emitter.ts +1 -1
package/dist/lib/browser.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
this["@tma"]=this["@tma"]||{},this["@tma"]["js/bridge"]=function(e){"use strict";let t=class{listeners={};subscribeListeners=[];emit(e,...t){this.subscribeListeners.forEach((n=>n(e,...t)));const n=this.listeners[e];if(void 0===n)return;const r=[];n.forEach((e=>{"function"!=typeof e?(e.once&&r.push(e.listener),e.listener(...t)):e(...t)})),r.forEach((t=>this.off(e,t)))}on(e,t){const n=this.listeners[e];void 0===n?this.listeners[e]=[t]:n.push(t)}once(e,t){const n=this.listeners[e],r={listener:t,once:!0};void 0===n?this.listeners[e]=[r]:n.push(r)}off(e,t){const n=this.listeners[e];if(void 0!==n)for(let e=0;e<n.length;e+=1){const r=n[e];t===("function"==typeof r?r:r.listener)&&(n.splice(e,1),e-=1)}}subscribe(e){this.subscribeListeners.push(e)}unsubscribe(e){const t=this.subscribeListeners.indexOf(e);t>=0&&this.subscribeListeners.splice(t,1)}};class n{parser;isOptional;getDefault;isEmpty;static create(e){return new n(e,!1,void 0)}constructor(e,t,n,r=(e=>void 0===e)){this.parser=e,this.isOptional=t,this.getDefault=n,this.isEmpty=r}parse(e){return this.isOptional&&this.isEmpty(e)?this.getDefault?this.getDefault():void 0:this.parser(e)}optional(e){return this.isOptional=!0,e&&(this.isEmpty=e),this}default(e){return this.getDefault=e,this}}function r(e){return()=>n.create(e)}function o(e){return r((t=>{if(typeof t!==e)throw new TypeError(`Unable to parse value ${JSON.stringify(t)} as ${e}.`);return t}))}const i=o("string"),s=o("number"),a=o("boolean"),c=r((e=>{const t=i().parse(e);try{return function(e){const t=e.replace(/\s/g,"").toLowerCase();if(function(e){return/^#[\da-f]{6}$/i.test(e)}(t))return t;if(function(e){return/^#[\da-f]{3}$/i.test(e)}(t)){let e="#";for(let n=0;n<3;n+=1)e+=t[1+n].repeat(2);return e}const n=t.match(/^rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)$/)||t.match(/^rgba\((\d{1,3}),(\d{1,3}),(\d{1,3}),\d{1,3}\)$/);if(null===n)throw new Error(`Value "${e}" does not satisfy any of known RGB formats.`);return n.slice(1).reduce(((e,t)=>{const n=parseInt(t,10).toString(16);return e+(1===n.length?"0":"")+n}),"#")}(t)}catch(e){throw new TypeError(`Unable to parse value "${t}" as RGB.`,{cause:e})}}));function u(e){return n.create((t=>{let n=t;if("string"==typeof n)try{n=JSON.parse(n)}catch(e){throw new TypeError("Value is not JSON object converted to string.")}if("object"!=typeof n||null===n||Array.isArray(n))throw new TypeError("Value is not JSON object.");return function(e,t){const n={};for(const r in e){const o=e[r];if(!o)continue;let i,s,a,c;if("type"in o){const{from:e=r,type:t}=o;i=e,s="function"==typeof t?t:t.parse.bind(t),a="required"in o&&o.required}else i=r,a=!1,s="function"==typeof o?o:o.parse.bind(o);try{c=s(t(i))}catch(e){throw new Error(`Unable to parse field "${i}"`,{cause:e})}(void 0!==c||a)&&(n[r]=c)}return n}(e,(e=>n[e]))}))}let p=!1,l="https://web.telegram.org";function _(){return l}const f=(e,...t)=>{p&&function(e,...t){const n=new Date,r=Intl.DateTimeFormat("en-GB",{hour:"2-digit",minute:"2-digit",second:"2-digit",fractionalSecondDigits:3,timeZone:"UTC"}).format(n);console[e](`[${r}]`,...t)}(e,"[Bridge]",...t)};function d(e){return null==e}const h=u({theme_params:u({bg_color:c().optional(),text_color:c().optional(),hint_color:c().optional(),link_color:c().optional(),button_color:c().optional(),button_text_color:c().optional(),secondary_bg_color:c().optional()})}),w=u({height:s(),width:s().optional(d).default((()=>window.innerWidth)),is_state_stable:a(),is_expanded:a()}),b=u({button_id:i().optional(d)}),y=u({data:i().optional()}),g=u({slug:i(),status:i()}),v=u({req_id:i(),data:e=>null===e?e:i().optional().parse(e)}),m=u({status:i()}),E=u({status:i()}),x=u({req_id:i(),result:e=>e,error:i().optional()}),T=u({eventType:i(),eventData:e=>e});function q(e,t){window.dispatchEvent(new MessageEvent("message",{data:JSON.stringify({eventType:e,eventData:t})}))}function O(e){!function(){const e=window;"TelegramGameProxy_receiveEvent"in e||[["TelegramGameProxy_receiveEvent"],["TelegramGameProxy","receiveEvent"],["Telegram","WebView","receiveEvent"]].forEach((t=>{let n=e;t.forEach(((e,t,r)=>{t!==r.length-1?(e in n||(n[e]={}),n=n[e]):n[e]=q}))}))}(),window.addEventListener("message",(t=>{try{const{eventType:n,eventData:r}=T.parse(t.data);e(n,r)}catch{}}))}const P="__telegram-cached-emitter__";function D(){const e=window;return void 0===e[P]&&(e[P]=function(){const e=new t,n=(t,...n)=>{f("log","Emitting processed event:",t,...n),e.emit(t,...n)};return window.addEventListener("resize",(()=>{
|
|
1
|
+
this["@tma"]=this["@tma"]||{},this["@tma"]["js/bridge"]=function(e){"use strict";let t=class{listeners={};subscribeListeners=[];emit(e,...t){this.subscribeListeners.forEach((n=>n(e,...t)));const n=this.listeners[e];if(void 0===n)return;const r=[];n.forEach((e=>{"function"!=typeof e?(e.once&&r.push(e.listener),e.listener(...t)):e(...t)})),r.forEach((t=>this.off(e,t)))}on(e,t){const n=this.listeners[e];void 0===n?this.listeners[e]=[t]:n.push(t)}once(e,t){const n=this.listeners[e],r={listener:t,once:!0};void 0===n?this.listeners[e]=[r]:n.push(r)}off(e,t){const n=this.listeners[e];if(void 0!==n)for(let e=0;e<n.length;e+=1){const r=n[e];t===("function"==typeof r?r:r.listener)&&(n.splice(e,1),e-=1)}}subscribe(e){this.subscribeListeners.push(e)}unsubscribe(e){const t=this.subscribeListeners.indexOf(e);t>=0&&this.subscribeListeners.splice(t,1)}};class n{parser;isOptional;getDefault;isEmpty;static create(e){return new n(e,!1,void 0)}constructor(e,t,n,r=(e=>void 0===e)){this.parser=e,this.isOptional=t,this.getDefault=n,this.isEmpty=r}parse(e){return this.isOptional&&this.isEmpty(e)?this.getDefault?this.getDefault():void 0:this.parser(e)}optional(e){return this.isOptional=!0,e&&(this.isEmpty=e),this}default(e){return this.getDefault=e,this}}function r(e){return()=>n.create(e)}function o(e){return r((t=>{if(typeof t!==e)throw new TypeError(`Unable to parse value ${JSON.stringify(t)} as ${e}.`);return t}))}const i=o("string"),s=o("number"),a=o("boolean"),c=r((e=>{const t=i().parse(e);try{return function(e){const t=e.replace(/\s/g,"").toLowerCase();if(function(e){return/^#[\da-f]{6}$/i.test(e)}(t))return t;if(function(e){return/^#[\da-f]{3}$/i.test(e)}(t)){let e="#";for(let n=0;n<3;n+=1)e+=t[1+n].repeat(2);return e}const n=t.match(/^rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)$/)||t.match(/^rgba\((\d{1,3}),(\d{1,3}),(\d{1,3}),\d{1,3}\)$/);if(null===n)throw new Error(`Value "${e}" does not satisfy any of known RGB formats.`);return n.slice(1).reduce(((e,t)=>{const n=parseInt(t,10).toString(16);return e+(1===n.length?"0":"")+n}),"#")}(t)}catch(e){throw new TypeError(`Unable to parse value "${t}" as RGB.`,{cause:e})}}));function u(e){return n.create((t=>{let n=t;if("string"==typeof n)try{n=JSON.parse(n)}catch(e){throw new TypeError("Value is not JSON object converted to string.")}if("object"!=typeof n||null===n||Array.isArray(n))throw new TypeError("Value is not JSON object.");return function(e,t){const n={};for(const r in e){const o=e[r];if(!o)continue;let i,s,a,c;if("type"in o){const{from:e=r,type:t}=o;i=e,s="function"==typeof t?t:t.parse.bind(t),a="required"in o&&o.required}else i=r,a=!1,s="function"==typeof o?o:o.parse.bind(o);try{c=s(t(i))}catch(e){throw new Error(`Unable to parse field "${i}"`,{cause:e})}(void 0!==c||a)&&(n[r]=c)}return n}(e,(e=>n[e]))}))}let p=!1,l="https://web.telegram.org";function _(){return l}const f=(e,...t)=>{p&&function(e,...t){const n=new Date,r=Intl.DateTimeFormat("en-GB",{hour:"2-digit",minute:"2-digit",second:"2-digit",fractionalSecondDigits:3,timeZone:"UTC"}).format(n);console[e](`[${r}]`,...t)}(e,"[Bridge]",...t)};function d(e){return null==e}const h=u({theme_params:u({bg_color:c().optional(),text_color:c().optional(),hint_color:c().optional(),link_color:c().optional(),button_color:c().optional(),button_text_color:c().optional(),secondary_bg_color:c().optional()})}),w=u({height:s(),width:s().optional(d).default((()=>window.innerWidth)),is_state_stable:a(),is_expanded:a()}),b=u({button_id:i().optional(d)}),y=u({data:i().optional()}),g=u({slug:i(),status:i()}),v=u({req_id:i(),data:e=>null===e?e:i().optional().parse(e)}),m=u({status:i()}),E=u({status:i()}),x=u({req_id:i(),result:e=>e,error:i().optional()}),T=u({eventType:i(),eventData:e=>e});function q(e,t){window.dispatchEvent(new MessageEvent("message",{data:JSON.stringify({eventType:e,eventData:t})}))}function O(e){!function(){const e=window;"TelegramGameProxy_receiveEvent"in e||[["TelegramGameProxy_receiveEvent"],["TelegramGameProxy","receiveEvent"],["Telegram","WebView","receiveEvent"]].forEach((t=>{let n=e;t.forEach(((e,t,r)=>{t!==r.length-1?(e in n||(n[e]={}),n=n[e]):n[e]=q}))}))}(),window.addEventListener("message",(t=>{try{const{eventType:n,eventData:r}=T.parse(t.data);e(n,r)}catch{}}))}const P="__telegram-cached-emitter__";function D(){const e=window;return void 0===e[P]&&(e[P]=function(){const e=new t,n=(t,...n)=>{f("log","Emitting processed event:",t,...n),e.emit(t,...n)};return window.addEventListener("resize",(()=>{n("viewport_changed",{width:window.innerWidth,height:window.innerHeight,is_state_stable:!0,is_expanded:!0})})),O(((e,t)=>{f("log","Received raw event:",e,t);try{switch(e){case"viewport_changed":return n(e,w.parse(t));case"theme_changed":return n(e,h.parse(t));case"popup_closed":return n(e,null==t?{}:b.parse(t));case"set_custom_style":return n(e,i().parse(t));case"qr_text_received":return n(e,y.parse(t));case"clipboard_text_received":return n(e,v.parse(t));case"invoice_closed":return n(e,g.parse(t));case"phone_requested":return n("phone_requested",E.parse(t));case"custom_method_invoked":return n("custom_method_invoked",x.parse(t));case"write_access_requested":return n("write_access_requested",m.parse(t));case"main_button_pressed":case"back_button_pressed":case"settings_button_pressed":case"scan_qr_popup_closed":return n(e);default:return n(e,t)}}catch(e){f("error","Error processing event:",e)}})),e}()),e[P]}function k(e,t){D().off(e,t)}function A(e,t){return D().on(e,t),()=>k(e,t)}function S(e){D().unsubscribe(e)}function $(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}class N extends Error{constructor(e){super(`Async call timeout exceeded. Timeout: ${e}`),Object.setPrototypeOf(this,N.prototype)}}function W(e){return new Promise(((t,n)=>{setTimeout(n,e,new N(e))}))}function J(e){return"external"in e&&$(e.external)&&"notify"in e.external&&"function"==typeof e.external.notify}function L(e){return"TelegramWebviewProxy"in e&&$(e.TelegramWebviewProxy)&&"postEvent"in e.TelegramWebviewProxy&&"function"==typeof e.TelegramWebviewProxy.postEvent}function j(){try{return window.self!==window.top}catch(e){return!0}}function G(e,t,n){let r,o={};void 0===t&&void 0===n?o={}:void 0!==t&&void 0!==n?(o=n,r=t):void 0!==t&&("targetOrigin"in t?o=t:r=t);const{targetOrigin:i=_()}=o;if(j())window.parent.postMessage(JSON.stringify({eventType:e,eventData:r}),i);else if(J(window))window.external.notify(JSON.stringify({eventType:e,eventData:r}));else{if(!L(window))throw new Error("Unable to determine current environment and possible way to send event.");window.TelegramWebviewProxy.postEvent(e,JSON.stringify(r))}}function I(e,t){return function(e,t){const n=e.split("."),r=t.split("."),o=Math.max(n.length,r.length);for(let e=0;e<o;e+=1){const t=parseInt(n[e]||"0",10),o=parseInt(r[e]||"0",10);if(t!==o)return t>o?1:-1}return 0}(e,t)<=0}return e.detectSupportParams=function(e,t){return"web_app_open_link"===e&&"try_instant_view"in t?["try_instant_view"]:"web_app_set_header_color"===e&&"color"in t?["color"]:[]},e.hasExternalNotify=J,e.hasWebviewProxy=L,e.isIframe=j,e.off=k,e.on=A,e.once=function(e,t){return D().once(e,t),()=>k(e,t)},e.postEvent=G,e.request=function(e,t,n,r){let o,i,s,a;"string"==typeof t||Array.isArray(t)?(s=Array.isArray(t)?t:[t],o=n):(i=t,s=Array.isArray(n)?n:[n],o=r),$(i)&&"string"==typeof i.req_id&&(a=i.req_id);const{postEvent:c=G,timeout:u}=o||{},p=o&&"capture"in o?o.capture:null,l=new Promise(((t,n)=>{const r=s.map((e=>A(e,(e=>{("string"!=typeof a||$(e)&&e.req_id===a)&&("function"!=typeof p||p(e))&&(o(),t(e))})))),o=()=>r.forEach((e=>e()));try{c(e,i)}catch(e){o(),n(e)}}));return"number"==typeof u?function(e,t){return"function"==typeof e?(...n)=>Promise.race([e(...n),W(t)]):Promise.race([e,W(t)])}(l,u):l},e.setDebug=function(e){p=e},e.setTargetOrigin=function(e){l=e},e.subscribe=function(e){return D().subscribe(e),()=>S(e)},e.supports=function(e,t,n){if("string"==typeof n){if("web_app_open_link"===e&&"try_instant_view"===t)return I("6.4",n);if("web_app_set_header_color"===e&&"color"===t)return I("6.9",n)}switch(e){case"web_app_open_tg_link":case"web_app_open_invoice":case"web_app_setup_back_button":case"web_app_set_background_color":case"web_app_set_header_color":case"web_app_trigger_haptic_feedback":return I("6.1",t);case"web_app_open_popup":return I("6.2",t);case"web_app_close_scan_qr_popup":case"web_app_open_scan_qr_popup":case"web_app_read_text_from_clipboard":return I("6.4",t);case"web_app_invoke_custom_method":case"web_app_request_write_access":case"web_app_request_phone":return I("6.9",t);default:return!0}},e.unsubscribe=S,e}({});
|
|
2
2
|
//# sourceMappingURL=browser.js.map
|
package/dist/lib/browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sources":["../../../event-emitter/dist/lib/index.mjs","../../../parsing/dist/lib/index.mjs","../../../colors/dist/lib/index.mjs","../../src/globals.ts","../../../logger/dist/lib/index.mjs","../../src/events/parsing.ts","../../src/events/onTelegramEvent.ts","../../src/events/emitter.ts","../../src/events/off.ts","../../src/events/on.ts","../../src/events/unsubscribe.ts","../../../utils/dist/lib/index.mjs","../../src/env.ts","../../src/methods/postEvent.ts","../../src/supports.ts","../../src/events/once.ts","../../src/request.ts","../../src/events/subscribe.ts"],"sourcesContent":["class s{listeners={};subscribeListeners=[];emit(s,...e){this.subscribeListeners.forEach((i=>i(s,...e)));const i=this.listeners[s];if(void 0===i)return;const t=[];i.forEach((s=>{\"function\"!=typeof s?(s.once&&t.push(s.listener),s.listener(...e)):s(...e)})),t.forEach((e=>this.off(s,e)))}on(s,e){const i=this.listeners[s];void 0===i?this.listeners[s]=[e]:i.push(e)}once(s,e){const i=this.listeners[s],t={listener:e,once:!0};void 0===i?this.listeners[s]=[t]:i.push(t)}off(s,e){const i=this.listeners[s];if(void 0!==i)for(let s=0;s<i.length;s+=1){const t=i[s];e===(\"function\"==typeof t?t:t.listener)&&(i.splice(s,1),s-=1)}}subscribe(s){this.subscribeListeners.push(s)}unsubscribe(s){const e=this.subscribeListeners.indexOf(s);e>=0&&this.subscribeListeners.splice(e,1)}}export{s as EventEmitter};\n//# sourceMappingURL=index.mjs.map\n","import{toRGB as t}from\"@tma.js/colors\";class r{parser;isOptional;getDefault;isEmpty;static create(t){return new r(t,!1,void 0)}constructor(t,r,e,n=(t=>void 0===t)){this.parser=t,this.isOptional=r,this.getDefault=e,this.isEmpty=n}parse(t){return this.isOptional&&this.isEmpty(t)?this.getDefault?this.getDefault():void 0:this.parser(t)}optional(t){return this.isOptional=!0,t&&(this.isEmpty=t),this}default(t){return this.getDefault=t,this}}function e(t){const r=\"function\"==typeof t?t:t.parse.bind(t);return t=>function(t){if(Array.isArray(t))return t;if(\"string\"==typeof t)try{const r=JSON.parse(t);if(Array.isArray(r))return r}catch(t){}throw new Error(`Passed value does not satisfy any of known formats: ${JSON.stringify(t)}`)}(t).map(r)}class n extends r{constructor(t,r,n,o=(t=>void 0===t)){super(e(t),r,n,o)}of(t){return this.parser=e(t),this}}function o(t){return()=>r.create(t)}function s(t){return o((r=>{if(typeof r!==t)throw new TypeError(`Unable to parse value ${JSON.stringify(r)} as ${t}.`);return r}))}function i(t,r){const e={};for(const n in t){const o=t[n];if(!o)continue;let s,i,a,u;if(\"type\"in o){const{from:t=n,type:r}=o;s=t,i=\"function\"==typeof r?r:r.parse.bind(r),a=\"required\"in o&&o.required}else s=n,a=!1,i=\"function\"==typeof o?o:o.parse.bind(o);try{u=i(r(s))}catch(t){throw new Error(`Unable to parse field \"${s}\"`,{cause:t})}(void 0!==u||a)&&(e[n]=u)}return e}const a=s(\"string\"),u=s(\"number\"),c=s(\"boolean\"),f=o((t=>{const r=a().parse(t);if(r){const t=Number(r),e=new Date(t.toString()===r?1e3*t:r);if(\"Invalid Date\"!==e.toString())return e}throw new TypeError(`Unable to parse value \"${t}\" as Date.`)})),p=o((r=>{const e=a().parse(r);try{return t(e)}catch(t){throw new TypeError(`Unable to parse value \"${e}\" as RGB.`,{cause:t})}}));function l(t){return r.create((r=>{let e=r;if(\"string\"==typeof e)try{e=JSON.parse(e)}catch(t){throw new TypeError(\"Value is not JSON object converted to string.\")}if(\"object\"!=typeof e||null===e||Array.isArray(e))throw new TypeError(\"Value is not JSON object.\");return i(t,(t=>e[t]))}))}function y(t){return r.create((r=>{if(\"string\"!=typeof r&&!(r instanceof URLSearchParams))throw new TypeError(\"Value has not processable type.\");const e=\"string\"==typeof r?new URLSearchParams(r):r;return i(t,(t=>{const r=e.get(t);return null===r?void 0:r}))}))}function h(){return new n((t=>t),!1,void 0)}export{n as ArrayValueParser,r as ValueParser,h as array,c as boolean,o as createParserGenerator,f as date,l as json,u as number,p as rgb,y as searchParams,a as string};\n//# sourceMappingURL=index.mjs.map\n","function t(t){return/^#[\\da-f]{3}$/i.test(t)}function r(t){return/^#[\\da-f]{6}$/i.test(t)}function e(e){const n=e.replace(/\\s/g,\"\").toLowerCase();if(r(n))return n;if(t(n)){let t=\"#\";for(let r=0;r<3;r+=1)t+=n[1+r].repeat(2);return t}const o=n.match(/^rgb\\((\\d{1,3}),(\\d{1,3}),(\\d{1,3})\\)$/)||n.match(/^rgba\\((\\d{1,3}),(\\d{1,3}),(\\d{1,3}),\\d{1,3}\\)$/);if(null===o)throw new Error(`Value \"${e}\" does not satisfy any of known RGB formats.`);return o.slice(1).reduce(((t,r)=>{const e=parseInt(r,10).toString(16);return t+(1===e.length?\"0\":\"\")+e}),\"#\")}function n(t){const r=e(t);return Math.sqrt([.299,.587,.114].reduce(((t,e,n)=>{const o=parseInt(r.slice(1+2*n,1+2*(n+1)),16);return t+o*o*e}),0))<120}export{n as isColorDark,r as isRGB,t as isRGBShort,e as toRGB};\n//# sourceMappingURL=index.mjs.map\n","import { log as utilLog } from '@tma.js/logger';\n\nlet currentDebug = false;\nlet currentTargetOrigin = 'https://web.telegram.org';\n\n/**\n * Sets new debug mode. Enabling debug mode leads to printing\n * additional messages in console, related to the processes\n * inside the package.\n * @param value - should debug mode be enabled.\n */\nexport function setDebug(value: boolean): void {\n currentDebug = value;\n}\n\n/**\n * Sets new global targetOrigin, used by `postEvent` method.\n * Default value is \"https://web.telegram.org\". You don't need to\n * use this method until you know what you are doing.\n *\n * This method could be used for test purposes.\n * @param value - new target origin.\n */\nexport function setTargetOrigin(value: string): void {\n currentTargetOrigin = value;\n}\n\n/**\n * Returns current global target origin.\n */\nexport function targetOrigin(): string {\n return currentTargetOrigin;\n}\n\n/**\n * Logs message in case, debug mode is enabled.\n * @param level - log level\n * @param args - values to print.\n */\nexport const log: typeof utilLog = (level, ...args) => {\n if (currentDebug) {\n utilLog(level, '[Bridge]', ...args);\n }\n};\n","function t(t,...i){const e=new Date,n=Intl.DateTimeFormat(\"en-GB\",{hour:\"2-digit\",minute:\"2-digit\",second:\"2-digit\",fractionalSecondDigits:3,timeZone:\"UTC\"}).format(e);console[t](`[${n}]`,...i)}export{t as log};\n//# sourceMappingURL=index.mjs.map\n","import {\n number,\n string,\n boolean,\n json,\n rgb,\n} from '@tma.js/parsing';\n\nimport type {\n ClipboardTextReceivedPayload, CustomMethodInvokedPayload,\n InvoiceClosedPayload, PhoneRequestedPayload,\n PopupClosedPayload, QrTextReceivedPayload,\n ThemeChangedPayload,\n ViewportChangedPayload, WriteAccessRequestedPayload,\n} from './payloads.js';\n\nfunction isNullOrUndefined(value: unknown): boolean {\n return value === null || value === undefined;\n}\n\n/**\n * Parses incoming value as ThemeChangedPayload.\n */\nexport const themeChangedPayload = json<ThemeChangedPayload>({\n theme_params: json<ThemeChangedPayload['theme_params']>({\n bg_color: rgb().optional(),\n text_color: rgb().optional(),\n hint_color: rgb().optional(),\n link_color: rgb().optional(),\n button_color: rgb().optional(),\n button_text_color: rgb().optional(),\n secondary_bg_color: rgb().optional(),\n }),\n});\n\n/**\n * Parses incoming value as ViewportChangedPayload.\n * @param value - value to parse.\n */\nexport const viewportChangedPayload = json<ViewportChangedPayload>({\n height: number(),\n width: number().optional(isNullOrUndefined).default(() => window.innerWidth),\n is_state_stable: boolean(),\n is_expanded: boolean(),\n});\n\n/**\n * Parses incoming value as PopupClosedPayload.\n */\nexport const popupClosedPayload = json<PopupClosedPayload>({\n button_id: string().optional(isNullOrUndefined),\n});\n\n/**\n * Parses incoming value as QrTextReceivedPayload.\n */\nexport const qrTextReceivedPayload = json<QrTextReceivedPayload>({\n data: string().optional(),\n});\n\n/**\n * Parses incoming value as InvoiceClosedPayload.\n */\nexport const invoiceClosedPayload = json<InvoiceClosedPayload>({\n slug: string(),\n status: string(),\n});\n\n/**\n * Parses incoming value as clipboard text received payload.\n */\nexport const clipboardTextReceivedPayload = json<ClipboardTextReceivedPayload>({\n req_id: string(),\n data: (value) => (value === null ? value : string().optional().parse(value)),\n});\n\n/**\n * Parses incoming value as WriteAccessRequestedPayload.\n */\nexport const writeAccessRequestedPayload = json<WriteAccessRequestedPayload>({ status: string() });\n\n/**\n * Parses incoming value as PhoneRequestedPayload.\n */\nexport const phoneRequestedPayload = json<PhoneRequestedPayload>({ status: string() });\n\n/**\n * Parses incoming value as CustomMethodInvokedPayload.\n */\nexport const customMethodInvokedPayload = json<CustomMethodInvokedPayload>({\n req_id: string(),\n result: (value) => value,\n error: string().optional(),\n});\n","import { json, string } from '@tma.js/parsing';\n\n/**\n * Extracts event data from native application event.\n */\nconst eventDataJson = json<{ eventType: string; eventData?: unknown }>({\n eventType: string(),\n eventData: (value) => value,\n});\n\n/**\n * Emits event sent from Telegram native application like it was sent in\n * default web environment between 2 iframes. It dispatches new MessageEvent\n * and expects it to be handled via `window.addEventListener('message', ...)`\n * as developer would do it to handle messages sent from parent iframe.\n * @param eventType - event name.\n * @param eventData - event payload.\n */\nfunction emitEvent(eventType: string, eventData: unknown): void {\n window.dispatchEvent(new MessageEvent('message', {\n data: JSON.stringify({ eventType, eventData }),\n }));\n}\n\n/**\n * Defines special handlers by known paths, which are recognized by\n * Telegram as ports to receive events. This function also sets special\n * function in global window object to prevent duplicate declaration.\n */\nfunction defineEventHandlers(): void {\n const wnd: any = window;\n\n // Prevent from duplicate event handlers definition.\n if ('TelegramGameProxy_receiveEvent' in wnd) {\n return;\n }\n\n // Iterate over each path, where \"receiveEvent\" function should be\n // defined. This function is called by external environment in case,\n // it wants to emit some event.\n [\n ['TelegramGameProxy_receiveEvent'], // Windows Phone.\n ['TelegramGameProxy', 'receiveEvent'], // Desktop.\n ['Telegram', 'WebView', 'receiveEvent'], // Android and iOS.\n ].forEach((path) => {\n // Path starts from \"window\" object.\n let pointer = wnd;\n\n path.forEach((item, idx, arr) => {\n // We are on the last iteration, where function property name is passed.\n if (idx === arr.length - 1) {\n pointer[item] = emitEvent;\n return;\n }\n\n if (!(item in pointer)) {\n pointer[item] = {};\n }\n pointer = pointer[item];\n });\n });\n}\n\n/**\n * Adds listener to window \"message\" event assuming, that this event could\n * be sent by Telegram native application. Calls passed callback with event\n * type and data.\n * @param cb - callback to call.\n */\nexport function onTelegramEvent(cb: (eventType: string, eventData: unknown) => void): void {\n // Define event handlers to make sure, message handler will work correctly.\n defineEventHandlers();\n\n // We expect Telegram to send us new event through \"message\" event.\n window.addEventListener('message', (event) => {\n try {\n const { eventType, eventData } = eventDataJson.parse(event.data);\n cb(eventType, eventData);\n } catch {\n // We ignore incorrect messages as they could be generated by any other code.\n }\n });\n}\n","import { EventEmitter as UtilEventEmitter } from '@tma.js/event-emitter';\nimport { string } from '@tma.js/parsing';\n\nimport { log } from '../globals.js';\nimport {\n clipboardTextReceivedPayload,\n customMethodInvokedPayload,\n invoiceClosedPayload,\n phoneRequestedPayload,\n popupClosedPayload,\n qrTextReceivedPayload,\n themeChangedPayload,\n viewportChangedPayload,\n writeAccessRequestedPayload,\n} from './parsing.js';\nimport { onTelegramEvent } from './onTelegramEvent.js';\n\nimport type { EventEmitter, EventName } from './events.js';\n\nconst CACHED_EMITTER = '__telegram-cached-emitter__';\n\n/**\n * Returns event emitter which could be safely used, to process events from\n * Telegram native application.\n */\nexport function createEmitter(): EventEmitter {\n const emitter: EventEmitter = new UtilEventEmitter();\n const emit: EventEmitter['emit'] = (event: any, ...data: any[]) => {\n log('log', 'Emitting processed event:', event, ...data);\n emitter.emit(event, ...data);\n };\n\n // Desktop version of Telegram is sometimes not sending the viewport_changed\n // event. For example, when main button is shown. That's why we should\n // add our own listener to make sure, viewport information is always fresh.\n // Issue: https://github.com/Telegram-Web-Apps/tma.js/issues/10\n window.addEventListener('resize', () => {\n emitter.emit('viewport_changed', {\n width: window.innerWidth,\n height: window.innerHeight,\n is_state_stable: true,\n is_expanded: true,\n });\n });\n\n // In case, any Telegram event was received, we should prepare data before\n // passing it to emitter.\n onTelegramEvent((eventType: EventName | string, eventData): void => {\n log('log', 'Received raw event:', eventType, eventData);\n\n try {\n switch (eventType) {\n case 'viewport_changed':\n return emit(eventType, viewportChangedPayload.parse(eventData));\n\n case 'theme_changed':\n return emit(eventType, themeChangedPayload.parse(eventData));\n\n case 'popup_closed':\n // FIXME: Payloads are different on different platforms.\n // Issue: https://github.com/Telegram-Web-Apps/tma.js/issues/2\n if (\n // Sent on desktop.\n eventData === undefined\n // Sent on iOS.\n || eventData === null\n ) {\n return emit(eventType, {});\n }\n return emit(eventType, popupClosedPayload.parse(eventData));\n\n case 'set_custom_style':\n return emit(eventType, string().parse(eventData));\n\n case 'qr_text_received':\n return emit(eventType, qrTextReceivedPayload.parse(eventData));\n\n case 'clipboard_text_received':\n return emit(eventType, clipboardTextReceivedPayload.parse(eventData));\n\n case 'invoice_closed':\n return emit(eventType, invoiceClosedPayload.parse(eventData));\n\n case 'phone_requested':\n return emit('phone_requested', phoneRequestedPayload.parse(eventData));\n\n case 'custom_method_invoked':\n return emit('custom_method_invoked', customMethodInvokedPayload.parse(eventData));\n\n case 'write_access_requested':\n return emit('write_access_requested', writeAccessRequestedPayload.parse(eventData));\n\n // Events which have no parameters.\n case 'main_button_pressed':\n case 'back_button_pressed':\n case 'settings_button_pressed':\n case 'scan_qr_popup_closed':\n return emit(eventType);\n\n // All other event listeners will receive unknown type of data.\n default:\n return emit(eventType as any, eventData);\n }\n } catch (cause) {\n log('error', 'Error processing event:', cause);\n }\n });\n\n return emitter;\n}\n\n/**\n * Returns singleton instance of bridge EventEmitter. Also, defines\n * Telegram event handlers.\n */\nexport function singletonEmitter(): EventEmitter {\n const wnd: any = window;\n const cachedEmitter = wnd[CACHED_EMITTER];\n\n if (cachedEmitter === undefined) {\n wnd[CACHED_EMITTER] = createEmitter();\n }\n\n return wnd[CACHED_EMITTER];\n}\n","import { singletonEmitter } from './emitter.js';\n\nimport type { EventName, EventListener } from './events.js';\n\n/**\n * Removes listener from specified event.\n * @param event - event to listen.\n * @param listener - event listener.\n */\nexport function off<E extends EventName>(event: E, listener: EventListener<E>): void {\n singletonEmitter().off(event, listener);\n}\n","import { singletonEmitter } from './emitter.js';\nimport { off } from './off.js';\n\nimport type { EventName, EventListener } from './events.js';\n\ntype StopListening = () => void;\n\n/**\n * Adds new listener to the specified event. Returns handler\n * which allows to stop listening to event.\n * @param event - event name.\n * @param listener - event listener.\n */\nexport function on<E extends EventName>(event: E, listener: EventListener<E>): StopListening {\n singletonEmitter().on(event, listener);\n return () => off(event, listener);\n}\n","import { singletonEmitter } from './emitter.js';\n\nimport type { GlobalEventListener } from './events.js';\n\n/**\n * Removes global event listener.\n * @param listener - event listener.\n */\nexport function unsubscribe(listener: GlobalEventListener): void {\n singletonEmitter().unsubscribe(listener);\n}\n","function t(t,e){return t+(t.length>0&&e.length>0?` ${e}`:e)}function e(...e){return e.reduce(((e,r)=>{let n=\"\";return\"string\"==typeof r?n=r:\"object\"==typeof r&&null!==r&&(n=Object.entries(r).reduce(((e,[r,n])=>n?t(e,r):e),\"\")),t(e,n)}),\"\")}function r(...t){return t.reduce(((t,r)=>{return\"object\"!=typeof(n=r)||null===n||Array.isArray(null)||Object.entries(r).forEach((([r,n])=>{const o=e(t[r],n);o.length>0&&(t[r]=o)})),t;var n}),{})}function n(t){return\"object\"==typeof t&&null!==t&&!Array.isArray(t)}function o(t,e){const r=t.split(\".\"),n=e.split(\".\"),o=Math.max(r.length,n.length);for(let t=0;t<o;t+=1){const e=parseInt(r[t]||\"0\",10),o=parseInt(n[t]||\"0\",10);if(e!==o)return e>o?1:-1}return 0}class u extends Error{constructor(t){super(`Async call timeout exceeded. Timeout: ${t}`),Object.setPrototypeOf(this,u.prototype)}}function c(t){return new Promise(((e,r)=>{setTimeout(r,t,new u(t))}))}function i(t,e){return\"function\"==typeof t?(...r)=>Promise.race([t(...r),c(e)]):Promise.race([t,c(e)])}function s(t){return t instanceof u}export{u as TimeoutError,e as classNames,o as compareVersions,n as isRecord,s as isTimeoutError,r as mergeClassNames,i as withTimeout};\n//# sourceMappingURL=index.mjs.map\n","import { isRecord } from '@tma.js/utils';\n\ntype AnyFunc = (...args: unknown[]) => unknown;\n\ntype WithExternalNotify<T> = T & {\n external: { notify: AnyFunc }\n};\n\ntype WithWebviewProxy<T> = T & {\n TelegramWebviewProxy: {\n postEvent: AnyFunc;\n }\n};\n\n/**\n * Returns true in case, passed value contains path `external.notify` property and `notify` is a\n * function.\n * @param value - value to check.\n */\nexport function hasExternalNotify<T extends {}>(value: T): value is WithExternalNotify<T> {\n return 'external' in value\n && isRecord(value.external)\n && 'notify' in value.external\n && typeof value.external.notify === 'function';\n}\n\n/**\n * Returns true in case, passed value contains path `TelegramWebviewProxy.postEvent` property and\n * `postEvent` is a function.\n * @param value - value to check.\n */\nexport function hasWebviewProxy<T extends {}>(value: T): value is WithWebviewProxy<T> {\n return 'TelegramWebviewProxy' in value\n && isRecord(value.TelegramWebviewProxy)\n && 'postEvent' in value.TelegramWebviewProxy\n && typeof value.TelegramWebviewProxy.postEvent === 'function';\n}\n\n/**\n * Returns true in case, current environment is iframe.\n * @see https://stackoverflow.com/a/326076\n */\nexport function isIframe(): boolean {\n try {\n return window.self !== window.top;\n } catch (e) {\n return true;\n }\n}\n","import {\n isIframe,\n hasExternalNotify,\n hasWebviewProxy,\n} from '../env.js';\nimport { targetOrigin as globalTargetOrigin } from '../globals.js';\n\nimport type {\n EmptyMethodName,\n MethodName,\n MethodParams,\n NonEmptyMethodName,\n} from './params.js';\n\ninterface PostEventOptions {\n /**\n * Origin used while posting message. This option is only used in case,\n * current environment is browser (Web version of Telegram) and could\n * be used for test purposes.\n * @default 'https://web.telegram.org'\n */\n targetOrigin?: string;\n}\n\nexport type PostEvent = typeof postEvent;\n\n/**\n * Sends event to native application which launched Web App. This function\n * accepts only events, which require arguments.\n * @param eventType - event name.\n * @param params - event parameters.\n * @param options - posting options.\n * @throws {Error} Bridge could not determine current\n * environment and possible way to send event.\n */\nexport function postEvent<E extends NonEmptyMethodName>(\n eventType: E,\n params: MethodParams<E>,\n options?: PostEventOptions,\n): void;\n\n/**\n * Sends event to native application which launched Web App. This function\n * accepts only events, which require arguments.\n * @param eventType - event name.\n * @param options - posting options.\n * @throws {Error} Bridge could not determine current\n * environment and possible way to send event.\n */\nexport function postEvent(eventType: EmptyMethodName, options?: PostEventOptions): void;\n\nexport function postEvent(\n eventType: MethodName,\n paramsOrOptions?: MethodParams<MethodName> | PostEventOptions,\n options?: PostEventOptions,\n): void {\n let postOptions: PostEventOptions = {};\n let eventData: any;\n\n if (paramsOrOptions === undefined && options === undefined) {\n // Parameters and options were not passed.\n postOptions = {};\n } else if (paramsOrOptions !== undefined && options !== undefined) {\n // Both parameters and options passed.\n postOptions = options;\n eventData = paramsOrOptions;\n } else if (paramsOrOptions !== undefined) {\n // Only parameters were passed.\n if ('targetOrigin' in paramsOrOptions) {\n postOptions = paramsOrOptions;\n } else {\n eventData = paramsOrOptions;\n }\n }\n const { targetOrigin = globalTargetOrigin() } = postOptions;\n\n // Telegram Web.\n if (isIframe()) {\n window.parent.postMessage(JSON.stringify({\n eventType,\n eventData,\n }), targetOrigin);\n return;\n }\n\n // Telegram for Windows Phone or Android.\n if (hasExternalNotify(window)) {\n window.external.notify(JSON.stringify({ eventType, eventData }));\n return;\n }\n\n // Telegram for iOS and macOS.\n if (hasWebviewProxy(window)) {\n window.TelegramWebviewProxy.postEvent(eventType, JSON.stringify(eventData));\n return;\n }\n\n // Otherwise current environment is unknown, and we are not able to send\n // event.\n throw new Error(\n 'Unable to determine current environment and possible way to send event.',\n );\n}\n","import { compareVersions, type Version } from '@tma.js/utils';\n\nimport type {\n HasCheckSupportMethodParam,\n HasCheckSupportMethodName,\n MethodName,\n MethodParams,\n NonEmptyMethodName,\n} from './methods/index.js';\n\nfunction lessOrEqual(a: Version, b: Version): boolean {\n return compareVersions(a, b) <= 0;\n}\n\n/**\n * By specified method and parameters extracts properties which could be used by\n * supports function as TWA method parameter.\n * @param method - TWA method.\n * @param params - method parameters.\n */\nexport function detectSupportParams<M extends NonEmptyMethodName>(\n method: M,\n params: MethodParams<M>,\n): HasCheckSupportMethodParam<HasCheckSupportMethodName>[] {\n if (method === 'web_app_open_link') {\n if ('try_instant_view' in params) {\n return ['try_instant_view'];\n }\n }\n\n if (method === 'web_app_set_header_color') {\n if ('color' in params) {\n return ['color'];\n }\n }\n\n return [];\n}\n\n/**\n * Returns true in case, passed parameter in specified method is supported.\n * @param method - method name\n * @param param - method parameter\n * @param inVersion - platform version.\n */\nexport function supports<M extends HasCheckSupportMethodName>(\n method: M,\n param: HasCheckSupportMethodParam<M>,\n inVersion: Version,\n): boolean;\n/**\n * Returns true in case, specified method is supported in passed version.\n * @param method - method name.\n * @param inVersion - platform version.\n */\nexport function supports(method: MethodName, inVersion: Version): boolean;\nexport function supports(\n method: MethodName,\n paramOrVersion: Version | string,\n inVersion?: string,\n): boolean {\n // Method name, parameter, target version.\n if (typeof inVersion === 'string') {\n if (method === 'web_app_open_link') {\n if (paramOrVersion === 'try_instant_view') {\n return lessOrEqual('6.4', inVersion);\n }\n }\n\n if (method === 'web_app_set_header_color') {\n if (paramOrVersion === 'color') {\n return lessOrEqual('6.9', inVersion);\n }\n }\n }\n\n // Method name, target version.\n switch (method) {\n case 'web_app_open_tg_link':\n case 'web_app_open_invoice':\n case 'web_app_setup_back_button':\n case 'web_app_set_background_color':\n case 'web_app_set_header_color':\n case 'web_app_trigger_haptic_feedback':\n return lessOrEqual('6.1', paramOrVersion);\n case 'web_app_open_popup':\n return lessOrEqual('6.2', paramOrVersion);\n case 'web_app_close_scan_qr_popup':\n case 'web_app_open_scan_qr_popup':\n case 'web_app_read_text_from_clipboard':\n return lessOrEqual('6.4', paramOrVersion);\n case 'web_app_invoke_custom_method':\n case 'web_app_request_write_access':\n case 'web_app_request_phone':\n return lessOrEqual('6.9', paramOrVersion);\n default:\n return true;\n }\n}\n","import { singletonEmitter } from './emitter.js';\nimport { off } from './off.js';\n\nimport type { EventName, EventListener } from './events.js';\n\ntype StopListening = () => void;\n\n/**\n * Works the same as \"on\" method, but after catching the event, will remove event listener.\n * @param event - event name.\n * @param listener - event listener.\n */\nexport function once<E extends EventName>(event: E, listener: EventListener<E>): StopListening {\n singletonEmitter().once(event, listener);\n return () => off(event, listener);\n}\n","import { withTimeout, isRecord } from '@tma.js/utils';\n\nimport type { And, If, IsNever } from '@tma.js/util-types';\n\nimport { postEvent as defaultPostEvent, type PostEvent } from './methods/postEvent.js';\nimport { on, type EventName, type EventParams, type EventHasParams } from './events/index.js';\n\nimport type {\n EmptyMethodName, MethodHasParams,\n MethodName,\n MethodParams,\n NonEmptyMethodName,\n} from './methods/params.js';\n\n/**\n * Names of methods, which require passing \"req_id\" parameter.\n */\ntype MethodNameWithRequestId = {\n [Method in MethodName]: If<\n And<MethodHasParams<Method>, MethodParams<Method> extends { req_id: string } ? true : false>,\n Method,\n never\n >;\n}[MethodName];\n\n/**\n * Names of events, which contain \"req_id\" parameter.\n */\ntype EventNameWithRequestId = {\n [Event in EventName]: If<\n And<EventHasParams<Event>, EventParams<Event> extends { req_id: string } ? true : false>,\n Event,\n never\n >;\n}[EventName];\n\nexport interface RequestOptions {\n /**\n * Bridge postEvent method.\n * @default Global postEvent method.\n */\n postEvent?: PostEvent;\n\n /**\n * Execution timeout.\n */\n timeout?: number;\n}\n\nexport interface RequestOptionsAdvanced<EventPayload> extends RequestOptions {\n /**\n * Should return true in case, this event should be captured. If not specified,\n * request is not skipping captured events.\n */\n capture?: If<IsNever<EventPayload>, () => boolean, (payload: EventPayload) => boolean>;\n}\n\n/**\n * Calls specified TWA method and captures one of the specified events. Returns promise\n * which will be resolved in case, event with specified in method request identifier\n * was captured.\n * @param method - method to execute.\n * @param params - method parameters.\n * @param event - event or events to listen.\n * @param options - additional execution options.\n */\nexport function request<\n Method extends MethodNameWithRequestId,\n Event extends EventNameWithRequestId,\n>(\n method: Method,\n params: MethodParams<Method>,\n event: Event | Event[],\n options?: RequestOptions,\n): Promise<EventParams<Event>>;\n\n/**\n * Calls specified TWA method and captures one of the specified events. Returns promise\n * which will be resolved in case, specified event was captured.\n * @param method - method to execute.\n * @param event - event or events to listen.\n * @param options - additional execution options.\n */\nexport function request<Method extends EmptyMethodName, Event extends EventName>(\n method: Method,\n event: Event | Event[],\n options?: RequestOptionsAdvanced<EventParams<Event>>,\n): Promise<EventParams<Event>>;\n\n/**\n * Calls specified TWA method and captures one of the specified events. Returns promise\n * which will be resolved in case, specified event was captured.\n * @param method - method to execute\n * @param params - method parameters.\n * @param event - event or events to listen\n * @param options - additional execution options.\n */\nexport function request<Method extends NonEmptyMethodName, Event extends EventName>(\n method: Method,\n params: MethodParams<Method>,\n event: Event | Event[],\n options?: RequestOptionsAdvanced<EventParams<Event>>,\n): Promise<EventParams<Event>>;\n\nexport function request(\n method: MethodName,\n eventOrParams: EventName | EventName[] | EventParams<any>,\n eventOrOptions?: EventName | EventName[] | RequestOptions | RequestOptionsAdvanced<any>,\n options?: RequestOptions | RequestOptionsAdvanced<any>,\n): Promise<any> {\n let executionOptions: RequestOptions | RequestOptionsAdvanced<any> | undefined;\n let methodParams: EventParams<any> | undefined;\n let events: EventName[];\n let requestId: string | undefined;\n\n if (typeof eventOrParams === 'string' || Array.isArray(eventOrParams)) {\n // Override: [method, event, options?]\n events = Array.isArray(eventOrParams) ? eventOrParams : [eventOrParams] as EventName[];\n executionOptions = eventOrOptions as (RequestOptionsAdvanced<any> | undefined);\n } else {\n // Override: [method, params, event, options?]\n methodParams = eventOrParams as EventParams<any>;\n events = Array.isArray(eventOrOptions) ? eventOrOptions : [eventOrOptions] as EventName[];\n executionOptions = options;\n }\n\n // In case, method parameters were passed, and they contained request identifier, we should store\n // it and wait for the event with this identifier to occur.\n if (isRecord(methodParams) && typeof methodParams.req_id === 'string') {\n requestId = methodParams.req_id;\n }\n\n const { postEvent = defaultPostEvent, timeout } = executionOptions || {};\n const capture = executionOptions && 'capture' in executionOptions\n ? executionOptions.capture\n : null;\n\n const promise = new Promise((res, rej) => {\n // Iterate over each event and create event listener.\n const stoppers = events.map((ev) => on(ev, (data?) => {\n // If request identifier was specified, we are waiting for event with the same value\n // to occur.\n if (typeof requestId === 'string' && (!isRecord(data) || data.req_id !== requestId)) {\n return;\n }\n\n if (typeof capture === 'function' && !capture(data)) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n stopListening();\n res(data);\n }));\n\n // Function which removes all event listeners.\n const stopListening = () => stoppers.forEach((stop) => stop());\n\n try {\n // We are wrapping this call in try catch, because it can throw errors in case,\n // compatibility check was enabled. We want an error to be captured by promise, not by\n // another one external try catch.\n postEvent(method as any, methodParams);\n } catch (e) {\n stopListening();\n rej(e);\n }\n });\n\n return typeof timeout === 'number' ? withTimeout(promise, timeout) : promise;\n}\n","import { singletonEmitter } from './emitter.js';\nimport { unsubscribe } from './unsubscribe.js';\n\nimport type { GlobalEventListener } from './events.js';\n\ntype StopListening = () => void;\n\n/**\n * Subscribes to all events sent from the native Telegram application.\n * Returns function used to remove added event listener.\n * @param listener - event listener.\n */\nexport function subscribe(listener: GlobalEventListener): StopListening {\n singletonEmitter().subscribe(listener);\n return () => unsubscribe(listener);\n}\n"],"names":["s$1","listeners","subscribeListeners","emit","s","e","this","forEach","i","t","once","push","listener","off","on","length","splice","subscribe","unsubscribe","indexOf","r","parser","isOptional","getDefault","isEmpty","static","constructor","n","parse","optional","default","o","create","TypeError","JSON","stringify","a","u","c","p","replace","toLowerCase","test","repeat","match","Error","slice","reduce","parseInt","toString","cause","l","Array","isArray","from","type","bind","required","currentDebug","currentTargetOrigin","targetOrigin","log","level","args","Date","Intl","DateTimeFormat","hour","minute","second","fractionalSecondDigits","timeZone","format","console","utilLog","isNullOrUndefined","value","themeChangedPayload","json","theme_params","bg_color","rgb","text_color","hint_color","link_color","button_color","button_text_color","secondary_bg_color","viewportChangedPayload","height","number","width","window","innerWidth","is_state_stable","boolean","is_expanded","popupClosedPayload","button_id","string","qrTextReceivedPayload","data","invoiceClosedPayload","slug","status","clipboardTextReceivedPayload","req_id","writeAccessRequestedPayload","phoneRequestedPayload","customMethodInvokedPayload","result","error","eventDataJson","eventType","eventData","emitEvent","dispatchEvent","MessageEvent","onTelegramEvent","cb","wnd","path","pointer","item","idx","arr","defineEventHandlers","addEventListener","event","CACHED_EMITTER","singletonEmitter","undefined","emitter","UtilEventEmitter","innerHeight","createEmitter","super","Object","setPrototypeOf","prototype","Promise","setTimeout","hasExternalNotify","isRecord","external","notify","hasWebviewProxy","TelegramWebviewProxy","postEvent","isIframe","self","top","paramsOrOptions","options","postOptions","globalTargetOrigin","parent","postMessage","lessOrEqual","b","split","Math","max","compareVersions","method","params","eventOrParams","eventOrOptions","executionOptions","methodParams","events","requestId","defaultPostEvent","timeout","capture","promise","res","rej","stoppers","map","ev","stopListening","stop","race","withTimeout","paramOrVersion","inVersion"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"browser.js","sources":["../../../event-emitter/dist/lib/index.mjs","../../../parsing/dist/lib/index.mjs","../../../colors/dist/lib/index.mjs","../../src/globals.ts","../../../logger/dist/lib/index.mjs","../../src/events/parsing.ts","../../src/events/onTelegramEvent.ts","../../src/events/emitter.ts","../../src/events/off.ts","../../src/events/on.ts","../../src/events/unsubscribe.ts","../../../utils/dist/lib/index.mjs","../../src/env.ts","../../src/methods/postEvent.ts","../../src/supports.ts","../../src/events/once.ts","../../src/request.ts","../../src/events/subscribe.ts"],"sourcesContent":["class s{listeners={};subscribeListeners=[];emit(s,...e){this.subscribeListeners.forEach((i=>i(s,...e)));const i=this.listeners[s];if(void 0===i)return;const t=[];i.forEach((s=>{\"function\"!=typeof s?(s.once&&t.push(s.listener),s.listener(...e)):s(...e)})),t.forEach((e=>this.off(s,e)))}on(s,e){const i=this.listeners[s];void 0===i?this.listeners[s]=[e]:i.push(e)}once(s,e){const i=this.listeners[s],t={listener:e,once:!0};void 0===i?this.listeners[s]=[t]:i.push(t)}off(s,e){const i=this.listeners[s];if(void 0!==i)for(let s=0;s<i.length;s+=1){const t=i[s];e===(\"function\"==typeof t?t:t.listener)&&(i.splice(s,1),s-=1)}}subscribe(s){this.subscribeListeners.push(s)}unsubscribe(s){const e=this.subscribeListeners.indexOf(s);e>=0&&this.subscribeListeners.splice(e,1)}}export{s as EventEmitter};\n//# sourceMappingURL=index.mjs.map\n","import{toRGB as t}from\"@tma.js/colors\";class r{parser;isOptional;getDefault;isEmpty;static create(t){return new r(t,!1,void 0)}constructor(t,r,e,n=(t=>void 0===t)){this.parser=t,this.isOptional=r,this.getDefault=e,this.isEmpty=n}parse(t){return this.isOptional&&this.isEmpty(t)?this.getDefault?this.getDefault():void 0:this.parser(t)}optional(t){return this.isOptional=!0,t&&(this.isEmpty=t),this}default(t){return this.getDefault=t,this}}function e(t){const r=\"function\"==typeof t?t:t.parse.bind(t);return t=>function(t){if(Array.isArray(t))return t;if(\"string\"==typeof t)try{const r=JSON.parse(t);if(Array.isArray(r))return r}catch(t){}throw new Error(`Passed value does not satisfy any of known formats: ${JSON.stringify(t)}`)}(t).map(r)}class n extends r{constructor(t,r,n,o=(t=>void 0===t)){super(e(t),r,n,o)}of(t){return this.parser=e(t),this}}function o(t){return()=>r.create(t)}function s(t){return o((r=>{if(typeof r!==t)throw new TypeError(`Unable to parse value ${JSON.stringify(r)} as ${t}.`);return r}))}function i(t,r){const e={};for(const n in t){const o=t[n];if(!o)continue;let s,i,a,u;if(\"type\"in o){const{from:t=n,type:r}=o;s=t,i=\"function\"==typeof r?r:r.parse.bind(r),a=\"required\"in o&&o.required}else s=n,a=!1,i=\"function\"==typeof o?o:o.parse.bind(o);try{u=i(r(s))}catch(t){throw new Error(`Unable to parse field \"${s}\"`,{cause:t})}(void 0!==u||a)&&(e[n]=u)}return e}const a=s(\"string\"),u=s(\"number\"),c=s(\"boolean\"),f=o((t=>{const r=a().parse(t);if(r){const t=Number(r),e=new Date(t.toString()===r?1e3*t:r);if(\"Invalid Date\"!==e.toString())return e}throw new TypeError(`Unable to parse value \"${t}\" as Date.`)})),p=o((r=>{const e=a().parse(r);try{return t(e)}catch(t){throw new TypeError(`Unable to parse value \"${e}\" as RGB.`,{cause:t})}}));function l(t){return r.create((r=>{let e=r;if(\"string\"==typeof e)try{e=JSON.parse(e)}catch(t){throw new TypeError(\"Value is not JSON object converted to string.\")}if(\"object\"!=typeof e||null===e||Array.isArray(e))throw new TypeError(\"Value is not JSON object.\");return i(t,(t=>e[t]))}))}function y(t){return r.create((r=>{if(\"string\"!=typeof r&&!(r instanceof URLSearchParams))throw new TypeError(\"Value has not processable type.\");const e=\"string\"==typeof r?new URLSearchParams(r):r;return i(t,(t=>{const r=e.get(t);return null===r?void 0:r}))}))}function h(){return new n((t=>t),!1,void 0)}export{n as ArrayValueParser,r as ValueParser,h as array,c as boolean,o as createParserGenerator,f as date,l as json,u as number,p as rgb,y as searchParams,a as string};\n//# sourceMappingURL=index.mjs.map\n","function t(t){return/^#[\\da-f]{3}$/i.test(t)}function r(t){return/^#[\\da-f]{6}$/i.test(t)}function e(e){const n=e.replace(/\\s/g,\"\").toLowerCase();if(r(n))return n;if(t(n)){let t=\"#\";for(let r=0;r<3;r+=1)t+=n[1+r].repeat(2);return t}const o=n.match(/^rgb\\((\\d{1,3}),(\\d{1,3}),(\\d{1,3})\\)$/)||n.match(/^rgba\\((\\d{1,3}),(\\d{1,3}),(\\d{1,3}),\\d{1,3}\\)$/);if(null===o)throw new Error(`Value \"${e}\" does not satisfy any of known RGB formats.`);return o.slice(1).reduce(((t,r)=>{const e=parseInt(r,10).toString(16);return t+(1===e.length?\"0\":\"\")+e}),\"#\")}function n(t){const r=e(t);return Math.sqrt([.299,.587,.114].reduce(((t,e,n)=>{const o=parseInt(r.slice(1+2*n,1+2*(n+1)),16);return t+o*o*e}),0))<120}export{n as isColorDark,r as isRGB,t as isRGBShort,e as toRGB};\n//# sourceMappingURL=index.mjs.map\n","import { log as utilLog } from '@tma.js/logger';\n\nlet currentDebug = false;\nlet currentTargetOrigin = 'https://web.telegram.org';\n\n/**\n * Sets new debug mode. Enabling debug mode leads to printing\n * additional messages in console, related to the processes\n * inside the package.\n * @param value - should debug mode be enabled.\n */\nexport function setDebug(value: boolean): void {\n currentDebug = value;\n}\n\n/**\n * Sets new global targetOrigin, used by `postEvent` method.\n * Default value is \"https://web.telegram.org\". You don't need to\n * use this method until you know what you are doing.\n *\n * This method could be used for test purposes.\n * @param value - new target origin.\n */\nexport function setTargetOrigin(value: string): void {\n currentTargetOrigin = value;\n}\n\n/**\n * Returns current global target origin.\n */\nexport function targetOrigin(): string {\n return currentTargetOrigin;\n}\n\n/**\n * Logs message in case, debug mode is enabled.\n * @param level - log level\n * @param args - values to print.\n */\nexport const log: typeof utilLog = (level, ...args) => {\n if (currentDebug) {\n utilLog(level, '[Bridge]', ...args);\n }\n};\n","function t(t,...i){const e=new Date,n=Intl.DateTimeFormat(\"en-GB\",{hour:\"2-digit\",minute:\"2-digit\",second:\"2-digit\",fractionalSecondDigits:3,timeZone:\"UTC\"}).format(e);console[t](`[${n}]`,...i)}export{t as log};\n//# sourceMappingURL=index.mjs.map\n","import {\n number,\n string,\n boolean,\n json,\n rgb,\n} from '@tma.js/parsing';\n\nimport type {\n ClipboardTextReceivedPayload, CustomMethodInvokedPayload,\n InvoiceClosedPayload, PhoneRequestedPayload,\n PopupClosedPayload, QrTextReceivedPayload,\n ThemeChangedPayload,\n ViewportChangedPayload, WriteAccessRequestedPayload,\n} from './payloads.js';\n\nfunction isNullOrUndefined(value: unknown): boolean {\n return value === null || value === undefined;\n}\n\n/**\n * Parses incoming value as ThemeChangedPayload.\n */\nexport const themeChangedPayload = json<ThemeChangedPayload>({\n theme_params: json<ThemeChangedPayload['theme_params']>({\n bg_color: rgb().optional(),\n text_color: rgb().optional(),\n hint_color: rgb().optional(),\n link_color: rgb().optional(),\n button_color: rgb().optional(),\n button_text_color: rgb().optional(),\n secondary_bg_color: rgb().optional(),\n }),\n});\n\n/**\n * Parses incoming value as ViewportChangedPayload.\n * @param value - value to parse.\n */\nexport const viewportChangedPayload = json<ViewportChangedPayload>({\n height: number(),\n width: number().optional(isNullOrUndefined).default(() => window.innerWidth),\n is_state_stable: boolean(),\n is_expanded: boolean(),\n});\n\n/**\n * Parses incoming value as PopupClosedPayload.\n */\nexport const popupClosedPayload = json<PopupClosedPayload>({\n button_id: string().optional(isNullOrUndefined),\n});\n\n/**\n * Parses incoming value as QrTextReceivedPayload.\n */\nexport const qrTextReceivedPayload = json<QrTextReceivedPayload>({\n data: string().optional(),\n});\n\n/**\n * Parses incoming value as InvoiceClosedPayload.\n */\nexport const invoiceClosedPayload = json<InvoiceClosedPayload>({\n slug: string(),\n status: string(),\n});\n\n/**\n * Parses incoming value as clipboard text received payload.\n */\nexport const clipboardTextReceivedPayload = json<ClipboardTextReceivedPayload>({\n req_id: string(),\n data: (value) => (value === null ? value : string().optional().parse(value)),\n});\n\n/**\n * Parses incoming value as WriteAccessRequestedPayload.\n */\nexport const writeAccessRequestedPayload = json<WriteAccessRequestedPayload>({ status: string() });\n\n/**\n * Parses incoming value as PhoneRequestedPayload.\n */\nexport const phoneRequestedPayload = json<PhoneRequestedPayload>({ status: string() });\n\n/**\n * Parses incoming value as CustomMethodInvokedPayload.\n */\nexport const customMethodInvokedPayload = json<CustomMethodInvokedPayload>({\n req_id: string(),\n result: (value) => value,\n error: string().optional(),\n});\n","import { json, string } from '@tma.js/parsing';\n\n/**\n * Extracts event data from native application event.\n */\nconst eventDataJson = json<{ eventType: string; eventData?: unknown }>({\n eventType: string(),\n eventData: (value) => value,\n});\n\n/**\n * Emits event sent from Telegram native application like it was sent in\n * default web environment between 2 iframes. It dispatches new MessageEvent\n * and expects it to be handled via `window.addEventListener('message', ...)`\n * as developer would do it to handle messages sent from parent iframe.\n * @param eventType - event name.\n * @param eventData - event payload.\n */\nfunction emitEvent(eventType: string, eventData: unknown): void {\n window.dispatchEvent(new MessageEvent('message', {\n data: JSON.stringify({ eventType, eventData }),\n }));\n}\n\n/**\n * Defines special handlers by known paths, which are recognized by\n * Telegram as ports to receive events. This function also sets special\n * function in global window object to prevent duplicate declaration.\n */\nfunction defineEventHandlers(): void {\n const wnd: any = window;\n\n // Prevent from duplicate event handlers definition.\n if ('TelegramGameProxy_receiveEvent' in wnd) {\n return;\n }\n\n // Iterate over each path, where \"receiveEvent\" function should be\n // defined. This function is called by external environment in case,\n // it wants to emit some event.\n [\n ['TelegramGameProxy_receiveEvent'], // Windows Phone.\n ['TelegramGameProxy', 'receiveEvent'], // Desktop.\n ['Telegram', 'WebView', 'receiveEvent'], // Android and iOS.\n ].forEach((path) => {\n // Path starts from \"window\" object.\n let pointer = wnd;\n\n path.forEach((item, idx, arr) => {\n // We are on the last iteration, where function property name is passed.\n if (idx === arr.length - 1) {\n pointer[item] = emitEvent;\n return;\n }\n\n if (!(item in pointer)) {\n pointer[item] = {};\n }\n pointer = pointer[item];\n });\n });\n}\n\n/**\n * Adds listener to window \"message\" event assuming, that this event could\n * be sent by Telegram native application. Calls passed callback with event\n * type and data.\n * @param cb - callback to call.\n */\nexport function onTelegramEvent(cb: (eventType: string, eventData: unknown) => void): void {\n // Define event handlers to make sure, message handler will work correctly.\n defineEventHandlers();\n\n // We expect Telegram to send us new event through \"message\" event.\n window.addEventListener('message', (event) => {\n try {\n const { eventType, eventData } = eventDataJson.parse(event.data);\n cb(eventType, eventData);\n } catch {\n // We ignore incorrect messages as they could be generated by any other code.\n }\n });\n}\n","import { EventEmitter as UtilEventEmitter } from '@tma.js/event-emitter';\nimport { string } from '@tma.js/parsing';\n\nimport { log } from '../globals.js';\nimport {\n clipboardTextReceivedPayload,\n customMethodInvokedPayload,\n invoiceClosedPayload,\n phoneRequestedPayload,\n popupClosedPayload,\n qrTextReceivedPayload,\n themeChangedPayload,\n viewportChangedPayload,\n writeAccessRequestedPayload,\n} from './parsing.js';\nimport { onTelegramEvent } from './onTelegramEvent.js';\n\nimport type { EventEmitter, EventName } from './events.js';\n\nconst CACHED_EMITTER = '__telegram-cached-emitter__';\n\n/**\n * Returns event emitter which could be safely used, to process events from\n * Telegram native application.\n */\nexport function createEmitter(): EventEmitter {\n const emitter: EventEmitter = new UtilEventEmitter();\n const emit: EventEmitter['emit'] = (event: any, ...data: any[]) => {\n log('log', 'Emitting processed event:', event, ...data);\n emitter.emit(event, ...data);\n };\n\n // Desktop version of Telegram is sometimes not sending the viewport_changed\n // event. For example, when main button is shown. That's why we should\n // add our own listener to make sure, viewport information is always fresh.\n // Issue: https://github.com/Telegram-Web-Apps/tma.js/issues/10\n window.addEventListener('resize', () => {\n emit('viewport_changed', {\n width: window.innerWidth,\n height: window.innerHeight,\n is_state_stable: true,\n is_expanded: true,\n });\n });\n\n // In case, any Telegram event was received, we should prepare data before\n // passing it to emitter.\n onTelegramEvent((eventType: EventName | string, eventData): void => {\n log('log', 'Received raw event:', eventType, eventData);\n\n try {\n switch (eventType) {\n case 'viewport_changed':\n return emit(eventType, viewportChangedPayload.parse(eventData));\n\n case 'theme_changed':\n return emit(eventType, themeChangedPayload.parse(eventData));\n\n case 'popup_closed':\n // FIXME: Payloads are different on different platforms.\n // Issue: https://github.com/Telegram-Web-Apps/tma.js/issues/2\n if (\n // Sent on desktop.\n eventData === undefined\n // Sent on iOS.\n || eventData === null\n ) {\n return emit(eventType, {});\n }\n return emit(eventType, popupClosedPayload.parse(eventData));\n\n case 'set_custom_style':\n return emit(eventType, string().parse(eventData));\n\n case 'qr_text_received':\n return emit(eventType, qrTextReceivedPayload.parse(eventData));\n\n case 'clipboard_text_received':\n return emit(eventType, clipboardTextReceivedPayload.parse(eventData));\n\n case 'invoice_closed':\n return emit(eventType, invoiceClosedPayload.parse(eventData));\n\n case 'phone_requested':\n return emit('phone_requested', phoneRequestedPayload.parse(eventData));\n\n case 'custom_method_invoked':\n return emit('custom_method_invoked', customMethodInvokedPayload.parse(eventData));\n\n case 'write_access_requested':\n return emit('write_access_requested', writeAccessRequestedPayload.parse(eventData));\n\n // Events which have no parameters.\n case 'main_button_pressed':\n case 'back_button_pressed':\n case 'settings_button_pressed':\n case 'scan_qr_popup_closed':\n return emit(eventType);\n\n // All other event listeners will receive unknown type of data.\n default:\n return emit(eventType as any, eventData);\n }\n } catch (cause) {\n log('error', 'Error processing event:', cause);\n }\n });\n\n return emitter;\n}\n\n/**\n * Returns singleton instance of bridge EventEmitter. Also, defines\n * Telegram event handlers.\n */\nexport function singletonEmitter(): EventEmitter {\n const wnd: any = window;\n const cachedEmitter = wnd[CACHED_EMITTER];\n\n if (cachedEmitter === undefined) {\n wnd[CACHED_EMITTER] = createEmitter();\n }\n\n return wnd[CACHED_EMITTER];\n}\n","import { singletonEmitter } from './emitter.js';\n\nimport type { EventName, EventListener } from './events.js';\n\n/**\n * Removes listener from specified event.\n * @param event - event to listen.\n * @param listener - event listener.\n */\nexport function off<E extends EventName>(event: E, listener: EventListener<E>): void {\n singletonEmitter().off(event, listener);\n}\n","import { singletonEmitter } from './emitter.js';\nimport { off } from './off.js';\n\nimport type { EventName, EventListener } from './events.js';\n\ntype StopListening = () => void;\n\n/**\n * Adds new listener to the specified event. Returns handler\n * which allows to stop listening to event.\n * @param event - event name.\n * @param listener - event listener.\n */\nexport function on<E extends EventName>(event: E, listener: EventListener<E>): StopListening {\n singletonEmitter().on(event, listener);\n return () => off(event, listener);\n}\n","import { singletonEmitter } from './emitter.js';\n\nimport type { GlobalEventListener } from './events.js';\n\n/**\n * Removes global event listener.\n * @param listener - event listener.\n */\nexport function unsubscribe(listener: GlobalEventListener): void {\n singletonEmitter().unsubscribe(listener);\n}\n","function t(t,e){return t+(t.length>0&&e.length>0?` ${e}`:e)}function e(...e){return e.reduce(((e,r)=>{let n=\"\";return\"string\"==typeof r?n=r:\"object\"==typeof r&&null!==r&&(n=Object.entries(r).reduce(((e,[r,n])=>n?t(e,r):e),\"\")),t(e,n)}),\"\")}function r(...t){return t.reduce(((t,r)=>{return\"object\"!=typeof(n=r)||null===n||Array.isArray(null)||Object.entries(r).forEach((([r,n])=>{const o=e(t[r],n);o.length>0&&(t[r]=o)})),t;var n}),{})}function n(t){return\"object\"==typeof t&&null!==t&&!Array.isArray(t)}function o(t,e){const r=t.split(\".\"),n=e.split(\".\"),o=Math.max(r.length,n.length);for(let t=0;t<o;t+=1){const e=parseInt(r[t]||\"0\",10),o=parseInt(n[t]||\"0\",10);if(e!==o)return e>o?1:-1}return 0}class u extends Error{constructor(t){super(`Async call timeout exceeded. Timeout: ${t}`),Object.setPrototypeOf(this,u.prototype)}}function c(t){return new Promise(((e,r)=>{setTimeout(r,t,new u(t))}))}function i(t,e){return\"function\"==typeof t?(...r)=>Promise.race([t(...r),c(e)]):Promise.race([t,c(e)])}function s(t){return t instanceof u}export{u as TimeoutError,e as classNames,o as compareVersions,n as isRecord,s as isTimeoutError,r as mergeClassNames,i as withTimeout};\n//# sourceMappingURL=index.mjs.map\n","import { isRecord } from '@tma.js/utils';\n\ntype AnyFunc = (...args: unknown[]) => unknown;\n\ntype WithExternalNotify<T> = T & {\n external: { notify: AnyFunc }\n};\n\ntype WithWebviewProxy<T> = T & {\n TelegramWebviewProxy: {\n postEvent: AnyFunc;\n }\n};\n\n/**\n * Returns true in case, passed value contains path `external.notify` property and `notify` is a\n * function.\n * @param value - value to check.\n */\nexport function hasExternalNotify<T extends {}>(value: T): value is WithExternalNotify<T> {\n return 'external' in value\n && isRecord(value.external)\n && 'notify' in value.external\n && typeof value.external.notify === 'function';\n}\n\n/**\n * Returns true in case, passed value contains path `TelegramWebviewProxy.postEvent` property and\n * `postEvent` is a function.\n * @param value - value to check.\n */\nexport function hasWebviewProxy<T extends {}>(value: T): value is WithWebviewProxy<T> {\n return 'TelegramWebviewProxy' in value\n && isRecord(value.TelegramWebviewProxy)\n && 'postEvent' in value.TelegramWebviewProxy\n && typeof value.TelegramWebviewProxy.postEvent === 'function';\n}\n\n/**\n * Returns true in case, current environment is iframe.\n * @see https://stackoverflow.com/a/326076\n */\nexport function isIframe(): boolean {\n try {\n return window.self !== window.top;\n } catch (e) {\n return true;\n }\n}\n","import {\n isIframe,\n hasExternalNotify,\n hasWebviewProxy,\n} from '../env.js';\nimport { targetOrigin as globalTargetOrigin } from '../globals.js';\n\nimport type {\n EmptyMethodName,\n MethodName,\n MethodParams,\n NonEmptyMethodName,\n} from './params.js';\n\ninterface PostEventOptions {\n /**\n * Origin used while posting message. This option is only used in case,\n * current environment is browser (Web version of Telegram) and could\n * be used for test purposes.\n * @default 'https://web.telegram.org'\n */\n targetOrigin?: string;\n}\n\nexport type PostEvent = typeof postEvent;\n\n/**\n * Sends event to native application which launched Web App. This function\n * accepts only events, which require arguments.\n * @param eventType - event name.\n * @param params - event parameters.\n * @param options - posting options.\n * @throws {Error} Bridge could not determine current\n * environment and possible way to send event.\n */\nexport function postEvent<E extends NonEmptyMethodName>(\n eventType: E,\n params: MethodParams<E>,\n options?: PostEventOptions,\n): void;\n\n/**\n * Sends event to native application which launched Web App. This function\n * accepts only events, which require arguments.\n * @param eventType - event name.\n * @param options - posting options.\n * @throws {Error} Bridge could not determine current\n * environment and possible way to send event.\n */\nexport function postEvent(eventType: EmptyMethodName, options?: PostEventOptions): void;\n\nexport function postEvent(\n eventType: MethodName,\n paramsOrOptions?: MethodParams<MethodName> | PostEventOptions,\n options?: PostEventOptions,\n): void {\n let postOptions: PostEventOptions = {};\n let eventData: any;\n\n if (paramsOrOptions === undefined && options === undefined) {\n // Parameters and options were not passed.\n postOptions = {};\n } else if (paramsOrOptions !== undefined && options !== undefined) {\n // Both parameters and options passed.\n postOptions = options;\n eventData = paramsOrOptions;\n } else if (paramsOrOptions !== undefined) {\n // Only parameters were passed.\n if ('targetOrigin' in paramsOrOptions) {\n postOptions = paramsOrOptions;\n } else {\n eventData = paramsOrOptions;\n }\n }\n const { targetOrigin = globalTargetOrigin() } = postOptions;\n\n // Telegram Web.\n if (isIframe()) {\n window.parent.postMessage(JSON.stringify({\n eventType,\n eventData,\n }), targetOrigin);\n return;\n }\n\n // Telegram for Windows Phone or Android.\n if (hasExternalNotify(window)) {\n window.external.notify(JSON.stringify({ eventType, eventData }));\n return;\n }\n\n // Telegram for iOS and macOS.\n if (hasWebviewProxy(window)) {\n window.TelegramWebviewProxy.postEvent(eventType, JSON.stringify(eventData));\n return;\n }\n\n // Otherwise current environment is unknown, and we are not able to send\n // event.\n throw new Error(\n 'Unable to determine current environment and possible way to send event.',\n );\n}\n","import { compareVersions, type Version } from '@tma.js/utils';\n\nimport type {\n HasCheckSupportMethodParam,\n HasCheckSupportMethodName,\n MethodName,\n MethodParams,\n NonEmptyMethodName,\n} from './methods/index.js';\n\nfunction lessOrEqual(a: Version, b: Version): boolean {\n return compareVersions(a, b) <= 0;\n}\n\n/**\n * By specified method and parameters extracts properties which could be used by\n * supports function as TWA method parameter.\n * @param method - TWA method.\n * @param params - method parameters.\n */\nexport function detectSupportParams<M extends NonEmptyMethodName>(\n method: M,\n params: MethodParams<M>,\n): HasCheckSupportMethodParam<HasCheckSupportMethodName>[] {\n if (method === 'web_app_open_link') {\n if ('try_instant_view' in params) {\n return ['try_instant_view'];\n }\n }\n\n if (method === 'web_app_set_header_color') {\n if ('color' in params) {\n return ['color'];\n }\n }\n\n return [];\n}\n\n/**\n * Returns true in case, passed parameter in specified method is supported.\n * @param method - method name\n * @param param - method parameter\n * @param inVersion - platform version.\n */\nexport function supports<M extends HasCheckSupportMethodName>(\n method: M,\n param: HasCheckSupportMethodParam<M>,\n inVersion: Version,\n): boolean;\n/**\n * Returns true in case, specified method is supported in passed version.\n * @param method - method name.\n * @param inVersion - platform version.\n */\nexport function supports(method: MethodName, inVersion: Version): boolean;\nexport function supports(\n method: MethodName,\n paramOrVersion: Version | string,\n inVersion?: string,\n): boolean {\n // Method name, parameter, target version.\n if (typeof inVersion === 'string') {\n if (method === 'web_app_open_link') {\n if (paramOrVersion === 'try_instant_view') {\n return lessOrEqual('6.4', inVersion);\n }\n }\n\n if (method === 'web_app_set_header_color') {\n if (paramOrVersion === 'color') {\n return lessOrEqual('6.9', inVersion);\n }\n }\n }\n\n // Method name, target version.\n switch (method) {\n case 'web_app_open_tg_link':\n case 'web_app_open_invoice':\n case 'web_app_setup_back_button':\n case 'web_app_set_background_color':\n case 'web_app_set_header_color':\n case 'web_app_trigger_haptic_feedback':\n return lessOrEqual('6.1', paramOrVersion);\n case 'web_app_open_popup':\n return lessOrEqual('6.2', paramOrVersion);\n case 'web_app_close_scan_qr_popup':\n case 'web_app_open_scan_qr_popup':\n case 'web_app_read_text_from_clipboard':\n return lessOrEqual('6.4', paramOrVersion);\n case 'web_app_invoke_custom_method':\n case 'web_app_request_write_access':\n case 'web_app_request_phone':\n return lessOrEqual('6.9', paramOrVersion);\n default:\n return true;\n }\n}\n","import { singletonEmitter } from './emitter.js';\nimport { off } from './off.js';\n\nimport type { EventName, EventListener } from './events.js';\n\ntype StopListening = () => void;\n\n/**\n * Works the same as \"on\" method, but after catching the event, will remove event listener.\n * @param event - event name.\n * @param listener - event listener.\n */\nexport function once<E extends EventName>(event: E, listener: EventListener<E>): StopListening {\n singletonEmitter().once(event, listener);\n return () => off(event, listener);\n}\n","import { withTimeout, isRecord } from '@tma.js/utils';\n\nimport type { And, If, IsNever } from '@tma.js/util-types';\n\nimport { postEvent as defaultPostEvent, type PostEvent } from './methods/postEvent.js';\nimport { on, type EventName, type EventParams, type EventHasParams } from './events/index.js';\n\nimport type {\n EmptyMethodName, MethodHasParams,\n MethodName,\n MethodParams,\n NonEmptyMethodName,\n} from './methods/params.js';\n\n/**\n * Names of methods, which require passing \"req_id\" parameter.\n */\ntype MethodNameWithRequestId = {\n [Method in MethodName]: If<\n And<MethodHasParams<Method>, MethodParams<Method> extends { req_id: string } ? true : false>,\n Method,\n never\n >;\n}[MethodName];\n\n/**\n * Names of events, which contain \"req_id\" parameter.\n */\ntype EventNameWithRequestId = {\n [Event in EventName]: If<\n And<EventHasParams<Event>, EventParams<Event> extends { req_id: string } ? true : false>,\n Event,\n never\n >;\n}[EventName];\n\nexport interface RequestOptions {\n /**\n * Bridge postEvent method.\n * @default Global postEvent method.\n */\n postEvent?: PostEvent;\n\n /**\n * Execution timeout.\n */\n timeout?: number;\n}\n\nexport interface RequestOptionsAdvanced<EventPayload> extends RequestOptions {\n /**\n * Should return true in case, this event should be captured. If not specified,\n * request is not skipping captured events.\n */\n capture?: If<IsNever<EventPayload>, () => boolean, (payload: EventPayload) => boolean>;\n}\n\n/**\n * Calls specified TWA method and captures one of the specified events. Returns promise\n * which will be resolved in case, event with specified in method request identifier\n * was captured.\n * @param method - method to execute.\n * @param params - method parameters.\n * @param event - event or events to listen.\n * @param options - additional execution options.\n */\nexport function request<\n Method extends MethodNameWithRequestId,\n Event extends EventNameWithRequestId,\n>(\n method: Method,\n params: MethodParams<Method>,\n event: Event | Event[],\n options?: RequestOptions,\n): Promise<EventParams<Event>>;\n\n/**\n * Calls specified TWA method and captures one of the specified events. Returns promise\n * which will be resolved in case, specified event was captured.\n * @param method - method to execute.\n * @param event - event or events to listen.\n * @param options - additional execution options.\n */\nexport function request<Method extends EmptyMethodName, Event extends EventName>(\n method: Method,\n event: Event | Event[],\n options?: RequestOptionsAdvanced<EventParams<Event>>,\n): Promise<EventParams<Event>>;\n\n/**\n * Calls specified TWA method and captures one of the specified events. Returns promise\n * which will be resolved in case, specified event was captured.\n * @param method - method to execute\n * @param params - method parameters.\n * @param event - event or events to listen\n * @param options - additional execution options.\n */\nexport function request<Method extends NonEmptyMethodName, Event extends EventName>(\n method: Method,\n params: MethodParams<Method>,\n event: Event | Event[],\n options?: RequestOptionsAdvanced<EventParams<Event>>,\n): Promise<EventParams<Event>>;\n\nexport function request(\n method: MethodName,\n eventOrParams: EventName | EventName[] | EventParams<any>,\n eventOrOptions?: EventName | EventName[] | RequestOptions | RequestOptionsAdvanced<any>,\n options?: RequestOptions | RequestOptionsAdvanced<any>,\n): Promise<any> {\n let executionOptions: RequestOptions | RequestOptionsAdvanced<any> | undefined;\n let methodParams: EventParams<any> | undefined;\n let events: EventName[];\n let requestId: string | undefined;\n\n if (typeof eventOrParams === 'string' || Array.isArray(eventOrParams)) {\n // Override: [method, event, options?]\n events = Array.isArray(eventOrParams) ? eventOrParams : [eventOrParams] as EventName[];\n executionOptions = eventOrOptions as (RequestOptionsAdvanced<any> | undefined);\n } else {\n // Override: [method, params, event, options?]\n methodParams = eventOrParams as EventParams<any>;\n events = Array.isArray(eventOrOptions) ? eventOrOptions : [eventOrOptions] as EventName[];\n executionOptions = options;\n }\n\n // In case, method parameters were passed, and they contained request identifier, we should store\n // it and wait for the event with this identifier to occur.\n if (isRecord(methodParams) && typeof methodParams.req_id === 'string') {\n requestId = methodParams.req_id;\n }\n\n const { postEvent = defaultPostEvent, timeout } = executionOptions || {};\n const capture = executionOptions && 'capture' in executionOptions\n ? executionOptions.capture\n : null;\n\n const promise = new Promise((res, rej) => {\n // Iterate over each event and create event listener.\n const stoppers = events.map((ev) => on(ev, (data?) => {\n // If request identifier was specified, we are waiting for event with the same value\n // to occur.\n if (typeof requestId === 'string' && (!isRecord(data) || data.req_id !== requestId)) {\n return;\n }\n\n if (typeof capture === 'function' && !capture(data)) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n stopListening();\n res(data);\n }));\n\n // Function which removes all event listeners.\n const stopListening = () => stoppers.forEach((stop) => stop());\n\n try {\n // We are wrapping this call in try catch, because it can throw errors in case,\n // compatibility check was enabled. We want an error to be captured by promise, not by\n // another one external try catch.\n postEvent(method as any, methodParams);\n } catch (e) {\n stopListening();\n rej(e);\n }\n });\n\n return typeof timeout === 'number' ? withTimeout(promise, timeout) : promise;\n}\n","import { singletonEmitter } from './emitter.js';\nimport { unsubscribe } from './unsubscribe.js';\n\nimport type { GlobalEventListener } from './events.js';\n\ntype StopListening = () => void;\n\n/**\n * Subscribes to all events sent from the native Telegram application.\n * Returns function used to remove added event listener.\n * @param listener - event listener.\n */\nexport function subscribe(listener: GlobalEventListener): StopListening {\n singletonEmitter().subscribe(listener);\n return () => unsubscribe(listener);\n}\n"],"names":["s$1","listeners","subscribeListeners","emit","s","e","this","forEach","i","t","once","push","listener","off","on","length","splice","subscribe","unsubscribe","indexOf","r","parser","isOptional","getDefault","isEmpty","static","constructor","n","parse","optional","default","o","create","TypeError","JSON","stringify","a","u","c","p","replace","toLowerCase","test","repeat","match","Error","slice","reduce","parseInt","toString","cause","l","Array","isArray","from","type","bind","required","currentDebug","currentTargetOrigin","targetOrigin","log","level","args","Date","Intl","DateTimeFormat","hour","minute","second","fractionalSecondDigits","timeZone","format","console","utilLog","isNullOrUndefined","value","themeChangedPayload","json","theme_params","bg_color","rgb","text_color","hint_color","link_color","button_color","button_text_color","secondary_bg_color","viewportChangedPayload","height","number","width","window","innerWidth","is_state_stable","boolean","is_expanded","popupClosedPayload","button_id","string","qrTextReceivedPayload","data","invoiceClosedPayload","slug","status","clipboardTextReceivedPayload","req_id","writeAccessRequestedPayload","phoneRequestedPayload","customMethodInvokedPayload","result","error","eventDataJson","eventType","eventData","emitEvent","dispatchEvent","MessageEvent","onTelegramEvent","cb","wnd","path","pointer","item","idx","arr","defineEventHandlers","addEventListener","event","CACHED_EMITTER","singletonEmitter","undefined","emitter","UtilEventEmitter","innerHeight","createEmitter","super","Object","setPrototypeOf","prototype","Promise","setTimeout","hasExternalNotify","isRecord","external","notify","hasWebviewProxy","TelegramWebviewProxy","postEvent","isIframe","self","top","paramsOrOptions","options","postOptions","globalTargetOrigin","parent","postMessage","lessOrEqual","b","split","Math","max","compareVersions","method","params","eventOrParams","eventOrOptions","executionOptions","methodParams","events","requestId","defaultPostEvent","timeout","capture","promise","res","rej","stoppers","map","ev","stopListening","stop","race","withTimeout","paramOrVersion","inVersion"],"mappings":"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"}
|
package/dist/lib/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("@tma.js/event-emitter"),t=require("@tma.js/parsing"),r=require("@tma.js/logger"),n=require("@tma.js/utils");let o=!1,s="https://web.telegram.org";function i(){return s}const a=(e,...t)=>{o&&r.log(e,"[Bridge]",...t)};function c(e){return null==e}const p=t.json({theme_params:t.json({bg_color:t.rgb().optional(),text_color:t.rgb().optional(),hint_color:t.rgb().optional(),link_color:t.rgb().optional(),button_color:t.rgb().optional(),button_text_color:t.rgb().optional(),secondary_bg_color:t.rgb().optional()})}),_=t.json({height:t.number(),width:t.number().optional(c).default((()=>window.innerWidth)),is_state_stable:t.boolean(),is_expanded:t.boolean()}),u=t.json({button_id:t.string().optional(c)}),d=t.json({data:t.string().optional()}),l=t.json({slug:t.string(),status:t.string()}),w=t.json({req_id:t.string(),data:e=>null===e?e:t.string().optional().parse(e)}),g=t.json({status:t.string()}),b=t.json({status:t.string()}),f=t.json({req_id:t.string(),result:e=>e,error:t.string().optional()}),v=t.json({eventType:t.string(),eventData:e=>e});function m(e,t){window.dispatchEvent(new MessageEvent("message",{data:JSON.stringify({eventType:e,eventData:t})}))}function y(e){!function(){const e=window;"TelegramGameProxy_receiveEvent"in e||[["TelegramGameProxy_receiveEvent"],["TelegramGameProxy","receiveEvent"],["Telegram","WebView","receiveEvent"]].forEach((t=>{let r=e;t.forEach(((e,t,n)=>{t!==n.length-1?(e in r||(r[e]={}),r=r[e]):r[e]=m}))}))}(),window.addEventListener("message",(t=>{try{const{eventType:r,eventData:n}=v.parse(t.data);e(r,n)}catch{}}))}const h="__telegram-cached-emitter__";function x(){const r=window;return void 0===r[h]&&(r[h]=function(){const r=new e.EventEmitter,n=(e,...t)=>{a("log","Emitting processed event:",e,...t),r.emit(e,...t)};return window.addEventListener("resize",(()=>{
|
|
1
|
+
"use strict";var e=require("@tma.js/event-emitter"),t=require("@tma.js/parsing"),r=require("@tma.js/logger"),n=require("@tma.js/utils");let o=!1,s="https://web.telegram.org";function i(){return s}const a=(e,...t)=>{o&&r.log(e,"[Bridge]",...t)};function c(e){return null==e}const p=t.json({theme_params:t.json({bg_color:t.rgb().optional(),text_color:t.rgb().optional(),hint_color:t.rgb().optional(),link_color:t.rgb().optional(),button_color:t.rgb().optional(),button_text_color:t.rgb().optional(),secondary_bg_color:t.rgb().optional()})}),_=t.json({height:t.number(),width:t.number().optional(c).default((()=>window.innerWidth)),is_state_stable:t.boolean(),is_expanded:t.boolean()}),u=t.json({button_id:t.string().optional(c)}),d=t.json({data:t.string().optional()}),l=t.json({slug:t.string(),status:t.string()}),w=t.json({req_id:t.string(),data:e=>null===e?e:t.string().optional().parse(e)}),g=t.json({status:t.string()}),b=t.json({status:t.string()}),f=t.json({req_id:t.string(),result:e=>e,error:t.string().optional()}),v=t.json({eventType:t.string(),eventData:e=>e});function m(e,t){window.dispatchEvent(new MessageEvent("message",{data:JSON.stringify({eventType:e,eventData:t})}))}function y(e){!function(){const e=window;"TelegramGameProxy_receiveEvent"in e||[["TelegramGameProxy_receiveEvent"],["TelegramGameProxy","receiveEvent"],["Telegram","WebView","receiveEvent"]].forEach((t=>{let r=e;t.forEach(((e,t,n)=>{t!==n.length-1?(e in r||(r[e]={}),r=r[e]):r[e]=m}))}))}(),window.addEventListener("message",(t=>{try{const{eventType:r,eventData:n}=v.parse(t.data);e(r,n)}catch{}}))}const h="__telegram-cached-emitter__";function x(){const r=window;return void 0===r[h]&&(r[h]=function(){const r=new e.EventEmitter,n=(e,...t)=>{a("log","Emitting processed event:",e,...t),r.emit(e,...t)};return window.addEventListener("resize",(()=>{n("viewport_changed",{width:window.innerWidth,height:window.innerHeight,is_state_stable:!0,is_expanded:!0})})),y(((e,r)=>{a("log","Received raw event:",e,r);try{switch(e){case"viewport_changed":return n(e,_.parse(r));case"theme_changed":return n(e,p.parse(r));case"popup_closed":return n(e,null==r?{}:u.parse(r));case"set_custom_style":return n(e,t.string().parse(r));case"qr_text_received":return n(e,d.parse(r));case"clipboard_text_received":return n(e,w.parse(r));case"invoice_closed":return n(e,l.parse(r));case"phone_requested":return n("phone_requested",b.parse(r));case"custom_method_invoked":return n("custom_method_invoked",f.parse(r));case"write_access_requested":return n("write_access_requested",g.parse(r));case"main_button_pressed":case"back_button_pressed":case"settings_button_pressed":case"scan_qr_popup_closed":return n(e);default:return n(e,r)}}catch(e){a("error","Error processing event:",e)}})),r}()),r[h]}function E(e,t){x().off(e,t)}function q(e,t){return x().on(e,t),()=>E(e,t)}function T(e){x().unsubscribe(e)}function j(e){return"external"in e&&n.isRecord(e.external)&&"notify"in e.external&&"function"==typeof e.external.notify}function k(e){return"TelegramWebviewProxy"in e&&n.isRecord(e.TelegramWebviewProxy)&&"postEvent"in e.TelegramWebviewProxy&&"function"==typeof e.TelegramWebviewProxy.postEvent}function P(){try{return window.self!==window.top}catch(e){return!0}}function W(e,t,r){let n,o={};void 0===t&&void 0===r?o={}:void 0!==t&&void 0!==r?(o=r,n=t):void 0!==t&&("targetOrigin"in t?o=t:n=t);const{targetOrigin:s=i()}=o;if(P())window.parent.postMessage(JSON.stringify({eventType:e,eventData:n}),s);else if(j(window))window.external.notify(JSON.stringify({eventType:e,eventData:n}));else{if(!k(window))throw new Error("Unable to determine current environment and possible way to send event.");window.TelegramWebviewProxy.postEvent(e,JSON.stringify(n))}}function O(e,t){return n.compareVersions(e,t)<=0}exports.detectSupportParams=function(e,t){return"web_app_open_link"===e&&"try_instant_view"in t?["try_instant_view"]:"web_app_set_header_color"===e&&"color"in t?["color"]:[]},exports.hasExternalNotify=j,exports.hasWebviewProxy=k,exports.isIframe=P,exports.off=E,exports.on=q,exports.once=function(e,t){return x().once(e,t),()=>E(e,t)},exports.postEvent=W,exports.request=function(e,t,r,o){let s,i,a,c;"string"==typeof t||Array.isArray(t)?(a=Array.isArray(t)?t:[t],s=r):(i=t,a=Array.isArray(r)?r:[r],s=o),n.isRecord(i)&&"string"==typeof i.req_id&&(c=i.req_id);const{postEvent:p=W,timeout:_}=s||{},u=s&&"capture"in s?s.capture:null,d=new Promise(((t,r)=>{const o=a.map((e=>q(e,(e=>{("string"!=typeof c||n.isRecord(e)&&e.req_id===c)&&("function"!=typeof u||u(e))&&(s(),t(e))})))),s=()=>o.forEach((e=>e()));try{p(e,i)}catch(e){s(),r(e)}}));return"number"==typeof _?n.withTimeout(d,_):d},exports.setDebug=function(e){o=e},exports.setTargetOrigin=function(e){s=e},exports.subscribe=function(e){return x().subscribe(e),()=>T(e)},exports.supports=function(e,t,r){if("string"==typeof r){if("web_app_open_link"===e&&"try_instant_view"===t)return O("6.4",r);if("web_app_set_header_color"===e&&"color"===t)return O("6.9",r)}switch(e){case"web_app_open_tg_link":case"web_app_open_invoice":case"web_app_setup_back_button":case"web_app_set_background_color":case"web_app_set_header_color":case"web_app_trigger_haptic_feedback":return O("6.1",t);case"web_app_open_popup":return O("6.2",t);case"web_app_close_scan_qr_popup":case"web_app_open_scan_qr_popup":case"web_app_read_text_from_clipboard":return O("6.4",t);case"web_app_invoke_custom_method":case"web_app_request_write_access":case"web_app_request_phone":return O("6.9",t);default:return!0}},exports.unsubscribe=T;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/lib/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../src/globals.ts","../../src/events/parsing.ts","../../src/events/onTelegramEvent.ts","../../src/events/emitter.ts","../../src/events/off.ts","../../src/events/on.ts","../../src/events/unsubscribe.ts","../../src/env.ts","../../src/methods/postEvent.ts","../../src/supports.ts","../../src/events/once.ts","../../src/request.ts","../../src/events/subscribe.ts"],"sourcesContent":["import { log as utilLog } from '@tma.js/logger';\n\nlet currentDebug = false;\nlet currentTargetOrigin = 'https://web.telegram.org';\n\n/**\n * Sets new debug mode. Enabling debug mode leads to printing\n * additional messages in console, related to the processes\n * inside the package.\n * @param value - should debug mode be enabled.\n */\nexport function setDebug(value: boolean): void {\n currentDebug = value;\n}\n\n/**\n * Sets new global targetOrigin, used by `postEvent` method.\n * Default value is \"https://web.telegram.org\". You don't need to\n * use this method until you know what you are doing.\n *\n * This method could be used for test purposes.\n * @param value - new target origin.\n */\nexport function setTargetOrigin(value: string): void {\n currentTargetOrigin = value;\n}\n\n/**\n * Returns current global target origin.\n */\nexport function targetOrigin(): string {\n return currentTargetOrigin;\n}\n\n/**\n * Logs message in case, debug mode is enabled.\n * @param level - log level\n * @param args - values to print.\n */\nexport const log: typeof utilLog = (level, ...args) => {\n if (currentDebug) {\n utilLog(level, '[Bridge]', ...args);\n }\n};\n","import {\n number,\n string,\n boolean,\n json,\n rgb,\n} from '@tma.js/parsing';\n\nimport type {\n ClipboardTextReceivedPayload, CustomMethodInvokedPayload,\n InvoiceClosedPayload, PhoneRequestedPayload,\n PopupClosedPayload, QrTextReceivedPayload,\n ThemeChangedPayload,\n ViewportChangedPayload, WriteAccessRequestedPayload,\n} from './payloads.js';\n\nfunction isNullOrUndefined(value: unknown): boolean {\n return value === null || value === undefined;\n}\n\n/**\n * Parses incoming value as ThemeChangedPayload.\n */\nexport const themeChangedPayload = json<ThemeChangedPayload>({\n theme_params: json<ThemeChangedPayload['theme_params']>({\n bg_color: rgb().optional(),\n text_color: rgb().optional(),\n hint_color: rgb().optional(),\n link_color: rgb().optional(),\n button_color: rgb().optional(),\n button_text_color: rgb().optional(),\n secondary_bg_color: rgb().optional(),\n }),\n});\n\n/**\n * Parses incoming value as ViewportChangedPayload.\n * @param value - value to parse.\n */\nexport const viewportChangedPayload = json<ViewportChangedPayload>({\n height: number(),\n width: number().optional(isNullOrUndefined).default(() => window.innerWidth),\n is_state_stable: boolean(),\n is_expanded: boolean(),\n});\n\n/**\n * Parses incoming value as PopupClosedPayload.\n */\nexport const popupClosedPayload = json<PopupClosedPayload>({\n button_id: string().optional(isNullOrUndefined),\n});\n\n/**\n * Parses incoming value as QrTextReceivedPayload.\n */\nexport const qrTextReceivedPayload = json<QrTextReceivedPayload>({\n data: string().optional(),\n});\n\n/**\n * Parses incoming value as InvoiceClosedPayload.\n */\nexport const invoiceClosedPayload = json<InvoiceClosedPayload>({\n slug: string(),\n status: string(),\n});\n\n/**\n * Parses incoming value as clipboard text received payload.\n */\nexport const clipboardTextReceivedPayload = json<ClipboardTextReceivedPayload>({\n req_id: string(),\n data: (value) => (value === null ? value : string().optional().parse(value)),\n});\n\n/**\n * Parses incoming value as WriteAccessRequestedPayload.\n */\nexport const writeAccessRequestedPayload = json<WriteAccessRequestedPayload>({ status: string() });\n\n/**\n * Parses incoming value as PhoneRequestedPayload.\n */\nexport const phoneRequestedPayload = json<PhoneRequestedPayload>({ status: string() });\n\n/**\n * Parses incoming value as CustomMethodInvokedPayload.\n */\nexport const customMethodInvokedPayload = json<CustomMethodInvokedPayload>({\n req_id: string(),\n result: (value) => value,\n error: string().optional(),\n});\n","import { json, string } from '@tma.js/parsing';\n\n/**\n * Extracts event data from native application event.\n */\nconst eventDataJson = json<{ eventType: string; eventData?: unknown }>({\n eventType: string(),\n eventData: (value) => value,\n});\n\n/**\n * Emits event sent from Telegram native application like it was sent in\n * default web environment between 2 iframes. It dispatches new MessageEvent\n * and expects it to be handled via `window.addEventListener('message', ...)`\n * as developer would do it to handle messages sent from parent iframe.\n * @param eventType - event name.\n * @param eventData - event payload.\n */\nfunction emitEvent(eventType: string, eventData: unknown): void {\n window.dispatchEvent(new MessageEvent('message', {\n data: JSON.stringify({ eventType, eventData }),\n }));\n}\n\n/**\n * Defines special handlers by known paths, which are recognized by\n * Telegram as ports to receive events. This function also sets special\n * function in global window object to prevent duplicate declaration.\n */\nfunction defineEventHandlers(): void {\n const wnd: any = window;\n\n // Prevent from duplicate event handlers definition.\n if ('TelegramGameProxy_receiveEvent' in wnd) {\n return;\n }\n\n // Iterate over each path, where \"receiveEvent\" function should be\n // defined. This function is called by external environment in case,\n // it wants to emit some event.\n [\n ['TelegramGameProxy_receiveEvent'], // Windows Phone.\n ['TelegramGameProxy', 'receiveEvent'], // Desktop.\n ['Telegram', 'WebView', 'receiveEvent'], // Android and iOS.\n ].forEach((path) => {\n // Path starts from \"window\" object.\n let pointer = wnd;\n\n path.forEach((item, idx, arr) => {\n // We are on the last iteration, where function property name is passed.\n if (idx === arr.length - 1) {\n pointer[item] = emitEvent;\n return;\n }\n\n if (!(item in pointer)) {\n pointer[item] = {};\n }\n pointer = pointer[item];\n });\n });\n}\n\n/**\n * Adds listener to window \"message\" event assuming, that this event could\n * be sent by Telegram native application. Calls passed callback with event\n * type and data.\n * @param cb - callback to call.\n */\nexport function onTelegramEvent(cb: (eventType: string, eventData: unknown) => void): void {\n // Define event handlers to make sure, message handler will work correctly.\n defineEventHandlers();\n\n // We expect Telegram to send us new event through \"message\" event.\n window.addEventListener('message', (event) => {\n try {\n const { eventType, eventData } = eventDataJson.parse(event.data);\n cb(eventType, eventData);\n } catch {\n // We ignore incorrect messages as they could be generated by any other code.\n }\n });\n}\n","import { EventEmitter as UtilEventEmitter } from '@tma.js/event-emitter';\nimport { string } from '@tma.js/parsing';\n\nimport { log } from '../globals.js';\nimport {\n clipboardTextReceivedPayload,\n customMethodInvokedPayload,\n invoiceClosedPayload,\n phoneRequestedPayload,\n popupClosedPayload,\n qrTextReceivedPayload,\n themeChangedPayload,\n viewportChangedPayload,\n writeAccessRequestedPayload,\n} from './parsing.js';\nimport { onTelegramEvent } from './onTelegramEvent.js';\n\nimport type { EventEmitter, EventName } from './events.js';\n\nconst CACHED_EMITTER = '__telegram-cached-emitter__';\n\n/**\n * Returns event emitter which could be safely used, to process events from\n * Telegram native application.\n */\nexport function createEmitter(): EventEmitter {\n const emitter: EventEmitter = new UtilEventEmitter();\n const emit: EventEmitter['emit'] = (event: any, ...data: any[]) => {\n log('log', 'Emitting processed event:', event, ...data);\n emitter.emit(event, ...data);\n };\n\n // Desktop version of Telegram is sometimes not sending the viewport_changed\n // event. For example, when main button is shown. That's why we should\n // add our own listener to make sure, viewport information is always fresh.\n // Issue: https://github.com/Telegram-Web-Apps/tma.js/issues/10\n window.addEventListener('resize', () => {\n emitter.emit('viewport_changed', {\n width: window.innerWidth,\n height: window.innerHeight,\n is_state_stable: true,\n is_expanded: true,\n });\n });\n\n // In case, any Telegram event was received, we should prepare data before\n // passing it to emitter.\n onTelegramEvent((eventType: EventName | string, eventData): void => {\n log('log', 'Received raw event:', eventType, eventData);\n\n try {\n switch (eventType) {\n case 'viewport_changed':\n return emit(eventType, viewportChangedPayload.parse(eventData));\n\n case 'theme_changed':\n return emit(eventType, themeChangedPayload.parse(eventData));\n\n case 'popup_closed':\n // FIXME: Payloads are different on different platforms.\n // Issue: https://github.com/Telegram-Web-Apps/tma.js/issues/2\n if (\n // Sent on desktop.\n eventData === undefined\n // Sent on iOS.\n || eventData === null\n ) {\n return emit(eventType, {});\n }\n return emit(eventType, popupClosedPayload.parse(eventData));\n\n case 'set_custom_style':\n return emit(eventType, string().parse(eventData));\n\n case 'qr_text_received':\n return emit(eventType, qrTextReceivedPayload.parse(eventData));\n\n case 'clipboard_text_received':\n return emit(eventType, clipboardTextReceivedPayload.parse(eventData));\n\n case 'invoice_closed':\n return emit(eventType, invoiceClosedPayload.parse(eventData));\n\n case 'phone_requested':\n return emit('phone_requested', phoneRequestedPayload.parse(eventData));\n\n case 'custom_method_invoked':\n return emit('custom_method_invoked', customMethodInvokedPayload.parse(eventData));\n\n case 'write_access_requested':\n return emit('write_access_requested', writeAccessRequestedPayload.parse(eventData));\n\n // Events which have no parameters.\n case 'main_button_pressed':\n case 'back_button_pressed':\n case 'settings_button_pressed':\n case 'scan_qr_popup_closed':\n return emit(eventType);\n\n // All other event listeners will receive unknown type of data.\n default:\n return emit(eventType as any, eventData);\n }\n } catch (cause) {\n log('error', 'Error processing event:', cause);\n }\n });\n\n return emitter;\n}\n\n/**\n * Returns singleton instance of bridge EventEmitter. Also, defines\n * Telegram event handlers.\n */\nexport function singletonEmitter(): EventEmitter {\n const wnd: any = window;\n const cachedEmitter = wnd[CACHED_EMITTER];\n\n if (cachedEmitter === undefined) {\n wnd[CACHED_EMITTER] = createEmitter();\n }\n\n return wnd[CACHED_EMITTER];\n}\n","import { singletonEmitter } from './emitter.js';\n\nimport type { EventName, EventListener } from './events.js';\n\n/**\n * Removes listener from specified event.\n * @param event - event to listen.\n * @param listener - event listener.\n */\nexport function off<E extends EventName>(event: E, listener: EventListener<E>): void {\n singletonEmitter().off(event, listener);\n}\n","import { singletonEmitter } from './emitter.js';\nimport { off } from './off.js';\n\nimport type { EventName, EventListener } from './events.js';\n\ntype StopListening = () => void;\n\n/**\n * Adds new listener to the specified event. Returns handler\n * which allows to stop listening to event.\n * @param event - event name.\n * @param listener - event listener.\n */\nexport function on<E extends EventName>(event: E, listener: EventListener<E>): StopListening {\n singletonEmitter().on(event, listener);\n return () => off(event, listener);\n}\n","import { singletonEmitter } from './emitter.js';\n\nimport type { GlobalEventListener } from './events.js';\n\n/**\n * Removes global event listener.\n * @param listener - event listener.\n */\nexport function unsubscribe(listener: GlobalEventListener): void {\n singletonEmitter().unsubscribe(listener);\n}\n","import { isRecord } from '@tma.js/utils';\n\ntype AnyFunc = (...args: unknown[]) => unknown;\n\ntype WithExternalNotify<T> = T & {\n external: { notify: AnyFunc }\n};\n\ntype WithWebviewProxy<T> = T & {\n TelegramWebviewProxy: {\n postEvent: AnyFunc;\n }\n};\n\n/**\n * Returns true in case, passed value contains path `external.notify` property and `notify` is a\n * function.\n * @param value - value to check.\n */\nexport function hasExternalNotify<T extends {}>(value: T): value is WithExternalNotify<T> {\n return 'external' in value\n && isRecord(value.external)\n && 'notify' in value.external\n && typeof value.external.notify === 'function';\n}\n\n/**\n * Returns true in case, passed value contains path `TelegramWebviewProxy.postEvent` property and\n * `postEvent` is a function.\n * @param value - value to check.\n */\nexport function hasWebviewProxy<T extends {}>(value: T): value is WithWebviewProxy<T> {\n return 'TelegramWebviewProxy' in value\n && isRecord(value.TelegramWebviewProxy)\n && 'postEvent' in value.TelegramWebviewProxy\n && typeof value.TelegramWebviewProxy.postEvent === 'function';\n}\n\n/**\n * Returns true in case, current environment is iframe.\n * @see https://stackoverflow.com/a/326076\n */\nexport function isIframe(): boolean {\n try {\n return window.self !== window.top;\n } catch (e) {\n return true;\n }\n}\n","import {\n isIframe,\n hasExternalNotify,\n hasWebviewProxy,\n} from '../env.js';\nimport { targetOrigin as globalTargetOrigin } from '../globals.js';\n\nimport type {\n EmptyMethodName,\n MethodName,\n MethodParams,\n NonEmptyMethodName,\n} from './params.js';\n\ninterface PostEventOptions {\n /**\n * Origin used while posting message. This option is only used in case,\n * current environment is browser (Web version of Telegram) and could\n * be used for test purposes.\n * @default 'https://web.telegram.org'\n */\n targetOrigin?: string;\n}\n\nexport type PostEvent = typeof postEvent;\n\n/**\n * Sends event to native application which launched Web App. This function\n * accepts only events, which require arguments.\n * @param eventType - event name.\n * @param params - event parameters.\n * @param options - posting options.\n * @throws {Error} Bridge could not determine current\n * environment and possible way to send event.\n */\nexport function postEvent<E extends NonEmptyMethodName>(\n eventType: E,\n params: MethodParams<E>,\n options?: PostEventOptions,\n): void;\n\n/**\n * Sends event to native application which launched Web App. This function\n * accepts only events, which require arguments.\n * @param eventType - event name.\n * @param options - posting options.\n * @throws {Error} Bridge could not determine current\n * environment and possible way to send event.\n */\nexport function postEvent(eventType: EmptyMethodName, options?: PostEventOptions): void;\n\nexport function postEvent(\n eventType: MethodName,\n paramsOrOptions?: MethodParams<MethodName> | PostEventOptions,\n options?: PostEventOptions,\n): void {\n let postOptions: PostEventOptions = {};\n let eventData: any;\n\n if (paramsOrOptions === undefined && options === undefined) {\n // Parameters and options were not passed.\n postOptions = {};\n } else if (paramsOrOptions !== undefined && options !== undefined) {\n // Both parameters and options passed.\n postOptions = options;\n eventData = paramsOrOptions;\n } else if (paramsOrOptions !== undefined) {\n // Only parameters were passed.\n if ('targetOrigin' in paramsOrOptions) {\n postOptions = paramsOrOptions;\n } else {\n eventData = paramsOrOptions;\n }\n }\n const { targetOrigin = globalTargetOrigin() } = postOptions;\n\n // Telegram Web.\n if (isIframe()) {\n window.parent.postMessage(JSON.stringify({\n eventType,\n eventData,\n }), targetOrigin);\n return;\n }\n\n // Telegram for Windows Phone or Android.\n if (hasExternalNotify(window)) {\n window.external.notify(JSON.stringify({ eventType, eventData }));\n return;\n }\n\n // Telegram for iOS and macOS.\n if (hasWebviewProxy(window)) {\n window.TelegramWebviewProxy.postEvent(eventType, JSON.stringify(eventData));\n return;\n }\n\n // Otherwise current environment is unknown, and we are not able to send\n // event.\n throw new Error(\n 'Unable to determine current environment and possible way to send event.',\n );\n}\n","import { compareVersions, type Version } from '@tma.js/utils';\n\nimport type {\n HasCheckSupportMethodParam,\n HasCheckSupportMethodName,\n MethodName,\n MethodParams,\n NonEmptyMethodName,\n} from './methods/index.js';\n\nfunction lessOrEqual(a: Version, b: Version): boolean {\n return compareVersions(a, b) <= 0;\n}\n\n/**\n * By specified method and parameters extracts properties which could be used by\n * supports function as TWA method parameter.\n * @param method - TWA method.\n * @param params - method parameters.\n */\nexport function detectSupportParams<M extends NonEmptyMethodName>(\n method: M,\n params: MethodParams<M>,\n): HasCheckSupportMethodParam<HasCheckSupportMethodName>[] {\n if (method === 'web_app_open_link') {\n if ('try_instant_view' in params) {\n return ['try_instant_view'];\n }\n }\n\n if (method === 'web_app_set_header_color') {\n if ('color' in params) {\n return ['color'];\n }\n }\n\n return [];\n}\n\n/**\n * Returns true in case, passed parameter in specified method is supported.\n * @param method - method name\n * @param param - method parameter\n * @param inVersion - platform version.\n */\nexport function supports<M extends HasCheckSupportMethodName>(\n method: M,\n param: HasCheckSupportMethodParam<M>,\n inVersion: Version,\n): boolean;\n/**\n * Returns true in case, specified method is supported in passed version.\n * @param method - method name.\n * @param inVersion - platform version.\n */\nexport function supports(method: MethodName, inVersion: Version): boolean;\nexport function supports(\n method: MethodName,\n paramOrVersion: Version | string,\n inVersion?: string,\n): boolean {\n // Method name, parameter, target version.\n if (typeof inVersion === 'string') {\n if (method === 'web_app_open_link') {\n if (paramOrVersion === 'try_instant_view') {\n return lessOrEqual('6.4', inVersion);\n }\n }\n\n if (method === 'web_app_set_header_color') {\n if (paramOrVersion === 'color') {\n return lessOrEqual('6.9', inVersion);\n }\n }\n }\n\n // Method name, target version.\n switch (method) {\n case 'web_app_open_tg_link':\n case 'web_app_open_invoice':\n case 'web_app_setup_back_button':\n case 'web_app_set_background_color':\n case 'web_app_set_header_color':\n case 'web_app_trigger_haptic_feedback':\n return lessOrEqual('6.1', paramOrVersion);\n case 'web_app_open_popup':\n return lessOrEqual('6.2', paramOrVersion);\n case 'web_app_close_scan_qr_popup':\n case 'web_app_open_scan_qr_popup':\n case 'web_app_read_text_from_clipboard':\n return lessOrEqual('6.4', paramOrVersion);\n case 'web_app_invoke_custom_method':\n case 'web_app_request_write_access':\n case 'web_app_request_phone':\n return lessOrEqual('6.9', paramOrVersion);\n default:\n return true;\n }\n}\n","import { singletonEmitter } from './emitter.js';\nimport { off } from './off.js';\n\nimport type { EventName, EventListener } from './events.js';\n\ntype StopListening = () => void;\n\n/**\n * Works the same as \"on\" method, but after catching the event, will remove event listener.\n * @param event - event name.\n * @param listener - event listener.\n */\nexport function once<E extends EventName>(event: E, listener: EventListener<E>): StopListening {\n singletonEmitter().once(event, listener);\n return () => off(event, listener);\n}\n","import { withTimeout, isRecord } from '@tma.js/utils';\n\nimport type { And, If, IsNever } from '@tma.js/util-types';\n\nimport { postEvent as defaultPostEvent, type PostEvent } from './methods/postEvent.js';\nimport { on, type EventName, type EventParams, type EventHasParams } from './events/index.js';\n\nimport type {\n EmptyMethodName, MethodHasParams,\n MethodName,\n MethodParams,\n NonEmptyMethodName,\n} from './methods/params.js';\n\n/**\n * Names of methods, which require passing \"req_id\" parameter.\n */\ntype MethodNameWithRequestId = {\n [Method in MethodName]: If<\n And<MethodHasParams<Method>, MethodParams<Method> extends { req_id: string } ? true : false>,\n Method,\n never\n >;\n}[MethodName];\n\n/**\n * Names of events, which contain \"req_id\" parameter.\n */\ntype EventNameWithRequestId = {\n [Event in EventName]: If<\n And<EventHasParams<Event>, EventParams<Event> extends { req_id: string } ? true : false>,\n Event,\n never\n >;\n}[EventName];\n\nexport interface RequestOptions {\n /**\n * Bridge postEvent method.\n * @default Global postEvent method.\n */\n postEvent?: PostEvent;\n\n /**\n * Execution timeout.\n */\n timeout?: number;\n}\n\nexport interface RequestOptionsAdvanced<EventPayload> extends RequestOptions {\n /**\n * Should return true in case, this event should be captured. If not specified,\n * request is not skipping captured events.\n */\n capture?: If<IsNever<EventPayload>, () => boolean, (payload: EventPayload) => boolean>;\n}\n\n/**\n * Calls specified TWA method and captures one of the specified events. Returns promise\n * which will be resolved in case, event with specified in method request identifier\n * was captured.\n * @param method - method to execute.\n * @param params - method parameters.\n * @param event - event or events to listen.\n * @param options - additional execution options.\n */\nexport function request<\n Method extends MethodNameWithRequestId,\n Event extends EventNameWithRequestId,\n>(\n method: Method,\n params: MethodParams<Method>,\n event: Event | Event[],\n options?: RequestOptions,\n): Promise<EventParams<Event>>;\n\n/**\n * Calls specified TWA method and captures one of the specified events. Returns promise\n * which will be resolved in case, specified event was captured.\n * @param method - method to execute.\n * @param event - event or events to listen.\n * @param options - additional execution options.\n */\nexport function request<Method extends EmptyMethodName, Event extends EventName>(\n method: Method,\n event: Event | Event[],\n options?: RequestOptionsAdvanced<EventParams<Event>>,\n): Promise<EventParams<Event>>;\n\n/**\n * Calls specified TWA method and captures one of the specified events. Returns promise\n * which will be resolved in case, specified event was captured.\n * @param method - method to execute\n * @param params - method parameters.\n * @param event - event or events to listen\n * @param options - additional execution options.\n */\nexport function request<Method extends NonEmptyMethodName, Event extends EventName>(\n method: Method,\n params: MethodParams<Method>,\n event: Event | Event[],\n options?: RequestOptionsAdvanced<EventParams<Event>>,\n): Promise<EventParams<Event>>;\n\nexport function request(\n method: MethodName,\n eventOrParams: EventName | EventName[] | EventParams<any>,\n eventOrOptions?: EventName | EventName[] | RequestOptions | RequestOptionsAdvanced<any>,\n options?: RequestOptions | RequestOptionsAdvanced<any>,\n): Promise<any> {\n let executionOptions: RequestOptions | RequestOptionsAdvanced<any> | undefined;\n let methodParams: EventParams<any> | undefined;\n let events: EventName[];\n let requestId: string | undefined;\n\n if (typeof eventOrParams === 'string' || Array.isArray(eventOrParams)) {\n // Override: [method, event, options?]\n events = Array.isArray(eventOrParams) ? eventOrParams : [eventOrParams] as EventName[];\n executionOptions = eventOrOptions as (RequestOptionsAdvanced<any> | undefined);\n } else {\n // Override: [method, params, event, options?]\n methodParams = eventOrParams as EventParams<any>;\n events = Array.isArray(eventOrOptions) ? eventOrOptions : [eventOrOptions] as EventName[];\n executionOptions = options;\n }\n\n // In case, method parameters were passed, and they contained request identifier, we should store\n // it and wait for the event with this identifier to occur.\n if (isRecord(methodParams) && typeof methodParams.req_id === 'string') {\n requestId = methodParams.req_id;\n }\n\n const { postEvent = defaultPostEvent, timeout } = executionOptions || {};\n const capture = executionOptions && 'capture' in executionOptions\n ? executionOptions.capture\n : null;\n\n const promise = new Promise((res, rej) => {\n // Iterate over each event and create event listener.\n const stoppers = events.map((ev) => on(ev, (data?) => {\n // If request identifier was specified, we are waiting for event with the same value\n // to occur.\n if (typeof requestId === 'string' && (!isRecord(data) || data.req_id !== requestId)) {\n return;\n }\n\n if (typeof capture === 'function' && !capture(data)) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n stopListening();\n res(data);\n }));\n\n // Function which removes all event listeners.\n const stopListening = () => stoppers.forEach((stop) => stop());\n\n try {\n // We are wrapping this call in try catch, because it can throw errors in case,\n // compatibility check was enabled. We want an error to be captured by promise, not by\n // another one external try catch.\n postEvent(method as any, methodParams);\n } catch (e) {\n stopListening();\n rej(e);\n }\n });\n\n return typeof timeout === 'number' ? withTimeout(promise, timeout) : promise;\n}\n","import { singletonEmitter } from './emitter.js';\nimport { unsubscribe } from './unsubscribe.js';\n\nimport type { GlobalEventListener } from './events.js';\n\ntype StopListening = () => void;\n\n/**\n * Subscribes to all events sent from the native Telegram application.\n * Returns function used to remove added event listener.\n * @param listener - event listener.\n */\nexport function subscribe(listener: GlobalEventListener): StopListening {\n singletonEmitter().subscribe(listener);\n return () => unsubscribe(listener);\n}\n"],"names":["currentDebug","currentTargetOrigin","targetOrigin","log","level","args","utilLog","isNullOrUndefined","value","themeChangedPayload","json","theme_params","bg_color","rgb","optional","text_color","hint_color","link_color","button_color","button_text_color","secondary_bg_color","viewportChangedPayload","height","number","width","default","window","innerWidth","is_state_stable","boolean","is_expanded","popupClosedPayload","button_id","string","qrTextReceivedPayload","data","invoiceClosedPayload","slug","status","clipboardTextReceivedPayload","req_id","parse","writeAccessRequestedPayload","phoneRequestedPayload","customMethodInvokedPayload","result","error","eventDataJson","eventType","eventData","emitEvent","dispatchEvent","MessageEvent","JSON","stringify","onTelegramEvent","cb","wnd","forEach","path","pointer","item","idx","arr","length","defineEventHandlers","addEventListener","event","CACHED_EMITTER","singletonEmitter","undefined","emitter","UtilEventEmitter","emit","innerHeight","cause","createEmitter","off","listener","on","unsubscribe","hasExternalNotify","isRecord","external","notify","hasWebviewProxy","TelegramWebviewProxy","postEvent","isIframe","self","top","e","paramsOrOptions","options","postOptions","globalTargetOrigin","parent","postMessage","Error","lessOrEqual","a","b","compareVersions","method","params","once","eventOrParams","eventOrOptions","executionOptions","methodParams","events","requestId","Array","isArray","defaultPostEvent","timeout","capture","promise","Promise","res","rej","stoppers","map","ev","stopListening","stop","withTimeout","subscribe","paramOrVersion","inVersion"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/globals.ts","../../src/events/parsing.ts","../../src/events/onTelegramEvent.ts","../../src/events/emitter.ts","../../src/events/off.ts","../../src/events/on.ts","../../src/events/unsubscribe.ts","../../src/env.ts","../../src/methods/postEvent.ts","../../src/supports.ts","../../src/events/once.ts","../../src/request.ts","../../src/events/subscribe.ts"],"sourcesContent":["import { log as utilLog } from '@tma.js/logger';\n\nlet currentDebug = false;\nlet currentTargetOrigin = 'https://web.telegram.org';\n\n/**\n * Sets new debug mode. Enabling debug mode leads to printing\n * additional messages in console, related to the processes\n * inside the package.\n * @param value - should debug mode be enabled.\n */\nexport function setDebug(value: boolean): void {\n currentDebug = value;\n}\n\n/**\n * Sets new global targetOrigin, used by `postEvent` method.\n * Default value is \"https://web.telegram.org\". You don't need to\n * use this method until you know what you are doing.\n *\n * This method could be used for test purposes.\n * @param value - new target origin.\n */\nexport function setTargetOrigin(value: string): void {\n currentTargetOrigin = value;\n}\n\n/**\n * Returns current global target origin.\n */\nexport function targetOrigin(): string {\n return currentTargetOrigin;\n}\n\n/**\n * Logs message in case, debug mode is enabled.\n * @param level - log level\n * @param args - values to print.\n */\nexport const log: typeof utilLog = (level, ...args) => {\n if (currentDebug) {\n utilLog(level, '[Bridge]', ...args);\n }\n};\n","import {\n number,\n string,\n boolean,\n json,\n rgb,\n} from '@tma.js/parsing';\n\nimport type {\n ClipboardTextReceivedPayload, CustomMethodInvokedPayload,\n InvoiceClosedPayload, PhoneRequestedPayload,\n PopupClosedPayload, QrTextReceivedPayload,\n ThemeChangedPayload,\n ViewportChangedPayload, WriteAccessRequestedPayload,\n} from './payloads.js';\n\nfunction isNullOrUndefined(value: unknown): boolean {\n return value === null || value === undefined;\n}\n\n/**\n * Parses incoming value as ThemeChangedPayload.\n */\nexport const themeChangedPayload = json<ThemeChangedPayload>({\n theme_params: json<ThemeChangedPayload['theme_params']>({\n bg_color: rgb().optional(),\n text_color: rgb().optional(),\n hint_color: rgb().optional(),\n link_color: rgb().optional(),\n button_color: rgb().optional(),\n button_text_color: rgb().optional(),\n secondary_bg_color: rgb().optional(),\n }),\n});\n\n/**\n * Parses incoming value as ViewportChangedPayload.\n * @param value - value to parse.\n */\nexport const viewportChangedPayload = json<ViewportChangedPayload>({\n height: number(),\n width: number().optional(isNullOrUndefined).default(() => window.innerWidth),\n is_state_stable: boolean(),\n is_expanded: boolean(),\n});\n\n/**\n * Parses incoming value as PopupClosedPayload.\n */\nexport const popupClosedPayload = json<PopupClosedPayload>({\n button_id: string().optional(isNullOrUndefined),\n});\n\n/**\n * Parses incoming value as QrTextReceivedPayload.\n */\nexport const qrTextReceivedPayload = json<QrTextReceivedPayload>({\n data: string().optional(),\n});\n\n/**\n * Parses incoming value as InvoiceClosedPayload.\n */\nexport const invoiceClosedPayload = json<InvoiceClosedPayload>({\n slug: string(),\n status: string(),\n});\n\n/**\n * Parses incoming value as clipboard text received payload.\n */\nexport const clipboardTextReceivedPayload = json<ClipboardTextReceivedPayload>({\n req_id: string(),\n data: (value) => (value === null ? value : string().optional().parse(value)),\n});\n\n/**\n * Parses incoming value as WriteAccessRequestedPayload.\n */\nexport const writeAccessRequestedPayload = json<WriteAccessRequestedPayload>({ status: string() });\n\n/**\n * Parses incoming value as PhoneRequestedPayload.\n */\nexport const phoneRequestedPayload = json<PhoneRequestedPayload>({ status: string() });\n\n/**\n * Parses incoming value as CustomMethodInvokedPayload.\n */\nexport const customMethodInvokedPayload = json<CustomMethodInvokedPayload>({\n req_id: string(),\n result: (value) => value,\n error: string().optional(),\n});\n","import { json, string } from '@tma.js/parsing';\n\n/**\n * Extracts event data from native application event.\n */\nconst eventDataJson = json<{ eventType: string; eventData?: unknown }>({\n eventType: string(),\n eventData: (value) => value,\n});\n\n/**\n * Emits event sent from Telegram native application like it was sent in\n * default web environment between 2 iframes. It dispatches new MessageEvent\n * and expects it to be handled via `window.addEventListener('message', ...)`\n * as developer would do it to handle messages sent from parent iframe.\n * @param eventType - event name.\n * @param eventData - event payload.\n */\nfunction emitEvent(eventType: string, eventData: unknown): void {\n window.dispatchEvent(new MessageEvent('message', {\n data: JSON.stringify({ eventType, eventData }),\n }));\n}\n\n/**\n * Defines special handlers by known paths, which are recognized by\n * Telegram as ports to receive events. This function also sets special\n * function in global window object to prevent duplicate declaration.\n */\nfunction defineEventHandlers(): void {\n const wnd: any = window;\n\n // Prevent from duplicate event handlers definition.\n if ('TelegramGameProxy_receiveEvent' in wnd) {\n return;\n }\n\n // Iterate over each path, where \"receiveEvent\" function should be\n // defined. This function is called by external environment in case,\n // it wants to emit some event.\n [\n ['TelegramGameProxy_receiveEvent'], // Windows Phone.\n ['TelegramGameProxy', 'receiveEvent'], // Desktop.\n ['Telegram', 'WebView', 'receiveEvent'], // Android and iOS.\n ].forEach((path) => {\n // Path starts from \"window\" object.\n let pointer = wnd;\n\n path.forEach((item, idx, arr) => {\n // We are on the last iteration, where function property name is passed.\n if (idx === arr.length - 1) {\n pointer[item] = emitEvent;\n return;\n }\n\n if (!(item in pointer)) {\n pointer[item] = {};\n }\n pointer = pointer[item];\n });\n });\n}\n\n/**\n * Adds listener to window \"message\" event assuming, that this event could\n * be sent by Telegram native application. Calls passed callback with event\n * type and data.\n * @param cb - callback to call.\n */\nexport function onTelegramEvent(cb: (eventType: string, eventData: unknown) => void): void {\n // Define event handlers to make sure, message handler will work correctly.\n defineEventHandlers();\n\n // We expect Telegram to send us new event through \"message\" event.\n window.addEventListener('message', (event) => {\n try {\n const { eventType, eventData } = eventDataJson.parse(event.data);\n cb(eventType, eventData);\n } catch {\n // We ignore incorrect messages as they could be generated by any other code.\n }\n });\n}\n","import { EventEmitter as UtilEventEmitter } from '@tma.js/event-emitter';\nimport { string } from '@tma.js/parsing';\n\nimport { log } from '../globals.js';\nimport {\n clipboardTextReceivedPayload,\n customMethodInvokedPayload,\n invoiceClosedPayload,\n phoneRequestedPayload,\n popupClosedPayload,\n qrTextReceivedPayload,\n themeChangedPayload,\n viewportChangedPayload,\n writeAccessRequestedPayload,\n} from './parsing.js';\nimport { onTelegramEvent } from './onTelegramEvent.js';\n\nimport type { EventEmitter, EventName } from './events.js';\n\nconst CACHED_EMITTER = '__telegram-cached-emitter__';\n\n/**\n * Returns event emitter which could be safely used, to process events from\n * Telegram native application.\n */\nexport function createEmitter(): EventEmitter {\n const emitter: EventEmitter = new UtilEventEmitter();\n const emit: EventEmitter['emit'] = (event: any, ...data: any[]) => {\n log('log', 'Emitting processed event:', event, ...data);\n emitter.emit(event, ...data);\n };\n\n // Desktop version of Telegram is sometimes not sending the viewport_changed\n // event. For example, when main button is shown. That's why we should\n // add our own listener to make sure, viewport information is always fresh.\n // Issue: https://github.com/Telegram-Web-Apps/tma.js/issues/10\n window.addEventListener('resize', () => {\n emit('viewport_changed', {\n width: window.innerWidth,\n height: window.innerHeight,\n is_state_stable: true,\n is_expanded: true,\n });\n });\n\n // In case, any Telegram event was received, we should prepare data before\n // passing it to emitter.\n onTelegramEvent((eventType: EventName | string, eventData): void => {\n log('log', 'Received raw event:', eventType, eventData);\n\n try {\n switch (eventType) {\n case 'viewport_changed':\n return emit(eventType, viewportChangedPayload.parse(eventData));\n\n case 'theme_changed':\n return emit(eventType, themeChangedPayload.parse(eventData));\n\n case 'popup_closed':\n // FIXME: Payloads are different on different platforms.\n // Issue: https://github.com/Telegram-Web-Apps/tma.js/issues/2\n if (\n // Sent on desktop.\n eventData === undefined\n // Sent on iOS.\n || eventData === null\n ) {\n return emit(eventType, {});\n }\n return emit(eventType, popupClosedPayload.parse(eventData));\n\n case 'set_custom_style':\n return emit(eventType, string().parse(eventData));\n\n case 'qr_text_received':\n return emit(eventType, qrTextReceivedPayload.parse(eventData));\n\n case 'clipboard_text_received':\n return emit(eventType, clipboardTextReceivedPayload.parse(eventData));\n\n case 'invoice_closed':\n return emit(eventType, invoiceClosedPayload.parse(eventData));\n\n case 'phone_requested':\n return emit('phone_requested', phoneRequestedPayload.parse(eventData));\n\n case 'custom_method_invoked':\n return emit('custom_method_invoked', customMethodInvokedPayload.parse(eventData));\n\n case 'write_access_requested':\n return emit('write_access_requested', writeAccessRequestedPayload.parse(eventData));\n\n // Events which have no parameters.\n case 'main_button_pressed':\n case 'back_button_pressed':\n case 'settings_button_pressed':\n case 'scan_qr_popup_closed':\n return emit(eventType);\n\n // All other event listeners will receive unknown type of data.\n default:\n return emit(eventType as any, eventData);\n }\n } catch (cause) {\n log('error', 'Error processing event:', cause);\n }\n });\n\n return emitter;\n}\n\n/**\n * Returns singleton instance of bridge EventEmitter. Also, defines\n * Telegram event handlers.\n */\nexport function singletonEmitter(): EventEmitter {\n const wnd: any = window;\n const cachedEmitter = wnd[CACHED_EMITTER];\n\n if (cachedEmitter === undefined) {\n wnd[CACHED_EMITTER] = createEmitter();\n }\n\n return wnd[CACHED_EMITTER];\n}\n","import { singletonEmitter } from './emitter.js';\n\nimport type { EventName, EventListener } from './events.js';\n\n/**\n * Removes listener from specified event.\n * @param event - event to listen.\n * @param listener - event listener.\n */\nexport function off<E extends EventName>(event: E, listener: EventListener<E>): void {\n singletonEmitter().off(event, listener);\n}\n","import { singletonEmitter } from './emitter.js';\nimport { off } from './off.js';\n\nimport type { EventName, EventListener } from './events.js';\n\ntype StopListening = () => void;\n\n/**\n * Adds new listener to the specified event. Returns handler\n * which allows to stop listening to event.\n * @param event - event name.\n * @param listener - event listener.\n */\nexport function on<E extends EventName>(event: E, listener: EventListener<E>): StopListening {\n singletonEmitter().on(event, listener);\n return () => off(event, listener);\n}\n","import { singletonEmitter } from './emitter.js';\n\nimport type { GlobalEventListener } from './events.js';\n\n/**\n * Removes global event listener.\n * @param listener - event listener.\n */\nexport function unsubscribe(listener: GlobalEventListener): void {\n singletonEmitter().unsubscribe(listener);\n}\n","import { isRecord } from '@tma.js/utils';\n\ntype AnyFunc = (...args: unknown[]) => unknown;\n\ntype WithExternalNotify<T> = T & {\n external: { notify: AnyFunc }\n};\n\ntype WithWebviewProxy<T> = T & {\n TelegramWebviewProxy: {\n postEvent: AnyFunc;\n }\n};\n\n/**\n * Returns true in case, passed value contains path `external.notify` property and `notify` is a\n * function.\n * @param value - value to check.\n */\nexport function hasExternalNotify<T extends {}>(value: T): value is WithExternalNotify<T> {\n return 'external' in value\n && isRecord(value.external)\n && 'notify' in value.external\n && typeof value.external.notify === 'function';\n}\n\n/**\n * Returns true in case, passed value contains path `TelegramWebviewProxy.postEvent` property and\n * `postEvent` is a function.\n * @param value - value to check.\n */\nexport function hasWebviewProxy<T extends {}>(value: T): value is WithWebviewProxy<T> {\n return 'TelegramWebviewProxy' in value\n && isRecord(value.TelegramWebviewProxy)\n && 'postEvent' in value.TelegramWebviewProxy\n && typeof value.TelegramWebviewProxy.postEvent === 'function';\n}\n\n/**\n * Returns true in case, current environment is iframe.\n * @see https://stackoverflow.com/a/326076\n */\nexport function isIframe(): boolean {\n try {\n return window.self !== window.top;\n } catch (e) {\n return true;\n }\n}\n","import {\n isIframe,\n hasExternalNotify,\n hasWebviewProxy,\n} from '../env.js';\nimport { targetOrigin as globalTargetOrigin } from '../globals.js';\n\nimport type {\n EmptyMethodName,\n MethodName,\n MethodParams,\n NonEmptyMethodName,\n} from './params.js';\n\ninterface PostEventOptions {\n /**\n * Origin used while posting message. This option is only used in case,\n * current environment is browser (Web version of Telegram) and could\n * be used for test purposes.\n * @default 'https://web.telegram.org'\n */\n targetOrigin?: string;\n}\n\nexport type PostEvent = typeof postEvent;\n\n/**\n * Sends event to native application which launched Web App. This function\n * accepts only events, which require arguments.\n * @param eventType - event name.\n * @param params - event parameters.\n * @param options - posting options.\n * @throws {Error} Bridge could not determine current\n * environment and possible way to send event.\n */\nexport function postEvent<E extends NonEmptyMethodName>(\n eventType: E,\n params: MethodParams<E>,\n options?: PostEventOptions,\n): void;\n\n/**\n * Sends event to native application which launched Web App. This function\n * accepts only events, which require arguments.\n * @param eventType - event name.\n * @param options - posting options.\n * @throws {Error} Bridge could not determine current\n * environment and possible way to send event.\n */\nexport function postEvent(eventType: EmptyMethodName, options?: PostEventOptions): void;\n\nexport function postEvent(\n eventType: MethodName,\n paramsOrOptions?: MethodParams<MethodName> | PostEventOptions,\n options?: PostEventOptions,\n): void {\n let postOptions: PostEventOptions = {};\n let eventData: any;\n\n if (paramsOrOptions === undefined && options === undefined) {\n // Parameters and options were not passed.\n postOptions = {};\n } else if (paramsOrOptions !== undefined && options !== undefined) {\n // Both parameters and options passed.\n postOptions = options;\n eventData = paramsOrOptions;\n } else if (paramsOrOptions !== undefined) {\n // Only parameters were passed.\n if ('targetOrigin' in paramsOrOptions) {\n postOptions = paramsOrOptions;\n } else {\n eventData = paramsOrOptions;\n }\n }\n const { targetOrigin = globalTargetOrigin() } = postOptions;\n\n // Telegram Web.\n if (isIframe()) {\n window.parent.postMessage(JSON.stringify({\n eventType,\n eventData,\n }), targetOrigin);\n return;\n }\n\n // Telegram for Windows Phone or Android.\n if (hasExternalNotify(window)) {\n window.external.notify(JSON.stringify({ eventType, eventData }));\n return;\n }\n\n // Telegram for iOS and macOS.\n if (hasWebviewProxy(window)) {\n window.TelegramWebviewProxy.postEvent(eventType, JSON.stringify(eventData));\n return;\n }\n\n // Otherwise current environment is unknown, and we are not able to send\n // event.\n throw new Error(\n 'Unable to determine current environment and possible way to send event.',\n );\n}\n","import { compareVersions, type Version } from '@tma.js/utils';\n\nimport type {\n HasCheckSupportMethodParam,\n HasCheckSupportMethodName,\n MethodName,\n MethodParams,\n NonEmptyMethodName,\n} from './methods/index.js';\n\nfunction lessOrEqual(a: Version, b: Version): boolean {\n return compareVersions(a, b) <= 0;\n}\n\n/**\n * By specified method and parameters extracts properties which could be used by\n * supports function as TWA method parameter.\n * @param method - TWA method.\n * @param params - method parameters.\n */\nexport function detectSupportParams<M extends NonEmptyMethodName>(\n method: M,\n params: MethodParams<M>,\n): HasCheckSupportMethodParam<HasCheckSupportMethodName>[] {\n if (method === 'web_app_open_link') {\n if ('try_instant_view' in params) {\n return ['try_instant_view'];\n }\n }\n\n if (method === 'web_app_set_header_color') {\n if ('color' in params) {\n return ['color'];\n }\n }\n\n return [];\n}\n\n/**\n * Returns true in case, passed parameter in specified method is supported.\n * @param method - method name\n * @param param - method parameter\n * @param inVersion - platform version.\n */\nexport function supports<M extends HasCheckSupportMethodName>(\n method: M,\n param: HasCheckSupportMethodParam<M>,\n inVersion: Version,\n): boolean;\n/**\n * Returns true in case, specified method is supported in passed version.\n * @param method - method name.\n * @param inVersion - platform version.\n */\nexport function supports(method: MethodName, inVersion: Version): boolean;\nexport function supports(\n method: MethodName,\n paramOrVersion: Version | string,\n inVersion?: string,\n): boolean {\n // Method name, parameter, target version.\n if (typeof inVersion === 'string') {\n if (method === 'web_app_open_link') {\n if (paramOrVersion === 'try_instant_view') {\n return lessOrEqual('6.4', inVersion);\n }\n }\n\n if (method === 'web_app_set_header_color') {\n if (paramOrVersion === 'color') {\n return lessOrEqual('6.9', inVersion);\n }\n }\n }\n\n // Method name, target version.\n switch (method) {\n case 'web_app_open_tg_link':\n case 'web_app_open_invoice':\n case 'web_app_setup_back_button':\n case 'web_app_set_background_color':\n case 'web_app_set_header_color':\n case 'web_app_trigger_haptic_feedback':\n return lessOrEqual('6.1', paramOrVersion);\n case 'web_app_open_popup':\n return lessOrEqual('6.2', paramOrVersion);\n case 'web_app_close_scan_qr_popup':\n case 'web_app_open_scan_qr_popup':\n case 'web_app_read_text_from_clipboard':\n return lessOrEqual('6.4', paramOrVersion);\n case 'web_app_invoke_custom_method':\n case 'web_app_request_write_access':\n case 'web_app_request_phone':\n return lessOrEqual('6.9', paramOrVersion);\n default:\n return true;\n }\n}\n","import { singletonEmitter } from './emitter.js';\nimport { off } from './off.js';\n\nimport type { EventName, EventListener } from './events.js';\n\ntype StopListening = () => void;\n\n/**\n * Works the same as \"on\" method, but after catching the event, will remove event listener.\n * @param event - event name.\n * @param listener - event listener.\n */\nexport function once<E extends EventName>(event: E, listener: EventListener<E>): StopListening {\n singletonEmitter().once(event, listener);\n return () => off(event, listener);\n}\n","import { withTimeout, isRecord } from '@tma.js/utils';\n\nimport type { And, If, IsNever } from '@tma.js/util-types';\n\nimport { postEvent as defaultPostEvent, type PostEvent } from './methods/postEvent.js';\nimport { on, type EventName, type EventParams, type EventHasParams } from './events/index.js';\n\nimport type {\n EmptyMethodName, MethodHasParams,\n MethodName,\n MethodParams,\n NonEmptyMethodName,\n} from './methods/params.js';\n\n/**\n * Names of methods, which require passing \"req_id\" parameter.\n */\ntype MethodNameWithRequestId = {\n [Method in MethodName]: If<\n And<MethodHasParams<Method>, MethodParams<Method> extends { req_id: string } ? true : false>,\n Method,\n never\n >;\n}[MethodName];\n\n/**\n * Names of events, which contain \"req_id\" parameter.\n */\ntype EventNameWithRequestId = {\n [Event in EventName]: If<\n And<EventHasParams<Event>, EventParams<Event> extends { req_id: string } ? true : false>,\n Event,\n never\n >;\n}[EventName];\n\nexport interface RequestOptions {\n /**\n * Bridge postEvent method.\n * @default Global postEvent method.\n */\n postEvent?: PostEvent;\n\n /**\n * Execution timeout.\n */\n timeout?: number;\n}\n\nexport interface RequestOptionsAdvanced<EventPayload> extends RequestOptions {\n /**\n * Should return true in case, this event should be captured. If not specified,\n * request is not skipping captured events.\n */\n capture?: If<IsNever<EventPayload>, () => boolean, (payload: EventPayload) => boolean>;\n}\n\n/**\n * Calls specified TWA method and captures one of the specified events. Returns promise\n * which will be resolved in case, event with specified in method request identifier\n * was captured.\n * @param method - method to execute.\n * @param params - method parameters.\n * @param event - event or events to listen.\n * @param options - additional execution options.\n */\nexport function request<\n Method extends MethodNameWithRequestId,\n Event extends EventNameWithRequestId,\n>(\n method: Method,\n params: MethodParams<Method>,\n event: Event | Event[],\n options?: RequestOptions,\n): Promise<EventParams<Event>>;\n\n/**\n * Calls specified TWA method and captures one of the specified events. Returns promise\n * which will be resolved in case, specified event was captured.\n * @param method - method to execute.\n * @param event - event or events to listen.\n * @param options - additional execution options.\n */\nexport function request<Method extends EmptyMethodName, Event extends EventName>(\n method: Method,\n event: Event | Event[],\n options?: RequestOptionsAdvanced<EventParams<Event>>,\n): Promise<EventParams<Event>>;\n\n/**\n * Calls specified TWA method and captures one of the specified events. Returns promise\n * which will be resolved in case, specified event was captured.\n * @param method - method to execute\n * @param params - method parameters.\n * @param event - event or events to listen\n * @param options - additional execution options.\n */\nexport function request<Method extends NonEmptyMethodName, Event extends EventName>(\n method: Method,\n params: MethodParams<Method>,\n event: Event | Event[],\n options?: RequestOptionsAdvanced<EventParams<Event>>,\n): Promise<EventParams<Event>>;\n\nexport function request(\n method: MethodName,\n eventOrParams: EventName | EventName[] | EventParams<any>,\n eventOrOptions?: EventName | EventName[] | RequestOptions | RequestOptionsAdvanced<any>,\n options?: RequestOptions | RequestOptionsAdvanced<any>,\n): Promise<any> {\n let executionOptions: RequestOptions | RequestOptionsAdvanced<any> | undefined;\n let methodParams: EventParams<any> | undefined;\n let events: EventName[];\n let requestId: string | undefined;\n\n if (typeof eventOrParams === 'string' || Array.isArray(eventOrParams)) {\n // Override: [method, event, options?]\n events = Array.isArray(eventOrParams) ? eventOrParams : [eventOrParams] as EventName[];\n executionOptions = eventOrOptions as (RequestOptionsAdvanced<any> | undefined);\n } else {\n // Override: [method, params, event, options?]\n methodParams = eventOrParams as EventParams<any>;\n events = Array.isArray(eventOrOptions) ? eventOrOptions : [eventOrOptions] as EventName[];\n executionOptions = options;\n }\n\n // In case, method parameters were passed, and they contained request identifier, we should store\n // it and wait for the event with this identifier to occur.\n if (isRecord(methodParams) && typeof methodParams.req_id === 'string') {\n requestId = methodParams.req_id;\n }\n\n const { postEvent = defaultPostEvent, timeout } = executionOptions || {};\n const capture = executionOptions && 'capture' in executionOptions\n ? executionOptions.capture\n : null;\n\n const promise = new Promise((res, rej) => {\n // Iterate over each event and create event listener.\n const stoppers = events.map((ev) => on(ev, (data?) => {\n // If request identifier was specified, we are waiting for event with the same value\n // to occur.\n if (typeof requestId === 'string' && (!isRecord(data) || data.req_id !== requestId)) {\n return;\n }\n\n if (typeof capture === 'function' && !capture(data)) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n stopListening();\n res(data);\n }));\n\n // Function which removes all event listeners.\n const stopListening = () => stoppers.forEach((stop) => stop());\n\n try {\n // We are wrapping this call in try catch, because it can throw errors in case,\n // compatibility check was enabled. We want an error to be captured by promise, not by\n // another one external try catch.\n postEvent(method as any, methodParams);\n } catch (e) {\n stopListening();\n rej(e);\n }\n });\n\n return typeof timeout === 'number' ? withTimeout(promise, timeout) : promise;\n}\n","import { singletonEmitter } from './emitter.js';\nimport { unsubscribe } from './unsubscribe.js';\n\nimport type { GlobalEventListener } from './events.js';\n\ntype StopListening = () => void;\n\n/**\n * Subscribes to all events sent from the native Telegram application.\n * Returns function used to remove added event listener.\n * @param listener - event listener.\n */\nexport function subscribe(listener: GlobalEventListener): StopListening {\n singletonEmitter().subscribe(listener);\n return () => unsubscribe(listener);\n}\n"],"names":["currentDebug","currentTargetOrigin","targetOrigin","log","level","args","utilLog","isNullOrUndefined","value","themeChangedPayload","json","theme_params","bg_color","rgb","optional","text_color","hint_color","link_color","button_color","button_text_color","secondary_bg_color","viewportChangedPayload","height","number","width","default","window","innerWidth","is_state_stable","boolean","is_expanded","popupClosedPayload","button_id","string","qrTextReceivedPayload","data","invoiceClosedPayload","slug","status","clipboardTextReceivedPayload","req_id","parse","writeAccessRequestedPayload","phoneRequestedPayload","customMethodInvokedPayload","result","error","eventDataJson","eventType","eventData","emitEvent","dispatchEvent","MessageEvent","JSON","stringify","onTelegramEvent","cb","wnd","forEach","path","pointer","item","idx","arr","length","defineEventHandlers","addEventListener","event","CACHED_EMITTER","singletonEmitter","undefined","emitter","UtilEventEmitter","emit","innerHeight","cause","createEmitter","off","listener","on","unsubscribe","hasExternalNotify","isRecord","external","notify","hasWebviewProxy","TelegramWebviewProxy","postEvent","isIframe","self","top","e","paramsOrOptions","options","postOptions","globalTargetOrigin","parent","postMessage","Error","lessOrEqual","a","b","compareVersions","method","params","once","eventOrParams","eventOrOptions","executionOptions","methodParams","events","requestId","Array","isArray","defaultPostEvent","timeout","capture","promise","Promise","res","rej","stoppers","map","ev","stopListening","stop","withTimeout","subscribe","paramOrVersion","inVersion"],"mappings":"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"}
|
package/dist/lib/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{EventEmitter as e}from"@tma.js/event-emitter";import{json as t,rgb as n,number as r,boolean as o,string as i}from"@tma.js/parsing";import{log as a}from"@tma.js/logger";import{isRecord as s,withTimeout as c,compareVersions as _}from"@tma.js/utils";let p=!1,u="https://web.telegram.org";function d(e){p=e}function l(e){u=e}function w(){return u}const f=(e,...t)=>{p&&a(e,"[Bridge]",...t)};function v(e){return null==e}const g=t({theme_params:t({bg_color:n().optional(),text_color:n().optional(),hint_color:n().optional(),link_color:n().optional(),button_color:n().optional(),button_text_color:n().optional(),secondary_bg_color:n().optional()})}),m=t({height:r(),width:r().optional(v).default((()=>window.innerWidth)),is_state_stable:o(),is_expanded:o()}),b=t({button_id:i().optional(v)}),y=t({data:i().optional()}),h=t({slug:i(),status:i()}),x=t({req_id:i(),data:e=>null===e?e:i().optional().parse(e)}),E=t({status:i()}),q=t({status:i()}),T=t({req_id:i(),result:e=>e,error:i().optional()}),k=t({eventType:i(),eventData:e=>e});function P(e,t){window.dispatchEvent(new MessageEvent("message",{data:JSON.stringify({eventType:e,eventData:t})}))}function W(e){!function(){const e=window;"TelegramGameProxy_receiveEvent"in e||[["TelegramGameProxy_receiveEvent"],["TelegramGameProxy","receiveEvent"],["Telegram","WebView","receiveEvent"]].forEach((t=>{let n=e;t.forEach(((e,t,r)=>{t!==r.length-1?(e in n||(n[e]={}),n=n[e]):n[e]=P}))}))}(),window.addEventListener("message",(t=>{try{const{eventType:n,eventData:r}=k.parse(t.data);e(n,r)}catch{}}))}const A="__telegram-cached-emitter__";function O(){const t=window;return void 0===t[A]&&(t[A]=function(){const t=new e,n=(e,...n)=>{f("log","Emitting processed event:",e,...n),t.emit(e,...n)};return window.addEventListener("resize",(()=>{
|
|
1
|
+
import{EventEmitter as e}from"@tma.js/event-emitter";import{json as t,rgb as n,number as r,boolean as o,string as i}from"@tma.js/parsing";import{log as a}from"@tma.js/logger";import{isRecord as s,withTimeout as c,compareVersions as _}from"@tma.js/utils";let p=!1,u="https://web.telegram.org";function d(e){p=e}function l(e){u=e}function w(){return u}const f=(e,...t)=>{p&&a(e,"[Bridge]",...t)};function v(e){return null==e}const g=t({theme_params:t({bg_color:n().optional(),text_color:n().optional(),hint_color:n().optional(),link_color:n().optional(),button_color:n().optional(),button_text_color:n().optional(),secondary_bg_color:n().optional()})}),m=t({height:r(),width:r().optional(v).default((()=>window.innerWidth)),is_state_stable:o(),is_expanded:o()}),b=t({button_id:i().optional(v)}),y=t({data:i().optional()}),h=t({slug:i(),status:i()}),x=t({req_id:i(),data:e=>null===e?e:i().optional().parse(e)}),E=t({status:i()}),q=t({status:i()}),T=t({req_id:i(),result:e=>e,error:i().optional()}),k=t({eventType:i(),eventData:e=>e});function P(e,t){window.dispatchEvent(new MessageEvent("message",{data:JSON.stringify({eventType:e,eventData:t})}))}function W(e){!function(){const e=window;"TelegramGameProxy_receiveEvent"in e||[["TelegramGameProxy_receiveEvent"],["TelegramGameProxy","receiveEvent"],["Telegram","WebView","receiveEvent"]].forEach((t=>{let n=e;t.forEach(((e,t,r)=>{t!==r.length-1?(e in n||(n[e]={}),n=n[e]):n[e]=P}))}))}(),window.addEventListener("message",(t=>{try{const{eventType:n,eventData:r}=k.parse(t.data);e(n,r)}catch{}}))}const A="__telegram-cached-emitter__";function O(){const t=window;return void 0===t[A]&&(t[A]=function(){const t=new e,n=(e,...n)=>{f("log","Emitting processed event:",e,...n),t.emit(e,...n)};return window.addEventListener("resize",(()=>{n("viewport_changed",{width:window.innerWidth,height:window.innerHeight,is_state_stable:!0,is_expanded:!0})})),W(((e,t)=>{f("log","Received raw event:",e,t);try{switch(e){case"viewport_changed":return n(e,m.parse(t));case"theme_changed":return n(e,g.parse(t));case"popup_closed":return n(e,null==t?{}:b.parse(t));case"set_custom_style":return n(e,i().parse(t));case"qr_text_received":return n(e,y.parse(t));case"clipboard_text_received":return n(e,x.parse(t));case"invoice_closed":return n(e,h.parse(t));case"phone_requested":return n("phone_requested",q.parse(t));case"custom_method_invoked":return n("custom_method_invoked",T.parse(t));case"write_access_requested":return n("write_access_requested",E.parse(t));case"main_button_pressed":case"back_button_pressed":case"settings_button_pressed":case"scan_qr_popup_closed":return n(e);default:return n(e,t)}}catch(e){f("error","Error processing event:",e)}})),t}()),t[A]}function D(e,t){O().off(e,t)}function j(e,t){return O().on(e,t),()=>D(e,t)}function J(e,t){return O().once(e,t),()=>D(e,t)}function N(e){O().unsubscribe(e)}function S(e){return O().subscribe(e),()=>N(e)}function G(e){return"external"in e&&s(e.external)&&"notify"in e.external&&"function"==typeof e.external.notify}function L(e){return"TelegramWebviewProxy"in e&&s(e.TelegramWebviewProxy)&&"postEvent"in e.TelegramWebviewProxy&&"function"==typeof e.TelegramWebviewProxy.postEvent}function M(){try{return window.self!==window.top}catch(e){return!0}}function z(e,t,n){let r,o={};void 0===t&&void 0===n?o={}:void 0!==t&&void 0!==n?(o=n,r=t):void 0!==t&&("targetOrigin"in t?o=t:r=t);const{targetOrigin:i=w()}=o;if(M())window.parent.postMessage(JSON.stringify({eventType:e,eventData:r}),i);else if(G(window))window.external.notify(JSON.stringify({eventType:e,eventData:r}));else{if(!L(window))throw new Error("Unable to determine current environment and possible way to send event.");window.TelegramWebviewProxy.postEvent(e,JSON.stringify(r))}}function B(e,t,n,r){let o,i,a,_;"string"==typeof t||Array.isArray(t)?(a=Array.isArray(t)?t:[t],o=n):(i=t,a=Array.isArray(n)?n:[n],o=r),s(i)&&"string"==typeof i.req_id&&(_=i.req_id);const{postEvent:p=z,timeout:u}=o||{},d=o&&"capture"in o?o.capture:null,l=new Promise(((t,n)=>{const r=a.map((e=>j(e,(e=>{("string"!=typeof _||s(e)&&e.req_id===_)&&("function"!=typeof d||d(e))&&(o(),t(e))})))),o=()=>r.forEach((e=>e()));try{p(e,i)}catch(e){o(),n(e)}}));return"number"==typeof u?c(l,u):l}function H(e,t){return _(e,t)<=0}function R(e,t){return"web_app_open_link"===e&&"try_instant_view"in t?["try_instant_view"]:"web_app_set_header_color"===e&&"color"in t?["color"]:[]}function U(e,t,n){if("string"==typeof n){if("web_app_open_link"===e&&"try_instant_view"===t)return H("6.4",n);if("web_app_set_header_color"===e&&"color"===t)return H("6.9",n)}switch(e){case"web_app_open_tg_link":case"web_app_open_invoice":case"web_app_setup_back_button":case"web_app_set_background_color":case"web_app_set_header_color":case"web_app_trigger_haptic_feedback":return H("6.1",t);case"web_app_open_popup":return H("6.2",t);case"web_app_close_scan_qr_popup":case"web_app_open_scan_qr_popup":case"web_app_read_text_from_clipboard":return H("6.4",t);case"web_app_invoke_custom_method":case"web_app_request_write_access":case"web_app_request_phone":return H("6.9",t);default:return!0}}export{R as detectSupportParams,G as hasExternalNotify,L as hasWebviewProxy,M as isIframe,D as off,j as on,J as once,z as postEvent,B as request,d as setDebug,l as setTargetOrigin,S as subscribe,U as supports,N as unsubscribe};
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
package/dist/lib/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../src/globals.ts","../../src/events/parsing.ts","../../src/events/onTelegramEvent.ts","../../src/events/emitter.ts","../../src/events/off.ts","../../src/events/on.ts","../../src/events/once.ts","../../src/events/unsubscribe.ts","../../src/events/subscribe.ts","../../src/env.ts","../../src/methods/postEvent.ts","../../src/request.ts","../../src/supports.ts"],"sourcesContent":["import { log as utilLog } from '@tma.js/logger';\n\nlet currentDebug = false;\nlet currentTargetOrigin = 'https://web.telegram.org';\n\n/**\n * Sets new debug mode. Enabling debug mode leads to printing\n * additional messages in console, related to the processes\n * inside the package.\n * @param value - should debug mode be enabled.\n */\nexport function setDebug(value: boolean): void {\n currentDebug = value;\n}\n\n/**\n * Sets new global targetOrigin, used by `postEvent` method.\n * Default value is \"https://web.telegram.org\". You don't need to\n * use this method until you know what you are doing.\n *\n * This method could be used for test purposes.\n * @param value - new target origin.\n */\nexport function setTargetOrigin(value: string): void {\n currentTargetOrigin = value;\n}\n\n/**\n * Returns current global target origin.\n */\nexport function targetOrigin(): string {\n return currentTargetOrigin;\n}\n\n/**\n * Logs message in case, debug mode is enabled.\n * @param level - log level\n * @param args - values to print.\n */\nexport const log: typeof utilLog = (level, ...args) => {\n if (currentDebug) {\n utilLog(level, '[Bridge]', ...args);\n }\n};\n","import {\n number,\n string,\n boolean,\n json,\n rgb,\n} from '@tma.js/parsing';\n\nimport type {\n ClipboardTextReceivedPayload, CustomMethodInvokedPayload,\n InvoiceClosedPayload, PhoneRequestedPayload,\n PopupClosedPayload, QrTextReceivedPayload,\n ThemeChangedPayload,\n ViewportChangedPayload, WriteAccessRequestedPayload,\n} from './payloads.js';\n\nfunction isNullOrUndefined(value: unknown): boolean {\n return value === null || value === undefined;\n}\n\n/**\n * Parses incoming value as ThemeChangedPayload.\n */\nexport const themeChangedPayload = json<ThemeChangedPayload>({\n theme_params: json<ThemeChangedPayload['theme_params']>({\n bg_color: rgb().optional(),\n text_color: rgb().optional(),\n hint_color: rgb().optional(),\n link_color: rgb().optional(),\n button_color: rgb().optional(),\n button_text_color: rgb().optional(),\n secondary_bg_color: rgb().optional(),\n }),\n});\n\n/**\n * Parses incoming value as ViewportChangedPayload.\n * @param value - value to parse.\n */\nexport const viewportChangedPayload = json<ViewportChangedPayload>({\n height: number(),\n width: number().optional(isNullOrUndefined).default(() => window.innerWidth),\n is_state_stable: boolean(),\n is_expanded: boolean(),\n});\n\n/**\n * Parses incoming value as PopupClosedPayload.\n */\nexport const popupClosedPayload = json<PopupClosedPayload>({\n button_id: string().optional(isNullOrUndefined),\n});\n\n/**\n * Parses incoming value as QrTextReceivedPayload.\n */\nexport const qrTextReceivedPayload = json<QrTextReceivedPayload>({\n data: string().optional(),\n});\n\n/**\n * Parses incoming value as InvoiceClosedPayload.\n */\nexport const invoiceClosedPayload = json<InvoiceClosedPayload>({\n slug: string(),\n status: string(),\n});\n\n/**\n * Parses incoming value as clipboard text received payload.\n */\nexport const clipboardTextReceivedPayload = json<ClipboardTextReceivedPayload>({\n req_id: string(),\n data: (value) => (value === null ? value : string().optional().parse(value)),\n});\n\n/**\n * Parses incoming value as WriteAccessRequestedPayload.\n */\nexport const writeAccessRequestedPayload = json<WriteAccessRequestedPayload>({ status: string() });\n\n/**\n * Parses incoming value as PhoneRequestedPayload.\n */\nexport const phoneRequestedPayload = json<PhoneRequestedPayload>({ status: string() });\n\n/**\n * Parses incoming value as CustomMethodInvokedPayload.\n */\nexport const customMethodInvokedPayload = json<CustomMethodInvokedPayload>({\n req_id: string(),\n result: (value) => value,\n error: string().optional(),\n});\n","import { json, string } from '@tma.js/parsing';\n\n/**\n * Extracts event data from native application event.\n */\nconst eventDataJson = json<{ eventType: string; eventData?: unknown }>({\n eventType: string(),\n eventData: (value) => value,\n});\n\n/**\n * Emits event sent from Telegram native application like it was sent in\n * default web environment between 2 iframes. It dispatches new MessageEvent\n * and expects it to be handled via `window.addEventListener('message', ...)`\n * as developer would do it to handle messages sent from parent iframe.\n * @param eventType - event name.\n * @param eventData - event payload.\n */\nfunction emitEvent(eventType: string, eventData: unknown): void {\n window.dispatchEvent(new MessageEvent('message', {\n data: JSON.stringify({ eventType, eventData }),\n }));\n}\n\n/**\n * Defines special handlers by known paths, which are recognized by\n * Telegram as ports to receive events. This function also sets special\n * function in global window object to prevent duplicate declaration.\n */\nfunction defineEventHandlers(): void {\n const wnd: any = window;\n\n // Prevent from duplicate event handlers definition.\n if ('TelegramGameProxy_receiveEvent' in wnd) {\n return;\n }\n\n // Iterate over each path, where \"receiveEvent\" function should be\n // defined. This function is called by external environment in case,\n // it wants to emit some event.\n [\n ['TelegramGameProxy_receiveEvent'], // Windows Phone.\n ['TelegramGameProxy', 'receiveEvent'], // Desktop.\n ['Telegram', 'WebView', 'receiveEvent'], // Android and iOS.\n ].forEach((path) => {\n // Path starts from \"window\" object.\n let pointer = wnd;\n\n path.forEach((item, idx, arr) => {\n // We are on the last iteration, where function property name is passed.\n if (idx === arr.length - 1) {\n pointer[item] = emitEvent;\n return;\n }\n\n if (!(item in pointer)) {\n pointer[item] = {};\n }\n pointer = pointer[item];\n });\n });\n}\n\n/**\n * Adds listener to window \"message\" event assuming, that this event could\n * be sent by Telegram native application. Calls passed callback with event\n * type and data.\n * @param cb - callback to call.\n */\nexport function onTelegramEvent(cb: (eventType: string, eventData: unknown) => void): void {\n // Define event handlers to make sure, message handler will work correctly.\n defineEventHandlers();\n\n // We expect Telegram to send us new event through \"message\" event.\n window.addEventListener('message', (event) => {\n try {\n const { eventType, eventData } = eventDataJson.parse(event.data);\n cb(eventType, eventData);\n } catch {\n // We ignore incorrect messages as they could be generated by any other code.\n }\n });\n}\n","import { EventEmitter as UtilEventEmitter } from '@tma.js/event-emitter';\nimport { string } from '@tma.js/parsing';\n\nimport { log } from '../globals.js';\nimport {\n clipboardTextReceivedPayload,\n customMethodInvokedPayload,\n invoiceClosedPayload,\n phoneRequestedPayload,\n popupClosedPayload,\n qrTextReceivedPayload,\n themeChangedPayload,\n viewportChangedPayload,\n writeAccessRequestedPayload,\n} from './parsing.js';\nimport { onTelegramEvent } from './onTelegramEvent.js';\n\nimport type { EventEmitter, EventName } from './events.js';\n\nconst CACHED_EMITTER = '__telegram-cached-emitter__';\n\n/**\n * Returns event emitter which could be safely used, to process events from\n * Telegram native application.\n */\nexport function createEmitter(): EventEmitter {\n const emitter: EventEmitter = new UtilEventEmitter();\n const emit: EventEmitter['emit'] = (event: any, ...data: any[]) => {\n log('log', 'Emitting processed event:', event, ...data);\n emitter.emit(event, ...data);\n };\n\n // Desktop version of Telegram is sometimes not sending the viewport_changed\n // event. For example, when main button is shown. That's why we should\n // add our own listener to make sure, viewport information is always fresh.\n // Issue: https://github.com/Telegram-Web-Apps/tma.js/issues/10\n window.addEventListener('resize', () => {\n emitter.emit('viewport_changed', {\n width: window.innerWidth,\n height: window.innerHeight,\n is_state_stable: true,\n is_expanded: true,\n });\n });\n\n // In case, any Telegram event was received, we should prepare data before\n // passing it to emitter.\n onTelegramEvent((eventType: EventName | string, eventData): void => {\n log('log', 'Received raw event:', eventType, eventData);\n\n try {\n switch (eventType) {\n case 'viewport_changed':\n return emit(eventType, viewportChangedPayload.parse(eventData));\n\n case 'theme_changed':\n return emit(eventType, themeChangedPayload.parse(eventData));\n\n case 'popup_closed':\n // FIXME: Payloads are different on different platforms.\n // Issue: https://github.com/Telegram-Web-Apps/tma.js/issues/2\n if (\n // Sent on desktop.\n eventData === undefined\n // Sent on iOS.\n || eventData === null\n ) {\n return emit(eventType, {});\n }\n return emit(eventType, popupClosedPayload.parse(eventData));\n\n case 'set_custom_style':\n return emit(eventType, string().parse(eventData));\n\n case 'qr_text_received':\n return emit(eventType, qrTextReceivedPayload.parse(eventData));\n\n case 'clipboard_text_received':\n return emit(eventType, clipboardTextReceivedPayload.parse(eventData));\n\n case 'invoice_closed':\n return emit(eventType, invoiceClosedPayload.parse(eventData));\n\n case 'phone_requested':\n return emit('phone_requested', phoneRequestedPayload.parse(eventData));\n\n case 'custom_method_invoked':\n return emit('custom_method_invoked', customMethodInvokedPayload.parse(eventData));\n\n case 'write_access_requested':\n return emit('write_access_requested', writeAccessRequestedPayload.parse(eventData));\n\n // Events which have no parameters.\n case 'main_button_pressed':\n case 'back_button_pressed':\n case 'settings_button_pressed':\n case 'scan_qr_popup_closed':\n return emit(eventType);\n\n // All other event listeners will receive unknown type of data.\n default:\n return emit(eventType as any, eventData);\n }\n } catch (cause) {\n log('error', 'Error processing event:', cause);\n }\n });\n\n return emitter;\n}\n\n/**\n * Returns singleton instance of bridge EventEmitter. Also, defines\n * Telegram event handlers.\n */\nexport function singletonEmitter(): EventEmitter {\n const wnd: any = window;\n const cachedEmitter = wnd[CACHED_EMITTER];\n\n if (cachedEmitter === undefined) {\n wnd[CACHED_EMITTER] = createEmitter();\n }\n\n return wnd[CACHED_EMITTER];\n}\n","import { singletonEmitter } from './emitter.js';\n\nimport type { EventName, EventListener } from './events.js';\n\n/**\n * Removes listener from specified event.\n * @param event - event to listen.\n * @param listener - event listener.\n */\nexport function off<E extends EventName>(event: E, listener: EventListener<E>): void {\n singletonEmitter().off(event, listener);\n}\n","import { singletonEmitter } from './emitter.js';\nimport { off } from './off.js';\n\nimport type { EventName, EventListener } from './events.js';\n\ntype StopListening = () => void;\n\n/**\n * Adds new listener to the specified event. Returns handler\n * which allows to stop listening to event.\n * @param event - event name.\n * @param listener - event listener.\n */\nexport function on<E extends EventName>(event: E, listener: EventListener<E>): StopListening {\n singletonEmitter().on(event, listener);\n return () => off(event, listener);\n}\n","import { singletonEmitter } from './emitter.js';\nimport { off } from './off.js';\n\nimport type { EventName, EventListener } from './events.js';\n\ntype StopListening = () => void;\n\n/**\n * Works the same as \"on\" method, but after catching the event, will remove event listener.\n * @param event - event name.\n * @param listener - event listener.\n */\nexport function once<E extends EventName>(event: E, listener: EventListener<E>): StopListening {\n singletonEmitter().once(event, listener);\n return () => off(event, listener);\n}\n","import { singletonEmitter } from './emitter.js';\n\nimport type { GlobalEventListener } from './events.js';\n\n/**\n * Removes global event listener.\n * @param listener - event listener.\n */\nexport function unsubscribe(listener: GlobalEventListener): void {\n singletonEmitter().unsubscribe(listener);\n}\n","import { singletonEmitter } from './emitter.js';\nimport { unsubscribe } from './unsubscribe.js';\n\nimport type { GlobalEventListener } from './events.js';\n\ntype StopListening = () => void;\n\n/**\n * Subscribes to all events sent from the native Telegram application.\n * Returns function used to remove added event listener.\n * @param listener - event listener.\n */\nexport function subscribe(listener: GlobalEventListener): StopListening {\n singletonEmitter().subscribe(listener);\n return () => unsubscribe(listener);\n}\n","import { isRecord } from '@tma.js/utils';\n\ntype AnyFunc = (...args: unknown[]) => unknown;\n\ntype WithExternalNotify<T> = T & {\n external: { notify: AnyFunc }\n};\n\ntype WithWebviewProxy<T> = T & {\n TelegramWebviewProxy: {\n postEvent: AnyFunc;\n }\n};\n\n/**\n * Returns true in case, passed value contains path `external.notify` property and `notify` is a\n * function.\n * @param value - value to check.\n */\nexport function hasExternalNotify<T extends {}>(value: T): value is WithExternalNotify<T> {\n return 'external' in value\n && isRecord(value.external)\n && 'notify' in value.external\n && typeof value.external.notify === 'function';\n}\n\n/**\n * Returns true in case, passed value contains path `TelegramWebviewProxy.postEvent` property and\n * `postEvent` is a function.\n * @param value - value to check.\n */\nexport function hasWebviewProxy<T extends {}>(value: T): value is WithWebviewProxy<T> {\n return 'TelegramWebviewProxy' in value\n && isRecord(value.TelegramWebviewProxy)\n && 'postEvent' in value.TelegramWebviewProxy\n && typeof value.TelegramWebviewProxy.postEvent === 'function';\n}\n\n/**\n * Returns true in case, current environment is iframe.\n * @see https://stackoverflow.com/a/326076\n */\nexport function isIframe(): boolean {\n try {\n return window.self !== window.top;\n } catch (e) {\n return true;\n }\n}\n","import {\n isIframe,\n hasExternalNotify,\n hasWebviewProxy,\n} from '../env.js';\nimport { targetOrigin as globalTargetOrigin } from '../globals.js';\n\nimport type {\n EmptyMethodName,\n MethodName,\n MethodParams,\n NonEmptyMethodName,\n} from './params.js';\n\ninterface PostEventOptions {\n /**\n * Origin used while posting message. This option is only used in case,\n * current environment is browser (Web version of Telegram) and could\n * be used for test purposes.\n * @default 'https://web.telegram.org'\n */\n targetOrigin?: string;\n}\n\nexport type PostEvent = typeof postEvent;\n\n/**\n * Sends event to native application which launched Web App. This function\n * accepts only events, which require arguments.\n * @param eventType - event name.\n * @param params - event parameters.\n * @param options - posting options.\n * @throws {Error} Bridge could not determine current\n * environment and possible way to send event.\n */\nexport function postEvent<E extends NonEmptyMethodName>(\n eventType: E,\n params: MethodParams<E>,\n options?: PostEventOptions,\n): void;\n\n/**\n * Sends event to native application which launched Web App. This function\n * accepts only events, which require arguments.\n * @param eventType - event name.\n * @param options - posting options.\n * @throws {Error} Bridge could not determine current\n * environment and possible way to send event.\n */\nexport function postEvent(eventType: EmptyMethodName, options?: PostEventOptions): void;\n\nexport function postEvent(\n eventType: MethodName,\n paramsOrOptions?: MethodParams<MethodName> | PostEventOptions,\n options?: PostEventOptions,\n): void {\n let postOptions: PostEventOptions = {};\n let eventData: any;\n\n if (paramsOrOptions === undefined && options === undefined) {\n // Parameters and options were not passed.\n postOptions = {};\n } else if (paramsOrOptions !== undefined && options !== undefined) {\n // Both parameters and options passed.\n postOptions = options;\n eventData = paramsOrOptions;\n } else if (paramsOrOptions !== undefined) {\n // Only parameters were passed.\n if ('targetOrigin' in paramsOrOptions) {\n postOptions = paramsOrOptions;\n } else {\n eventData = paramsOrOptions;\n }\n }\n const { targetOrigin = globalTargetOrigin() } = postOptions;\n\n // Telegram Web.\n if (isIframe()) {\n window.parent.postMessage(JSON.stringify({\n eventType,\n eventData,\n }), targetOrigin);\n return;\n }\n\n // Telegram for Windows Phone or Android.\n if (hasExternalNotify(window)) {\n window.external.notify(JSON.stringify({ eventType, eventData }));\n return;\n }\n\n // Telegram for iOS and macOS.\n if (hasWebviewProxy(window)) {\n window.TelegramWebviewProxy.postEvent(eventType, JSON.stringify(eventData));\n return;\n }\n\n // Otherwise current environment is unknown, and we are not able to send\n // event.\n throw new Error(\n 'Unable to determine current environment and possible way to send event.',\n );\n}\n","import { withTimeout, isRecord } from '@tma.js/utils';\n\nimport type { And, If, IsNever } from '@tma.js/util-types';\n\nimport { postEvent as defaultPostEvent, type PostEvent } from './methods/postEvent.js';\nimport { on, type EventName, type EventParams, type EventHasParams } from './events/index.js';\n\nimport type {\n EmptyMethodName, MethodHasParams,\n MethodName,\n MethodParams,\n NonEmptyMethodName,\n} from './methods/params.js';\n\n/**\n * Names of methods, which require passing \"req_id\" parameter.\n */\ntype MethodNameWithRequestId = {\n [Method in MethodName]: If<\n And<MethodHasParams<Method>, MethodParams<Method> extends { req_id: string } ? true : false>,\n Method,\n never\n >;\n}[MethodName];\n\n/**\n * Names of events, which contain \"req_id\" parameter.\n */\ntype EventNameWithRequestId = {\n [Event in EventName]: If<\n And<EventHasParams<Event>, EventParams<Event> extends { req_id: string } ? true : false>,\n Event,\n never\n >;\n}[EventName];\n\nexport interface RequestOptions {\n /**\n * Bridge postEvent method.\n * @default Global postEvent method.\n */\n postEvent?: PostEvent;\n\n /**\n * Execution timeout.\n */\n timeout?: number;\n}\n\nexport interface RequestOptionsAdvanced<EventPayload> extends RequestOptions {\n /**\n * Should return true in case, this event should be captured. If not specified,\n * request is not skipping captured events.\n */\n capture?: If<IsNever<EventPayload>, () => boolean, (payload: EventPayload) => boolean>;\n}\n\n/**\n * Calls specified TWA method and captures one of the specified events. Returns promise\n * which will be resolved in case, event with specified in method request identifier\n * was captured.\n * @param method - method to execute.\n * @param params - method parameters.\n * @param event - event or events to listen.\n * @param options - additional execution options.\n */\nexport function request<\n Method extends MethodNameWithRequestId,\n Event extends EventNameWithRequestId,\n>(\n method: Method,\n params: MethodParams<Method>,\n event: Event | Event[],\n options?: RequestOptions,\n): Promise<EventParams<Event>>;\n\n/**\n * Calls specified TWA method and captures one of the specified events. Returns promise\n * which will be resolved in case, specified event was captured.\n * @param method - method to execute.\n * @param event - event or events to listen.\n * @param options - additional execution options.\n */\nexport function request<Method extends EmptyMethodName, Event extends EventName>(\n method: Method,\n event: Event | Event[],\n options?: RequestOptionsAdvanced<EventParams<Event>>,\n): Promise<EventParams<Event>>;\n\n/**\n * Calls specified TWA method and captures one of the specified events. Returns promise\n * which will be resolved in case, specified event was captured.\n * @param method - method to execute\n * @param params - method parameters.\n * @param event - event or events to listen\n * @param options - additional execution options.\n */\nexport function request<Method extends NonEmptyMethodName, Event extends EventName>(\n method: Method,\n params: MethodParams<Method>,\n event: Event | Event[],\n options?: RequestOptionsAdvanced<EventParams<Event>>,\n): Promise<EventParams<Event>>;\n\nexport function request(\n method: MethodName,\n eventOrParams: EventName | EventName[] | EventParams<any>,\n eventOrOptions?: EventName | EventName[] | RequestOptions | RequestOptionsAdvanced<any>,\n options?: RequestOptions | RequestOptionsAdvanced<any>,\n): Promise<any> {\n let executionOptions: RequestOptions | RequestOptionsAdvanced<any> | undefined;\n let methodParams: EventParams<any> | undefined;\n let events: EventName[];\n let requestId: string | undefined;\n\n if (typeof eventOrParams === 'string' || Array.isArray(eventOrParams)) {\n // Override: [method, event, options?]\n events = Array.isArray(eventOrParams) ? eventOrParams : [eventOrParams] as EventName[];\n executionOptions = eventOrOptions as (RequestOptionsAdvanced<any> | undefined);\n } else {\n // Override: [method, params, event, options?]\n methodParams = eventOrParams as EventParams<any>;\n events = Array.isArray(eventOrOptions) ? eventOrOptions : [eventOrOptions] as EventName[];\n executionOptions = options;\n }\n\n // In case, method parameters were passed, and they contained request identifier, we should store\n // it and wait for the event with this identifier to occur.\n if (isRecord(methodParams) && typeof methodParams.req_id === 'string') {\n requestId = methodParams.req_id;\n }\n\n const { postEvent = defaultPostEvent, timeout } = executionOptions || {};\n const capture = executionOptions && 'capture' in executionOptions\n ? executionOptions.capture\n : null;\n\n const promise = new Promise((res, rej) => {\n // Iterate over each event and create event listener.\n const stoppers = events.map((ev) => on(ev, (data?) => {\n // If request identifier was specified, we are waiting for event with the same value\n // to occur.\n if (typeof requestId === 'string' && (!isRecord(data) || data.req_id !== requestId)) {\n return;\n }\n\n if (typeof capture === 'function' && !capture(data)) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n stopListening();\n res(data);\n }));\n\n // Function which removes all event listeners.\n const stopListening = () => stoppers.forEach((stop) => stop());\n\n try {\n // We are wrapping this call in try catch, because it can throw errors in case,\n // compatibility check was enabled. We want an error to be captured by promise, not by\n // another one external try catch.\n postEvent(method as any, methodParams);\n } catch (e) {\n stopListening();\n rej(e);\n }\n });\n\n return typeof timeout === 'number' ? withTimeout(promise, timeout) : promise;\n}\n","import { compareVersions, type Version } from '@tma.js/utils';\n\nimport type {\n HasCheckSupportMethodParam,\n HasCheckSupportMethodName,\n MethodName,\n MethodParams,\n NonEmptyMethodName,\n} from './methods/index.js';\n\nfunction lessOrEqual(a: Version, b: Version): boolean {\n return compareVersions(a, b) <= 0;\n}\n\n/**\n * By specified method and parameters extracts properties which could be used by\n * supports function as TWA method parameter.\n * @param method - TWA method.\n * @param params - method parameters.\n */\nexport function detectSupportParams<M extends NonEmptyMethodName>(\n method: M,\n params: MethodParams<M>,\n): HasCheckSupportMethodParam<HasCheckSupportMethodName>[] {\n if (method === 'web_app_open_link') {\n if ('try_instant_view' in params) {\n return ['try_instant_view'];\n }\n }\n\n if (method === 'web_app_set_header_color') {\n if ('color' in params) {\n return ['color'];\n }\n }\n\n return [];\n}\n\n/**\n * Returns true in case, passed parameter in specified method is supported.\n * @param method - method name\n * @param param - method parameter\n * @param inVersion - platform version.\n */\nexport function supports<M extends HasCheckSupportMethodName>(\n method: M,\n param: HasCheckSupportMethodParam<M>,\n inVersion: Version,\n): boolean;\n/**\n * Returns true in case, specified method is supported in passed version.\n * @param method - method name.\n * @param inVersion - platform version.\n */\nexport function supports(method: MethodName, inVersion: Version): boolean;\nexport function supports(\n method: MethodName,\n paramOrVersion: Version | string,\n inVersion?: string,\n): boolean {\n // Method name, parameter, target version.\n if (typeof inVersion === 'string') {\n if (method === 'web_app_open_link') {\n if (paramOrVersion === 'try_instant_view') {\n return lessOrEqual('6.4', inVersion);\n }\n }\n\n if (method === 'web_app_set_header_color') {\n if (paramOrVersion === 'color') {\n return lessOrEqual('6.9', inVersion);\n }\n }\n }\n\n // Method name, target version.\n switch (method) {\n case 'web_app_open_tg_link':\n case 'web_app_open_invoice':\n case 'web_app_setup_back_button':\n case 'web_app_set_background_color':\n case 'web_app_set_header_color':\n case 'web_app_trigger_haptic_feedback':\n return lessOrEqual('6.1', paramOrVersion);\n case 'web_app_open_popup':\n return lessOrEqual('6.2', paramOrVersion);\n case 'web_app_close_scan_qr_popup':\n case 'web_app_open_scan_qr_popup':\n case 'web_app_read_text_from_clipboard':\n return lessOrEqual('6.4', paramOrVersion);\n case 'web_app_invoke_custom_method':\n case 'web_app_request_write_access':\n case 'web_app_request_phone':\n return lessOrEqual('6.9', paramOrVersion);\n default:\n return true;\n }\n}\n"],"names":["currentDebug","currentTargetOrigin","setDebug","value","setTargetOrigin","targetOrigin","log","level","args","utilLog","isNullOrUndefined","themeChangedPayload","json","theme_params","bg_color","rgb","optional","text_color","hint_color","link_color","button_color","button_text_color","secondary_bg_color","viewportChangedPayload","height","number","width","default","window","innerWidth","is_state_stable","boolean","is_expanded","popupClosedPayload","button_id","string","qrTextReceivedPayload","data","invoiceClosedPayload","slug","status","clipboardTextReceivedPayload","req_id","parse","writeAccessRequestedPayload","phoneRequestedPayload","customMethodInvokedPayload","result","error","eventDataJson","eventType","eventData","emitEvent","dispatchEvent","MessageEvent","JSON","stringify","onTelegramEvent","cb","wnd","forEach","path","pointer","item","idx","arr","length","defineEventHandlers","addEventListener","event","CACHED_EMITTER","singletonEmitter","undefined","emitter","UtilEventEmitter","emit","innerHeight","cause","createEmitter","off","listener","on","once","unsubscribe","subscribe","hasExternalNotify","isRecord","external","notify","hasWebviewProxy","TelegramWebviewProxy","postEvent","isIframe","self","top","e","paramsOrOptions","options","postOptions","globalTargetOrigin","parent","postMessage","Error","request","method","eventOrParams","eventOrOptions","executionOptions","methodParams","events","requestId","Array","isArray","defaultPostEvent","timeout","capture","promise","Promise","res","rej","stoppers","map","ev","stopListening","stop","withTimeout","lessOrEqual","a","b","compareVersions","detectSupportParams","params","supports","paramOrVersion","inVersion"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../src/globals.ts","../../src/events/parsing.ts","../../src/events/onTelegramEvent.ts","../../src/events/emitter.ts","../../src/events/off.ts","../../src/events/on.ts","../../src/events/once.ts","../../src/events/unsubscribe.ts","../../src/events/subscribe.ts","../../src/env.ts","../../src/methods/postEvent.ts","../../src/request.ts","../../src/supports.ts"],"sourcesContent":["import { log as utilLog } from '@tma.js/logger';\n\nlet currentDebug = false;\nlet currentTargetOrigin = 'https://web.telegram.org';\n\n/**\n * Sets new debug mode. Enabling debug mode leads to printing\n * additional messages in console, related to the processes\n * inside the package.\n * @param value - should debug mode be enabled.\n */\nexport function setDebug(value: boolean): void {\n currentDebug = value;\n}\n\n/**\n * Sets new global targetOrigin, used by `postEvent` method.\n * Default value is \"https://web.telegram.org\". You don't need to\n * use this method until you know what you are doing.\n *\n * This method could be used for test purposes.\n * @param value - new target origin.\n */\nexport function setTargetOrigin(value: string): void {\n currentTargetOrigin = value;\n}\n\n/**\n * Returns current global target origin.\n */\nexport function targetOrigin(): string {\n return currentTargetOrigin;\n}\n\n/**\n * Logs message in case, debug mode is enabled.\n * @param level - log level\n * @param args - values to print.\n */\nexport const log: typeof utilLog = (level, ...args) => {\n if (currentDebug) {\n utilLog(level, '[Bridge]', ...args);\n }\n};\n","import {\n number,\n string,\n boolean,\n json,\n rgb,\n} from '@tma.js/parsing';\n\nimport type {\n ClipboardTextReceivedPayload, CustomMethodInvokedPayload,\n InvoiceClosedPayload, PhoneRequestedPayload,\n PopupClosedPayload, QrTextReceivedPayload,\n ThemeChangedPayload,\n ViewportChangedPayload, WriteAccessRequestedPayload,\n} from './payloads.js';\n\nfunction isNullOrUndefined(value: unknown): boolean {\n return value === null || value === undefined;\n}\n\n/**\n * Parses incoming value as ThemeChangedPayload.\n */\nexport const themeChangedPayload = json<ThemeChangedPayload>({\n theme_params: json<ThemeChangedPayload['theme_params']>({\n bg_color: rgb().optional(),\n text_color: rgb().optional(),\n hint_color: rgb().optional(),\n link_color: rgb().optional(),\n button_color: rgb().optional(),\n button_text_color: rgb().optional(),\n secondary_bg_color: rgb().optional(),\n }),\n});\n\n/**\n * Parses incoming value as ViewportChangedPayload.\n * @param value - value to parse.\n */\nexport const viewportChangedPayload = json<ViewportChangedPayload>({\n height: number(),\n width: number().optional(isNullOrUndefined).default(() => window.innerWidth),\n is_state_stable: boolean(),\n is_expanded: boolean(),\n});\n\n/**\n * Parses incoming value as PopupClosedPayload.\n */\nexport const popupClosedPayload = json<PopupClosedPayload>({\n button_id: string().optional(isNullOrUndefined),\n});\n\n/**\n * Parses incoming value as QrTextReceivedPayload.\n */\nexport const qrTextReceivedPayload = json<QrTextReceivedPayload>({\n data: string().optional(),\n});\n\n/**\n * Parses incoming value as InvoiceClosedPayload.\n */\nexport const invoiceClosedPayload = json<InvoiceClosedPayload>({\n slug: string(),\n status: string(),\n});\n\n/**\n * Parses incoming value as clipboard text received payload.\n */\nexport const clipboardTextReceivedPayload = json<ClipboardTextReceivedPayload>({\n req_id: string(),\n data: (value) => (value === null ? value : string().optional().parse(value)),\n});\n\n/**\n * Parses incoming value as WriteAccessRequestedPayload.\n */\nexport const writeAccessRequestedPayload = json<WriteAccessRequestedPayload>({ status: string() });\n\n/**\n * Parses incoming value as PhoneRequestedPayload.\n */\nexport const phoneRequestedPayload = json<PhoneRequestedPayload>({ status: string() });\n\n/**\n * Parses incoming value as CustomMethodInvokedPayload.\n */\nexport const customMethodInvokedPayload = json<CustomMethodInvokedPayload>({\n req_id: string(),\n result: (value) => value,\n error: string().optional(),\n});\n","import { json, string } from '@tma.js/parsing';\n\n/**\n * Extracts event data from native application event.\n */\nconst eventDataJson = json<{ eventType: string; eventData?: unknown }>({\n eventType: string(),\n eventData: (value) => value,\n});\n\n/**\n * Emits event sent from Telegram native application like it was sent in\n * default web environment between 2 iframes. It dispatches new MessageEvent\n * and expects it to be handled via `window.addEventListener('message', ...)`\n * as developer would do it to handle messages sent from parent iframe.\n * @param eventType - event name.\n * @param eventData - event payload.\n */\nfunction emitEvent(eventType: string, eventData: unknown): void {\n window.dispatchEvent(new MessageEvent('message', {\n data: JSON.stringify({ eventType, eventData }),\n }));\n}\n\n/**\n * Defines special handlers by known paths, which are recognized by\n * Telegram as ports to receive events. This function also sets special\n * function in global window object to prevent duplicate declaration.\n */\nfunction defineEventHandlers(): void {\n const wnd: any = window;\n\n // Prevent from duplicate event handlers definition.\n if ('TelegramGameProxy_receiveEvent' in wnd) {\n return;\n }\n\n // Iterate over each path, where \"receiveEvent\" function should be\n // defined. This function is called by external environment in case,\n // it wants to emit some event.\n [\n ['TelegramGameProxy_receiveEvent'], // Windows Phone.\n ['TelegramGameProxy', 'receiveEvent'], // Desktop.\n ['Telegram', 'WebView', 'receiveEvent'], // Android and iOS.\n ].forEach((path) => {\n // Path starts from \"window\" object.\n let pointer = wnd;\n\n path.forEach((item, idx, arr) => {\n // We are on the last iteration, where function property name is passed.\n if (idx === arr.length - 1) {\n pointer[item] = emitEvent;\n return;\n }\n\n if (!(item in pointer)) {\n pointer[item] = {};\n }\n pointer = pointer[item];\n });\n });\n}\n\n/**\n * Adds listener to window \"message\" event assuming, that this event could\n * be sent by Telegram native application. Calls passed callback with event\n * type and data.\n * @param cb - callback to call.\n */\nexport function onTelegramEvent(cb: (eventType: string, eventData: unknown) => void): void {\n // Define event handlers to make sure, message handler will work correctly.\n defineEventHandlers();\n\n // We expect Telegram to send us new event through \"message\" event.\n window.addEventListener('message', (event) => {\n try {\n const { eventType, eventData } = eventDataJson.parse(event.data);\n cb(eventType, eventData);\n } catch {\n // We ignore incorrect messages as they could be generated by any other code.\n }\n });\n}\n","import { EventEmitter as UtilEventEmitter } from '@tma.js/event-emitter';\nimport { string } from '@tma.js/parsing';\n\nimport { log } from '../globals.js';\nimport {\n clipboardTextReceivedPayload,\n customMethodInvokedPayload,\n invoiceClosedPayload,\n phoneRequestedPayload,\n popupClosedPayload,\n qrTextReceivedPayload,\n themeChangedPayload,\n viewportChangedPayload,\n writeAccessRequestedPayload,\n} from './parsing.js';\nimport { onTelegramEvent } from './onTelegramEvent.js';\n\nimport type { EventEmitter, EventName } from './events.js';\n\nconst CACHED_EMITTER = '__telegram-cached-emitter__';\n\n/**\n * Returns event emitter which could be safely used, to process events from\n * Telegram native application.\n */\nexport function createEmitter(): EventEmitter {\n const emitter: EventEmitter = new UtilEventEmitter();\n const emit: EventEmitter['emit'] = (event: any, ...data: any[]) => {\n log('log', 'Emitting processed event:', event, ...data);\n emitter.emit(event, ...data);\n };\n\n // Desktop version of Telegram is sometimes not sending the viewport_changed\n // event. For example, when main button is shown. That's why we should\n // add our own listener to make sure, viewport information is always fresh.\n // Issue: https://github.com/Telegram-Web-Apps/tma.js/issues/10\n window.addEventListener('resize', () => {\n emit('viewport_changed', {\n width: window.innerWidth,\n height: window.innerHeight,\n is_state_stable: true,\n is_expanded: true,\n });\n });\n\n // In case, any Telegram event was received, we should prepare data before\n // passing it to emitter.\n onTelegramEvent((eventType: EventName | string, eventData): void => {\n log('log', 'Received raw event:', eventType, eventData);\n\n try {\n switch (eventType) {\n case 'viewport_changed':\n return emit(eventType, viewportChangedPayload.parse(eventData));\n\n case 'theme_changed':\n return emit(eventType, themeChangedPayload.parse(eventData));\n\n case 'popup_closed':\n // FIXME: Payloads are different on different platforms.\n // Issue: https://github.com/Telegram-Web-Apps/tma.js/issues/2\n if (\n // Sent on desktop.\n eventData === undefined\n // Sent on iOS.\n || eventData === null\n ) {\n return emit(eventType, {});\n }\n return emit(eventType, popupClosedPayload.parse(eventData));\n\n case 'set_custom_style':\n return emit(eventType, string().parse(eventData));\n\n case 'qr_text_received':\n return emit(eventType, qrTextReceivedPayload.parse(eventData));\n\n case 'clipboard_text_received':\n return emit(eventType, clipboardTextReceivedPayload.parse(eventData));\n\n case 'invoice_closed':\n return emit(eventType, invoiceClosedPayload.parse(eventData));\n\n case 'phone_requested':\n return emit('phone_requested', phoneRequestedPayload.parse(eventData));\n\n case 'custom_method_invoked':\n return emit('custom_method_invoked', customMethodInvokedPayload.parse(eventData));\n\n case 'write_access_requested':\n return emit('write_access_requested', writeAccessRequestedPayload.parse(eventData));\n\n // Events which have no parameters.\n case 'main_button_pressed':\n case 'back_button_pressed':\n case 'settings_button_pressed':\n case 'scan_qr_popup_closed':\n return emit(eventType);\n\n // All other event listeners will receive unknown type of data.\n default:\n return emit(eventType as any, eventData);\n }\n } catch (cause) {\n log('error', 'Error processing event:', cause);\n }\n });\n\n return emitter;\n}\n\n/**\n * Returns singleton instance of bridge EventEmitter. Also, defines\n * Telegram event handlers.\n */\nexport function singletonEmitter(): EventEmitter {\n const wnd: any = window;\n const cachedEmitter = wnd[CACHED_EMITTER];\n\n if (cachedEmitter === undefined) {\n wnd[CACHED_EMITTER] = createEmitter();\n }\n\n return wnd[CACHED_EMITTER];\n}\n","import { singletonEmitter } from './emitter.js';\n\nimport type { EventName, EventListener } from './events.js';\n\n/**\n * Removes listener from specified event.\n * @param event - event to listen.\n * @param listener - event listener.\n */\nexport function off<E extends EventName>(event: E, listener: EventListener<E>): void {\n singletonEmitter().off(event, listener);\n}\n","import { singletonEmitter } from './emitter.js';\nimport { off } from './off.js';\n\nimport type { EventName, EventListener } from './events.js';\n\ntype StopListening = () => void;\n\n/**\n * Adds new listener to the specified event. Returns handler\n * which allows to stop listening to event.\n * @param event - event name.\n * @param listener - event listener.\n */\nexport function on<E extends EventName>(event: E, listener: EventListener<E>): StopListening {\n singletonEmitter().on(event, listener);\n return () => off(event, listener);\n}\n","import { singletonEmitter } from './emitter.js';\nimport { off } from './off.js';\n\nimport type { EventName, EventListener } from './events.js';\n\ntype StopListening = () => void;\n\n/**\n * Works the same as \"on\" method, but after catching the event, will remove event listener.\n * @param event - event name.\n * @param listener - event listener.\n */\nexport function once<E extends EventName>(event: E, listener: EventListener<E>): StopListening {\n singletonEmitter().once(event, listener);\n return () => off(event, listener);\n}\n","import { singletonEmitter } from './emitter.js';\n\nimport type { GlobalEventListener } from './events.js';\n\n/**\n * Removes global event listener.\n * @param listener - event listener.\n */\nexport function unsubscribe(listener: GlobalEventListener): void {\n singletonEmitter().unsubscribe(listener);\n}\n","import { singletonEmitter } from './emitter.js';\nimport { unsubscribe } from './unsubscribe.js';\n\nimport type { GlobalEventListener } from './events.js';\n\ntype StopListening = () => void;\n\n/**\n * Subscribes to all events sent from the native Telegram application.\n * Returns function used to remove added event listener.\n * @param listener - event listener.\n */\nexport function subscribe(listener: GlobalEventListener): StopListening {\n singletonEmitter().subscribe(listener);\n return () => unsubscribe(listener);\n}\n","import { isRecord } from '@tma.js/utils';\n\ntype AnyFunc = (...args: unknown[]) => unknown;\n\ntype WithExternalNotify<T> = T & {\n external: { notify: AnyFunc }\n};\n\ntype WithWebviewProxy<T> = T & {\n TelegramWebviewProxy: {\n postEvent: AnyFunc;\n }\n};\n\n/**\n * Returns true in case, passed value contains path `external.notify` property and `notify` is a\n * function.\n * @param value - value to check.\n */\nexport function hasExternalNotify<T extends {}>(value: T): value is WithExternalNotify<T> {\n return 'external' in value\n && isRecord(value.external)\n && 'notify' in value.external\n && typeof value.external.notify === 'function';\n}\n\n/**\n * Returns true in case, passed value contains path `TelegramWebviewProxy.postEvent` property and\n * `postEvent` is a function.\n * @param value - value to check.\n */\nexport function hasWebviewProxy<T extends {}>(value: T): value is WithWebviewProxy<T> {\n return 'TelegramWebviewProxy' in value\n && isRecord(value.TelegramWebviewProxy)\n && 'postEvent' in value.TelegramWebviewProxy\n && typeof value.TelegramWebviewProxy.postEvent === 'function';\n}\n\n/**\n * Returns true in case, current environment is iframe.\n * @see https://stackoverflow.com/a/326076\n */\nexport function isIframe(): boolean {\n try {\n return window.self !== window.top;\n } catch (e) {\n return true;\n }\n}\n","import {\n isIframe,\n hasExternalNotify,\n hasWebviewProxy,\n} from '../env.js';\nimport { targetOrigin as globalTargetOrigin } from '../globals.js';\n\nimport type {\n EmptyMethodName,\n MethodName,\n MethodParams,\n NonEmptyMethodName,\n} from './params.js';\n\ninterface PostEventOptions {\n /**\n * Origin used while posting message. This option is only used in case,\n * current environment is browser (Web version of Telegram) and could\n * be used for test purposes.\n * @default 'https://web.telegram.org'\n */\n targetOrigin?: string;\n}\n\nexport type PostEvent = typeof postEvent;\n\n/**\n * Sends event to native application which launched Web App. This function\n * accepts only events, which require arguments.\n * @param eventType - event name.\n * @param params - event parameters.\n * @param options - posting options.\n * @throws {Error} Bridge could not determine current\n * environment and possible way to send event.\n */\nexport function postEvent<E extends NonEmptyMethodName>(\n eventType: E,\n params: MethodParams<E>,\n options?: PostEventOptions,\n): void;\n\n/**\n * Sends event to native application which launched Web App. This function\n * accepts only events, which require arguments.\n * @param eventType - event name.\n * @param options - posting options.\n * @throws {Error} Bridge could not determine current\n * environment and possible way to send event.\n */\nexport function postEvent(eventType: EmptyMethodName, options?: PostEventOptions): void;\n\nexport function postEvent(\n eventType: MethodName,\n paramsOrOptions?: MethodParams<MethodName> | PostEventOptions,\n options?: PostEventOptions,\n): void {\n let postOptions: PostEventOptions = {};\n let eventData: any;\n\n if (paramsOrOptions === undefined && options === undefined) {\n // Parameters and options were not passed.\n postOptions = {};\n } else if (paramsOrOptions !== undefined && options !== undefined) {\n // Both parameters and options passed.\n postOptions = options;\n eventData = paramsOrOptions;\n } else if (paramsOrOptions !== undefined) {\n // Only parameters were passed.\n if ('targetOrigin' in paramsOrOptions) {\n postOptions = paramsOrOptions;\n } else {\n eventData = paramsOrOptions;\n }\n }\n const { targetOrigin = globalTargetOrigin() } = postOptions;\n\n // Telegram Web.\n if (isIframe()) {\n window.parent.postMessage(JSON.stringify({\n eventType,\n eventData,\n }), targetOrigin);\n return;\n }\n\n // Telegram for Windows Phone or Android.\n if (hasExternalNotify(window)) {\n window.external.notify(JSON.stringify({ eventType, eventData }));\n return;\n }\n\n // Telegram for iOS and macOS.\n if (hasWebviewProxy(window)) {\n window.TelegramWebviewProxy.postEvent(eventType, JSON.stringify(eventData));\n return;\n }\n\n // Otherwise current environment is unknown, and we are not able to send\n // event.\n throw new Error(\n 'Unable to determine current environment and possible way to send event.',\n );\n}\n","import { withTimeout, isRecord } from '@tma.js/utils';\n\nimport type { And, If, IsNever } from '@tma.js/util-types';\n\nimport { postEvent as defaultPostEvent, type PostEvent } from './methods/postEvent.js';\nimport { on, type EventName, type EventParams, type EventHasParams } from './events/index.js';\n\nimport type {\n EmptyMethodName, MethodHasParams,\n MethodName,\n MethodParams,\n NonEmptyMethodName,\n} from './methods/params.js';\n\n/**\n * Names of methods, which require passing \"req_id\" parameter.\n */\ntype MethodNameWithRequestId = {\n [Method in MethodName]: If<\n And<MethodHasParams<Method>, MethodParams<Method> extends { req_id: string } ? true : false>,\n Method,\n never\n >;\n}[MethodName];\n\n/**\n * Names of events, which contain \"req_id\" parameter.\n */\ntype EventNameWithRequestId = {\n [Event in EventName]: If<\n And<EventHasParams<Event>, EventParams<Event> extends { req_id: string } ? true : false>,\n Event,\n never\n >;\n}[EventName];\n\nexport interface RequestOptions {\n /**\n * Bridge postEvent method.\n * @default Global postEvent method.\n */\n postEvent?: PostEvent;\n\n /**\n * Execution timeout.\n */\n timeout?: number;\n}\n\nexport interface RequestOptionsAdvanced<EventPayload> extends RequestOptions {\n /**\n * Should return true in case, this event should be captured. If not specified,\n * request is not skipping captured events.\n */\n capture?: If<IsNever<EventPayload>, () => boolean, (payload: EventPayload) => boolean>;\n}\n\n/**\n * Calls specified TWA method and captures one of the specified events. Returns promise\n * which will be resolved in case, event with specified in method request identifier\n * was captured.\n * @param method - method to execute.\n * @param params - method parameters.\n * @param event - event or events to listen.\n * @param options - additional execution options.\n */\nexport function request<\n Method extends MethodNameWithRequestId,\n Event extends EventNameWithRequestId,\n>(\n method: Method,\n params: MethodParams<Method>,\n event: Event | Event[],\n options?: RequestOptions,\n): Promise<EventParams<Event>>;\n\n/**\n * Calls specified TWA method and captures one of the specified events. Returns promise\n * which will be resolved in case, specified event was captured.\n * @param method - method to execute.\n * @param event - event or events to listen.\n * @param options - additional execution options.\n */\nexport function request<Method extends EmptyMethodName, Event extends EventName>(\n method: Method,\n event: Event | Event[],\n options?: RequestOptionsAdvanced<EventParams<Event>>,\n): Promise<EventParams<Event>>;\n\n/**\n * Calls specified TWA method and captures one of the specified events. Returns promise\n * which will be resolved in case, specified event was captured.\n * @param method - method to execute\n * @param params - method parameters.\n * @param event - event or events to listen\n * @param options - additional execution options.\n */\nexport function request<Method extends NonEmptyMethodName, Event extends EventName>(\n method: Method,\n params: MethodParams<Method>,\n event: Event | Event[],\n options?: RequestOptionsAdvanced<EventParams<Event>>,\n): Promise<EventParams<Event>>;\n\nexport function request(\n method: MethodName,\n eventOrParams: EventName | EventName[] | EventParams<any>,\n eventOrOptions?: EventName | EventName[] | RequestOptions | RequestOptionsAdvanced<any>,\n options?: RequestOptions | RequestOptionsAdvanced<any>,\n): Promise<any> {\n let executionOptions: RequestOptions | RequestOptionsAdvanced<any> | undefined;\n let methodParams: EventParams<any> | undefined;\n let events: EventName[];\n let requestId: string | undefined;\n\n if (typeof eventOrParams === 'string' || Array.isArray(eventOrParams)) {\n // Override: [method, event, options?]\n events = Array.isArray(eventOrParams) ? eventOrParams : [eventOrParams] as EventName[];\n executionOptions = eventOrOptions as (RequestOptionsAdvanced<any> | undefined);\n } else {\n // Override: [method, params, event, options?]\n methodParams = eventOrParams as EventParams<any>;\n events = Array.isArray(eventOrOptions) ? eventOrOptions : [eventOrOptions] as EventName[];\n executionOptions = options;\n }\n\n // In case, method parameters were passed, and they contained request identifier, we should store\n // it and wait for the event with this identifier to occur.\n if (isRecord(methodParams) && typeof methodParams.req_id === 'string') {\n requestId = methodParams.req_id;\n }\n\n const { postEvent = defaultPostEvent, timeout } = executionOptions || {};\n const capture = executionOptions && 'capture' in executionOptions\n ? executionOptions.capture\n : null;\n\n const promise = new Promise((res, rej) => {\n // Iterate over each event and create event listener.\n const stoppers = events.map((ev) => on(ev, (data?) => {\n // If request identifier was specified, we are waiting for event with the same value\n // to occur.\n if (typeof requestId === 'string' && (!isRecord(data) || data.req_id !== requestId)) {\n return;\n }\n\n if (typeof capture === 'function' && !capture(data)) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n stopListening();\n res(data);\n }));\n\n // Function which removes all event listeners.\n const stopListening = () => stoppers.forEach((stop) => stop());\n\n try {\n // We are wrapping this call in try catch, because it can throw errors in case,\n // compatibility check was enabled. We want an error to be captured by promise, not by\n // another one external try catch.\n postEvent(method as any, methodParams);\n } catch (e) {\n stopListening();\n rej(e);\n }\n });\n\n return typeof timeout === 'number' ? withTimeout(promise, timeout) : promise;\n}\n","import { compareVersions, type Version } from '@tma.js/utils';\n\nimport type {\n HasCheckSupportMethodParam,\n HasCheckSupportMethodName,\n MethodName,\n MethodParams,\n NonEmptyMethodName,\n} from './methods/index.js';\n\nfunction lessOrEqual(a: Version, b: Version): boolean {\n return compareVersions(a, b) <= 0;\n}\n\n/**\n * By specified method and parameters extracts properties which could be used by\n * supports function as TWA method parameter.\n * @param method - TWA method.\n * @param params - method parameters.\n */\nexport function detectSupportParams<M extends NonEmptyMethodName>(\n method: M,\n params: MethodParams<M>,\n): HasCheckSupportMethodParam<HasCheckSupportMethodName>[] {\n if (method === 'web_app_open_link') {\n if ('try_instant_view' in params) {\n return ['try_instant_view'];\n }\n }\n\n if (method === 'web_app_set_header_color') {\n if ('color' in params) {\n return ['color'];\n }\n }\n\n return [];\n}\n\n/**\n * Returns true in case, passed parameter in specified method is supported.\n * @param method - method name\n * @param param - method parameter\n * @param inVersion - platform version.\n */\nexport function supports<M extends HasCheckSupportMethodName>(\n method: M,\n param: HasCheckSupportMethodParam<M>,\n inVersion: Version,\n): boolean;\n/**\n * Returns true in case, specified method is supported in passed version.\n * @param method - method name.\n * @param inVersion - platform version.\n */\nexport function supports(method: MethodName, inVersion: Version): boolean;\nexport function supports(\n method: MethodName,\n paramOrVersion: Version | string,\n inVersion?: string,\n): boolean {\n // Method name, parameter, target version.\n if (typeof inVersion === 'string') {\n if (method === 'web_app_open_link') {\n if (paramOrVersion === 'try_instant_view') {\n return lessOrEqual('6.4', inVersion);\n }\n }\n\n if (method === 'web_app_set_header_color') {\n if (paramOrVersion === 'color') {\n return lessOrEqual('6.9', inVersion);\n }\n }\n }\n\n // Method name, target version.\n switch (method) {\n case 'web_app_open_tg_link':\n case 'web_app_open_invoice':\n case 'web_app_setup_back_button':\n case 'web_app_set_background_color':\n case 'web_app_set_header_color':\n case 'web_app_trigger_haptic_feedback':\n return lessOrEqual('6.1', paramOrVersion);\n case 'web_app_open_popup':\n return lessOrEqual('6.2', paramOrVersion);\n case 'web_app_close_scan_qr_popup':\n case 'web_app_open_scan_qr_popup':\n case 'web_app_read_text_from_clipboard':\n return lessOrEqual('6.4', paramOrVersion);\n case 'web_app_invoke_custom_method':\n case 'web_app_request_write_access':\n case 'web_app_request_phone':\n return lessOrEqual('6.9', paramOrVersion);\n default:\n return true;\n }\n}\n"],"names":["currentDebug","currentTargetOrigin","setDebug","value","setTargetOrigin","targetOrigin","log","level","args","utilLog","isNullOrUndefined","themeChangedPayload","json","theme_params","bg_color","rgb","optional","text_color","hint_color","link_color","button_color","button_text_color","secondary_bg_color","viewportChangedPayload","height","number","width","default","window","innerWidth","is_state_stable","boolean","is_expanded","popupClosedPayload","button_id","string","qrTextReceivedPayload","data","invoiceClosedPayload","slug","status","clipboardTextReceivedPayload","req_id","parse","writeAccessRequestedPayload","phoneRequestedPayload","customMethodInvokedPayload","result","error","eventDataJson","eventType","eventData","emitEvent","dispatchEvent","MessageEvent","JSON","stringify","onTelegramEvent","cb","wnd","forEach","path","pointer","item","idx","arr","length","defineEventHandlers","addEventListener","event","CACHED_EMITTER","singletonEmitter","undefined","emitter","UtilEventEmitter","emit","innerHeight","cause","createEmitter","off","listener","on","once","unsubscribe","subscribe","hasExternalNotify","isRecord","external","notify","hasWebviewProxy","TelegramWebviewProxy","postEvent","isIframe","self","top","e","paramsOrOptions","options","postOptions","globalTargetOrigin","parent","postMessage","Error","request","method","eventOrParams","eventOrOptions","executionOptions","methodParams","events","requestId","Array","isArray","defaultPostEvent","timeout","capture","promise","Promise","res","rej","stoppers","map","ev","stopListening","stop","withTimeout","lessOrEqual","a","b","compareVersions","detectSupportParams","params","supports","paramOrVersion","inVersion"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tma.js/bridge",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.3",
|
|
4
4
|
"description": "Communication layer between Telegram and frontend applications.",
|
|
5
5
|
"author": "Vladislav Kibenko <wolfram.deus@gmail.com>",
|
|
6
6
|
"homepage": "https://github.com/Telegram-Mini-Apps/tma.js#readme",
|
package/src/events/emitter.ts
CHANGED
|
@@ -35,7 +35,7 @@ export function createEmitter(): EventEmitter {
|
|
|
35
35
|
// add our own listener to make sure, viewport information is always fresh.
|
|
36
36
|
// Issue: https://github.com/Telegram-Web-Apps/tma.js/issues/10
|
|
37
37
|
window.addEventListener('resize', () => {
|
|
38
|
-
|
|
38
|
+
emit('viewport_changed', {
|
|
39
39
|
width: window.innerWidth,
|
|
40
40
|
height: window.innerHeight,
|
|
41
41
|
is_state_stable: true,
|