Pular para o conteúdo principal

@cactus-agents/sports

SDK multi-provider para integracoes de sportsbook. Suporta tres providers: First (iframe), Altenar (JS SDK) e Betby (JS SDK). Oferece service HTTP, helpers de deep-link, mapeamento de URLs semanticas e utilitarios para carregamento de SDKs externos.

Instalacao

pnpm add @cactus-agents/sports

Uso recomendado

import { createApiClient } from "@cactus-agents/api-client";
import { createSportsFromClient } from "@cactus-agents/sports";

const client = createApiClient({ baseUrl, tenant, language });
const sports = createSportsFromClient(client);

// Launch (autenticado)
const { url } = await sports.launch();

// Launch (anonimo)
const { url } = await sports.anonymousLaunch();

// Busca
const results = await sports.search({ term: "futebol" });

// JWT para Betby
const { jwt } = await sports.getBetbyJwt({ user_id: "123" });

API — SportsService

Endpoints

MetodoVerboEndpointDescricao
search(params)GET/cactus-sportbook/searchBusca esportiva (query params livres)
launch()GET/cactus-sportbook/launchURL iframe First — autenticado
anonymousLaunch()GET/cactus-sportbook/anonymous-launchURL iframe First — anonimo
getBetbyJwt(user)POST/betby/get-jwtGera JWT para Betby

Providers

First (iframe)

O First funciona via iframe com comunicacao postMessage. O SDK fornece helpers para deep-linking bidirecional:

import {
buildFirstRedirectUrl,
buildFirstDeepLink,
pathEntryFromRoute,
extractSemanticPath,
discoveryPathFromLocationChangeEvent,
sanitizeFirstQueryParams,
} from "@cactus-agents/sports";
FuncaoDescricao
buildFirstRedirectUrl(baseUrl, pathEntry)Constroi URL com fragmento/query para o iframe
buildFirstDeepLink(pathEntry)Converte FirstPathEntry em payload postMessage
pathEntryFromRoute(pathname, query, basePath?)Extrai path entry de uma rota React Router
extractSemanticPath(eventData, basePath?)Converte evento LOCATION_CHANGE em URL semantica legivel
discoveryPathFromQueryParams(query)Extrai path entry de query params
discoveryPathFromLocationChangeEvent(data)Mapeia evento do iframe para query-like object
sanitizeFirstQueryParams(params)Remove parametros sports-specific das query params
parseSemanticSegment(segment)Parseia segmento de URL semantica (ex: e-123, l-456)

URLs semanticas

O SDK converte URLs internas do First em URLs legiveis:

/sports/futebol/brasil/flamengo-x-palmeiras/e-816042737861410816
/sports/live → { eventlistTab: "Live" }
/sports/upcoming → { eventlistTab: "Upcoming" }

Prefixos suportados: e- (evento), l- (liga), s- (esporte), ml- (master league), c- (campeonato).

Altenar (JS SDK)

Helpers para mapeamento bidirecional entre URLs semanticas da app e payloads do SDK Altenar:

import {
buildAltenarSemanticPath,
parseAltenarPageFromPath,
} from "@cactus-agents/sports";
FuncaoDescricao
buildAltenarSemanticPath(to, basePath?)Converte callback onRouteChangeDetailed em URL semantica
parseAltenarPageFromPath(pathname, basePath?, testBasePath?)Parseia URL back para AltenarSetPayload

Paginas suportadas: overview, live, sport, category, championship, event, liveEvent, results, betHistory, esports, toto, entre outras.

Betby (JS SDK)

Para Betby, o SDK fornece apenas o endpoint JWT. A configuracao e feita via BetbyConfig:

interface BetbyConfig {
brandId?: string;
theme?: string;
libraryUrl?: string;
}

Helpers para resolver paths de menu e detectar o provider ativo:

import { resolveMenuItemPath, getActiveProvider } from "@cactus-agents/sports";

// Resolve path do menu baseado no provider ativo
const path = resolveMenuItemPath(sidebarItem, "altenar");
// → sidebarItem.altenarPath

// Detecta provider ativo pela URL (com basePath customizavel)
const provider = getActiveProvider("/sports/live", config);
// → config.main (ex: "first")

const provider2 = getActiveProvider("/deportes/live", config, {
sportsBasePath: "/deportes",
testBasePath: "/deportes-test",
});
// → config.main (brand override)

const testProvider = getActiveProvider("/sports-test/live", config);
// → config.test (ex: "altenar")

Parametro basePath

As funcoes extractSemanticPath(), pathEntryFromRoute(), buildAltenarSemanticPath(), parseAltenarPageFromPath() e getActiveProvider() aceitam um parametro opcional basePath (default: "/sports"). Isso permite que brands com paths customizados (ex: /deportes) passem o base path correto para que deep-links e deteccao de provider funcionem.

No template, o valor correto de basePath vem de routePaths.sports (via Route Registry):

import { routePaths } from "~/utils/routes";
import { getActiveProvider, extractSemanticPath } from "@cactus-agents/sports";

const provider = getActiveProvider(pathname, config, {
sportsBasePath: routePaths.sports,
testBasePath: routePaths["sports.test"],
});

const semanticPath = extractSemanticPath(eventData, routePaths.sports);

Carregamento de SDK externo

Utilitarios genericos para carregar scripts de terceiros:

import { loadExternalScript, waitForGlobal } from "@cactus-agents/sports";

// Carrega script Altenar
await loadExternalScript("https://sb1client-altenar.biahosted.com/sdk.js", "altenar-sdk");

// Aguarda global ficar disponivel
const sdk = await waitForGlobal<AltenarWSDK>("AltenarWSDK", {
interval: 200, // polling a cada 200ms
timeout: 30000, // timeout em 30s
});

Tipos principais

Provider

type SportsProvider = "first" | "altenar" | "betby";

Configuracao

interface SportsModuleConfig {
main: SportsProvider | null; // provider principal (/sports)
test: SportsProvider | null; // provider teste (/sports-test)
first?: FirstProviderConfig;
altenar?: AltenarProviderConfig;
betby?: BetbyConfig;
}

First

FirstPathEntry, FirstPathEntryData, FirstUrlData, FirstDeepLink, FirstLaunchResponse

Altenar

AltenarPage, AltenarPathEntry, AltenarInitPayload, AltenarSetPayload, AltenarProviderConfig

Betby

BetbyConfig, BetbyJwtResponse

SportsSidebarItemBase, WaitForGlobalOptions

Service

SportsFetcher, SportsService, SportsSearchParams, SportsSearchResponse

Arquivos relevantes

ArquivoConteudo
src/service.tscreateSportsService, createSportsFromClient
src/first.tsHelpers de deep-link e URL semantica (First)
src/altenar.tsHelpers de URL semantica (Altenar)
src/navigation.tsresolveMenuItemPath, getActiveProvider
src/sdk-loader.tsloadExternalScript, waitForGlobal
src/types.tsTodas as interfaces e tipos