@tma.js/bridge 1.3.10 → 1.3.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,15 +1,15 @@
1
- import { isRecord as f, withTimeout as C, compareVersions as N } from "@tma.js/utils";
2
- import { Logger as T } from "@tma.js/logger";
3
- import { EventEmitter as J } from "@tma.js/event-emitter";
4
- import { rgb as S, number as q, createValueParserGen as G, json as s, boolean as x, string as i } from "@tma.js/parsing";
1
+ import { isRecord as f, withTimeout as R, compareVersions as N } from "@tma.js/utils";
2
+ import { Logger as J } from "@tma.js/logger";
3
+ import { EventEmitter as S } from "@tma.js/event-emitter";
4
+ import { rgb as T, number as q, createValueParserGenerator as G, json as s, boolean as x, string as i } from "@tma.js/parsing";
5
5
  let v = "https://web.telegram.org";
6
- const d = new T("[Bridge]", !1);
6
+ const u = new J("[Bridge]", !1);
7
7
  function ue(e) {
8
8
  if (e) {
9
- d.enable();
9
+ u.enable();
10
10
  return;
11
11
  }
12
- d.disable();
12
+ u.disable();
13
13
  }
14
14
  function de(e) {
15
15
  v = e;
@@ -20,17 +20,19 @@ function I() {
20
20
  function L(e) {
21
21
  return e == null;
22
22
  }
23
- const a = S().optional(), M = q(), H = G((e) => e == null ? window.innerWidth : M.parse(e)), U = s({
23
+ const _ = T().optional(), M = q(), H = G(
24
+ (e) => e == null ? window.innerWidth : M.parse(e)
25
+ ), $ = s({
24
26
  theme_params: s({
25
- bg_color: a,
26
- text_color: a,
27
- hint_color: a,
28
- link_color: a,
29
- button_color: a,
30
- button_text_color: a,
31
- secondary_bg_color: a
27
+ bg_color: _,
28
+ text_color: _,
29
+ hint_color: _,
30
+ link_color: _,
31
+ button_color: _,
32
+ button_text_color: _,
33
+ secondary_bg_color: _
32
34
  })
33
- }), $ = s({
35
+ }), U = s({
34
36
  height: q(),
35
37
  width: H(),
36
38
  is_state_stable: x(),
@@ -89,8 +91,8 @@ function D(e) {
89
91
  }
90
92
  const b = "__telegram-cached-emitter__";
91
93
  function O() {
92
- const e = new J(), t = (r, ...n) => {
93
- d.log("Emitting processed event:", r, ...n), e.emit(r, ...n);
94
+ const e = new S(), t = (r, ...n) => {
95
+ u.log("Emitting processed event:", r, ...n), e.emit(r, ...n);
94
96
  };
95
97
  return window.addEventListener("resize", () => {
96
98
  t("viewport_changed", {
@@ -100,13 +102,13 @@ function O() {
100
102
  is_expanded: !0
101
103
  });
102
104
  }), D((r, n) => {
103
- d.log("Received raw event:", r, n);
105
+ u.log("Received raw event:", r, n);
104
106
  try {
105
107
  switch (r) {
106
108
  case "viewport_changed":
107
- return t(r, $.parse(n));
108
- case "theme_changed":
109
109
  return t(r, U.parse(n));
110
+ case "theme_changed":
111
+ return t(r, $.parse(n));
110
112
  case "popup_closed":
111
113
  return (
112
114
  // Sent on desktop.
@@ -135,7 +137,7 @@ function O() {
135
137
  return t(r, n);
136
138
  }
137
139
  } catch (o) {
138
- d.error("Error processing event:", o);
140
+ u.error("Error processing event:", o);
139
141
  }
140
142
  }), e;
141
143
  }
@@ -175,7 +177,7 @@ function ie(e, t, r) {
175
177
  let n = {}, o;
176
178
  t === void 0 && r === void 0 ? n = {} : t !== void 0 && r !== void 0 ? (n = r, o = t) : t !== void 0 && ("targetOrigin" in t ? n = t : o = t);
177
179
  const { targetOrigin: c = I() } = n;
178
- if (oe()) {
180
+ if (u.log(`Calling method "${e}"`, o), oe()) {
179
181
  window.parent.postMessage(JSON.stringify({
180
182
  eventType: e,
181
183
  eventData: o
@@ -198,18 +200,18 @@ function fe(e, t, r, n) {
198
200
  let o, c, w, g;
199
201
  typeof t == "string" || Array.isArray(t) ? (w = Array.isArray(t) ? t : [t], o = r) : (c = t, w = Array.isArray(r) ? r : [r], o = n), f(c) && typeof c.req_id == "string" && (g = c.req_id);
200
202
  const { postEvent: k = ie, timeout: h } = o || {}, m = o && "capture" in o ? o.capture : null, y = new Promise((W, A) => {
201
- const R = w.map((u) => ee(u, (l) => {
203
+ const C = w.map((d) => ee(d, (l) => {
202
204
  typeof g == "string" && (!f(l) || l.req_id !== g) || typeof m == "function" && !m(l) || (E(), W(l));
203
- })), E = () => R.forEach((u) => u());
205
+ })), E = () => C.forEach((d) => d());
204
206
  try {
205
207
  k(e, c);
206
- } catch (u) {
207
- E(), A(u);
208
+ } catch (d) {
209
+ E(), A(d);
208
210
  }
209
211
  });
210
- return typeof h == "number" ? C(y, h) : y;
212
+ return typeof h == "number" ? R(y, h) : y;
211
213
  }
212
- function _(e, t) {
214
+ function a(e, t) {
213
215
  return N(e, t) <= 0;
214
216
  }
215
217
  function we(e, t) {
@@ -218,9 +220,9 @@ function we(e, t) {
218
220
  function ge(e, t, r) {
219
221
  if (typeof r == "string") {
220
222
  if (e === "web_app_open_link" && t === "try_instant_view")
221
- return _("6.4", r);
223
+ return a("6.4", r);
222
224
  if (e === "web_app_set_header_color" && t === "color")
223
- return _("6.9", r);
225
+ return a("6.9", r);
224
226
  }
225
227
  switch (e) {
226
228
  case "web_app_open_tg_link":
@@ -229,19 +231,21 @@ function ge(e, t, r) {
229
231
  case "web_app_set_background_color":
230
232
  case "web_app_set_header_color":
231
233
  case "web_app_trigger_haptic_feedback":
232
- return _("6.1", t);
234
+ return a("6.1", t);
233
235
  case "web_app_open_popup":
234
- return _("6.2", t);
236
+ return a("6.2", t);
235
237
  case "web_app_close_scan_qr_popup":
236
238
  case "web_app_open_scan_qr_popup":
237
239
  case "web_app_read_text_from_clipboard":
238
- return _("6.4", t);
240
+ return a("6.4", t);
241
+ case "web_app_switch_inline_query":
242
+ return a("6.7", t);
239
243
  case "web_app_invoke_custom_method":
240
244
  case "web_app_request_write_access":
241
245
  case "web_app_request_phone":
242
- return _("6.9", t);
246
+ return a("6.9", t);
243
247
  case "web_app_setup_settings_button":
244
- return _("6.10", t);
248
+ return a("6.10", t);
245
249
  default:
246
250
  return !0;
247
251
  }
@@ -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 { Logger } from '@tma.js/logger';\n\nlet currentTargetOrigin = 'https://web.telegram.org';\n\nexport const logger = new Logger('[Bridge]', false);\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 if (value) {\n logger.enable();\n return;\n }\n logger.disable();\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","import {\n number,\n string,\n boolean,\n json,\n rgb,\n createValueParserGen,\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\nconst rgbOptional = rgb().optional();\nconst num = number();\n\nconst windowWidthParser = createValueParserGen((value) => (value === null || value === undefined\n ? window.innerWidth\n : num.parse(value)));\n\n/**\n * Parses incoming value as ThemeChangedPayload.\n */\nexport const themeChangedPayload = json<ThemeChangedPayload>({\n theme_params: json({\n bg_color: rgbOptional,\n text_color: rgbOptional,\n hint_color: rgbOptional,\n link_color: rgbOptional,\n button_color: rgbOptional,\n button_text_color: rgbOptional,\n secondary_bg_color: rgbOptional,\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: windowWidthParser(),\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({ isEmpty: isNullOrUndefined }).optional(),\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 { logger } 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 logger.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-Mini-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 logger.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-Mini-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 logger.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 case 'web_app_setup_settings_button':\n return lessOrEqual('6.10', paramOrVersion);\n default:\n return true;\n }\n}\n"],"names":["currentTargetOrigin","logger","Logger","setDebug","value","setTargetOrigin","targetOrigin","isNullOrUndefined","rgbOptional","rgb","num","number","windowWidthParser","createValueParserGen","themeChangedPayload","json","viewportChangedPayload","boolean","popupClosedPayload","string","qrTextReceivedPayload","invoiceClosedPayload","clipboardTextReceivedPayload","writeAccessRequestedPayload","phoneRequestedPayload","customMethodInvokedPayload","eventDataJson","emitEvent","eventType","eventData","defineEventHandlers","wnd","path","pointer","item","idx","arr","onTelegramEvent","cb","event","CACHED_EMITTER","createEmitter","emitter","UtilEventEmitter","emit","data","cause","singletonEmitter","off","listener","on","once","unsubscribe","subscribe","hasExternalNotify","isRecord","hasWebviewProxy","isIframe","postEvent","paramsOrOptions","options","postOptions","globalTargetOrigin","request","method","eventOrParams","eventOrOptions","executionOptions","methodParams","events","requestId","defaultPostEvent","timeout","capture","promise","res","rej","stoppers","ev","stopListening","stop","e","withTimeout","lessOrEqual","a","b","compareVersions","detectSupportParams","params","supports","paramOrVersion","inVersion"],"mappings":";;;;AAEA,IAAIA,IAAsB;AAEnB,MAAMC,IAAS,IAAIC,EAAO,YAAY,EAAK;AAQ3C,SAASC,GAASC,GAAsB;AAC7C,MAAIA,GAAO;AACT,IAAAH,EAAO,OAAO;AACd;AAAA,EACF;AACA,EAAAA,EAAO,QAAQ;AACjB;AAUO,SAASI,GAAgBD,GAAqB;AAC7B,EAAAJ,IAAAI;AACxB;AAKO,SAASE,IAAuB;AAC9B,SAAAN;AACT;ACpBA,SAASO,EAAkBH,GAAyB;AAC3C,SAAAA,KAAU;AACnB;AAEA,MAAMI,IAAcC,IAAM,YACpBC,IAAMC,EAAO,GAEbC,IAAoBC,EAAqB,CAACT,MAAWA,KAAU,OACjE,OAAO,aACPM,EAAI,MAAMN,CAAK,CAAE,GAKRU,IAAsBC,EAA0B;AAAA,EAC3D,cAAcA,EAAK;AAAA,IACjB,UAAUP;AAAA,IACV,YAAYA;AAAA,IACZ,YAAYA;AAAA,IACZ,YAAYA;AAAA,IACZ,cAAcA;AAAA,IACd,mBAAmBA;AAAA,IACnB,oBAAoBA;AAAA,EAAA,CACrB;AACH,CAAC,GAMYQ,IAAyBD,EAA6B;AAAA,EACjE,QAAQJ,EAAO;AAAA,EACf,OAAOC,EAAkB;AAAA,EACzB,iBAAiBK,EAAQ;AAAA,EACzB,aAAaA,EAAQ;AACvB,CAAC,GAKYC,IAAqBH,EAAyB;AAAA,EACzD,WAAWI,EAAO,EAAE,SAASZ,EAAmB,CAAA,EAAE,SAAS;AAC7D,CAAC,GAKYa,IAAwBL,EAA4B;AAAA,EAC/D,MAAMI,EAAO,EAAE,SAAS;AAC1B,CAAC,GAKYE,IAAuBN,EAA2B;AAAA,EAC7D,MAAMI,EAAO;AAAA,EACb,QAAQA,EAAO;AACjB,CAAC,GAKYG,IAA+BP,EAAmC;AAAA,EAC7E,QAAQI,EAAO;AAAA,EACf,MAAM,CAACf,MAAWA,MAAU,OAAOA,IAAQe,EAAA,EAAS,SAAA,EAAW,MAAMf,CAAK;AAC5E,CAAC,GAKYmB,IAA8BR,EAAkC,EAAE,QAAQI,EAAA,EAAU,CAAA,GAKpFK,IAAwBT,EAA4B,EAAE,QAAQI,EAAA,EAAU,CAAA,GAKxEM,IAA6BV,EAAiC;AAAA,EACzE,QAAQI,EAAO;AAAA,EACf,QAAQ,CAACf,MAAUA;AAAA,EACnB,OAAOe,EAAO,EAAE,SAAS;AAC3B,CAAC,GChGKO,IAAgBX,EAAiD;AAAA,EACrE,WAAWI,EAAO;AAAA,EAClB,WAAW,CAACf,MAAUA;AACxB,CAAC;AAUD,SAASuB,EAAUC,GAAmBC,GAA0B;AACvD,SAAA,cAAc,IAAI,aAAa,WAAW;AAAA,IAC/C,MAAM,KAAK,UAAU,EAAE,WAAAD,GAAW,WAAAC,GAAW;AAAA,EAC9C,CAAA,CAAC;AACJ;AAOA,SAASC,IAA4B;AACnC,QAAMC,IAAW;AAGjB,EAAI,oCAAoCA,KAOxC;AAAA,IACE,CAAC,gCAAgC;AAAA;AAAA,IACjC,CAAC,qBAAqB,cAAc;AAAA;AAAA,IACpC,CAAC,YAAY,WAAW,cAAc;AAAA;AAAA,EAAA,EACtC,QAAQ,CAACC,MAAS;AAElB,QAAIC,IAAUF;AAEd,IAAAC,EAAK,QAAQ,CAACE,GAAMC,GAAKC,MAAQ;AAE3B,UAAAD,MAAQC,EAAI,SAAS,GAAG;AAC1B,QAAAH,EAAQC,CAAI,IAAIP;AAChB;AAAA,MACF;AAEI,MAAEO,KAAQD,MACJA,EAAAC,CAAI,IAAI,KAElBD,IAAUA,EAAQC,CAAI;AAAA,IAAA,CACvB;AAAA,EAAA,CACF;AACH;AAQO,SAASG,EAAgBC,GAA2D;AAErE,EAAAR,KAGb,OAAA,iBAAiB,WAAW,CAACS,MAAU;AACxC,QAAA;AACF,YAAM,EAAE,WAAAX,GAAW,WAAAC,MAAcH,EAAc,MAAMa,EAAM,IAAI;AAC/D,MAAAD,EAAGV,GAAWC,CAAS;AAAA,IAAA,QACjB;AAAA,IAER;AAAA,EAAA,CACD;AACH;AC/DA,MAAMW,IAAiB;AAMhB,SAASC,IAA8B;AACtC,QAAAC,IAAwB,IAAIC,KAC5BC,IAA6B,CAACL,MAAeM,MAAgB;AACjE,IAAA5C,EAAO,IAAI,6BAA6BsC,GAAO,GAAGM,CAAI,GAC9CH,EAAA,KAAKH,GAAO,GAAGM,CAAI;AAAA,EAAA;AAOtB,gBAAA,iBAAiB,UAAU,MAAM;AACtC,IAAAD,EAAK,oBAAoB;AAAA,MACvB,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,MACf,iBAAiB;AAAA,MACjB,aAAa;AAAA,IAAA,CACd;AAAA,EAAA,CACF,GAIeP,EAAA,CAACT,GAA+BC,MAAoB;AAC3D,IAAA5B,EAAA,IAAI,uBAAuB2B,GAAWC,CAAS;AAElD,QAAA;AACF,cAAQD,GAAW;AAAA,QACjB,KAAK;AACH,iBAAOgB,EAAKhB,GAAWZ,EAAuB,MAAMa,CAAS,CAAC;AAAA,QAEhE,KAAK;AACH,iBAAOe,EAAKhB,GAAWd,EAAoB,MAAMe,CAAS,CAAC;AAAA,QAE7D,KAAK;AAGH;AAAA;AAAA,YAIKA,KAAc,OAEVe,EAAKhB,GAAW,CAAA,CAAE,IAEpBgB,EAAKhB,GAAWV,EAAmB,MAAMW,CAAS,CAAC;AAAA;AAAA,QAE5D,KAAK;AACH,iBAAOe,EAAKhB,GAAWT,EAAS,EAAA,MAAMU,CAAS,CAAC;AAAA,QAElD,KAAK;AACH,iBAAOe,EAAKhB,GAAWR,EAAsB,MAAMS,CAAS,CAAC;AAAA,QAE/D,KAAK;AACH,iBAAOe,EAAKhB,GAAWN,EAA6B,MAAMO,CAAS,CAAC;AAAA,QAEtE,KAAK;AACH,iBAAOe,EAAKhB,GAAWP,EAAqB,MAAMQ,CAAS,CAAC;AAAA,QAE9D,KAAK;AACH,iBAAOe,EAAK,mBAAmBpB,EAAsB,MAAMK,CAAS,CAAC;AAAA,QAEvE,KAAK;AACH,iBAAOe,EAAK,yBAAyBnB,EAA2B,MAAMI,CAAS,CAAC;AAAA,QAElF,KAAK;AACH,iBAAOe,EAAK,0BAA0BrB,EAA4B,MAAMM,CAAS,CAAC;AAAA,QAGpF,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,iBAAOe,EAAKhB,CAAS;AAAA,QAGvB;AACS,iBAAAgB,EAAKhB,GAAkBC,CAAS;AAAA,MAC3C;AAAA,aACOiB,GAAO;AACP,MAAA7C,EAAA,MAAM,2BAA2B6C,CAAK;AAAA,IAC/C;AAAA,EAAA,CACD,GAEMJ;AACT;AAMO,SAASK,IAAiC;AAC/C,QAAMhB,IAAW;AAGjB,SAFsBA,EAAIS,CAAc,MAElB,WAChBT,EAAAS,CAAc,IAAIC,MAGjBV,EAAIS,CAAc;AAC3B;ACnHgB,SAAAQ,EAAyBT,GAAUU,GAAkC;AAClE,EAAAF,IAAE,IAAIR,GAAOU,CAAQ;AACxC;ACEgB,SAAAC,GAAwBX,GAAUU,GAA2C;AAC1E,SAAAF,IAAE,GAAGR,GAAOU,CAAQ,GAC9B,MAAMD,EAAIT,GAAOU,CAAQ;AAClC;ACJgB,SAAAE,GAA0BZ,GAAUU,GAA2C;AAC5E,SAAAF,IAAE,KAAKR,GAAOU,CAAQ,GAChC,MAAMD,EAAIT,GAAOU,CAAQ;AAClC;ACPO,SAASG,GAAYH,GAAqC;AAC9C,EAAAF,EAAA,EAAE,YAAYE,CAAQ;AACzC;ACEO,SAASI,GAAUJ,GAA8C;AACrD,SAAAF,EAAA,EAAE,UAAUE,CAAQ,GAC9B,MAAMG,GAAYH,CAAQ;AACnC;ACIO,SAASK,GAAgClD,GAA0C;AACxF,SAAO,cAAcA,KAChBmD,EAASnD,EAAM,QAAQ,KACvB,YAAYA,EAAM,YAClB,OAAOA,EAAM,SAAS,UAAW;AACxC;AAOO,SAASoD,GAA8BpD,GAAwC;AACpF,SAAO,0BAA0BA,KAC5BmD,EAASnD,EAAM,oBAAoB,KACnC,eAAeA,EAAM,wBACrB,OAAOA,EAAM,qBAAqB,aAAc;AACvD;AAMO,SAASqD,KAAoB;AAC9B,MAAA;AACK,WAAA,OAAO,SAAS,OAAO;AAAA,UACpB;AACH,WAAA;AAAA,EACT;AACF;ACGgB,SAAAC,GACd9B,GACA+B,GACAC,GACM;AACN,MAAIC,IAAgC,CAAA,GAChChC;AAEA,EAAA8B,MAAoB,UAAaC,MAAY,SAE/CC,IAAc,CAAA,IACLF,MAAoB,UAAaC,MAAY,UAExCC,IAAAD,GACF/B,IAAA8B,KACHA,MAAoB,WAEzB,kBAAkBA,IACNE,IAAAF,IAEF9B,IAAA8B;AAGhB,QAAM,gBAAErD,IAAewD,EAAmB,EAAA,IAAMD;AAGhD,MAAIJ,MAAY;AACP,WAAA,OAAO,YAAY,KAAK,UAAU;AAAA,MACvC,WAAA7B;AAAA,MACA,WAAAC;AAAA,IAAA,CACD,GAAGvB,CAAY;AAChB;AAAA,EACF;AAGI,MAAAgD,GAAkB,MAAM,GAAG;AACtB,WAAA,SAAS,OAAO,KAAK,UAAU,EAAE,WAAA1B,GAAW,WAAAC,EAAW,CAAA,CAAC;AAC/D;AAAA,EACF;AAGI,MAAA2B,GAAgB,MAAM,GAAG;AAC3B,WAAO,qBAAqB,UAAU5B,GAAW,KAAK,UAAUC,CAAS,CAAC;AAC1E;AAAA,EACF;AAIA,QAAM,IAAI;AAAA,IACR;AAAA,EAAA;AAEJ;ACEO,SAASkC,GACdC,GACAC,GACAC,GACAN,GACc;AACV,MAAAO,GACAC,GACAC,GACAC;AAEJ,EAAI,OAAOL,KAAkB,YAAY,MAAM,QAAQA,CAAa,KAElEI,IAAS,MAAM,QAAQJ,CAAa,IAAIA,IAAgB,CAACA,CAAa,GACnDE,IAAAD,MAGJE,IAAAH,GACfI,IAAS,MAAM,QAAQH,CAAc,IAAIA,IAAiB,CAACA,CAAc,GACtDC,IAAAP,IAKjBL,EAASa,CAAY,KAAK,OAAOA,EAAa,UAAW,aAC3DE,IAAYF,EAAa;AAG3B,QAAM,EAAA,WAAEV,IAAYa,IAAkB,SAAAC,EAAQ,IAAIL,KAAoB,CAAA,GAChEM,IAAUN,KAAoB,aAAaA,IAC7CA,EAAiB,UACjB,MAEEO,IAAU,IAAI,QAAQ,CAACC,GAAKC,MAAQ;AAElC,UAAAC,IAAWR,EAAO,IAAI,CAACS,MAAO5B,GAAG4B,GAAI,CAACjC,MAAU;AAGhD,MAAA,OAAOyB,KAAc,aAAa,CAACf,EAASV,CAAI,KAAKA,EAAK,WAAWyB,MAIrE,OAAOG,KAAY,cAAc,CAACA,EAAQ5B,CAAI,MAKpCkC,KACdJ,EAAI9B,CAAI;AAAA,IACT,CAAA,CAAC,GAGIkC,IAAgB,MAAMF,EAAS,QAAQ,CAACG,MAASA,GAAM;AAEzD,QAAA;AAIFtB,MAAAA,EAAUM,GAAeI,CAAY;AAAA,aAC9Ba,GAAG;AACI,MAAAF,KACdH,EAAIK,CAAC;AAAA,IACP;AAAA,EAAA,CACD;AAED,SAAO,OAAOT,KAAY,WAAWU,EAAYR,GAASF,CAAO,IAAIE;AACvE;AChKA,SAASS,EAAYC,GAAYC,GAAqB;AAC7C,SAAAC,EAAgBF,GAAGC,CAAC,KAAK;AAClC;AAQgB,SAAAE,GACdvB,GACAwB,GACyD;AACzD,SAAIxB,MAAW,uBACT,sBAAsBwB,IACjB,CAAC,kBAAkB,IAI1BxB,MAAW,8BACT,WAAWwB,IACN,CAAC,OAAO,IAIZ;AACT;AAmBgB,SAAAC,GACdzB,GACA0B,GACAC,GACS;AAEL,MAAA,OAAOA,KAAc,UAAU;AACjC,QAAI3B,MAAW,uBACT0B,MAAmB;AACd,aAAAP,EAAY,OAAOQ,CAAS;AAIvC,QAAI3B,MAAW,8BACT0B,MAAmB;AACd,aAAAP,EAAY,OAAOQ,CAAS;AAAA,EAGzC;AAGA,UAAQ3B,GAAQ;AAAA,IACd,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACI,aAAAmB,EAAY,OAAOO,CAAc;AAAA,IAC1C,KAAK;AACI,aAAAP,EAAY,OAAOO,CAAc;AAAA,IAC1C,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACI,aAAAP,EAAY,OAAOO,CAAc;AAAA,IAC1C,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACI,aAAAP,EAAY,OAAOO,CAAc;AAAA,IAC1C,KAAK;AACI,aAAAP,EAAY,QAAQO,CAAc;AAAA,IAC3C;AACS,aAAA;AAAA,EACX;AACF;"}
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 { Logger } from '@tma.js/logger';\n\nlet currentTargetOrigin = 'https://web.telegram.org';\n\nexport const logger = new Logger('[Bridge]', false);\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 if (value) {\n logger.enable();\n return;\n }\n logger.disable();\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","import {\n number,\n string,\n boolean,\n json,\n rgb,\n createValueParserGenerator,\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\nconst rgbOptional = rgb().optional();\nconst num = number();\n\nconst windowWidthParser = createValueParserGenerator(\n (value) => (value === null || value === undefined\n ? window.innerWidth\n : num.parse(value)),\n);\n\n/**\n * Parses incoming value as ThemeChangedPayload.\n */\nexport const themeChangedPayload = json<ThemeChangedPayload>({\n theme_params: json({\n bg_color: rgbOptional,\n text_color: rgbOptional,\n hint_color: rgbOptional,\n link_color: rgbOptional,\n button_color: rgbOptional,\n button_text_color: rgbOptional,\n secondary_bg_color: rgbOptional,\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: windowWidthParser(),\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({ isEmpty: isNullOrUndefined }).optional(),\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 { logger } 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 logger.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-Mini-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 logger.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-Mini-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 logger.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 { logger, targetOrigin as globalTargetOrigin } from '../globals.js';\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 Mini 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 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 Mini 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 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 logger.log(`Calling method \"${eventType}\"`, eventData);\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 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_switch_inline_query':\n return lessOrEqual('6.7', 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 case 'web_app_setup_settings_button':\n return lessOrEqual('6.10', paramOrVersion);\n default:\n return true;\n }\n}\n"],"names":["currentTargetOrigin","logger","Logger","setDebug","value","setTargetOrigin","targetOrigin","isNullOrUndefined","rgbOptional","rgb","num","number","windowWidthParser","createValueParserGenerator","themeChangedPayload","json","viewportChangedPayload","boolean","popupClosedPayload","string","qrTextReceivedPayload","invoiceClosedPayload","clipboardTextReceivedPayload","writeAccessRequestedPayload","phoneRequestedPayload","customMethodInvokedPayload","eventDataJson","emitEvent","eventType","eventData","defineEventHandlers","wnd","path","pointer","item","idx","arr","onTelegramEvent","cb","event","CACHED_EMITTER","createEmitter","emitter","UtilEventEmitter","emit","data","cause","singletonEmitter","off","listener","on","once","unsubscribe","subscribe","hasExternalNotify","isRecord","hasWebviewProxy","isIframe","postEvent","paramsOrOptions","options","postOptions","globalTargetOrigin","request","method","eventOrParams","eventOrOptions","executionOptions","methodParams","events","requestId","defaultPostEvent","timeout","capture","promise","res","rej","stoppers","ev","stopListening","stop","e","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.10",
3
+ "version": "1.3.12",
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",
@@ -41,9 +41,9 @@
41
41
  "@tma.js/colors": "0.0.5",
42
42
  "@tma.js/event-emitter": "0.1.0",
43
43
  "@tma.js/logger": "0.0.5",
44
- "@tma.js/parsing": "0.1.2",
44
+ "@tma.js/parsing": "1.0.0",
45
45
  "@tma.js/util-types": "0.0.3",
46
- "@tma.js/utils": "0.5.5"
46
+ "@tma.js/utils": "0.5.6"
47
47
  },
48
48
  "devDependencies": {
49
49
  "build-utils": "0.0.1",
@@ -59,7 +59,6 @@
59
59
  "typecheck": "tsc --noEmit -p tsconfig.build.json",
60
60
  "build": "pnpm run build:default && pnpm run build:iife",
61
61
  "build:default": "vite build --config vite.config.ts",
62
- "build:iife": "vite build --config vite.iife.config.ts",
63
- "rollup": "pnpm run typecheck && pnpm run build"
62
+ "build:iife": "vite build --config vite.iife.config.ts"
64
63
  }
65
64
  }
@@ -20,100 +20,112 @@ import type {
20
20
 
21
21
  /**
22
22
  * Map where key is known event name, and value is its listener.
23
- * @see Documentation https://docs.telegram-mini-apps.com/docs/apps-communication/events
23
+ * @see https://docs.telegram-mini-apps.com/apps-communication/events
24
24
  */
25
25
  export interface Events {
26
26
  /**
27
27
  * User clicked back button.
28
- * @see https://docs.telegram-mini-apps.com/docs/apps-communication/events#back_button_pressed
28
+ * @since v6.1
29
+ * @see https://docs.telegram-mini-apps.com/apps-communication/events#back-button-pressed
29
30
  */
30
31
  back_button_pressed: () => void;
31
32
 
32
33
  /**
33
- * Text was extracted from clipboard.
34
- * @param payload - event information.
35
- * @see https://docs.telegram-mini-apps.com/docs/apps-communication/events#clipboard_text_received
34
+ * Telegram application attempted to extract text from clipboard.
35
+ * @param payload - event payload.
36
+ * @since v6.4
37
+ * @see https://docs.telegram-mini-apps.com/apps-communication/events#clipboard-text-received
36
38
  */
37
39
  clipboard_text_received: (payload: ClipboardTextReceivedPayload) => void;
38
40
 
39
41
  /**
40
- * Being called whenever custom method was invoked.
42
+ * Custom method invocation completed.
41
43
  * @param payload - event payload.
42
- * @since 6.9
44
+ * @since v6.9
45
+ * @see https://docs.telegram-mini-apps.com/apps-communication/events#custom-method-invoked
43
46
  */
44
47
  custom_method_invoked: (payload: CustomMethodInvokedPayload) => void;
45
48
 
46
49
  /**
47
- * Invoice was closed.
50
+ * An invoice was closed.
48
51
  * @param payload - invoice close information.
49
- * @see https://docs.telegram-mini-apps.com/docs/apps-communication/events#invoice_closed
52
+ * @see https://docs.telegram-mini-apps.com/apps-communication/events#invoice-closed
50
53
  */
51
54
  invoice_closed: (payload: InvoiceClosedPayload) => void;
52
55
 
53
56
  /**
54
- * User clicked main button.
55
- * @see https://docs.telegram-mini-apps.com/docs/apps-communication/events#main_button_pressed
57
+ * User clicked the Main Button.
58
+ * @see https://docs.telegram-mini-apps.com/apps-communication/events#main-button-pressed
56
59
  */
57
60
  main_button_pressed: () => void;
58
61
 
59
62
  /**
60
63
  * Application received phone access request status.
61
- * @param payload - event payload. - event payload.
62
- * @since 6.9
64
+ * @param payload - event payload.
65
+ * @since v6.9
66
+ * @see https://docs.telegram-mini-apps.com/apps-communication/events#phone-requested
63
67
  */
64
68
  phone_requested: (payload: PhoneRequestedPayload) => void;
65
69
 
66
70
  /**
67
71
  * Popup was closed.
68
- * @param payload - popup close information.
69
- * @see https://docs.telegram-mini-apps.com/docs/apps-communication/events#main_button_pressed
72
+ * @param payload - event payload.
73
+ * @see https://docs.telegram-mini-apps.com/apps-communication/events#popup-closed
70
74
  */
71
75
  popup_closed: (payload: PopupClosedPayload) => void;
72
76
 
73
77
  /**
74
- * Data from QR was extracted.
75
- * @see https://docs.telegram-mini-apps.com/docs/apps-communication/events#qr_text_received
78
+ * The QR scanner scanned some QR and extracted its content.
79
+ * @param payload - event payload.
80
+ * @since v6.4
81
+ * @see https://docs.telegram-mini-apps.com/apps-communication/events#qr-text-received
76
82
  */
77
83
  qr_text_received: (payload: QrTextReceivedPayload) => void;
78
84
 
79
85
  /**
80
86
  * QR scanner was closed.
81
- * @see https://docs.telegram-mini-apps.com/docs/apps-communication/events#scan_qr_popup_closed
87
+ * @since v6.4
88
+ * @see https://docs.telegram-mini-apps.com/apps-communication/events#scan-qr-popup-closed
82
89
  */
83
90
  scan_qr_popup_closed: () => void;
84
91
 
85
92
  /**
86
- * Telegram requested to update current application style.
93
+ * The event which is usually sent by the Telegram web application. Its payload represents
94
+ * `<style/>` tag html content, a developer could use. The stylesheet described in the payload
95
+ * will help the developer to stylize the app scrollbar (but he is still able to do it himself).
87
96
  * @param html - `style` tag inner HTML.
88
- * @see https://docs.telegram-mini-apps.com/docs/apps-communication/events#set_custom_style
97
+ * @see https://docs.telegram-mini-apps.com/apps-communication/events#set-custom-style
89
98
  */
90
99
  set_custom_style: (html: string) => void;
91
100
 
92
101
  /**
93
- * Occurs when the Settings item in context menu is pressed.
94
- * @see https://docs.telegram-mini-apps.com/docs/apps-communication/events#settings_button_pressed
102
+ * Occurs when the Settings Button was pressed.
103
+ * @since v6.1
104
+ * @see https://docs.telegram-mini-apps.com/apps-communication/events#settings-button-pressed
95
105
  */
96
106
  settings_button_pressed: () => void;
97
107
 
98
108
  /**
99
109
  * Occurs whenever theme settings are changed in the user's Telegram app
100
110
  * (including switching to night mode).
101
- * @param payload - theme information.
102
- * @see https://docs.telegram-mini-apps.com/docs/apps-communication/events#theme_changed
111
+ * @param payload - event payload.
112
+ * @see https://docs.telegram-mini-apps.com/apps-communication/events#theme-changed
103
113
  */
104
114
  theme_changed: (payload: ThemeChangedPayload) => void;
105
115
 
106
116
  /**
107
- * Viewport was changed.
108
- * @param payload - viewport information.
109
- * @see https://docs.telegram-mini-apps.com/docs/apps-communication/events#viewport_changed
117
+ * Occurs whenever the viewport has been changed. For example, when the user started
118
+ * dragging the application or called the expansion method.
119
+ * @param payload - event payload.
120
+ * @see https://docs.telegram-mini-apps.com/apps-communication/events#viewport-changed
110
121
  */
111
122
  viewport_changed: (payload: ViewportChangedPayload) => void;
112
123
 
113
124
  /**
114
- * Application received write access requests status.
125
+ * Application received write access request status.
115
126
  * @param payload - event payload.
116
- * @since 6.9
127
+ * @since v6.9
128
+ * @see https://docs.telegram-mini-apps.com/apps-communication/events#write-access-requested
117
129
  */
118
130
  write_access_requested: (payload: WriteAccessRequestedPayload) => void;
119
131
  }
@@ -4,7 +4,7 @@ import {
4
4
  boolean,
5
5
  json,
6
6
  rgb,
7
- createValueParserGen,
7
+ createValueParserGenerator,
8
8
  } from '@tma.js/parsing';
9
9
 
10
10
  import type {
@@ -22,9 +22,11 @@ function isNullOrUndefined(value: unknown): boolean {
22
22
  const rgbOptional = rgb().optional();
23
23
  const num = number();
24
24
 
25
- const windowWidthParser = createValueParserGen((value) => (value === null || value === undefined
26
- ? window.innerWidth
27
- : num.parse(value)));
25
+ const windowWidthParser = createValueParserGenerator(
26
+ (value) => (value === null || value === undefined
27
+ ? window.innerWidth
28
+ : num.parse(value)),
29
+ );
28
30
 
29
31
  /**
30
32
  * Parses incoming value as ThemeChangedPayload.
@@ -3,13 +3,29 @@ import type { RGB } from '@tma.js/colors';
3
3
  import type { RequestId } from '../shared.js';
4
4
 
5
5
  export interface ClipboardTextReceivedPayload {
6
+ /**
7
+ * Passed during the `web_app_read_text_from_clipboard` method invocation `req_id` value.
8
+ */
6
9
  req_id: RequestId;
10
+ /**
11
+ * Data extracted from the clipboard. The returned value will have the type `string` only in
12
+ * the case, application has access to the clipboard.
13
+ */
7
14
  data?: string | null;
8
15
  }
9
16
 
10
17
  export interface CustomMethodInvokedPayload<R = unknown> {
18
+ /**
19
+ * Unique identifier of this invocation.
20
+ */
11
21
  req_id: RequestId;
22
+ /**
23
+ * Method invocation successful result.
24
+ */
12
25
  result?: R;
26
+ /**
27
+ * Method invocation error code.
28
+ */
13
29
  error?: string;
14
30
  }
15
31
 
@@ -21,15 +37,28 @@ export type InvoiceStatus =
21
37
  | string;
22
38
 
23
39
  export interface InvoiceClosedPayload {
40
+ /**
41
+ * Passed during the `web_app_open_invoice` method invocation `slug` value.
42
+ */
24
43
  slug: string;
44
+ /**
45
+ * Invoice status
46
+ */
25
47
  status: InvoiceStatus;
26
48
  }
27
49
 
28
50
  export interface QrTextReceivedPayload {
51
+ /**
52
+ * Data extracted from the QR.
53
+ */
29
54
  data?: string;
30
55
  }
31
56
 
32
57
  export interface ThemeChangedPayload {
58
+ /**
59
+ * Map where the key is a theme stylesheet key and value is the corresponding color in
60
+ * `#RRGGBB` format.
61
+ */
33
62
  theme_params: {
34
63
  bg_color?: RGB;
35
64
  text_color?: RGB;
@@ -42,24 +71,46 @@ export interface ThemeChangedPayload {
42
71
  }
43
72
 
44
73
  export interface ViewportChangedPayload {
74
+ /**
75
+ * The viewport height.
76
+ */
45
77
  height: number;
78
+ /**
79
+ * The viewport width.
80
+ */
46
81
  width: number;
82
+ /**
83
+ * Is the viewport currently expanded.
84
+ */
47
85
  is_expanded: boolean;
86
+ /**
87
+ * Is the viewport current state stable and not going to change in the next moment.
88
+ */
48
89
  is_state_stable: boolean;
49
90
  }
50
91
 
51
92
  export interface PopupClosedPayload {
93
+ /**
94
+ * Identifier of the clicked button. In case, the popup was closed without clicking any button,
95
+ * this property will be omitted.
96
+ */
52
97
  button_id?: string;
53
98
  }
54
99
 
55
100
  export type PhoneRequestedStatus = 'sent' | string;
56
101
 
57
102
  export interface PhoneRequestedPayload {
103
+ /**
104
+ * Request status.
105
+ */
58
106
  status: PhoneRequestedStatus;
59
107
  }
60
108
 
61
109
  export type WriteAccessRequestedStatus = 'allowed' | string;
62
110
 
63
111
  export interface WriteAccessRequestedPayload {
112
+ /**
113
+ * Request status.
114
+ */
64
115
  status: WriteAccessRequestedStatus;
65
116
  }