@dubsdotapp/node 0.2.1 → 0.3.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.d.mts +37 -1
- package/dist/index.d.ts +37 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/resources/ufc.ts +5 -1
- package/src/types.ts +38 -1
package/dist/index.d.mts
CHANGED
|
@@ -226,7 +226,10 @@ interface AppConfigResponse {
|
|
|
226
226
|
}
|
|
227
227
|
interface UFCFighter {
|
|
228
228
|
name: string;
|
|
229
|
-
|
|
229
|
+
athleteId: string | null;
|
|
230
|
+
headshotUrl: string | null;
|
|
231
|
+
flagUrl: string | null;
|
|
232
|
+
country: string | null;
|
|
230
233
|
abbreviation: string;
|
|
231
234
|
record: string | null;
|
|
232
235
|
winner: boolean;
|
|
@@ -256,6 +259,38 @@ interface UFCFightCardResponse {
|
|
|
256
259
|
success: boolean;
|
|
257
260
|
events: UFCEvent[];
|
|
258
261
|
}
|
|
262
|
+
interface UFCFighterDetail {
|
|
263
|
+
athleteId: string;
|
|
264
|
+
firstName: string | null;
|
|
265
|
+
lastName: string | null;
|
|
266
|
+
fullName: string | null;
|
|
267
|
+
nickname: string | null;
|
|
268
|
+
shortName: string | null;
|
|
269
|
+
height: string | null;
|
|
270
|
+
heightInches: number | null;
|
|
271
|
+
weight: string | null;
|
|
272
|
+
weightLbs: number | null;
|
|
273
|
+
reach: string | null;
|
|
274
|
+
reachInches: number | null;
|
|
275
|
+
age: number | null;
|
|
276
|
+
dateOfBirth: string | null;
|
|
277
|
+
stance: string | null;
|
|
278
|
+
weightClass: string | null;
|
|
279
|
+
citizenship: string | null;
|
|
280
|
+
citizenshipAbbreviation: string | null;
|
|
281
|
+
gym: string | null;
|
|
282
|
+
gymCountry: string | null;
|
|
283
|
+
active: boolean;
|
|
284
|
+
headshotUrl: string | null;
|
|
285
|
+
flagUrl: string | null;
|
|
286
|
+
stanceImageUrl: string | null;
|
|
287
|
+
espnUrl: string | null;
|
|
288
|
+
slug: string | null;
|
|
289
|
+
}
|
|
290
|
+
interface UFCFighterDetailResponse {
|
|
291
|
+
success: boolean;
|
|
292
|
+
fighter: UFCFighterDetail;
|
|
293
|
+
}
|
|
259
294
|
|
|
260
295
|
declare class AuthResource extends BaseResource {
|
|
261
296
|
getNonce(walletAddress: string): Promise<NonceResponse>;
|
|
@@ -299,6 +334,7 @@ declare class TransactionsResource extends BaseResource {
|
|
|
299
334
|
|
|
300
335
|
declare class UFCResource extends BaseResource {
|
|
301
336
|
fightCard(): Promise<UFCFightCardResponse>;
|
|
337
|
+
fighter(athleteId: string): Promise<UFCFighterDetailResponse>;
|
|
302
338
|
}
|
|
303
339
|
|
|
304
340
|
declare class Dubs {
|
package/dist/index.d.ts
CHANGED
|
@@ -226,7 +226,10 @@ interface AppConfigResponse {
|
|
|
226
226
|
}
|
|
227
227
|
interface UFCFighter {
|
|
228
228
|
name: string;
|
|
229
|
-
|
|
229
|
+
athleteId: string | null;
|
|
230
|
+
headshotUrl: string | null;
|
|
231
|
+
flagUrl: string | null;
|
|
232
|
+
country: string | null;
|
|
230
233
|
abbreviation: string;
|
|
231
234
|
record: string | null;
|
|
232
235
|
winner: boolean;
|
|
@@ -256,6 +259,38 @@ interface UFCFightCardResponse {
|
|
|
256
259
|
success: boolean;
|
|
257
260
|
events: UFCEvent[];
|
|
258
261
|
}
|
|
262
|
+
interface UFCFighterDetail {
|
|
263
|
+
athleteId: string;
|
|
264
|
+
firstName: string | null;
|
|
265
|
+
lastName: string | null;
|
|
266
|
+
fullName: string | null;
|
|
267
|
+
nickname: string | null;
|
|
268
|
+
shortName: string | null;
|
|
269
|
+
height: string | null;
|
|
270
|
+
heightInches: number | null;
|
|
271
|
+
weight: string | null;
|
|
272
|
+
weightLbs: number | null;
|
|
273
|
+
reach: string | null;
|
|
274
|
+
reachInches: number | null;
|
|
275
|
+
age: number | null;
|
|
276
|
+
dateOfBirth: string | null;
|
|
277
|
+
stance: string | null;
|
|
278
|
+
weightClass: string | null;
|
|
279
|
+
citizenship: string | null;
|
|
280
|
+
citizenshipAbbreviation: string | null;
|
|
281
|
+
gym: string | null;
|
|
282
|
+
gymCountry: string | null;
|
|
283
|
+
active: boolean;
|
|
284
|
+
headshotUrl: string | null;
|
|
285
|
+
flagUrl: string | null;
|
|
286
|
+
stanceImageUrl: string | null;
|
|
287
|
+
espnUrl: string | null;
|
|
288
|
+
slug: string | null;
|
|
289
|
+
}
|
|
290
|
+
interface UFCFighterDetailResponse {
|
|
291
|
+
success: boolean;
|
|
292
|
+
fighter: UFCFighterDetail;
|
|
293
|
+
}
|
|
259
294
|
|
|
260
295
|
declare class AuthResource extends BaseResource {
|
|
261
296
|
getNonce(walletAddress: string): Promise<NonceResponse>;
|
|
@@ -299,6 +334,7 @@ declare class TransactionsResource extends BaseResource {
|
|
|
299
334
|
|
|
300
335
|
declare class UFCResource extends BaseResource {
|
|
301
336
|
fightCard(): Promise<UFCFightCardResponse>;
|
|
337
|
+
fighter(athleteId: string): Promise<UFCFighterDetailResponse>;
|
|
302
338
|
}
|
|
303
339
|
|
|
304
340
|
declare class Dubs {
|
package/dist/index.js
CHANGED
|
@@ -198,6 +198,9 @@ var UFCResource = class extends BaseResource {
|
|
|
198
198
|
async fightCard() {
|
|
199
199
|
return this.request("GET", "/ufc/fightcard");
|
|
200
200
|
}
|
|
201
|
+
async fighter(athleteId) {
|
|
202
|
+
return this.request("GET", `/ufc/fighters/${encodeURIComponent(athleteId)}`);
|
|
203
|
+
}
|
|
201
204
|
};
|
|
202
205
|
|
|
203
206
|
// src/client.ts
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/client.ts","../src/constants.ts","../src/errors.ts","../src/resources/base.ts","../src/resources/auth.ts","../src/resources/users.ts","../src/resources/events.ts","../src/resources/games.ts","../src/resources/transactions.ts","../src/resources/ufc.ts"],"sourcesContent":["export { Dubs } from './client';\nexport { DubsApiError } from './errors';\nexport type { DubsConfig, ResolveGameParams, ResolveGameResult, WebhookEvent } from './types';\nexport { DEFAULT_BASE_URL, NETWORK_CONFIG } from './constants';\nexport type { DubsNetwork } from './constants';\n\n// Resource classes\nexport { AuthResource, UsersResource, EventsResource, GamesResource, TransactionsResource, UFCResource } from './resources';\nexport type { RequestFn } from './resources';\n\n// Auth types\nexport type {\n NonceParams,\n NonceResponse,\n AuthenticateParams,\n AuthenticateResponse,\n RegisterParams,\n RegisterResponse,\n MeResponse,\n CheckUsernameResponse,\n} from './types';\n\n// Users types\nexport type { User, UserResponse, UsersListParams, UsersListResponse } from './types';\n\n// Events types\nexport type {\n Event,\n UpcomingEventsParams,\n EventsResponse,\n EsportsParams,\n EsportsMatchResponse,\n} from './types';\n\n// Games types\nexport type {\n Game,\n ValidateParams,\n ValidateResponse,\n GameCreateParams,\n GameCreateResponse,\n GameJoinParams,\n GameJoinResponse,\n GameConfirmParams,\n GameConfirmResponse,\n GameListParams,\n GameListResponse,\n NetworkGamesParams,\n NetworkGamesResponse,\n LiveScoreResponse,\n CustomGameCreateParams,\n CustomGameCreateResponse,\n CustomGameConfirmParams,\n CustomGameConfirmResponse,\n} from './types';\n\n// Transactions types\nexport type { BuildClaimParams, BuildClaimResponse } from './types';\n\n// Config types\nexport type { AppConfigResponse } from './types';\n\n// UFC types\nexport type {\n UFCFighter,\n UFCData,\n UFCFight,\n UFCEvent,\n UFCFightCardResponse,\n} from './types';\n","import crypto from 'crypto';\nimport { DEFAULT_BASE_URL, NETWORK_CONFIG } from './constants';\nimport { DubsApiError } from './errors';\nimport {\n AuthResource,\n EventsResource,\n GamesResource,\n TransactionsResource,\n UFCResource,\n UsersResource,\n} from './resources';\nimport type { AppConfigResponse, DubsConfig, ResolveGameParams, ResolveGameResult, WebhookEvent } from './types';\n\nexport class Dubs {\n private readonly apiKey: string;\n private readonly resolutionSecret?: string;\n private readonly baseUrl: string;\n\n readonly auth: AuthResource;\n readonly users: UsersResource;\n readonly events: EventsResource;\n readonly games: GamesResource;\n readonly transactions: TransactionsResource;\n readonly ufc: UFCResource;\n\n constructor(config: DubsConfig) {\n this.apiKey = config.apiKey;\n this.resolutionSecret = config.resolutionSecret;\n\n if (config.baseUrl) {\n this.baseUrl = config.baseUrl;\n } else if (config.network) {\n this.baseUrl = NETWORK_CONFIG[config.network].baseUrl;\n } else {\n this.baseUrl = DEFAULT_BASE_URL;\n }\n\n const boundRequest = this.request.bind(this);\n this.auth = new AuthResource(boundRequest);\n this.users = new UsersResource(boundRequest);\n this.events = new EventsResource(boundRequest);\n this.games = new GamesResource(boundRequest);\n this.transactions = new TransactionsResource(boundRequest);\n this.ufc = new UFCResource(boundRequest);\n }\n\n /**\n * Fetch the platform configuration.\n */\n async config(): Promise<AppConfigResponse> {\n return this.request<AppConfigResponse>('GET', '/config');\n }\n\n /**\n * Resolve a custom game (game_mode=6).\n *\n * Automatically computes the HMAC-SHA256 signature using your resolution secret.\n */\n async resolveGame(gameId: string, params: ResolveGameParams): Promise<ResolveGameResult> {\n if (!this.resolutionSecret) {\n throw new DubsApiError(\n 'missing_resolution_secret',\n 'resolutionSecret is required for resolveGame(). Pass it in the Dubs constructor.',\n 0,\n );\n }\n\n const body = JSON.stringify({\n winner: params.winner,\n ...(params.metadata && { metadata: params.metadata }),\n });\n\n const hmac = crypto.createHmac('sha256', this.resolutionSecret).update(body).digest('hex');\n\n return this.request<ResolveGameResult>('POST', `/games/${gameId}/resolve`, body, {\n 'x-dubs-signature': `sha256=${hmac}`,\n });\n }\n\n /**\n * Verify an incoming Dubs webhook request.\n *\n * @param rawBody - The raw request body (string or Buffer)\n * @param signature - The X-Dubs-Signature header value\n * @param secret - Your webhook secret (from the developer portal)\n * @returns The parsed webhook event\n * @throws DubsApiError if the signature is invalid\n */\n static verifyWebhook(rawBody: string | Buffer, signature: string, secret: string): WebhookEvent {\n const body = typeof rawBody === 'string' ? rawBody : rawBody.toString('utf-8');\n const expected = crypto.createHmac('sha256', secret).update(body).digest('hex');\n\n if (\n signature.length !== expected.length ||\n !crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))\n ) {\n throw new DubsApiError('invalid_signature', 'Webhook signature verification failed', 401);\n }\n\n return JSON.parse(body) as WebhookEvent;\n }\n\n // ── Private ──\n\n private async request<T>(\n method: string,\n path: string,\n body?: string,\n extraHeaders?: Record<string, string>,\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n\n const headers: Record<string, string> = {\n 'x-api-key': this.apiKey,\n 'Content-Type': 'application/json',\n ...extraHeaders,\n };\n\n const res = await fetch(url, {\n method,\n headers,\n ...(body && { body }),\n });\n\n const json = (await res.json()) as Record<string, unknown>;\n\n if (!res.ok) {\n const msg = typeof json.message === 'string' ? json.message\n : typeof json.error === 'string' ? json.error\n : `Request failed with status ${res.status}: ${JSON.stringify(json)}`;\n throw new DubsApiError(\n (json.code as string) || 'api_error',\n msg,\n res.status,\n );\n }\n\n return json as T;\n }\n}\n","export const DEFAULT_BASE_URL = 'https://dubs-server-prod-9c91d3f01199.herokuapp.com/api/developer/v1';\n\nexport type DubsNetwork = 'devnet' | 'mainnet-beta';\n\nexport const NETWORK_CONFIG: Record<DubsNetwork, { baseUrl: string }> = {\n 'mainnet-beta': {\n baseUrl: 'https://dubs-server-prod-9c91d3f01199.herokuapp.com/api/developer/v1',\n },\n devnet: {\n baseUrl: 'https://dubs-server-dev-55d1fba09a97.herokuapp.com/api/developer/v1',\n },\n};\n","export class DubsApiError extends Error {\n public readonly code: string;\n public readonly httpStatus: number;\n\n constructor(code: string, message: string, httpStatus: number) {\n super(message);\n this.name = 'DubsApiError';\n this.code = code;\n this.httpStatus = httpStatus;\n }\n}\n","export type RequestFn = <T>(\n method: string,\n path: string,\n body?: string,\n extraHeaders?: Record<string, string>,\n) => Promise<T>;\n\nexport class BaseResource {\n protected request: RequestFn;\n\n constructor(request: RequestFn) {\n this.request = request;\n }\n}\n","import { BaseResource } from './base';\nimport type {\n AuthenticateParams,\n AuthenticateResponse,\n CheckUsernameResponse,\n MeResponse,\n NonceResponse,\n RegisterParams,\n RegisterResponse,\n} from '../types';\n\nexport class AuthResource extends BaseResource {\n async getNonce(walletAddress: string): Promise<NonceResponse> {\n return this.request<NonceResponse>('GET', `/auth/nonce?walletAddress=${encodeURIComponent(walletAddress)}`);\n }\n\n async authenticate(params: AuthenticateParams): Promise<AuthenticateResponse> {\n return this.request<AuthenticateResponse>('POST', '/auth/authenticate', JSON.stringify(params));\n }\n\n async register(params: RegisterParams): Promise<RegisterResponse> {\n return this.request<RegisterResponse>('POST', '/auth/register', JSON.stringify(params));\n }\n\n async me(userToken: string): Promise<MeResponse> {\n return this.request<MeResponse>('GET', '/auth/me', undefined, {\n Authorization: `Bearer ${userToken}`,\n });\n }\n\n async logout(userToken: string): Promise<void> {\n await this.request<Record<string, unknown>>('POST', '/auth/logout', undefined, {\n Authorization: `Bearer ${userToken}`,\n });\n }\n\n async checkUsername(username: string): Promise<CheckUsernameResponse> {\n return this.request<CheckUsernameResponse>('GET', `/auth/check-username?username=${encodeURIComponent(username)}`);\n }\n}\n","import { BaseResource } from './base';\nimport type { UserResponse, UsersListParams, UsersListResponse } from '../types';\n\nexport class UsersResource extends BaseResource {\n async get(walletAddress: string): Promise<UserResponse> {\n return this.request<UserResponse>('GET', `/users/${encodeURIComponent(walletAddress)}`);\n }\n\n async list(params?: UsersListParams): Promise<UsersListResponse> {\n const query = new URLSearchParams();\n if (params?.limit != null) query.set('limit', String(params.limit));\n if (params?.offset != null) query.set('offset', String(params.offset));\n const qs = query.toString();\n return this.request<UsersListResponse>('GET', `/users${qs ? `?${qs}` : ''}`);\n }\n}\n","import { BaseResource } from './base';\nimport type {\n EsportsMatchResponse,\n EsportsParams,\n EventsResponse,\n UpcomingEventsParams,\n} from '../types';\n\nexport class EventsResource extends BaseResource {\n async upcoming(params?: UpcomingEventsParams): Promise<EventsResponse> {\n const query = new URLSearchParams();\n if (params?.type) query.set('type', params.type);\n if (params?.page != null) query.set('page', String(params.page));\n if (params?.limit != null) query.set('limit', String(params.limit));\n const qs = query.toString();\n return this.request<EventsResponse>('GET', `/events/upcoming${qs ? `?${qs}` : ''}`);\n }\n\n async sports(league: string): Promise<EventsResponse> {\n return this.request<EventsResponse>('GET', `/events/sports/${encodeURIComponent(league)}`);\n }\n\n async esports(params?: EsportsParams): Promise<EventsResponse> {\n const query = new URLSearchParams();\n if (params?.videogame) query.set('videogame', params.videogame);\n if (params?.page != null) query.set('page', String(params.page));\n if (params?.limit != null) query.set('limit', String(params.limit));\n const qs = query.toString();\n return this.request<EventsResponse>('GET', `/events/esports${qs ? `?${qs}` : ''}`);\n }\n\n async esportsMatch(matchId: string): Promise<EsportsMatchResponse> {\n return this.request<EsportsMatchResponse>('GET', `/events/esports/match/${encodeURIComponent(matchId)}`);\n }\n}\n","import { BaseResource } from './base';\nimport type {\n CustomGameConfirmParams,\n CustomGameConfirmResponse,\n CustomGameCreateParams,\n CustomGameCreateResponse,\n Game,\n GameConfirmParams,\n GameConfirmResponse,\n GameCreateParams,\n GameCreateResponse,\n GameJoinParams,\n GameJoinResponse,\n GameListParams,\n GameListResponse,\n LiveScoreResponse,\n NetworkGamesParams,\n NetworkGamesResponse,\n ValidateResponse,\n} from '../types';\n\nexport class GamesResource extends BaseResource {\n async validate(eventId: string): Promise<ValidateResponse> {\n return this.request<ValidateResponse>('GET', `/games/validate?eventId=${encodeURIComponent(eventId)}`);\n }\n\n async create(params: GameCreateParams): Promise<GameCreateResponse> {\n return this.request<GameCreateResponse>('POST', '/games/create', JSON.stringify(params));\n }\n\n async join(params: GameJoinParams): Promise<GameJoinResponse> {\n return this.request<GameJoinResponse>('POST', '/games/join', JSON.stringify(params));\n }\n\n async confirm(params: GameConfirmParams): Promise<GameConfirmResponse> {\n return this.request<GameConfirmResponse>('POST', '/games/confirm', JSON.stringify(params));\n }\n\n async get(gameId: string): Promise<{ game: Game }> {\n return this.request<{ game: Game }>('GET', `/games/${encodeURIComponent(gameId)}`);\n }\n\n async list(params?: GameListParams): Promise<GameListResponse> {\n const query = new URLSearchParams();\n if (params?.status) query.set('status', params.status);\n if (params?.limit != null) query.set('limit', String(params.limit));\n if (params?.offset != null) query.set('offset', String(params.offset));\n const qs = query.toString();\n return this.request<GameListResponse>('GET', `/games${qs ? `?${qs}` : ''}`);\n }\n\n async network(params?: NetworkGamesParams): Promise<NetworkGamesResponse> {\n const query = new URLSearchParams();\n if (params?.limit != null) query.set('limit', String(params.limit));\n if (params?.offset != null) query.set('offset', String(params.offset));\n const qs = query.toString();\n return this.request<NetworkGamesResponse>('GET', `/games/network${qs ? `?${qs}` : ''}`);\n }\n\n async liveScore(gameId: string): Promise<LiveScoreResponse> {\n return this.request<LiveScoreResponse>('GET', `/games/${encodeURIComponent(gameId)}/live-score`);\n }\n\n async customCreate(params: CustomGameCreateParams): Promise<CustomGameCreateResponse> {\n return this.request<CustomGameCreateResponse>('POST', '/games/custom/create', JSON.stringify(params));\n }\n\n async customConfirm(params: CustomGameConfirmParams): Promise<CustomGameConfirmResponse> {\n return this.request<CustomGameConfirmResponse>('POST', '/games/custom/confirm', JSON.stringify(params));\n }\n}\n","import { BaseResource } from './base';\nimport type { BuildClaimParams, BuildClaimResponse } from '../types';\n\nexport class TransactionsResource extends BaseResource {\n async buildClaim(params: BuildClaimParams): Promise<BuildClaimResponse> {\n return this.request<BuildClaimResponse>('POST', '/transactions/build-claim', JSON.stringify(params));\n }\n}\n","import { BaseResource } from './base';\nimport type { UFCFightCardResponse } from '../types';\n\nexport class UFCResource extends BaseResource {\n async fightCard(): Promise<UFCFightCardResponse> {\n return this.request<UFCFightCardResponse>('GET', '/ufc/fightcard');\n }\n}\n"],"mappings":"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","names":["crypto"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/client.ts","../src/constants.ts","../src/errors.ts","../src/resources/base.ts","../src/resources/auth.ts","../src/resources/users.ts","../src/resources/events.ts","../src/resources/games.ts","../src/resources/transactions.ts","../src/resources/ufc.ts"],"sourcesContent":["export { Dubs } from './client';\nexport { DubsApiError } from './errors';\nexport type { DubsConfig, ResolveGameParams, ResolveGameResult, WebhookEvent } from './types';\nexport { DEFAULT_BASE_URL, NETWORK_CONFIG } from './constants';\nexport type { DubsNetwork } from './constants';\n\n// Resource classes\nexport { AuthResource, UsersResource, EventsResource, GamesResource, TransactionsResource, UFCResource } from './resources';\nexport type { RequestFn } from './resources';\n\n// Auth types\nexport type {\n NonceParams,\n NonceResponse,\n AuthenticateParams,\n AuthenticateResponse,\n RegisterParams,\n RegisterResponse,\n MeResponse,\n CheckUsernameResponse,\n} from './types';\n\n// Users types\nexport type { User, UserResponse, UsersListParams, UsersListResponse } from './types';\n\n// Events types\nexport type {\n Event,\n UpcomingEventsParams,\n EventsResponse,\n EsportsParams,\n EsportsMatchResponse,\n} from './types';\n\n// Games types\nexport type {\n Game,\n ValidateParams,\n ValidateResponse,\n GameCreateParams,\n GameCreateResponse,\n GameJoinParams,\n GameJoinResponse,\n GameConfirmParams,\n GameConfirmResponse,\n GameListParams,\n GameListResponse,\n NetworkGamesParams,\n NetworkGamesResponse,\n LiveScoreResponse,\n CustomGameCreateParams,\n CustomGameCreateResponse,\n CustomGameConfirmParams,\n CustomGameConfirmResponse,\n} from './types';\n\n// Transactions types\nexport type { BuildClaimParams, BuildClaimResponse } from './types';\n\n// Config types\nexport type { AppConfigResponse } from './types';\n\n// UFC types\nexport type {\n UFCFighter,\n UFCData,\n UFCFight,\n UFCEvent,\n UFCFightCardResponse,\n} from './types';\n","import crypto from 'crypto';\nimport { DEFAULT_BASE_URL, NETWORK_CONFIG } from './constants';\nimport { DubsApiError } from './errors';\nimport {\n AuthResource,\n EventsResource,\n GamesResource,\n TransactionsResource,\n UFCResource,\n UsersResource,\n} from './resources';\nimport type { AppConfigResponse, DubsConfig, ResolveGameParams, ResolveGameResult, WebhookEvent } from './types';\n\nexport class Dubs {\n private readonly apiKey: string;\n private readonly resolutionSecret?: string;\n private readonly baseUrl: string;\n\n readonly auth: AuthResource;\n readonly users: UsersResource;\n readonly events: EventsResource;\n readonly games: GamesResource;\n readonly transactions: TransactionsResource;\n readonly ufc: UFCResource;\n\n constructor(config: DubsConfig) {\n this.apiKey = config.apiKey;\n this.resolutionSecret = config.resolutionSecret;\n\n if (config.baseUrl) {\n this.baseUrl = config.baseUrl;\n } else if (config.network) {\n this.baseUrl = NETWORK_CONFIG[config.network].baseUrl;\n } else {\n this.baseUrl = DEFAULT_BASE_URL;\n }\n\n const boundRequest = this.request.bind(this);\n this.auth = new AuthResource(boundRequest);\n this.users = new UsersResource(boundRequest);\n this.events = new EventsResource(boundRequest);\n this.games = new GamesResource(boundRequest);\n this.transactions = new TransactionsResource(boundRequest);\n this.ufc = new UFCResource(boundRequest);\n }\n\n /**\n * Fetch the platform configuration.\n */\n async config(): Promise<AppConfigResponse> {\n return this.request<AppConfigResponse>('GET', '/config');\n }\n\n /**\n * Resolve a custom game (game_mode=6).\n *\n * Automatically computes the HMAC-SHA256 signature using your resolution secret.\n */\n async resolveGame(gameId: string, params: ResolveGameParams): Promise<ResolveGameResult> {\n if (!this.resolutionSecret) {\n throw new DubsApiError(\n 'missing_resolution_secret',\n 'resolutionSecret is required for resolveGame(). Pass it in the Dubs constructor.',\n 0,\n );\n }\n\n const body = JSON.stringify({\n winner: params.winner,\n ...(params.metadata && { metadata: params.metadata }),\n });\n\n const hmac = crypto.createHmac('sha256', this.resolutionSecret).update(body).digest('hex');\n\n return this.request<ResolveGameResult>('POST', `/games/${gameId}/resolve`, body, {\n 'x-dubs-signature': `sha256=${hmac}`,\n });\n }\n\n /**\n * Verify an incoming Dubs webhook request.\n *\n * @param rawBody - The raw request body (string or Buffer)\n * @param signature - The X-Dubs-Signature header value\n * @param secret - Your webhook secret (from the developer portal)\n * @returns The parsed webhook event\n * @throws DubsApiError if the signature is invalid\n */\n static verifyWebhook(rawBody: string | Buffer, signature: string, secret: string): WebhookEvent {\n const body = typeof rawBody === 'string' ? rawBody : rawBody.toString('utf-8');\n const expected = crypto.createHmac('sha256', secret).update(body).digest('hex');\n\n if (\n signature.length !== expected.length ||\n !crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))\n ) {\n throw new DubsApiError('invalid_signature', 'Webhook signature verification failed', 401);\n }\n\n return JSON.parse(body) as WebhookEvent;\n }\n\n // ── Private ──\n\n private async request<T>(\n method: string,\n path: string,\n body?: string,\n extraHeaders?: Record<string, string>,\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n\n const headers: Record<string, string> = {\n 'x-api-key': this.apiKey,\n 'Content-Type': 'application/json',\n ...extraHeaders,\n };\n\n const res = await fetch(url, {\n method,\n headers,\n ...(body && { body }),\n });\n\n const json = (await res.json()) as Record<string, unknown>;\n\n if (!res.ok) {\n const msg = typeof json.message === 'string' ? json.message\n : typeof json.error === 'string' ? json.error\n : `Request failed with status ${res.status}: ${JSON.stringify(json)}`;\n throw new DubsApiError(\n (json.code as string) || 'api_error',\n msg,\n res.status,\n );\n }\n\n return json as T;\n }\n}\n","export const DEFAULT_BASE_URL = 'https://dubs-server-prod-9c91d3f01199.herokuapp.com/api/developer/v1';\n\nexport type DubsNetwork = 'devnet' | 'mainnet-beta';\n\nexport const NETWORK_CONFIG: Record<DubsNetwork, { baseUrl: string }> = {\n 'mainnet-beta': {\n baseUrl: 'https://dubs-server-prod-9c91d3f01199.herokuapp.com/api/developer/v1',\n },\n devnet: {\n baseUrl: 'https://dubs-server-dev-55d1fba09a97.herokuapp.com/api/developer/v1',\n },\n};\n","export class DubsApiError extends Error {\n public readonly code: string;\n public readonly httpStatus: number;\n\n constructor(code: string, message: string, httpStatus: number) {\n super(message);\n this.name = 'DubsApiError';\n this.code = code;\n this.httpStatus = httpStatus;\n }\n}\n","export type RequestFn = <T>(\n method: string,\n path: string,\n body?: string,\n extraHeaders?: Record<string, string>,\n) => Promise<T>;\n\nexport class BaseResource {\n protected request: RequestFn;\n\n constructor(request: RequestFn) {\n this.request = request;\n }\n}\n","import { BaseResource } from './base';\nimport type {\n AuthenticateParams,\n AuthenticateResponse,\n CheckUsernameResponse,\n MeResponse,\n NonceResponse,\n RegisterParams,\n RegisterResponse,\n} from '../types';\n\nexport class AuthResource extends BaseResource {\n async getNonce(walletAddress: string): Promise<NonceResponse> {\n return this.request<NonceResponse>('GET', `/auth/nonce?walletAddress=${encodeURIComponent(walletAddress)}`);\n }\n\n async authenticate(params: AuthenticateParams): Promise<AuthenticateResponse> {\n return this.request<AuthenticateResponse>('POST', '/auth/authenticate', JSON.stringify(params));\n }\n\n async register(params: RegisterParams): Promise<RegisterResponse> {\n return this.request<RegisterResponse>('POST', '/auth/register', JSON.stringify(params));\n }\n\n async me(userToken: string): Promise<MeResponse> {\n return this.request<MeResponse>('GET', '/auth/me', undefined, {\n Authorization: `Bearer ${userToken}`,\n });\n }\n\n async logout(userToken: string): Promise<void> {\n await this.request<Record<string, unknown>>('POST', '/auth/logout', undefined, {\n Authorization: `Bearer ${userToken}`,\n });\n }\n\n async checkUsername(username: string): Promise<CheckUsernameResponse> {\n return this.request<CheckUsernameResponse>('GET', `/auth/check-username?username=${encodeURIComponent(username)}`);\n }\n}\n","import { BaseResource } from './base';\nimport type { UserResponse, UsersListParams, UsersListResponse } from '../types';\n\nexport class UsersResource extends BaseResource {\n async get(walletAddress: string): Promise<UserResponse> {\n return this.request<UserResponse>('GET', `/users/${encodeURIComponent(walletAddress)}`);\n }\n\n async list(params?: UsersListParams): Promise<UsersListResponse> {\n const query = new URLSearchParams();\n if (params?.limit != null) query.set('limit', String(params.limit));\n if (params?.offset != null) query.set('offset', String(params.offset));\n const qs = query.toString();\n return this.request<UsersListResponse>('GET', `/users${qs ? `?${qs}` : ''}`);\n }\n}\n","import { BaseResource } from './base';\nimport type {\n EsportsMatchResponse,\n EsportsParams,\n EventsResponse,\n UpcomingEventsParams,\n} from '../types';\n\nexport class EventsResource extends BaseResource {\n async upcoming(params?: UpcomingEventsParams): Promise<EventsResponse> {\n const query = new URLSearchParams();\n if (params?.type) query.set('type', params.type);\n if (params?.page != null) query.set('page', String(params.page));\n if (params?.limit != null) query.set('limit', String(params.limit));\n const qs = query.toString();\n return this.request<EventsResponse>('GET', `/events/upcoming${qs ? `?${qs}` : ''}`);\n }\n\n async sports(league: string): Promise<EventsResponse> {\n return this.request<EventsResponse>('GET', `/events/sports/${encodeURIComponent(league)}`);\n }\n\n async esports(params?: EsportsParams): Promise<EventsResponse> {\n const query = new URLSearchParams();\n if (params?.videogame) query.set('videogame', params.videogame);\n if (params?.page != null) query.set('page', String(params.page));\n if (params?.limit != null) query.set('limit', String(params.limit));\n const qs = query.toString();\n return this.request<EventsResponse>('GET', `/events/esports${qs ? `?${qs}` : ''}`);\n }\n\n async esportsMatch(matchId: string): Promise<EsportsMatchResponse> {\n return this.request<EsportsMatchResponse>('GET', `/events/esports/match/${encodeURIComponent(matchId)}`);\n }\n}\n","import { BaseResource } from './base';\nimport type {\n CustomGameConfirmParams,\n CustomGameConfirmResponse,\n CustomGameCreateParams,\n CustomGameCreateResponse,\n Game,\n GameConfirmParams,\n GameConfirmResponse,\n GameCreateParams,\n GameCreateResponse,\n GameJoinParams,\n GameJoinResponse,\n GameListParams,\n GameListResponse,\n LiveScoreResponse,\n NetworkGamesParams,\n NetworkGamesResponse,\n ValidateResponse,\n} from '../types';\n\nexport class GamesResource extends BaseResource {\n async validate(eventId: string): Promise<ValidateResponse> {\n return this.request<ValidateResponse>('GET', `/games/validate?eventId=${encodeURIComponent(eventId)}`);\n }\n\n async create(params: GameCreateParams): Promise<GameCreateResponse> {\n return this.request<GameCreateResponse>('POST', '/games/create', JSON.stringify(params));\n }\n\n async join(params: GameJoinParams): Promise<GameJoinResponse> {\n return this.request<GameJoinResponse>('POST', '/games/join', JSON.stringify(params));\n }\n\n async confirm(params: GameConfirmParams): Promise<GameConfirmResponse> {\n return this.request<GameConfirmResponse>('POST', '/games/confirm', JSON.stringify(params));\n }\n\n async get(gameId: string): Promise<{ game: Game }> {\n return this.request<{ game: Game }>('GET', `/games/${encodeURIComponent(gameId)}`);\n }\n\n async list(params?: GameListParams): Promise<GameListResponse> {\n const query = new URLSearchParams();\n if (params?.status) query.set('status', params.status);\n if (params?.limit != null) query.set('limit', String(params.limit));\n if (params?.offset != null) query.set('offset', String(params.offset));\n const qs = query.toString();\n return this.request<GameListResponse>('GET', `/games${qs ? `?${qs}` : ''}`);\n }\n\n async network(params?: NetworkGamesParams): Promise<NetworkGamesResponse> {\n const query = new URLSearchParams();\n if (params?.limit != null) query.set('limit', String(params.limit));\n if (params?.offset != null) query.set('offset', String(params.offset));\n const qs = query.toString();\n return this.request<NetworkGamesResponse>('GET', `/games/network${qs ? `?${qs}` : ''}`);\n }\n\n async liveScore(gameId: string): Promise<LiveScoreResponse> {\n return this.request<LiveScoreResponse>('GET', `/games/${encodeURIComponent(gameId)}/live-score`);\n }\n\n async customCreate(params: CustomGameCreateParams): Promise<CustomGameCreateResponse> {\n return this.request<CustomGameCreateResponse>('POST', '/games/custom/create', JSON.stringify(params));\n }\n\n async customConfirm(params: CustomGameConfirmParams): Promise<CustomGameConfirmResponse> {\n return this.request<CustomGameConfirmResponse>('POST', '/games/custom/confirm', JSON.stringify(params));\n }\n}\n","import { BaseResource } from './base';\nimport type { BuildClaimParams, BuildClaimResponse } from '../types';\n\nexport class TransactionsResource extends BaseResource {\n async buildClaim(params: BuildClaimParams): Promise<BuildClaimResponse> {\n return this.request<BuildClaimResponse>('POST', '/transactions/build-claim', JSON.stringify(params));\n }\n}\n","import { BaseResource } from './base';\nimport type { UFCFightCardResponse, UFCFighterDetailResponse } from '../types';\n\nexport class UFCResource extends BaseResource {\n async fightCard(): Promise<UFCFightCardResponse> {\n return this.request<UFCFightCardResponse>('GET', '/ufc/fightcard');\n }\n\n async fighter(athleteId: string): Promise<UFCFighterDetailResponse> {\n return this.request<UFCFighterDetailResponse>('GET', `/ufc/fighters/${encodeURIComponent(athleteId)}`);\n }\n}\n"],"mappings":"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","names":["crypto"]}
|
package/dist/index.mjs
CHANGED
|
@@ -153,6 +153,9 @@ var UFCResource = class extends BaseResource {
|
|
|
153
153
|
async fightCard() {
|
|
154
154
|
return this.request("GET", "/ufc/fightcard");
|
|
155
155
|
}
|
|
156
|
+
async fighter(athleteId) {
|
|
157
|
+
return this.request("GET", `/ufc/fighters/${encodeURIComponent(athleteId)}`);
|
|
158
|
+
}
|
|
156
159
|
};
|
|
157
160
|
|
|
158
161
|
// src/client.ts
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts","../src/constants.ts","../src/errors.ts","../src/resources/base.ts","../src/resources/auth.ts","../src/resources/users.ts","../src/resources/events.ts","../src/resources/games.ts","../src/resources/transactions.ts","../src/resources/ufc.ts"],"sourcesContent":["import crypto from 'crypto';\nimport { DEFAULT_BASE_URL, NETWORK_CONFIG } from './constants';\nimport { DubsApiError } from './errors';\nimport {\n AuthResource,\n EventsResource,\n GamesResource,\n TransactionsResource,\n UFCResource,\n UsersResource,\n} from './resources';\nimport type { AppConfigResponse, DubsConfig, ResolveGameParams, ResolveGameResult, WebhookEvent } from './types';\n\nexport class Dubs {\n private readonly apiKey: string;\n private readonly resolutionSecret?: string;\n private readonly baseUrl: string;\n\n readonly auth: AuthResource;\n readonly users: UsersResource;\n readonly events: EventsResource;\n readonly games: GamesResource;\n readonly transactions: TransactionsResource;\n readonly ufc: UFCResource;\n\n constructor(config: DubsConfig) {\n this.apiKey = config.apiKey;\n this.resolutionSecret = config.resolutionSecret;\n\n if (config.baseUrl) {\n this.baseUrl = config.baseUrl;\n } else if (config.network) {\n this.baseUrl = NETWORK_CONFIG[config.network].baseUrl;\n } else {\n this.baseUrl = DEFAULT_BASE_URL;\n }\n\n const boundRequest = this.request.bind(this);\n this.auth = new AuthResource(boundRequest);\n this.users = new UsersResource(boundRequest);\n this.events = new EventsResource(boundRequest);\n this.games = new GamesResource(boundRequest);\n this.transactions = new TransactionsResource(boundRequest);\n this.ufc = new UFCResource(boundRequest);\n }\n\n /**\n * Fetch the platform configuration.\n */\n async config(): Promise<AppConfigResponse> {\n return this.request<AppConfigResponse>('GET', '/config');\n }\n\n /**\n * Resolve a custom game (game_mode=6).\n *\n * Automatically computes the HMAC-SHA256 signature using your resolution secret.\n */\n async resolveGame(gameId: string, params: ResolveGameParams): Promise<ResolveGameResult> {\n if (!this.resolutionSecret) {\n throw new DubsApiError(\n 'missing_resolution_secret',\n 'resolutionSecret is required for resolveGame(). Pass it in the Dubs constructor.',\n 0,\n );\n }\n\n const body = JSON.stringify({\n winner: params.winner,\n ...(params.metadata && { metadata: params.metadata }),\n });\n\n const hmac = crypto.createHmac('sha256', this.resolutionSecret).update(body).digest('hex');\n\n return this.request<ResolveGameResult>('POST', `/games/${gameId}/resolve`, body, {\n 'x-dubs-signature': `sha256=${hmac}`,\n });\n }\n\n /**\n * Verify an incoming Dubs webhook request.\n *\n * @param rawBody - The raw request body (string or Buffer)\n * @param signature - The X-Dubs-Signature header value\n * @param secret - Your webhook secret (from the developer portal)\n * @returns The parsed webhook event\n * @throws DubsApiError if the signature is invalid\n */\n static verifyWebhook(rawBody: string | Buffer, signature: string, secret: string): WebhookEvent {\n const body = typeof rawBody === 'string' ? rawBody : rawBody.toString('utf-8');\n const expected = crypto.createHmac('sha256', secret).update(body).digest('hex');\n\n if (\n signature.length !== expected.length ||\n !crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))\n ) {\n throw new DubsApiError('invalid_signature', 'Webhook signature verification failed', 401);\n }\n\n return JSON.parse(body) as WebhookEvent;\n }\n\n // ── Private ──\n\n private async request<T>(\n method: string,\n path: string,\n body?: string,\n extraHeaders?: Record<string, string>,\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n\n const headers: Record<string, string> = {\n 'x-api-key': this.apiKey,\n 'Content-Type': 'application/json',\n ...extraHeaders,\n };\n\n const res = await fetch(url, {\n method,\n headers,\n ...(body && { body }),\n });\n\n const json = (await res.json()) as Record<string, unknown>;\n\n if (!res.ok) {\n const msg = typeof json.message === 'string' ? json.message\n : typeof json.error === 'string' ? json.error\n : `Request failed with status ${res.status}: ${JSON.stringify(json)}`;\n throw new DubsApiError(\n (json.code as string) || 'api_error',\n msg,\n res.status,\n );\n }\n\n return json as T;\n }\n}\n","export const DEFAULT_BASE_URL = 'https://dubs-server-prod-9c91d3f01199.herokuapp.com/api/developer/v1';\n\nexport type DubsNetwork = 'devnet' | 'mainnet-beta';\n\nexport const NETWORK_CONFIG: Record<DubsNetwork, { baseUrl: string }> = {\n 'mainnet-beta': {\n baseUrl: 'https://dubs-server-prod-9c91d3f01199.herokuapp.com/api/developer/v1',\n },\n devnet: {\n baseUrl: 'https://dubs-server-dev-55d1fba09a97.herokuapp.com/api/developer/v1',\n },\n};\n","export class DubsApiError extends Error {\n public readonly code: string;\n public readonly httpStatus: number;\n\n constructor(code: string, message: string, httpStatus: number) {\n super(message);\n this.name = 'DubsApiError';\n this.code = code;\n this.httpStatus = httpStatus;\n }\n}\n","export type RequestFn = <T>(\n method: string,\n path: string,\n body?: string,\n extraHeaders?: Record<string, string>,\n) => Promise<T>;\n\nexport class BaseResource {\n protected request: RequestFn;\n\n constructor(request: RequestFn) {\n this.request = request;\n }\n}\n","import { BaseResource } from './base';\nimport type {\n AuthenticateParams,\n AuthenticateResponse,\n CheckUsernameResponse,\n MeResponse,\n NonceResponse,\n RegisterParams,\n RegisterResponse,\n} from '../types';\n\nexport class AuthResource extends BaseResource {\n async getNonce(walletAddress: string): Promise<NonceResponse> {\n return this.request<NonceResponse>('GET', `/auth/nonce?walletAddress=${encodeURIComponent(walletAddress)}`);\n }\n\n async authenticate(params: AuthenticateParams): Promise<AuthenticateResponse> {\n return this.request<AuthenticateResponse>('POST', '/auth/authenticate', JSON.stringify(params));\n }\n\n async register(params: RegisterParams): Promise<RegisterResponse> {\n return this.request<RegisterResponse>('POST', '/auth/register', JSON.stringify(params));\n }\n\n async me(userToken: string): Promise<MeResponse> {\n return this.request<MeResponse>('GET', '/auth/me', undefined, {\n Authorization: `Bearer ${userToken}`,\n });\n }\n\n async logout(userToken: string): Promise<void> {\n await this.request<Record<string, unknown>>('POST', '/auth/logout', undefined, {\n Authorization: `Bearer ${userToken}`,\n });\n }\n\n async checkUsername(username: string): Promise<CheckUsernameResponse> {\n return this.request<CheckUsernameResponse>('GET', `/auth/check-username?username=${encodeURIComponent(username)}`);\n }\n}\n","import { BaseResource } from './base';\nimport type { UserResponse, UsersListParams, UsersListResponse } from '../types';\n\nexport class UsersResource extends BaseResource {\n async get(walletAddress: string): Promise<UserResponse> {\n return this.request<UserResponse>('GET', `/users/${encodeURIComponent(walletAddress)}`);\n }\n\n async list(params?: UsersListParams): Promise<UsersListResponse> {\n const query = new URLSearchParams();\n if (params?.limit != null) query.set('limit', String(params.limit));\n if (params?.offset != null) query.set('offset', String(params.offset));\n const qs = query.toString();\n return this.request<UsersListResponse>('GET', `/users${qs ? `?${qs}` : ''}`);\n }\n}\n","import { BaseResource } from './base';\nimport type {\n EsportsMatchResponse,\n EsportsParams,\n EventsResponse,\n UpcomingEventsParams,\n} from '../types';\n\nexport class EventsResource extends BaseResource {\n async upcoming(params?: UpcomingEventsParams): Promise<EventsResponse> {\n const query = new URLSearchParams();\n if (params?.type) query.set('type', params.type);\n if (params?.page != null) query.set('page', String(params.page));\n if (params?.limit != null) query.set('limit', String(params.limit));\n const qs = query.toString();\n return this.request<EventsResponse>('GET', `/events/upcoming${qs ? `?${qs}` : ''}`);\n }\n\n async sports(league: string): Promise<EventsResponse> {\n return this.request<EventsResponse>('GET', `/events/sports/${encodeURIComponent(league)}`);\n }\n\n async esports(params?: EsportsParams): Promise<EventsResponse> {\n const query = new URLSearchParams();\n if (params?.videogame) query.set('videogame', params.videogame);\n if (params?.page != null) query.set('page', String(params.page));\n if (params?.limit != null) query.set('limit', String(params.limit));\n const qs = query.toString();\n return this.request<EventsResponse>('GET', `/events/esports${qs ? `?${qs}` : ''}`);\n }\n\n async esportsMatch(matchId: string): Promise<EsportsMatchResponse> {\n return this.request<EsportsMatchResponse>('GET', `/events/esports/match/${encodeURIComponent(matchId)}`);\n }\n}\n","import { BaseResource } from './base';\nimport type {\n CustomGameConfirmParams,\n CustomGameConfirmResponse,\n CustomGameCreateParams,\n CustomGameCreateResponse,\n Game,\n GameConfirmParams,\n GameConfirmResponse,\n GameCreateParams,\n GameCreateResponse,\n GameJoinParams,\n GameJoinResponse,\n GameListParams,\n GameListResponse,\n LiveScoreResponse,\n NetworkGamesParams,\n NetworkGamesResponse,\n ValidateResponse,\n} from '../types';\n\nexport class GamesResource extends BaseResource {\n async validate(eventId: string): Promise<ValidateResponse> {\n return this.request<ValidateResponse>('GET', `/games/validate?eventId=${encodeURIComponent(eventId)}`);\n }\n\n async create(params: GameCreateParams): Promise<GameCreateResponse> {\n return this.request<GameCreateResponse>('POST', '/games/create', JSON.stringify(params));\n }\n\n async join(params: GameJoinParams): Promise<GameJoinResponse> {\n return this.request<GameJoinResponse>('POST', '/games/join', JSON.stringify(params));\n }\n\n async confirm(params: GameConfirmParams): Promise<GameConfirmResponse> {\n return this.request<GameConfirmResponse>('POST', '/games/confirm', JSON.stringify(params));\n }\n\n async get(gameId: string): Promise<{ game: Game }> {\n return this.request<{ game: Game }>('GET', `/games/${encodeURIComponent(gameId)}`);\n }\n\n async list(params?: GameListParams): Promise<GameListResponse> {\n const query = new URLSearchParams();\n if (params?.status) query.set('status', params.status);\n if (params?.limit != null) query.set('limit', String(params.limit));\n if (params?.offset != null) query.set('offset', String(params.offset));\n const qs = query.toString();\n return this.request<GameListResponse>('GET', `/games${qs ? `?${qs}` : ''}`);\n }\n\n async network(params?: NetworkGamesParams): Promise<NetworkGamesResponse> {\n const query = new URLSearchParams();\n if (params?.limit != null) query.set('limit', String(params.limit));\n if (params?.offset != null) query.set('offset', String(params.offset));\n const qs = query.toString();\n return this.request<NetworkGamesResponse>('GET', `/games/network${qs ? `?${qs}` : ''}`);\n }\n\n async liveScore(gameId: string): Promise<LiveScoreResponse> {\n return this.request<LiveScoreResponse>('GET', `/games/${encodeURIComponent(gameId)}/live-score`);\n }\n\n async customCreate(params: CustomGameCreateParams): Promise<CustomGameCreateResponse> {\n return this.request<CustomGameCreateResponse>('POST', '/games/custom/create', JSON.stringify(params));\n }\n\n async customConfirm(params: CustomGameConfirmParams): Promise<CustomGameConfirmResponse> {\n return this.request<CustomGameConfirmResponse>('POST', '/games/custom/confirm', JSON.stringify(params));\n }\n}\n","import { BaseResource } from './base';\nimport type { BuildClaimParams, BuildClaimResponse } from '../types';\n\nexport class TransactionsResource extends BaseResource {\n async buildClaim(params: BuildClaimParams): Promise<BuildClaimResponse> {\n return this.request<BuildClaimResponse>('POST', '/transactions/build-claim', JSON.stringify(params));\n }\n}\n","import { BaseResource } from './base';\nimport type { UFCFightCardResponse } from '../types';\n\nexport class UFCResource extends BaseResource {\n async fightCard(): Promise<UFCFightCardResponse> {\n return this.request<UFCFightCardResponse>('GET', '/ufc/fightcard');\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/client.ts","../src/constants.ts","../src/errors.ts","../src/resources/base.ts","../src/resources/auth.ts","../src/resources/users.ts","../src/resources/events.ts","../src/resources/games.ts","../src/resources/transactions.ts","../src/resources/ufc.ts"],"sourcesContent":["import crypto from 'crypto';\nimport { DEFAULT_BASE_URL, NETWORK_CONFIG } from './constants';\nimport { DubsApiError } from './errors';\nimport {\n AuthResource,\n EventsResource,\n GamesResource,\n TransactionsResource,\n UFCResource,\n UsersResource,\n} from './resources';\nimport type { AppConfigResponse, DubsConfig, ResolveGameParams, ResolveGameResult, WebhookEvent } from './types';\n\nexport class Dubs {\n private readonly apiKey: string;\n private readonly resolutionSecret?: string;\n private readonly baseUrl: string;\n\n readonly auth: AuthResource;\n readonly users: UsersResource;\n readonly events: EventsResource;\n readonly games: GamesResource;\n readonly transactions: TransactionsResource;\n readonly ufc: UFCResource;\n\n constructor(config: DubsConfig) {\n this.apiKey = config.apiKey;\n this.resolutionSecret = config.resolutionSecret;\n\n if (config.baseUrl) {\n this.baseUrl = config.baseUrl;\n } else if (config.network) {\n this.baseUrl = NETWORK_CONFIG[config.network].baseUrl;\n } else {\n this.baseUrl = DEFAULT_BASE_URL;\n }\n\n const boundRequest = this.request.bind(this);\n this.auth = new AuthResource(boundRequest);\n this.users = new UsersResource(boundRequest);\n this.events = new EventsResource(boundRequest);\n this.games = new GamesResource(boundRequest);\n this.transactions = new TransactionsResource(boundRequest);\n this.ufc = new UFCResource(boundRequest);\n }\n\n /**\n * Fetch the platform configuration.\n */\n async config(): Promise<AppConfigResponse> {\n return this.request<AppConfigResponse>('GET', '/config');\n }\n\n /**\n * Resolve a custom game (game_mode=6).\n *\n * Automatically computes the HMAC-SHA256 signature using your resolution secret.\n */\n async resolveGame(gameId: string, params: ResolveGameParams): Promise<ResolveGameResult> {\n if (!this.resolutionSecret) {\n throw new DubsApiError(\n 'missing_resolution_secret',\n 'resolutionSecret is required for resolveGame(). Pass it in the Dubs constructor.',\n 0,\n );\n }\n\n const body = JSON.stringify({\n winner: params.winner,\n ...(params.metadata && { metadata: params.metadata }),\n });\n\n const hmac = crypto.createHmac('sha256', this.resolutionSecret).update(body).digest('hex');\n\n return this.request<ResolveGameResult>('POST', `/games/${gameId}/resolve`, body, {\n 'x-dubs-signature': `sha256=${hmac}`,\n });\n }\n\n /**\n * Verify an incoming Dubs webhook request.\n *\n * @param rawBody - The raw request body (string or Buffer)\n * @param signature - The X-Dubs-Signature header value\n * @param secret - Your webhook secret (from the developer portal)\n * @returns The parsed webhook event\n * @throws DubsApiError if the signature is invalid\n */\n static verifyWebhook(rawBody: string | Buffer, signature: string, secret: string): WebhookEvent {\n const body = typeof rawBody === 'string' ? rawBody : rawBody.toString('utf-8');\n const expected = crypto.createHmac('sha256', secret).update(body).digest('hex');\n\n if (\n signature.length !== expected.length ||\n !crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))\n ) {\n throw new DubsApiError('invalid_signature', 'Webhook signature verification failed', 401);\n }\n\n return JSON.parse(body) as WebhookEvent;\n }\n\n // ── Private ──\n\n private async request<T>(\n method: string,\n path: string,\n body?: string,\n extraHeaders?: Record<string, string>,\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n\n const headers: Record<string, string> = {\n 'x-api-key': this.apiKey,\n 'Content-Type': 'application/json',\n ...extraHeaders,\n };\n\n const res = await fetch(url, {\n method,\n headers,\n ...(body && { body }),\n });\n\n const json = (await res.json()) as Record<string, unknown>;\n\n if (!res.ok) {\n const msg = typeof json.message === 'string' ? json.message\n : typeof json.error === 'string' ? json.error\n : `Request failed with status ${res.status}: ${JSON.stringify(json)}`;\n throw new DubsApiError(\n (json.code as string) || 'api_error',\n msg,\n res.status,\n );\n }\n\n return json as T;\n }\n}\n","export const DEFAULT_BASE_URL = 'https://dubs-server-prod-9c91d3f01199.herokuapp.com/api/developer/v1';\n\nexport type DubsNetwork = 'devnet' | 'mainnet-beta';\n\nexport const NETWORK_CONFIG: Record<DubsNetwork, { baseUrl: string }> = {\n 'mainnet-beta': {\n baseUrl: 'https://dubs-server-prod-9c91d3f01199.herokuapp.com/api/developer/v1',\n },\n devnet: {\n baseUrl: 'https://dubs-server-dev-55d1fba09a97.herokuapp.com/api/developer/v1',\n },\n};\n","export class DubsApiError extends Error {\n public readonly code: string;\n public readonly httpStatus: number;\n\n constructor(code: string, message: string, httpStatus: number) {\n super(message);\n this.name = 'DubsApiError';\n this.code = code;\n this.httpStatus = httpStatus;\n }\n}\n","export type RequestFn = <T>(\n method: string,\n path: string,\n body?: string,\n extraHeaders?: Record<string, string>,\n) => Promise<T>;\n\nexport class BaseResource {\n protected request: RequestFn;\n\n constructor(request: RequestFn) {\n this.request = request;\n }\n}\n","import { BaseResource } from './base';\nimport type {\n AuthenticateParams,\n AuthenticateResponse,\n CheckUsernameResponse,\n MeResponse,\n NonceResponse,\n RegisterParams,\n RegisterResponse,\n} from '../types';\n\nexport class AuthResource extends BaseResource {\n async getNonce(walletAddress: string): Promise<NonceResponse> {\n return this.request<NonceResponse>('GET', `/auth/nonce?walletAddress=${encodeURIComponent(walletAddress)}`);\n }\n\n async authenticate(params: AuthenticateParams): Promise<AuthenticateResponse> {\n return this.request<AuthenticateResponse>('POST', '/auth/authenticate', JSON.stringify(params));\n }\n\n async register(params: RegisterParams): Promise<RegisterResponse> {\n return this.request<RegisterResponse>('POST', '/auth/register', JSON.stringify(params));\n }\n\n async me(userToken: string): Promise<MeResponse> {\n return this.request<MeResponse>('GET', '/auth/me', undefined, {\n Authorization: `Bearer ${userToken}`,\n });\n }\n\n async logout(userToken: string): Promise<void> {\n await this.request<Record<string, unknown>>('POST', '/auth/logout', undefined, {\n Authorization: `Bearer ${userToken}`,\n });\n }\n\n async checkUsername(username: string): Promise<CheckUsernameResponse> {\n return this.request<CheckUsernameResponse>('GET', `/auth/check-username?username=${encodeURIComponent(username)}`);\n }\n}\n","import { BaseResource } from './base';\nimport type { UserResponse, UsersListParams, UsersListResponse } from '../types';\n\nexport class UsersResource extends BaseResource {\n async get(walletAddress: string): Promise<UserResponse> {\n return this.request<UserResponse>('GET', `/users/${encodeURIComponent(walletAddress)}`);\n }\n\n async list(params?: UsersListParams): Promise<UsersListResponse> {\n const query = new URLSearchParams();\n if (params?.limit != null) query.set('limit', String(params.limit));\n if (params?.offset != null) query.set('offset', String(params.offset));\n const qs = query.toString();\n return this.request<UsersListResponse>('GET', `/users${qs ? `?${qs}` : ''}`);\n }\n}\n","import { BaseResource } from './base';\nimport type {\n EsportsMatchResponse,\n EsportsParams,\n EventsResponse,\n UpcomingEventsParams,\n} from '../types';\n\nexport class EventsResource extends BaseResource {\n async upcoming(params?: UpcomingEventsParams): Promise<EventsResponse> {\n const query = new URLSearchParams();\n if (params?.type) query.set('type', params.type);\n if (params?.page != null) query.set('page', String(params.page));\n if (params?.limit != null) query.set('limit', String(params.limit));\n const qs = query.toString();\n return this.request<EventsResponse>('GET', `/events/upcoming${qs ? `?${qs}` : ''}`);\n }\n\n async sports(league: string): Promise<EventsResponse> {\n return this.request<EventsResponse>('GET', `/events/sports/${encodeURIComponent(league)}`);\n }\n\n async esports(params?: EsportsParams): Promise<EventsResponse> {\n const query = new URLSearchParams();\n if (params?.videogame) query.set('videogame', params.videogame);\n if (params?.page != null) query.set('page', String(params.page));\n if (params?.limit != null) query.set('limit', String(params.limit));\n const qs = query.toString();\n return this.request<EventsResponse>('GET', `/events/esports${qs ? `?${qs}` : ''}`);\n }\n\n async esportsMatch(matchId: string): Promise<EsportsMatchResponse> {\n return this.request<EsportsMatchResponse>('GET', `/events/esports/match/${encodeURIComponent(matchId)}`);\n }\n}\n","import { BaseResource } from './base';\nimport type {\n CustomGameConfirmParams,\n CustomGameConfirmResponse,\n CustomGameCreateParams,\n CustomGameCreateResponse,\n Game,\n GameConfirmParams,\n GameConfirmResponse,\n GameCreateParams,\n GameCreateResponse,\n GameJoinParams,\n GameJoinResponse,\n GameListParams,\n GameListResponse,\n LiveScoreResponse,\n NetworkGamesParams,\n NetworkGamesResponse,\n ValidateResponse,\n} from '../types';\n\nexport class GamesResource extends BaseResource {\n async validate(eventId: string): Promise<ValidateResponse> {\n return this.request<ValidateResponse>('GET', `/games/validate?eventId=${encodeURIComponent(eventId)}`);\n }\n\n async create(params: GameCreateParams): Promise<GameCreateResponse> {\n return this.request<GameCreateResponse>('POST', '/games/create', JSON.stringify(params));\n }\n\n async join(params: GameJoinParams): Promise<GameJoinResponse> {\n return this.request<GameJoinResponse>('POST', '/games/join', JSON.stringify(params));\n }\n\n async confirm(params: GameConfirmParams): Promise<GameConfirmResponse> {\n return this.request<GameConfirmResponse>('POST', '/games/confirm', JSON.stringify(params));\n }\n\n async get(gameId: string): Promise<{ game: Game }> {\n return this.request<{ game: Game }>('GET', `/games/${encodeURIComponent(gameId)}`);\n }\n\n async list(params?: GameListParams): Promise<GameListResponse> {\n const query = new URLSearchParams();\n if (params?.status) query.set('status', params.status);\n if (params?.limit != null) query.set('limit', String(params.limit));\n if (params?.offset != null) query.set('offset', String(params.offset));\n const qs = query.toString();\n return this.request<GameListResponse>('GET', `/games${qs ? `?${qs}` : ''}`);\n }\n\n async network(params?: NetworkGamesParams): Promise<NetworkGamesResponse> {\n const query = new URLSearchParams();\n if (params?.limit != null) query.set('limit', String(params.limit));\n if (params?.offset != null) query.set('offset', String(params.offset));\n const qs = query.toString();\n return this.request<NetworkGamesResponse>('GET', `/games/network${qs ? `?${qs}` : ''}`);\n }\n\n async liveScore(gameId: string): Promise<LiveScoreResponse> {\n return this.request<LiveScoreResponse>('GET', `/games/${encodeURIComponent(gameId)}/live-score`);\n }\n\n async customCreate(params: CustomGameCreateParams): Promise<CustomGameCreateResponse> {\n return this.request<CustomGameCreateResponse>('POST', '/games/custom/create', JSON.stringify(params));\n }\n\n async customConfirm(params: CustomGameConfirmParams): Promise<CustomGameConfirmResponse> {\n return this.request<CustomGameConfirmResponse>('POST', '/games/custom/confirm', JSON.stringify(params));\n }\n}\n","import { BaseResource } from './base';\nimport type { BuildClaimParams, BuildClaimResponse } from '../types';\n\nexport class TransactionsResource extends BaseResource {\n async buildClaim(params: BuildClaimParams): Promise<BuildClaimResponse> {\n return this.request<BuildClaimResponse>('POST', '/transactions/build-claim', JSON.stringify(params));\n }\n}\n","import { BaseResource } from './base';\nimport type { UFCFightCardResponse, UFCFighterDetailResponse } from '../types';\n\nexport class UFCResource extends BaseResource {\n async fightCard(): Promise<UFCFightCardResponse> {\n return this.request<UFCFightCardResponse>('GET', '/ufc/fightcard');\n }\n\n async fighter(athleteId: string): Promise<UFCFighterDetailResponse> {\n return this.request<UFCFighterDetailResponse>('GET', `/ufc/fighters/${encodeURIComponent(athleteId)}`);\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
package/src/resources/ufc.ts
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { BaseResource } from './base';
|
|
2
|
-
import type { UFCFightCardResponse } from '../types';
|
|
2
|
+
import type { UFCFightCardResponse, UFCFighterDetailResponse } from '../types';
|
|
3
3
|
|
|
4
4
|
export class UFCResource extends BaseResource {
|
|
5
5
|
async fightCard(): Promise<UFCFightCardResponse> {
|
|
6
6
|
return this.request<UFCFightCardResponse>('GET', '/ufc/fightcard');
|
|
7
7
|
}
|
|
8
|
+
|
|
9
|
+
async fighter(athleteId: string): Promise<UFCFighterDetailResponse> {
|
|
10
|
+
return this.request<UFCFighterDetailResponse>('GET', `/ufc/fighters/${encodeURIComponent(athleteId)}`);
|
|
11
|
+
}
|
|
8
12
|
}
|
package/src/types.ts
CHANGED
|
@@ -271,7 +271,10 @@ export interface AppConfigResponse {
|
|
|
271
271
|
|
|
272
272
|
export interface UFCFighter {
|
|
273
273
|
name: string;
|
|
274
|
-
|
|
274
|
+
athleteId: string | null;
|
|
275
|
+
headshotUrl: string | null;
|
|
276
|
+
flagUrl: string | null;
|
|
277
|
+
country: string | null;
|
|
275
278
|
abbreviation: string;
|
|
276
279
|
record: string | null;
|
|
277
280
|
winner: boolean;
|
|
@@ -305,3 +308,37 @@ export interface UFCFightCardResponse {
|
|
|
305
308
|
success: boolean;
|
|
306
309
|
events: UFCEvent[];
|
|
307
310
|
}
|
|
311
|
+
|
|
312
|
+
export interface UFCFighterDetail {
|
|
313
|
+
athleteId: string;
|
|
314
|
+
firstName: string | null;
|
|
315
|
+
lastName: string | null;
|
|
316
|
+
fullName: string | null;
|
|
317
|
+
nickname: string | null;
|
|
318
|
+
shortName: string | null;
|
|
319
|
+
height: string | null;
|
|
320
|
+
heightInches: number | null;
|
|
321
|
+
weight: string | null;
|
|
322
|
+
weightLbs: number | null;
|
|
323
|
+
reach: string | null;
|
|
324
|
+
reachInches: number | null;
|
|
325
|
+
age: number | null;
|
|
326
|
+
dateOfBirth: string | null;
|
|
327
|
+
stance: string | null;
|
|
328
|
+
weightClass: string | null;
|
|
329
|
+
citizenship: string | null;
|
|
330
|
+
citizenshipAbbreviation: string | null;
|
|
331
|
+
gym: string | null;
|
|
332
|
+
gymCountry: string | null;
|
|
333
|
+
active: boolean;
|
|
334
|
+
headshotUrl: string | null;
|
|
335
|
+
flagUrl: string | null;
|
|
336
|
+
stanceImageUrl: string | null;
|
|
337
|
+
espnUrl: string | null;
|
|
338
|
+
slug: string | null;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
export interface UFCFighterDetailResponse {
|
|
342
|
+
success: boolean;
|
|
343
|
+
fighter: UFCFighterDetail;
|
|
344
|
+
}
|