npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

@1paws1/game-sdk

v0.1.5

Published

Game SDK for Mission Pawsible

Readme

Mission Pawsible Game SDK

Введение

Mission Pawsible Game SDK - это библиотека для интеграции игр в Telegram Mini App с поддержкой встраивания через iframe.

Установка

Установка пакета

После настройки registry установите пакет:

npm install @1paws1/game-sdk

Импорт

import { MissionPawsibleSDK } from "@1paws1/game-sdk";

Инициализация

Создание экземпляра SDK

const sdk = new MissionPawsibleSDK({
  clientId: "your-client-id",
  debug: false, // опционально
  apiUrl: "https://backend.missionpawsible.game", // опционально
});

Параметры конструктора (Options)

clientId (обязательный)

  • Тип: string
  • Описание: Уникальный идентификатор клиента, полученный при интеграции с Mission Pawsible платформой. Используется для аутентификации при запросах к API.

debug (опциональный)

  • Тип: boolean
  • По умолчанию: false
  • Описание: Включает режим отладки. При true в консоль будут выводиться логи работы SDK для диагностики проблем.

apiUrl (опциональный)

  • Тип: string
  • По умолчанию: "https://backend.missionpawsible.game"
  • Описание: URL адрес API бекенда Mission Pawsible. Используется для получения подмененного initData при работе в интегрированном режиме.

Методы SDK

init()

Инициализирует SDK и настраивает интеграцию с Telegram WebView.

⚠️ ВАЖНО: Метод init() должен вызываться до вызова Telegram.WebApp.ready() или любых других методов Telegram SDK.

Пример использования:

const sdk = new MissionPawsibleSDK({
  clientId: "your-client-id",
  debug: true,
});

// Вызывайте init() ПЕРЕД Telegram.WebApp.ready()
sdk.init();

// Теперь можно безопасно использовать Telegram SDK
Telegram.WebApp.ready();

Возвращаемое значение: void

Свойства после инициализации:

  • sdk.isInitialized - true, если SDK успешно инициализирован
  • sdk.isIntegrated - true, если игра запущена в интегрированном режиме (через Mission Pawsible платформу)

authorize<T>(callback: AuthorizeCallback<T>): Promise<T>

Используется для получения и подмены initData перед отправкой на ваш бекенд.

⚠️ ВАЖНО: Метод authorize() используется для подмены initData. В интегрированном режиме SDK автоматически получает новый initData с сервера Mission Pawsible, который должен использоваться вместо оригинального.

Пример использования:

const authData = await sdk.authorize(async ({ isIntegrated, initData }) => {
  // Отправка initData на ваш бекенд
  const response = await fetch("https://your-backend.com/auth", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      initData: initData,
      isIntegrated: isIntegrated,
    }),
  });

  return await response.json();
});

Параметры:

  • callback - Асинхронная функция, которая получает объект с параметрами:
    • isIntegrated: boolean - флаг, указывающий работает ли игра в интегрированном режиме
    • initData: string - строка initData для отправки на бекенд (уже подмененная, если isIntegrated = true)

Что делает метод:

  1. Если isIntegrated = false:

    • Использует оригинальный initData из window.Telegram.WebApp.initData
    • Вызывает callback с оригинальными данными
  2. Если isIntegrated = true:

    • Проверяет, что SDK инициализирован (выбросит ошибку, если init() не был вызван)
    • Отправляет запрос на ${apiUrl}/integration/auth с clientId и оригинальным initData
    • Получает новый подмененный initData с сервера
    • Вызывает callback с подмененным initData

Возвращаемое значение: Promise<T> - результат выполнения callback функции

Ошибки:

  • Error: "SDK not initialized" - если метод вызван до init() в интегрированном режиме

getOptions(): Options

Возвращает текущие опции SDK.

Пример использования:

const options = sdk.getOptions();
console.log(options.clientId); // 'your-client-id'
console.log(options.debug); // false
console.log(options.apiUrl); // 'https://backend.missionpawsible.game'

Возвращаемое значение: Объект Options с текущими настройками SDK

Работа с бекендом

⚠️ КРИТИЧЕСКИ ВАЖНО: Валидация initData на бекенде

При отправке initData на ваш бекенд, обязательно проверяйте значение isIntegrated:

Если isIntegrated = false:

  • Валидируйте initData используя Bot Father token (стандартная валидация Telegram)

Если isIntegrated = true:

  • НЕ используйте Bot Father token для валидации
  • Используйте secret значение, которое вы получили при интеграции вместе с clientId
  • Этот secret используется для валидации подмененного initData, полученного от Mission Pawsible API

Пример валидации на бекенде:

// Псевдокод для примера
async function validateInitData(initData: string, isIntegrated: boolean) {
  if (isIntegrated) {
    // Используйте secret, полученный при интеграции
    const secret = getIntegrationSecret(clientId);
    return validateWithSecret(initData, secret);
  } else {
    // Используйте Bot Father token
    const botToken = process.env.BOT_TOKEN;
    return validateWithBotToken(initData, botToken);
  }
}

Полный пример использования

import { MissionPawsibleSDK } from "@1paws1/game-sdk";

// 1. Создание экземпляра SDK
const sdk = new MissionPawsibleSDK({
  clientId: "your-client-id",
  debug: process.env.NODE_ENV === "development",
});

// 2. Инициализация ПЕРЕД Telegram.WebApp.ready()
sdk.init();

// 3. Теперь можно использовать Telegram SDK
Telegram.WebApp.ready();

// 4. Использование authorize для получения подмененного initData
async function authenticate() {
  try {
    const userData = await sdk.authorize(async ({ isIntegrated, initData }) => {
      // Отправка на ваш бекенд
      const response = await fetch("https://your-backend.com/auth", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          initData,
          isIntegrated,
        }),
      });

      if (!response.ok) {
        throw new Error("Authentication failed");
      }

      return await response.json();
    });

    console.log("User authenticated:", userData);
    return userData;
  } catch (error) {
    console.error("Authentication error:", error);
    throw error;
  }
}

// 5. Вызов аутентификации
authenticate();

Отладка

Для включения режима отладки установите debug: true при создании экземпляра SDK:

const sdk = new MissionPawsibleSDK({
  clientId: "your-client-id",
  debug: true,
});

В консоли браузера вы увидите подробные логи:

  • Инициализация SDK
  • Проверка режима интеграции
  • Запросы к API для получения подмененного initData
  • Обработка событий от родительского окна

Типы

type Options = {
  clientId: string;
  debug?: boolean;
  apiUrl?: string;
};

type AuthorizeCallbackParams = {
  isIntegrated: boolean;
  initData: string;
};

type AuthorizeCallback<T> = (params: AuthorizeCallbackParams) => Promise<T>;

Поддержка

При возникновении проблем проверьте:

  1. init() вызван до Telegram.WebApp.ready()
  2. clientId указан корректно
  3. ✅ В интегрированном режиме используется правильный secret для валидации на бекенде
  4. ✅ Включен режим отладки для диагностики (debug: true)