@tma.js/init-data 0.2.21 → 4.0.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,2 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("@tma.js/parsing");function _(){return t.json({id:t.number(),type:t.string(),title:t.string(),photoUrl:{type:t.string().optional(),from:"photo_url"},username:t.string().optional()},{type:"Chat"})}function f(){return t.json({addedToAttachmentMenu:{type:t.boolean().optional(),from:"added_to_attachment_menu"},allowsWriteToPm:{type:t.boolean().optional(),from:"allows_write_to_pm"},firstName:{type:t.string(),from:"first_name"},id:t.number(),isBot:{type:t.boolean().optional(),from:"is_bot"},isPremium:{type:t.boolean().optional(),from:"is_premium"},languageCode:{type:t.string().optional(),from:"language_code"},lastName:{type:t.string().optional(),from:"last_name"},photoUrl:{type:t.string().optional(),from:"photo_url"},username:t.string().optional()},{type:"User"})}function g(){return t.searchParams({authDate:{type:t.date(),from:"auth_date"},canSendAfter:{type:t.number().optional(),from:"can_send_after"},chat:_().optional(),chatInstance:{type:t.string().optional(),from:"chat_instance"},chatType:{type:t.string().optional(),from:"chat_type"},hash:t.string(),queryId:{type:t.string().optional(),from:"query_id"},receiver:f().optional(),startParam:{type:t.string().optional(),from:"start_param"},user:f().optional()},{type:"InitData"})}function S(a){return g().parse(a)}function n(a,o,r){r!==void 0&&a.set(o,r)}function h(a,o,r){if(r===void 0)return;const{photoUrl:i,firstName:s,lastName:p,isPremium:m,languageCode:u,isBot:l,...c}=r;a.set(o,JSON.stringify({...c,photo_url:i,first_name:s,last_name:p,is_premium:m,language_code:u,is_bot:l}))}function P(a){const{authDate:o,canSendAfter:r,chat:i,chatInstance:s,chatType:p,hash:m,queryId:u,receiver:l,startParam:c,user:y}=a,e=new URLSearchParams;if(e.set("auth_date",(o.getTime()/1e3).toString()),n(e,"chat_instance",s),n(e,"chat_type",p),n(e,"hash",m),n(e,"query_id",u),h(e,"receiver",l),n(e,"start_param",c),h(e,"user",y),i){const{photoUrl:d,...b}=i;e.set("chat",JSON.stringify({...b,photo_url:d}))}return r&&e.set("can_send_after",r.toString()),e.toString()}exports.chat=_;exports.initData=g;exports.parse=S;exports.serialize=P;exports.user=f;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("error-kid"),e=require("valibot");class E extends u.errorClassWithData({name:"InvalidInitDataError",message:r=>`Invalid init data: ${r}`,cause:(r,a)=>a,data:r=>({value:r})}){}class D extends u.errorClassWithData({name:"SignatureMissingError",data:r=>({param:r}),message:r=>`"${r}" parameter is missing`}){}class g extends u.errorClass({name:"SignatureInvalidError",message:"Init data signature is invalid"}){}class I extends u.errorClassWithData({name:"AuthDateInvalidError",data:r=>({value:r}),message:r=>`"auth_date" is invalid: ${r??"value is missing"}`}){}class A extends u.errorClassWithData({name:"ExpiredError",data:(r,a,n)=>({issuedAt:r,expiresAt:a,now:n}),message:(r,a,n)=>[`Init data expired. Issued at ${r.toISOString()},`,`expires at ${a.toISOString()}, now is ${n.toISOString()}`].join(" ")}){}function p(t){return{ok:!0,data:t}}function c(t){return{ok:!1,error:t}}function v(t){if(!t.ok)throw t.error;return t.data}function b(t){return(...r)=>{const a=t(...r);return a instanceof Promise?a.then(v):v(a)}}function m(t){return e.pipe(e.string(),e.parseJson(),t)}const _=e.object({added_to_attachment_menu:e.optional(e.boolean()),allows_write_to_pm:e.optional(e.boolean()),first_name:e.string(),id:e.number(),is_bot:e.optional(e.boolean()),is_premium:e.optional(e.boolean()),language_code:e.optional(e.string()),last_name:e.optional(e.string()),photo_url:e.optional(e.string()),username:e.optional(e.string())}),K=e.object({id:e.number(),photo_url:e.optional(e.string()),title:e.string(),type:e.string(),username:e.optional(e.string())}),O=e.object({auth_date:e.pipe(e.string(),e.digits(),e.transform(t=>new Date(Number(t)*1e3))),can_send_after:e.optional(e.pipe(e.string(),e.digits(),e.transform(Number))),chat:e.optional(m(K)),chat_instance:e.optional(e.string()),chat_join_request_query_id:e.optional(e.string()),chat_type:e.optional(e.string()),hash:e.string(),query_id:e.optional(e.string()),receiver:e.optional(m(_)),signature:e.optional(e.string()),start_param:e.optional(e.string()),user:e.optional(m(_))});function h(t){const r=new URLSearchParams(t),a={};r.forEach((i,o)=>{o in a||(a[o]=i)});const n=e.safeParse(O,a);return n.success?p(n.output):c(new E(r.toString(),new e.ValiError(n.issues)))}const W=b(h);function x(t){const r=new URLSearchParams;return Object.entries(t).forEach(([a,n])=>{n!==void 0&&r.set(a,n instanceof Date?String(Math.floor(n.getTime()/1e3)):typeof n=="object"?JSON.stringify(n):String(n))}),r.toString()}const y=new TextEncoder;function C(t){return Array.from(new Uint8Array(t),r=>r.toString(16).padStart(2,"0")).join("")}function S(t){return Uint8Array.from(t.match(/../g)||[],r=>parseInt(r,16))}function k(t){return t.map(([r,a])=>`${r}=${a}`).sort().join(`
2
+ `)}async function w(t){return crypto.subtle.importKey("raw",t,{name:"HMAC",hash:"SHA-256"},!1,["sign","verify"])}async function $(t,r){return crypto.subtle.sign("HMAC",await w(t),y.encode(r))}async function L(t){return C(await $(y.encode("WebAppData"),t))}async function j(t,r={}){if(!r.hashed)return w(await $(y.encode("WebAppData"),t));if(!/^[\da-f]{64}$/i.test(t))throw new TypeError("Hashed token must be a SHA-256 hash in the hex format");return w(S(t))}async function P(t){return typeof t=="string"?j(t):t}async function T(t,r){const a=await P(r);return C(await crypto.subtle.sign("HMAC",a,y.encode(t)))}async function R(t,r){const a=t.auth_date||new Date,n=new URLSearchParams(x({...t,auth_date:a}));return n.delete("hash"),n.set("hash",await T(k([...n]),r)),n.toString()}const N={production:"e7bf03a2fa4602af4580703d88dda5bb59f32ed8b02a56c187fe7d34caed242d",test:"40055058a4ee38156a06562e52eece92a771bcd8346a8c4615cb7376eddf72ec"};function q(t,r,a,{expiresIn:n=86400}){const i=new URLSearchParams(t),o=i.get(r);if(!o)return c(new D(r));const s=i.get("auth_date")??void 0;if(!s||!/^\d+$/.test(s))return c(new I(s));if(n>0){const d=new Date(Number(s)*1e3),l=new Date(d.getTime()+n*1e3),f=new Date;if(l<f)return c(new A(d,l,f))}return p({signature:o,dataCheckString:k([...i].filter(([d])=>!a.includes(d)))})}async function H(t,r,a={}){const n=q(t,"hash",["hash"],a);if(!n.ok)return n;const{signature:i,dataCheckString:o}=n.data;return/^[\da-f]{64}$/i.test(i)&&await crypto.subtle.verify("HMAC",await P(r),S(i),new TextEncoder().encode(o))?p(void 0):c(new g)}async function M(t,r,a={}){const n=q(t,"signature",["hash","signature"],a);if(!n.ok)return n;const{signature:i,dataCheckString:o}=n.data;let s;try{const l=atob(i.replace(/-/g,"+").replace(/_/g,"/"));s=Uint8Array.from(l,f=>f.charCodeAt(0))}catch{return c(new g)}return await crypto.subtle.verify("Ed25519",await crypto.subtle.importKey("raw",S(N[a.test?"test":"production"]),"Ed25519",!1,["verify"]),s,new TextEncoder().encode(`${r}:WebAppData
3
+ ${o}`))?p(void 0):c(new g)}async function U(t,r,a){const n=await H(t,r,a);return n.ok?h(t):n}const B=b(U);async function z(t,r,a){return(await H(t,r,a)).ok}async function V(t,r,a){const n=await M(t,r,a);return n.ok?h(t):n}const J=b(V);async function Y(t,r,a){return(await M(t,r,a)).ok}Object.defineProperty(exports,"matchError",{enumerable:!0,get:()=>u.matchError});exports.AuthDateInvalidError=I;exports.ExpiredError=A;exports.InvalidInitDataError=E;exports.SignatureInvalidError=g;exports.SignatureMissingError=D;exports.createSecretKey=j;exports.hashToken=L;exports.isValid=z;exports.isValid3rd=Y;exports.parse=W;exports.safeParse=h;exports.safeValidate=U;exports.safeValidate3rd=V;exports.serialize=x;exports.sign=R;exports.signData=T;exports.validate=B;exports.validate3rd=J;
2
4
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/chat.ts","../src/user.ts","../src/initData.ts","../src/parse.ts","../src/serialize.ts"],"sourcesContent":["import { json, number, string } from '@tma.js/parsing';\n\n/**\n * Returns parser used to parse chat data.\n */\nexport function chat() {\n return json({\n id: number(),\n type: string(),\n title: string(),\n photoUrl: {\n type: string().optional(),\n from: 'photo_url',\n },\n username: string().optional(),\n }, {\n type: 'Chat',\n });\n}\n","import { json, string, boolean, number } from '@tma.js/parsing';\n\nimport type { User } from './types.js';\n\n/**\n * Returns parser used to parse user data.\n */\nexport function user() {\n return json<User>({\n addedToAttachmentMenu: {\n type: boolean().optional(),\n from: 'added_to_attachment_menu',\n },\n allowsWriteToPm: {\n type: boolean().optional(),\n from: 'allows_write_to_pm',\n },\n firstName: {\n type: string(),\n from: 'first_name',\n },\n id: number(),\n isBot: {\n type: boolean().optional(),\n from: 'is_bot',\n },\n isPremium: {\n type: boolean().optional(),\n from: 'is_premium',\n },\n languageCode: {\n type: string().optional(),\n from: 'language_code',\n },\n lastName: {\n type: string().optional(),\n from: 'last_name',\n },\n photoUrl: {\n type: string().optional(),\n from: 'photo_url',\n },\n username: string().optional(),\n }, {\n type: 'User',\n });\n}\n","import { string, number, date, searchParams } from '@tma.js/parsing';\n\nimport { user } from './user.js';\nimport { chat } from './chat.js';\nimport type { InitData } from './types.js';\n\n/**\n * Returns parser used to parse init data, presented as search params.\n */\nexport function initData() {\n return searchParams<InitData>({\n authDate: {\n type: date(),\n from: 'auth_date',\n },\n canSendAfter: {\n type: number().optional(),\n from: 'can_send_after',\n },\n chat: chat().optional(),\n chatInstance: {\n type: string().optional(),\n from: 'chat_instance',\n },\n chatType: {\n type: string().optional(),\n from: 'chat_type',\n },\n hash: string(),\n queryId: {\n type: string().optional(),\n from: 'query_id',\n },\n receiver: user().optional(),\n startParam: {\n type: string().optional(),\n from: 'start_param',\n },\n user: user().optional(),\n }, {\n type: 'InitData',\n });\n}\n","import { initData } from './initData.js';\nimport type { InitData } from './types.js';\n\n/**\n * Parses incoming value as init data.\n * @param value - value to parse.\n */\nexport function parse(value: unknown): InitData {\n return initData().parse(value);\n}\n","import type { InitData, User } from './types.js';\n\nfunction setString(params: URLSearchParams, key: string, value: string | undefined) {\n if (value === undefined) {\n return;\n }\n params.set(key, value);\n}\n\nfunction setUser(params: URLSearchParams, key: string, value: User | undefined) {\n if (value === undefined) {\n return;\n }\n const {\n photoUrl,\n firstName,\n lastName,\n isPremium,\n languageCode,\n isBot,\n ...rest\n } = value;\n\n params.set(key, JSON.stringify({\n ...rest,\n photo_url: photoUrl,\n first_name: firstName,\n last_name: lastName,\n is_premium: isPremium,\n language_code: languageCode,\n is_bot: isBot,\n }));\n}\n\n/**\n * Converts init data to its initial representation.\n * @param value - init data.\n */\nexport function serialize(value: InitData): string {\n const {\n authDate,\n canSendAfter,\n chat,\n chatInstance,\n chatType,\n hash,\n queryId,\n receiver,\n startParam,\n user,\n } = value;\n\n const params = new URLSearchParams();\n\n params.set('auth_date', (authDate.getTime() / 1000).toString());\n setString(params, 'chat_instance', chatInstance);\n setString(params, 'chat_type', chatType);\n setString(params, 'hash', hash);\n setString(params, 'query_id', queryId);\n setUser(params, 'receiver', receiver);\n setString(params, 'start_param', startParam);\n setUser(params, 'user', user);\n\n if (chat) {\n const { photoUrl, ...rest } = chat;\n params.set('chat', JSON.stringify({\n ...rest,\n photo_url: photoUrl,\n }));\n }\n\n if (canSendAfter) {\n params.set('can_send_after', canSendAfter.toString());\n }\n\n return params.toString();\n}\n"],"names":["chat","json","number","string","user","boolean","initData","searchParams","date","parse","value","setString","params","key","setUser","photoUrl","firstName","lastName","isPremium","languageCode","isBot","rest","serialize","authDate","canSendAfter","chatInstance","chatType","hash","queryId","receiver","startParam"],"mappings":"mHAKO,SAASA,GAAO,CACrB,OAAOC,OAAK,CACV,GAAIC,EAAAA,OAAO,EACX,KAAMC,EAAAA,OAAO,EACb,MAAOA,EAAAA,OAAO,EACd,SAAU,CACR,KAAMA,EAAAA,OAAO,EAAE,SAAS,EACxB,KAAM,WACR,EACA,SAAUA,EAAAA,OAAO,EAAE,SAAS,CAAA,EAC3B,CACD,KAAM,MAAA,CACP,CACH,CCXO,SAASC,GAAO,CACrB,OAAOH,OAAW,CAChB,sBAAuB,CACrB,KAAMI,EAAAA,QAAQ,EAAE,SAAS,EACzB,KAAM,0BACR,EACA,gBAAiB,CACf,KAAMA,EAAAA,QAAQ,EAAE,SAAS,EACzB,KAAM,oBACR,EACA,UAAW,CACT,KAAMF,EAAAA,OAAO,EACb,KAAM,YACR,EACA,GAAID,EAAAA,OAAO,EACX,MAAO,CACL,KAAMG,EAAAA,QAAQ,EAAE,SAAS,EACzB,KAAM,QACR,EACA,UAAW,CACT,KAAMA,EAAAA,QAAQ,EAAE,SAAS,EACzB,KAAM,YACR,EACA,aAAc,CACZ,KAAMF,EAAAA,OAAO,EAAE,SAAS,EACxB,KAAM,eACR,EACA,SAAU,CACR,KAAMA,EAAAA,OAAO,EAAE,SAAS,EACxB,KAAM,WACR,EACA,SAAU,CACR,KAAMA,EAAAA,OAAO,EAAE,SAAS,EACxB,KAAM,WACR,EACA,SAAUA,EAAAA,OAAO,EAAE,SAAS,CAAA,EAC3B,CACD,KAAM,MAAA,CACP,CACH,CCrCO,SAASG,GAAW,CACzB,OAAOC,eAAuB,CAC5B,SAAU,CACR,KAAMC,EAAAA,KAAK,EACX,KAAM,WACR,EACA,aAAc,CACZ,KAAMN,EAAAA,OAAO,EAAE,SAAS,EACxB,KAAM,gBACR,EACA,KAAMF,EAAK,EAAE,SAAS,EACtB,aAAc,CACZ,KAAMG,EAAAA,OAAO,EAAE,SAAS,EACxB,KAAM,eACR,EACA,SAAU,CACR,KAAMA,EAAAA,OAAO,EAAE,SAAS,EACxB,KAAM,WACR,EACA,KAAMA,EAAAA,OAAO,EACb,QAAS,CACP,KAAMA,EAAAA,OAAO,EAAE,SAAS,EACxB,KAAM,UACR,EACA,SAAUC,EAAK,EAAE,SAAS,EAC1B,WAAY,CACV,KAAMD,EAAAA,OAAO,EAAE,SAAS,EACxB,KAAM,aACR,EACA,KAAMC,EAAK,EAAE,SAAS,CAAA,EACrB,CACD,KAAM,UAAA,CACP,CACH,CCnCO,SAASK,EAAMC,EAA0B,CACvC,OAAAJ,EAAW,EAAA,MAAMI,CAAK,CAC/B,CCPA,SAASC,EAAUC,EAAyBC,EAAaH,EAA2B,CAC9EA,IAAU,QAGPE,EAAA,IAAIC,EAAKH,CAAK,CACvB,CAEA,SAASI,EAAQF,EAAyBC,EAAaH,EAAyB,CAC9E,GAAIA,IAAU,OACZ,OAEI,KAAA,CACJ,SAAAK,EACA,UAAAC,EACA,SAAAC,EACA,UAAAC,EACA,aAAAC,EACA,MAAAC,EACA,GAAGC,CACD,EAAAX,EAEGE,EAAA,IAAIC,EAAK,KAAK,UAAU,CAC7B,GAAGQ,EACH,UAAWN,EACX,WAAYC,EACZ,UAAWC,EACX,WAAYC,EACZ,cAAeC,EACf,OAAQC,CACT,CAAA,CAAC,CACJ,CAMO,SAASE,EAAUZ,EAAyB,CAC3C,KAAA,CACJ,SAAAa,EACA,aAAAC,EACA,KAAAxB,EACA,aAAAyB,EACA,SAAAC,EACA,KAAAC,EACA,QAAAC,EACA,SAAAC,EACA,WAAAC,EACA,KAAA1B,CACE,EAAAM,EAEEE,EAAS,IAAI,gBAWnB,GATAA,EAAO,IAAI,aAAcW,EAAS,UAAY,KAAM,UAAU,EACpDZ,EAAAC,EAAQ,gBAAiBa,CAAY,EACrCd,EAAAC,EAAQ,YAAac,CAAQ,EAC7Bf,EAAAC,EAAQ,OAAQe,CAAI,EACpBhB,EAAAC,EAAQ,WAAYgB,CAAO,EAC7Bd,EAAAF,EAAQ,WAAYiB,CAAQ,EAC1BlB,EAAAC,EAAQ,cAAekB,CAAU,EACnChB,EAAAF,EAAQ,OAAQR,CAAI,EAExBJ,EAAM,CACR,KAAM,CAAE,SAAAe,EAAU,GAAGM,CAAA,EAASrB,EACvBY,EAAA,IAAI,OAAQ,KAAK,UAAU,CAChC,GAAGS,EACH,UAAWN,CACZ,CAAA,CAAC,CACJ,CAEA,OAAIS,GACFZ,EAAO,IAAI,iBAAkBY,EAAa,SAAU,CAAA,EAG/CZ,EAAO,UAChB"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/errors.ts","../src/result.ts","../src/parsing.ts","../src/signing.ts","../src/validation.ts"],"sourcesContent":["import { errorClass, errorClassWithData } from 'error-kid';\n\n/**\n * Thrown when a value doesn't represent valid init data.\n */\nexport class InvalidInitDataError extends /* @__PURE__ */ errorClassWithData({\n name: 'InvalidInitDataError',\n message: (value: string) => `Invalid init data: ${value}`,\n cause: (_value: string, cause?: unknown) => cause,\n data: (value: string) => ({ value }),\n}) {\n}\n\n/**\n * Thrown when init data has no parameter containing its signature.\n */\nexport class SignatureMissingError extends /* @__PURE__ */ errorClassWithData({\n name: 'SignatureMissingError',\n data: (param: 'hash' | 'signature') => ({ param }),\n message: (param: 'hash' | 'signature') => `\"${param}\" parameter is missing`,\n}) {\n}\n\n/**\n * Thrown when init data signature doesn't match its content.\n */\nexport class SignatureInvalidError extends /* @__PURE__ */ errorClass({\n name: 'SignatureInvalidError',\n message: 'Init data signature is invalid',\n}) {\n}\n\n/**\n * Thrown when the `auth_date` init data parameter is missing or isn't a Unix time.\n */\nexport class AuthDateInvalidError extends /* @__PURE__ */ errorClassWithData({\n name: 'AuthDateInvalidError',\n data: (value?: string) => ({ value }),\n message: (value?: string) => `\"auth_date\" is invalid: ${value ?? 'value is missing'}`,\n}) {\n}\n\n/**\n * Thrown when init data has expired.\n */\nexport class ExpiredError extends /* @__PURE__ */ errorClassWithData({\n name: 'ExpiredError',\n data: (issuedAt: Date, expiresAt: Date, now: Date) => ({ issuedAt, expiresAt, now }),\n message: (issuedAt: Date, expiresAt: Date, now: Date) => [\n `Init data expired. Issued at ${issuedAt.toISOString()},`,\n `expires at ${expiresAt.toISOString()}, now is ${now.toISOString()}`,\n ].join(' '),\n}) {\n}\n","/**\n * Result of an operation which can fail with one of the known errors. Unlike a thrown error,\n * the error type here is checked by the compiler.\n */\nexport type Result<E, T> = { ok: false; error: E } | { ok: true; data: T };\n\n/**\n * @returns A successful result.\n * @param data - result data.\n */\nexport function ok<T>(data: T): { ok: true; data: T } {\n return { ok: true, data };\n}\n\n/**\n * @returns A failed result.\n * @param error - result error.\n */\nexport function err<E>(error: E): { ok: false; error: E } {\n return { ok: false, error };\n}\n\n/**\n * @returns Result data.\n * @param result - result to unwrap.\n * @throws The result error, if the result is failed.\n */\nexport function unwrap<E extends Error, T>(result: Result<E, T>): T {\n if (!result.ok) {\n throw result.error;\n }\n return result.data;\n}\n\n/**\n * Creates a throwing version of a function returning a result. The created function accepts\n * the same arguments and returns the result data, or throws the result error.\n *\n * Generic functions lose their type parameters when wrapped, so write their throwing versions\n * manually using `unwrap`.\n * @param fn - function returning a result, or a promise of it.\n * @example\n * export const createStartParam = throwing(safeCreateStartParam);\n */\nexport function throwing<A extends unknown[], E extends Error, T>(\n fn: (...args: A) => Promise<Result<E, T>>,\n): (...args: A) => Promise<T>;\nexport function throwing<A extends unknown[], E extends Error, T>(\n fn: (...args: A) => Result<E, T>,\n): (...args: A) => T;\nexport function throwing(\n fn: (...args: unknown[]) => Result<Error, unknown> | Promise<Result<Error, unknown>>,\n): (...args: unknown[]) => unknown {\n return (...args) => {\n const result = fn(...args);\n return result instanceof Promise ? result.then(unwrap) : unwrap(result);\n };\n}\n","import {\n boolean,\n digits,\n type GenericSchema,\n number,\n object,\n optional,\n parseJson,\n pipe,\n safeParse as safeParseSchema,\n string,\n transform,\n ValiError,\n} from 'valibot';\n\nimport { InvalidInitDataError } from './errors.js';\nimport { err, ok, type Result, throwing } from './result.js';\nimport type { Chat, InitData, User } from './types.js';\n\nfunction json<T>(schema: GenericSchema<unknown, T>): GenericSchema<unknown, T> {\n return pipe(string(), parseJson(), schema);\n}\n\nconst UserSchema: GenericSchema<unknown, User> = object({\n added_to_attachment_menu: optional(boolean()),\n allows_write_to_pm: optional(boolean()),\n first_name: string(),\n id: number(),\n is_bot: optional(boolean()),\n is_premium: optional(boolean()),\n language_code: optional(string()),\n last_name: optional(string()),\n photo_url: optional(string()),\n username: optional(string()),\n});\n\nconst ChatSchema: GenericSchema<unknown, Chat> = object({\n id: number(),\n photo_url: optional(string()),\n title: string(),\n type: string(),\n username: optional(string()),\n});\n\nconst InitDataSchema: GenericSchema<unknown, InitData> = object({\n auth_date: pipe(string(), digits(), transform(value => new Date(Number(value) * 1000))),\n can_send_after: optional(pipe(string(), digits(), transform(Number))),\n chat: optional(json(ChatSchema)),\n chat_instance: optional(string()),\n chat_join_request_query_id: optional(string()),\n chat_type: optional(string()),\n hash: string(),\n query_id: optional(string()),\n receiver: optional(json(UserSchema)),\n signature: optional(string()),\n start_param: optional(string()),\n user: optional(json(UserSchema)),\n});\n\n/**\n * Parses init data from its query representation. The function doesn't check the init data\n * signature, use `safeValidate` for that.\n * @param value - init data query.\n * @returns Parsed init data, or `InvalidInitDataError` if the value doesn't represent valid\n * init data.\n */\nexport function safeParse(value: string | URLSearchParams): Result<InvalidInitDataError, InitData> {\n const query = new URLSearchParams(value);\n const input: Record<string, string> = {};\n query.forEach((item, key) => {\n // Like URLSearchParams.get, take the first value.\n key in input || (input[key] = item);\n });\n const result = safeParseSchema(InitDataSchema, input);\n return result.success\n ? ok(result.output)\n : err(new InvalidInitDataError(query.toString(), new ValiError(result.issues)));\n}\n\n/**\n * Parses init data from its query representation. The function doesn't check the init data\n * signature, use `validate` for that.\n *\n * Throwing version of `safeParse`.\n * @param value - init data query.\n * @throws {InvalidInitDataError} The value doesn't represent valid init data.\n */\nexport const parse = /* @__PURE__ */ throwing(safeParse);\n\n/**\n * Converts init data to its query representation.\n * @param value - init data.\n */\nexport function serialize(value: Partial<InitData>): string {\n const query = new URLSearchParams();\n Object.entries(value).forEach(([key, item]) => {\n if (item === undefined) {\n return;\n }\n query.set(\n key,\n item instanceof Date\n ? String(Math.floor(item.getTime() / 1000))\n : typeof item === 'object' ? JSON.stringify(item) : String(item),\n );\n });\n return query.toString();\n}\n","import { serialize } from './parsing.js';\nimport type { InitData } from './types.js';\n\n/**\n * Bot token, or a secret key created with `createSecretKey`.\n */\nexport type Secret = string | CryptoKey;\n\n/**\n * Init data to sign. If `auth_date` is omitted, the current date is used.\n */\nexport type SignableInitData = Omit<InitData, 'auth_date' | 'hash'> & { auth_date?: Date };\n\nconst encoder = new TextEncoder();\n\nexport function bytesToHex(bytes: ArrayBuffer): string {\n return Array\n .from(new Uint8Array(bytes), byte => byte.toString(16).padStart(2, '0'))\n .join('');\n}\n\nexport function hexToBytes(hex: string): Uint8Array<ArrayBuffer> {\n return Uint8Array.from(hex.match(/../g) || [], byte => parseInt(byte, 16));\n}\n\n/**\n * @returns Data-check-string of the init data parameters: `key=value` pairs sorted\n * alphabetically and separated by line feeds.\n * @param pairs - init data parameters.\n */\nexport function createDataCheckString(pairs: [key: string, value: string][]): string {\n return pairs\n .map(([key, value]) => `${key}=${value}`)\n .sort()\n .join('\\n');\n}\n\nasync function importHmacKey(raw: BufferSource): Promise<CryptoKey> {\n return crypto.subtle.importKey(\n 'raw',\n raw,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign', 'verify'],\n );\n}\n\nasync function hmac(key: BufferSource, data: string): Promise<ArrayBuffer> {\n return crypto.subtle.sign('HMAC', await importHmacKey(key), encoder.encode(data));\n}\n\n/**\n * Hashes the bot token the way Telegram does to sign init data. Store the result instead of\n * the bot token if the server only needs to validate init data, and pass it to\n * `createSecretKey` with the `hashed` option.\n * @param token - bot token.\n * @returns HMAC-SHA-256 of the bot token keyed with `WebAppData`, in the hex format.\n */\nexport async function hashToken(token: string): Promise<string> {\n return bytesToHex(await hmac(encoder.encode('WebAppData'), token));\n}\n\n/**\n * Creates a key used to sign and validate init data. Create it once and reuse to avoid\n * hashing the bot token on each call.\n * @param token - bot token, or its hash created with `hashToken` if `hashed` is true.\n * @param options - additional options.\n * @throws {TypeError} The token is marked as hashed but isn't a SHA-256 hash in the hex format.\n */\nexport async function createSecretKey(\n token: string,\n options: { hashed?: boolean } = {},\n): Promise<CryptoKey> {\n if (!options.hashed) {\n return importHmacKey(await hmac(encoder.encode('WebAppData'), token));\n }\n if (!/^[\\da-f]{64}$/i.test(token)) {\n throw new TypeError('Hashed token must be a SHA-256 hash in the hex format');\n }\n return importHmacKey(hexToBytes(token));\n}\n\nexport async function toSecretKey(secret: Secret): Promise<CryptoKey> {\n return typeof secret === 'string' ? createSecretKey(secret) : secret;\n}\n\n/**\n * Signs data the way Telegram signs init data.\n * @param data - data to sign, usually a data-check-string.\n * @param secret - bot token or a secret key.\n * @returns Signature in the hex format.\n */\nexport async function signData(data: string, secret: Secret): Promise<string> {\n const key = await toSecretKey(secret);\n return bytesToHex(await crypto.subtle.sign('HMAC', key, encoder.encode(data)));\n}\n\n/**\n * Signs init data. Useful to test the server or to mock the Telegram environment.\n * @param data - init data to sign.\n * @param secret - bot token or a secret key.\n * @returns Signed init data in the query format.\n * @example\n * const initData = await sign({ user: { id: 1, first_name: 'Pavel' } }, botToken);\n */\nexport async function sign(data: SignableInitData, secret: Secret): Promise<string> {\n const authDate = data.auth_date || new Date();\n const query = new URLSearchParams(serialize({ ...data, auth_date: authDate }));\n query.delete('hash');\n query.set('hash', await signData(createDataCheckString([...query]), secret));\n return query.toString();\n}\n","import {\n AuthDateInvalidError,\n ExpiredError,\n SignatureInvalidError,\n type InvalidInitDataError,\n SignatureMissingError,\n} from './errors.js';\nimport { safeParse } from './parsing.js';\nimport { err, ok, type Result, throwing } from './result.js';\nimport { createDataCheckString, hexToBytes, type Secret, toSecretKey } from './signing.js';\nimport type { InitData } from './types.js';\n\nconst PUBLIC_KEYS = {\n production: 'e7bf03a2fa4602af4580703d88dda5bb59f32ed8b02a56c187fe7d34caed242d',\n test: '40055058a4ee38156a06562e52eece92a771bcd8346a8c4615cb7376eddf72ec',\n};\n\nexport interface ValidateOptions {\n /**\n * Time in seconds during which init data is considered valid after it was created. Pass `0`\n * to skip the expiration check.\n * @default 86400 (1 day)\n */\n expiresIn?: number;\n}\n\nexport interface Validate3rdOptions extends ValidateOptions {\n /**\n * True if init data was created in the Telegram test environment.\n * @default false\n */\n test?: boolean;\n}\n\n/**\n * Error returned when init data is invalid.\n */\nexport type ValidateError =\n | SignatureMissingError\n | AuthDateInvalidError\n | ExpiredError\n | SignatureInvalidError\n | InvalidInitDataError;\n\ntype VerifyError = Exclude<ValidateError, InvalidInitDataError>;\n\n/**\n * Extracts the signature and data-check-string from init data, and checks its expiration.\n * @param value - init data query.\n * @param param - parameter containing the signature.\n * @param exclude - parameters excluded from the data-check-string.\n * @param options - validation options.\n */\nfunction prepare(\n value: string | URLSearchParams,\n param: 'hash' | 'signature',\n exclude: string[],\n { expiresIn = 86400 }: ValidateOptions,\n): Result<\n SignatureMissingError | AuthDateInvalidError | ExpiredError,\n { signature: string; dataCheckString: string }\n> {\n const query = new URLSearchParams(value);\n const signature = query.get(param);\n if (!signature) {\n return err(new SignatureMissingError(param));\n }\n\n const authDateRaw = query.get('auth_date') ?? undefined;\n if (!authDateRaw || !/^\\d+$/.test(authDateRaw)) {\n return err(new AuthDateInvalidError(authDateRaw));\n }\n\n if (expiresIn > 0) {\n const authDate = new Date(Number(authDateRaw) * 1000);\n const expiresAt = new Date(authDate.getTime() + (expiresIn * 1000));\n const now = new Date();\n if (expiresAt < now) {\n return err(new ExpiredError(authDate, expiresAt, now));\n }\n }\n\n return ok({\n signature,\n dataCheckString: createDataCheckString([...query].filter(([key]) => !exclude.includes(key))),\n });\n}\n\nasync function verify(\n value: string | URLSearchParams,\n secret: Secret,\n options: ValidateOptions = {},\n): Promise<Result<VerifyError, void>> {\n const prepared = prepare(value, 'hash', ['hash'], options);\n if (!prepared.ok) {\n return prepared;\n }\n const { signature, dataCheckString } = prepared.data;\n // crypto.subtle.verify compares signatures in constant time, which protects from timing\n // attacks.\n const verified = /^[\\da-f]{64}$/i.test(signature) && await crypto.subtle.verify(\n 'HMAC',\n await toSecretKey(secret),\n hexToBytes(signature),\n new TextEncoder().encode(dataCheckString),\n );\n return verified ? ok(undefined) : err(new SignatureInvalidError());\n}\n\nasync function verify3rd(\n value: string | URLSearchParams,\n botId: number,\n options: Validate3rdOptions = {},\n): Promise<Result<VerifyError, void>> {\n const prepared = prepare(value, 'signature', ['hash', 'signature'], options);\n if (!prepared.ok) {\n return prepared;\n }\n const { signature, dataCheckString } = prepared.data;\n\n let signatureBytes: Uint8Array<ArrayBuffer>;\n try {\n // The signature is in the base64url format.\n const binary = atob(signature.replace(/-/g, '+').replace(/_/g, '/'));\n signatureBytes = Uint8Array.from(binary, char => char.charCodeAt(0));\n } catch {\n return err(new SignatureInvalidError());\n }\n\n const verified = await crypto.subtle.verify(\n 'Ed25519',\n await crypto.subtle.importKey(\n 'raw',\n hexToBytes(PUBLIC_KEYS[options.test ? 'test' : 'production']),\n 'Ed25519',\n false,\n ['verify'],\n ),\n signatureBytes,\n new TextEncoder().encode(`${botId}:WebAppData\\n${dataCheckString}`),\n );\n return verified ? ok(undefined) : err(new SignatureInvalidError());\n}\n\n/**\n * Validates init data using the bot token and parses it.\n * @param value - init data query.\n * @param secret - bot token or a secret key created with `createSecretKey`.\n * @param options - additional options.\n * @returns Parsed init data, or one of the errors:\n * - `SignatureMissingError`: the `hash` parameter is missing;\n * - `AuthDateInvalidError`: the `auth_date` parameter is missing or invalid;\n * - `ExpiredError`: init data has expired;\n * - `SignatureInvalidError`: init data wasn't signed with the specified bot token;\n * - `InvalidInitDataError`: init data is signed, but has an unexpected structure.\n * @see https://core.telegram.org/bots/webapps#validating-data-received-via-the-mini-app\n * @example\n * const result = await safeValidate(rawInitData, botToken);\n * if (!result.ok) {\n * return matchError(result.error, {\n * ExpiredError: () => reply(401, 'Init data has expired'),\n * ...\n * });\n * }\n * const initData = result.data;\n */\nexport async function safeValidate(\n value: string | URLSearchParams,\n secret: Secret,\n options?: ValidateOptions,\n): Promise<Result<ValidateError, InitData>> {\n const verified = await verify(value, secret, options);\n return verified.ok ? safeParse(value) : verified;\n}\n\n/**\n * Validates init data using the bot token and parses it.\n *\n * Throwing version of `safeValidate`.\n * @param value - init data query.\n * @param secret - bot token or a secret key created with `createSecretKey`.\n * @param options - additional options.\n * @returns Parsed init data.\n * @throws {SignatureMissingError} The `hash` parameter is missing.\n * @throws {AuthDateInvalidError} The `auth_date` parameter is missing or invalid.\n * @throws {ExpiredError} Init data has expired.\n * @throws {SignatureInvalidError} Init data wasn't signed with the specified bot token.\n * @throws {InvalidInitDataError} Init data is signed, but has an unexpected structure.\n * @see https://core.telegram.org/bots/webapps#validating-data-received-via-the-mini-app\n * @example\n * const initData = await validate(rawInitData, botToken);\n */\nexport const validate = /* @__PURE__ */ throwing(safeValidate);\n\n/**\n * @returns True if init data is signed with the bot token and hasn't expired.\n * @param value - init data query.\n * @param secret - bot token or a secret key created with `createSecretKey`.\n * @param options - additional options.\n */\nexport async function isValid(\n value: string | URLSearchParams,\n secret: Secret,\n options?: ValidateOptions,\n): Promise<boolean> {\n return (await verify(value, secret, options)).ok;\n}\n\n/**\n * Validates init data without the bot token, using the Telegram public key, and parses it.\n * Useful for third parties receiving init data of another bot.\n * @param value - init data query.\n * @param botId - identifier of the bot the init data was issued for.\n * @param options - additional options.\n * @returns Parsed init data, or one of the errors:\n * - `SignatureMissingError`: the `signature` parameter is missing;\n * - `AuthDateInvalidError`: the `auth_date` parameter is missing or invalid;\n * - `ExpiredError`: init data has expired;\n * - `SignatureInvalidError`: init data wasn't signed by Telegram for the specified bot;\n * - `InvalidInitDataError`: init data is signed, but has an unexpected structure.\n * @see https://core.telegram.org/bots/webapps#validating-data-for-third-party-use\n */\nexport async function safeValidate3rd(\n value: string | URLSearchParams,\n botId: number,\n options?: Validate3rdOptions,\n): Promise<Result<ValidateError, InitData>> {\n const verified = await verify3rd(value, botId, options);\n return verified.ok ? safeParse(value) : verified;\n}\n\n/**\n * Validates init data without the bot token, using the Telegram public key, and parses it.\n * Useful for third parties receiving init data of another bot.\n *\n * Throwing version of `safeValidate3rd`.\n * @param value - init data query.\n * @param botId - identifier of the bot the init data was issued for.\n * @param options - additional options.\n * @returns Parsed init data.\n * @throws {SignatureMissingError} The `signature` parameter is missing.\n * @throws {AuthDateInvalidError} The `auth_date` parameter is missing or invalid.\n * @throws {ExpiredError} Init data has expired.\n * @throws {SignatureInvalidError} Init data wasn't signed by Telegram for the specified bot.\n * @throws {InvalidInitDataError} Init data is signed, but has an unexpected structure.\n * @see https://core.telegram.org/bots/webapps#validating-data-for-third-party-use\n */\nexport const validate3rd = /* @__PURE__ */ throwing(safeValidate3rd);\n\n/**\n * @returns True if init data is signed by Telegram for the specified bot and hasn't expired.\n * @param value - init data query.\n * @param botId - identifier of the bot the init data was issued for.\n * @param options - additional options.\n */\nexport async function isValid3rd(\n value: string | URLSearchParams,\n botId: number,\n options?: Validate3rdOptions,\n): Promise<boolean> {\n return (await verify3rd(value, botId, options)).ok;\n}\n"],"names":["InvalidInitDataError","errorClassWithData","value","_value","cause","SignatureMissingError","param","SignatureInvalidError","errorClass","AuthDateInvalidError","ExpiredError","issuedAt","expiresAt","now","ok","data","err","error","unwrap","result","throwing","fn","args","json","schema","pipe","string","parseJson","UserSchema","object","optional","boolean","number","ChatSchema","InitDataSchema","digits","transform","safeParse","query","input","item","key","safeParseSchema","ValiError","parse","serialize","encoder","bytesToHex","bytes","byte","hexToBytes","hex","createDataCheckString","pairs","importHmacKey","raw","hmac","hashToken","token","createSecretKey","options","toSecretKey","secret","signData","sign","authDate","PUBLIC_KEYS","prepare","exclude","expiresIn","signature","authDateRaw","verify","prepared","dataCheckString","verify3rd","botId","signatureBytes","binary","char","safeValidate","verified","validate","isValid","safeValidate3rd","validate3rd","isValid3rd"],"mappings":"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"}
@@ -1,2 +1,4 @@
1
- this.tmajs=this.tmajs||{};this.tmajs.initData=function(f){"use strict";var E=Object.defineProperty,j=(t,e,r)=>e in t?E(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,T=(t,e,r)=>(j(t,typeof e!="symbol"?e+"":e,r),r);class m extends Error{constructor(e,{cause:r,type:n}={}){super(`Unable to parse value${n?` as ${n}`:""}`,{cause:r}),T(this,"type"),this.value=e,Object.setPrototypeOf(this,m.prototype),this.type=n}}class w{constructor(e,r,n,o){this.parser=e,this.isOptional=r,this.isEmpty=n,this.type=o}parse(e){if(!(this.isOptional&&this.isEmpty(e)))try{return this.parser(e)}catch(r){throw new m(e,{type:this.type,cause:r})}}optional(){return this.isOptional=!0,this}}function y(){return new TypeError("Value has unexpected type")}function S(t){return t===void 0}function d(t,{type:e,isEmpty:r=S}={}){return({isEmpty:n=r}={})=>new w(t,!1,n,e)}const _=d(t=>{if(typeof t=="boolean")return t;const e=String(t);if(e==="1"||e==="true")return!0;if(e==="0"||e==="false")return!1;throw y()},{type:"boolean"}),g=d(t=>{if(typeof t=="number")return t;if(typeof t=="string"){const e=Number(t);if(!Number.isNaN(e))return e}throw y()},{type:"number"}),$=g(),A=d(t=>t instanceof Date?t:new Date($.parse(t)*1e3),{type:"Date"});class b extends Error{constructor(e,{cause:r,type:n}={}){super(`Unable to parse field "${e}"${n?` as ${n}`:""}`,{cause:r}),Object.setPrototypeOf(this,b.prototype)}}function O(t,e){const r={};for(const n in t){const o=t[n];if(!o)continue;let a,p;if(typeof o=="function"||"parse"in o)a=n,p=typeof o=="function"?o:o.parse.bind(o);else{const{type:s}=o;a=o.from||n,p=typeof s=="function"?s:s.parse.bind(s)}let c;const h=e(a);try{c=p(h)}catch(s){throw s instanceof m?new b(a,{type:s.type,cause:s}):new b(a,{cause:s})}c!==void 0&&(r[n]=c)}return r}function P(t,e={}){const{type:r,isEmpty:n=S}=e;return new w(o=>{let a=o;if(typeof a=="string"&&(a=JSON.parse(a)),typeof a!="object"||a===null||Array.isArray(a))throw y();return O(t,p=>a[p])},!1,n,r)}const i=d(t=>{if(typeof t=="string"||typeof t=="number")return t.toString();throw y()},{type:"string"});i();function I(t,e={}){const{type:r,isEmpty:n=S}=e;return new w(o=>{if(typeof o!="string"&&!(o instanceof URLSearchParams))throw y();const a=typeof o=="string"?new URLSearchParams(o):o;return O(t,p=>{const c=a.get(p);return c===null?void 0:c})},!1,n,r)}function N(){return P({id:g(),type:i(),title:i(),photoUrl:{type:i().optional(),from:"photo_url"},username:i().optional()},{type:"Chat"})}function v(){return P({addedToAttachmentMenu:{type:_().optional(),from:"added_to_attachment_menu"},allowsWriteToPm:{type:_().optional(),from:"allows_write_to_pm"},firstName:{type:i(),from:"first_name"},id:g(),isBot:{type:_().optional(),from:"is_bot"},isPremium:{type:_().optional(),from:"is_premium"},languageCode:{type:i().optional(),from:"language_code"},lastName:{type:i().optional(),from:"last_name"},photoUrl:{type:i().optional(),from:"photo_url"},username:i().optional()},{type:"User"})}function U(){return I({authDate:{type:A(),from:"auth_date"},canSendAfter:{type:g().optional(),from:"can_send_after"},chat:N().optional(),chatInstance:{type:i().optional(),from:"chat_instance"},chatType:{type:i().optional(),from:"chat_type"},hash:i(),queryId:{type:i().optional(),from:"query_id"},receiver:v().optional(),startParam:{type:i().optional(),from:"start_param"},user:v().optional()},{type:"InitData"})}function q(t){return U().parse(t)}function l(t,e,r){r!==void 0&&t.set(e,r)}function D(t,e,r){if(r===void 0)return;const{photoUrl:n,firstName:o,lastName:a,isPremium:p,languageCode:c,isBot:h,...s}=r;t.set(e,JSON.stringify({...s,photo_url:n,first_name:o,last_name:a,is_premium:p,language_code:c,is_bot:h}))}function R(t){const{authDate:e,canSendAfter:r,chat:n,chatInstance:o,chatType:a,hash:p,queryId:c,receiver:h,startParam:s,user:C}=t,u=new URLSearchParams;if(u.set("auth_date",(e.getTime()/1e3).toString()),l(u,"chat_instance",o),l(u,"chat_type",a),l(u,"hash",p),l(u,"query_id",c),D(u,"receiver",h),l(u,"start_param",s),D(u,"user",C),n){const{photoUrl:J,...L}=n;u.set("chat",JSON.stringify({...L,photo_url:J}))}return r&&u.set("can_send_after",r.toString()),u.toString()}return f.chat=N,f.initData=U,f.parse=q,f.serialize=R,f.user=v,Object.defineProperty(f,Symbol.toStringTag,{value:"Module"}),f}({});
1
+ this.tmajs=this.tmajs||{};this.tmajs.initData=function(u){"use strict";var se=Object.defineProperty,ue=(e,n,t)=>n in e?se(e,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[n]=t,V=(e,n,t)=>ue(e,typeof n!="symbol"?n+"":n,t);const h="$$errorKidTag";function oe(e){return`${h}:${e}`}function ce(e,n){Object.defineProperty(e,h,{value:n,enumerable:!0,writable:!1,configurable:!1})}function le(e,n){return typeof e=="object"&&e!==null&&e[h]===n}function H(e){const n=oe(e.name);class t extends Error{constructor(...a){var s;super(typeof e.message=="function"?e.message(...a):e.message,{cause:(s=e.cause)==null?void 0:s.call(e,...a)}),this.name=e.name,ce(this,n),Object.setPrototypeOf(this,new.target.prototype)}}return V(t,"is",r=>le(r,n)),Object.defineProperty(t,"name",{value:e.name,configurable:!0,writable:!1,enumerable:!0}),t}function b(e){class n extends H(e){constructor(...r){super(...r),V(this,"data"),this.data=e.data(...r)}}return Object.defineProperty(n,"name",{value:e.name,configurable:!0,writable:!1,enumerable:!0}),n}function fe(e,n,t){const r=n;if(typeof e=="object"&&e!==null&&h in e){const a=r[e.name];if(a)return a(e)}if(t!=null&&t.loose)return r.default(e);throw new TypeError("matchError: no handler matched the passed value")}class N extends b({name:"InvalidInitDataError",message:n=>`Invalid init data: ${n}`,cause:(n,t)=>t,data:n=>({value:n})}){}class K extends b({name:"SignatureMissingError",data:n=>({param:n}),message:n=>`"${n}" parameter is missing`}){}class w extends H({name:"SignatureInvalidError",message:"Init data signature is invalid"}){}class x extends b({name:"AuthDateInvalidError",data:n=>({value:n}),message:n=>`"auth_date" is invalid: ${n??"value is missing"}`}){}class R extends b({name:"ExpiredError",data:(n,t,r)=>({issuedAt:n,expiresAt:t,now:r}),message:(n,t,r)=>[`Init data expired. Issued at ${n.toISOString()},`,`expires at ${t.toISOString()}, now is ${r.toISOString()}`].join(" ")}){}const de={lang:void 0,message:void 0,abortEarly:void 0,abortPipeEarly:void 0};function L(e){return de}let D;function ye(e){return D==null?void 0:D.get(e)}let I;function pe(e){return I==null?void 0:I.get(e)}let P;function ge(e,n){var t;return(t=P==null?void 0:P.get(e))==null?void 0:t.get(n)}function me(e){var t,r;const n=typeof e;return n==="string"?`"${e}"`:n==="number"||n==="bigint"||n==="boolean"?`${e}`:n==="object"||n==="function"?(e&&((r=(t=Object.getPrototypeOf(e))==null?void 0:t.constructor)==null?void 0:r.name))??"null":n}function y(e,n,t,r,a){const s=a&&"input"in a?a.input:t.value,i=(a==null?void 0:a.expected)??e.expects??null,l=(a==null?void 0:a.received)??me(s),f={kind:e.kind,type:e.type,input:s,expected:i,received:l,message:`Invalid ${n}: ${i?`Expected ${i} but r`:"R"}eceived ${l}`,requirement:e.requirement,path:a==null?void 0:a.path,issues:a==null?void 0:a.issues,lang:r.lang,abortEarly:r.abortEarly,abortPipeEarly:r.abortPipeEarly},d=e.kind==="schema",g=(a==null?void 0:a.message)??e.message??ge(e.reference,f.lang)??(d?pe(f.lang):null)??r.message??ye(f.lang);g!==void 0&&(f.message=typeof g=="function"?g(f):g),d&&(t.typed=!1),t.issues?t.issues.push(f):t.issues=[f]}function m(e){return e["~standard"]={version:1,vendor:"valibot",validate:n=>e["~run"]({value:n},L())},e}var ve=class extends Error{constructor(e){super(e[0].message),this.name="ValiError",this.issues=e}};const he=/^\d+$/u;function A(e){return{kind:"validation",type:"digits",reference:A,async:!1,expects:null,requirement:he,message:e,"~run"(n,t){return n.typed&&!this.requirement.test(n.value)&&y(this,"digits",n,t),n}}}function G(e,n){return{kind:"transformation",type:"parse_json",reference:G,config:e,message:n,async:!1,"~run"(t,r){var a;try{t.value=JSON.parse(t.value,(a=this.config)==null?void 0:a.reviver)}catch(s){if(s instanceof Error)y(this,"JSON",t,r,{received:`"${s.message}"`}),t.typed=!1;else throw s}return t}}}function O(e){return{kind:"transformation",type:"transform",reference:O,async:!1,operation:e,"~run"(n){return n.value=this.operation(n.value),n}}}function be(e,n,t){return typeof e.fallback=="function"?e.fallback(n,t):e.fallback}function J(e,n,t){return typeof e.default=="function"?e.default(n,t):e.default}function v(e){return m({kind:"schema",type:"boolean",reference:v,expects:"boolean",async:!1,message:e,"~run"(n,t){return typeof n.value=="boolean"?n.typed=!0:y(this,"type",n,t),n}})}function $(e){return m({kind:"schema",type:"number",reference:$,expects:"number",async:!1,message:e,"~run"(n,t){return typeof n.value=="number"&&!isNaN(n.value)?n.typed=!0:y(this,"type",n,t),n}})}function E(e,n){return m({kind:"schema",type:"object",reference:E,expects:"Object",async:!1,entries:e,message:n,"~run"(t,r){var s;const a=t.value;if(a&&typeof a=="object"){t.typed=!0,t.value={};for(const i in this.entries){const l=this.entries[i];if(i in a||(l.type==="exact_optional"||l.type==="optional"||l.type==="nullish")&&l.default!==void 0){const f=i in a?a[i]:J(l),d=l["~run"]({value:f},r);if(d.issues){const g={type:"object",origin:"value",input:a,key:i,value:f};for(const j of d.issues)j.path?j.path.unshift(g):j.path=[g],(s=t.issues)==null||s.push(j);if(t.issues||(t.issues=d.issues),r.abortEarly){t.typed=!1;break}}d.typed||(t.typed=!1),t.value[i]=d.value}else if(l.fallback!==void 0)t.value[i]=be(l);else if(l.type!=="exact_optional"&&l.type!=="optional"&&l.type!=="nullish"&&(y(this,"key",t,r,{input:void 0,expected:`"${i}"`,path:[{type:"object",origin:"key",input:a,key:i,value:a[i]}]}),r.abortEarly))break}}else y(this,"type",t,r);return t}})}function o(e,n){return m({kind:"schema",type:"optional",reference:o,expects:`(${e.expects} | undefined)`,async:!1,wrapped:e,default:n,"~run"(t,r){return t.value===void 0&&(this.default!==void 0&&(t.value=J(this,t,r)),t.value===void 0)?(t.typed=!0,t):this.wrapped["~run"](t,r)}})}function c(e){return m({kind:"schema",type:"string",reference:c,expects:"string",async:!1,message:e,"~run"(n,t){return typeof n.value=="string"?n.typed=!0:y(this,"type",n,t),n}})}function T(...e){return m({...e[0],pipe:e,"~run"(n,t){for(const r of e)if(r.kind!=="metadata"){if(n.issues&&(r.kind==="schema"||r.kind==="transformation")){n.typed=!1;break}(!n.issues||!t.abortEarly&&!t.abortPipeEarly)&&(n=r["~run"](n,t))}return n}})}function we(e,n,t){const r=e["~run"]({value:n},L());return{typed:r.typed,success:!r.issues,output:r.value,issues:r.issues}}function S(e){return{ok:!0,data:e}}function p(e){return{ok:!1,error:e}}function B(e){if(!e.ok)throw e.error;return e.data}function C(e){return(...n)=>{const t=e(...n);return t instanceof Promise?t.then(B):B(t)}}function M(e){return T(c(),G(),e)}const F=E({added_to_attachment_menu:o(v()),allows_write_to_pm:o(v()),first_name:c(),id:$(),is_bot:o(v()),is_premium:o(v()),language_code:o(c()),last_name:o(c()),photo_url:o(c()),username:o(c())}),Ee=E({auth_date:T(c(),A(),O(e=>new Date(Number(e)*1e3))),can_send_after:o(T(c(),A(),O(Number))),chat:o(M(E({id:$(),photo_url:o(c()),title:c(),type:c(),username:o(c())}))),chat_instance:o(c()),chat_join_request_query_id:o(c()),chat_type:o(c()),hash:c(),query_id:o(c()),receiver:o(M(F)),signature:o(c()),start_param:o(c()),user:o(M(F))});function k(e){const n=new URLSearchParams(e),t={};n.forEach((a,s)=>{s in t||(t[s]=a)});const r=we(Ee,t);return r.success?S(r.output):p(new N(n.toString(),new ve(r.issues)))}const Se=C(k);function W(e){const n=new URLSearchParams;return Object.entries(e).forEach(([t,r])=>{r!==void 0&&n.set(t,r instanceof Date?String(Math.floor(r.getTime()/1e3)):typeof r=="object"?JSON.stringify(r):String(r))}),n.toString()}const _=new TextEncoder;function z(e){return Array.from(new Uint8Array(e),n=>n.toString(16).padStart(2,"0")).join("")}function q(e){return Uint8Array.from(e.match(/../g)||[],n=>parseInt(n,16))}function X(e){return e.map(([n,t])=>`${n}=${t}`).sort().join(`
2
+ `)}async function U(e){return crypto.subtle.importKey("raw",e,{name:"HMAC",hash:"SHA-256"},!1,["sign","verify"])}async function Y(e,n){return crypto.subtle.sign("HMAC",await U(e),_.encode(n))}async function ke(e){return z(await Y(_.encode("WebAppData"),e))}async function Q(e,n={}){if(!n.hashed)return U(await Y(_.encode("WebAppData"),e));if(!/^[\da-f]{64}$/i.test(e))throw new TypeError("Hashed token must be a SHA-256 hash in the hex format");return U(q(e))}async function Z(e){return typeof e=="string"?Q(e):e}async function ee(e,n){const t=await Z(n);return z(await crypto.subtle.sign("HMAC",t,_.encode(e)))}async function _e(e,n){const t=e.auth_date||new Date,r=new URLSearchParams(W({...e,auth_date:t}));return r.delete("hash"),r.set("hash",await ee(X([...r]),n)),r.toString()}const je={production:"e7bf03a2fa4602af4580703d88dda5bb59f32ed8b02a56c187fe7d34caed242d",test:"40055058a4ee38156a06562e52eece92a771bcd8346a8c4615cb7376eddf72ec"};function ne(e,n,t,{expiresIn:r=86400}){const a=new URLSearchParams(e),s=a.get(n);if(!s)return p(new K(n));const i=a.get("auth_date")??void 0;if(!i||!/^\d+$/.test(i))return p(new x(i));if(r>0){const l=new Date(Number(i)*1e3),f=new Date(l.getTime()+r*1e3),d=new Date;if(f<d)return p(new R(l,f,d))}return S({signature:s,dataCheckString:X([...a].filter(([l])=>!t.includes(l)))})}async function te(e,n,t={}){const r=ne(e,"hash",["hash"],t);if(!r.ok)return r;const{signature:a,dataCheckString:s}=r.data;return/^[\da-f]{64}$/i.test(a)&&await crypto.subtle.verify("HMAC",await Z(n),q(a),new TextEncoder().encode(s))?S(void 0):p(new w)}async function re(e,n,t={}){const r=ne(e,"signature",["hash","signature"],t);if(!r.ok)return r;const{signature:a,dataCheckString:s}=r.data;let i;try{const f=atob(a.replace(/-/g,"+").replace(/_/g,"/"));i=Uint8Array.from(f,d=>d.charCodeAt(0))}catch{return p(new w)}return await crypto.subtle.verify("Ed25519",await crypto.subtle.importKey("raw",q(je[t.test?"test":"production"]),"Ed25519",!1,["verify"]),i,new TextEncoder().encode(`${n}:WebAppData
3
+ ${s}`))?S(void 0):p(new w)}async function ae(e,n,t){const r=await te(e,n,t);return r.ok?k(e):r}const De=C(ae);async function Ie(e,n,t){return(await te(e,n,t)).ok}async function ie(e,n,t){const r=await re(e,n,t);return r.ok?k(e):r}const Pe=C(ie);async function Ae(e,n,t){return(await re(e,n,t)).ok}return u.AuthDateInvalidError=x,u.ExpiredError=R,u.InvalidInitDataError=N,u.SignatureInvalidError=w,u.SignatureMissingError=K,u.createSecretKey=Q,u.hashToken=ke,u.isValid=Ie,u.isValid3rd=Ae,u.matchError=fe,u.parse=Se,u.safeParse=k,u.safeValidate=ae,u.safeValidate3rd=ie,u.serialize=W,u.sign=_e,u.signData=ee,u.validate=De,u.validate3rd=Pe,Object.defineProperty(u,Symbol.toStringTag,{value:"Module"}),u}({});
2
4
  //# sourceMappingURL=index.iife.js.map