@dubsdotapp/node 0.1.1 → 0.2.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/README.md +228 -0
- package/dist/index.d.mts +238 -1
- package/dist/index.d.ts +238 -1
- package/dist/index.js +153 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +147 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/client.ts +28 -1
- package/src/index.ts +56 -0
- package/src/resources/auth.ts +40 -0
- package/src/resources/base.ts +14 -0
- package/src/resources/events.ts +35 -0
- package/src/resources/games.ts +71 -0
- package/src/resources/index.ts +7 -0
- package/src/resources/transactions.ts +8 -0
- package/src/resources/users.ts +16 -0
- package/src/types.ts +231 -0
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts","../src/constants.ts","../src/errors.ts"],"sourcesContent":["import crypto from 'crypto';\nimport { DEFAULT_BASE_URL, NETWORK_CONFIG } from './constants';\nimport { DubsApiError } from './errors';\nimport type { 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 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\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"],"mappings":";AAAA,OAAO,YAAY;;;ACAZ,IAAM,mBAAmB;AAIzB,IAAM,iBAA2D;AAAA,EACtE,gBAAgB;AAAA,IACd,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,IACN,SAAS;AAAA,EACX;AACF;;;ACXO,IAAM,eAAN,cAA2B,MAAM;AAAA,EACtB;AAAA,EACA;AAAA,EAEhB,YAAY,MAAc,SAAiB,YAAoB;AAC7D,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,aAAa;AAAA,EACpB;AACF;;;AFLO,IAAM,OAAN,MAAW;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,QAAoB;AAC9B,SAAK,SAAS,OAAO;AACrB,SAAK,mBAAmB,OAAO;AAE/B,QAAI,OAAO,SAAS;AAClB,WAAK,UAAU,OAAO;AAAA,IACxB,WAAW,OAAO,SAAS;AACzB,WAAK,UAAU,eAAe,OAAO,OAAO,EAAE;AAAA,IAChD,OAAO;AACL,WAAK,UAAU;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAY,QAAgB,QAAuD;AACvF,QAAI,CAAC,KAAK,kBAAkB;AAC1B,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,OAAO,KAAK,UAAU;AAAA,MAC1B,QAAQ,OAAO;AAAA,MACf,GAAI,OAAO,YAAY,EAAE,UAAU,OAAO,SAAS;AAAA,IACrD,CAAC;AAED,UAAM,OAAO,OAAO,WAAW,UAAU,KAAK,gBAAgB,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK;AAEzF,WAAO,KAAK,QAA2B,QAAQ,UAAU,MAAM,YAAY,MAAM;AAAA,MAC/E,oBAAoB,UAAU,IAAI;AAAA,IACpC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAO,cAAc,SAA0B,WAAmB,QAA8B;AAC9F,UAAM,OAAO,OAAO,YAAY,WAAW,UAAU,QAAQ,SAAS,OAAO;AAC7E,UAAM,WAAW,OAAO,WAAW,UAAU,MAAM,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK;AAE9E,QACE,UAAU,WAAW,SAAS,UAC9B,CAAC,OAAO,gBAAgB,OAAO,KAAK,SAAS,GAAG,OAAO,KAAK,QAAQ,CAAC,GACrE;AACA,YAAM,IAAI,aAAa,qBAAqB,yCAAyC,GAAG;AAAA,IAC1F;AAEA,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB;AAAA;AAAA,EAIA,MAAc,QACZ,QACA,MACA,MACA,cACY;AACZ,UAAM,MAAM,GAAG,KAAK,OAAO,GAAG,IAAI;AAElC,UAAM,UAAkC;AAAA,MACtC,aAAa,KAAK;AAAA,MAClB,gBAAgB;AAAA,MAChB,GAAG;AAAA,IACL;AAEA,UAAM,MAAM,MAAM,MAAM,KAAK;AAAA,MAC3B;AAAA,MACA;AAAA,MACA,GAAI,QAAQ,EAAE,KAAK;AAAA,IACrB,CAAC;AAED,UAAM,OAAQ,MAAM,IAAI,KAAK;AAE7B,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,MAAM,OAAO,KAAK,YAAY,WAAW,KAAK,UAChD,OAAO,KAAK,UAAU,WAAW,KAAK,QACtC,8BAA8B,IAAI,MAAM,KAAK,KAAK,UAAU,IAAI,CAAC;AACrE,YAAM,IAAI;AAAA,QACP,KAAK,QAAmB;AAAA,QACzB;AAAA,QACA,IAAI;AAAA,MACN;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;","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"],"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 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\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 }\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"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
package/src/client.ts
CHANGED
|
@@ -1,13 +1,26 @@
|
|
|
1
1
|
import crypto from 'crypto';
|
|
2
2
|
import { DEFAULT_BASE_URL, NETWORK_CONFIG } from './constants';
|
|
3
3
|
import { DubsApiError } from './errors';
|
|
4
|
-
import
|
|
4
|
+
import {
|
|
5
|
+
AuthResource,
|
|
6
|
+
EventsResource,
|
|
7
|
+
GamesResource,
|
|
8
|
+
TransactionsResource,
|
|
9
|
+
UsersResource,
|
|
10
|
+
} from './resources';
|
|
11
|
+
import type { AppConfigResponse, DubsConfig, ResolveGameParams, ResolveGameResult, WebhookEvent } from './types';
|
|
5
12
|
|
|
6
13
|
export class Dubs {
|
|
7
14
|
private readonly apiKey: string;
|
|
8
15
|
private readonly resolutionSecret?: string;
|
|
9
16
|
private readonly baseUrl: string;
|
|
10
17
|
|
|
18
|
+
readonly auth: AuthResource;
|
|
19
|
+
readonly users: UsersResource;
|
|
20
|
+
readonly events: EventsResource;
|
|
21
|
+
readonly games: GamesResource;
|
|
22
|
+
readonly transactions: TransactionsResource;
|
|
23
|
+
|
|
11
24
|
constructor(config: DubsConfig) {
|
|
12
25
|
this.apiKey = config.apiKey;
|
|
13
26
|
this.resolutionSecret = config.resolutionSecret;
|
|
@@ -19,6 +32,20 @@ export class Dubs {
|
|
|
19
32
|
} else {
|
|
20
33
|
this.baseUrl = DEFAULT_BASE_URL;
|
|
21
34
|
}
|
|
35
|
+
|
|
36
|
+
const boundRequest = this.request.bind(this);
|
|
37
|
+
this.auth = new AuthResource(boundRequest);
|
|
38
|
+
this.users = new UsersResource(boundRequest);
|
|
39
|
+
this.events = new EventsResource(boundRequest);
|
|
40
|
+
this.games = new GamesResource(boundRequest);
|
|
41
|
+
this.transactions = new TransactionsResource(boundRequest);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Fetch the platform configuration.
|
|
46
|
+
*/
|
|
47
|
+
async config(): Promise<AppConfigResponse> {
|
|
48
|
+
return this.request<AppConfigResponse>('GET', '/config');
|
|
22
49
|
}
|
|
23
50
|
|
|
24
51
|
/**
|
package/src/index.ts
CHANGED
|
@@ -3,3 +3,59 @@ export { DubsApiError } from './errors';
|
|
|
3
3
|
export type { DubsConfig, ResolveGameParams, ResolveGameResult, WebhookEvent } from './types';
|
|
4
4
|
export { DEFAULT_BASE_URL, NETWORK_CONFIG } from './constants';
|
|
5
5
|
export type { DubsNetwork } from './constants';
|
|
6
|
+
|
|
7
|
+
// Resource classes
|
|
8
|
+
export { AuthResource, UsersResource, EventsResource, GamesResource, TransactionsResource } from './resources';
|
|
9
|
+
export type { RequestFn } from './resources';
|
|
10
|
+
|
|
11
|
+
// Auth types
|
|
12
|
+
export type {
|
|
13
|
+
NonceParams,
|
|
14
|
+
NonceResponse,
|
|
15
|
+
AuthenticateParams,
|
|
16
|
+
AuthenticateResponse,
|
|
17
|
+
RegisterParams,
|
|
18
|
+
RegisterResponse,
|
|
19
|
+
MeResponse,
|
|
20
|
+
CheckUsernameResponse,
|
|
21
|
+
} from './types';
|
|
22
|
+
|
|
23
|
+
// Users types
|
|
24
|
+
export type { User, UserResponse, UsersListParams, UsersListResponse } from './types';
|
|
25
|
+
|
|
26
|
+
// Events types
|
|
27
|
+
export type {
|
|
28
|
+
Event,
|
|
29
|
+
UpcomingEventsParams,
|
|
30
|
+
EventsResponse,
|
|
31
|
+
EsportsParams,
|
|
32
|
+
EsportsMatchResponse,
|
|
33
|
+
} from './types';
|
|
34
|
+
|
|
35
|
+
// Games types
|
|
36
|
+
export type {
|
|
37
|
+
Game,
|
|
38
|
+
ValidateParams,
|
|
39
|
+
ValidateResponse,
|
|
40
|
+
GameCreateParams,
|
|
41
|
+
GameCreateResponse,
|
|
42
|
+
GameJoinParams,
|
|
43
|
+
GameJoinResponse,
|
|
44
|
+
GameConfirmParams,
|
|
45
|
+
GameConfirmResponse,
|
|
46
|
+
GameListParams,
|
|
47
|
+
GameListResponse,
|
|
48
|
+
NetworkGamesParams,
|
|
49
|
+
NetworkGamesResponse,
|
|
50
|
+
LiveScoreResponse,
|
|
51
|
+
CustomGameCreateParams,
|
|
52
|
+
CustomGameCreateResponse,
|
|
53
|
+
CustomGameConfirmParams,
|
|
54
|
+
CustomGameConfirmResponse,
|
|
55
|
+
} from './types';
|
|
56
|
+
|
|
57
|
+
// Transactions types
|
|
58
|
+
export type { BuildClaimParams, BuildClaimResponse } from './types';
|
|
59
|
+
|
|
60
|
+
// Config types
|
|
61
|
+
export type { AppConfigResponse } from './types';
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { BaseResource } from './base';
|
|
2
|
+
import type {
|
|
3
|
+
AuthenticateParams,
|
|
4
|
+
AuthenticateResponse,
|
|
5
|
+
CheckUsernameResponse,
|
|
6
|
+
MeResponse,
|
|
7
|
+
NonceResponse,
|
|
8
|
+
RegisterParams,
|
|
9
|
+
RegisterResponse,
|
|
10
|
+
} from '../types';
|
|
11
|
+
|
|
12
|
+
export class AuthResource extends BaseResource {
|
|
13
|
+
async getNonce(walletAddress: string): Promise<NonceResponse> {
|
|
14
|
+
return this.request<NonceResponse>('GET', `/auth/nonce?walletAddress=${encodeURIComponent(walletAddress)}`);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
async authenticate(params: AuthenticateParams): Promise<AuthenticateResponse> {
|
|
18
|
+
return this.request<AuthenticateResponse>('POST', '/auth/authenticate', JSON.stringify(params));
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
async register(params: RegisterParams): Promise<RegisterResponse> {
|
|
22
|
+
return this.request<RegisterResponse>('POST', '/auth/register', JSON.stringify(params));
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async me(userToken: string): Promise<MeResponse> {
|
|
26
|
+
return this.request<MeResponse>('GET', '/auth/me', undefined, {
|
|
27
|
+
Authorization: `Bearer ${userToken}`,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async logout(userToken: string): Promise<void> {
|
|
32
|
+
await this.request<Record<string, unknown>>('POST', '/auth/logout', undefined, {
|
|
33
|
+
Authorization: `Bearer ${userToken}`,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async checkUsername(username: string): Promise<CheckUsernameResponse> {
|
|
38
|
+
return this.request<CheckUsernameResponse>('GET', `/auth/check-username?username=${encodeURIComponent(username)}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type RequestFn = <T>(
|
|
2
|
+
method: string,
|
|
3
|
+
path: string,
|
|
4
|
+
body?: string,
|
|
5
|
+
extraHeaders?: Record<string, string>,
|
|
6
|
+
) => Promise<T>;
|
|
7
|
+
|
|
8
|
+
export class BaseResource {
|
|
9
|
+
protected request: RequestFn;
|
|
10
|
+
|
|
11
|
+
constructor(request: RequestFn) {
|
|
12
|
+
this.request = request;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { BaseResource } from './base';
|
|
2
|
+
import type {
|
|
3
|
+
EsportsMatchResponse,
|
|
4
|
+
EsportsParams,
|
|
5
|
+
EventsResponse,
|
|
6
|
+
UpcomingEventsParams,
|
|
7
|
+
} from '../types';
|
|
8
|
+
|
|
9
|
+
export class EventsResource extends BaseResource {
|
|
10
|
+
async upcoming(params?: UpcomingEventsParams): Promise<EventsResponse> {
|
|
11
|
+
const query = new URLSearchParams();
|
|
12
|
+
if (params?.type) query.set('type', params.type);
|
|
13
|
+
if (params?.page != null) query.set('page', String(params.page));
|
|
14
|
+
if (params?.limit != null) query.set('limit', String(params.limit));
|
|
15
|
+
const qs = query.toString();
|
|
16
|
+
return this.request<EventsResponse>('GET', `/events/upcoming${qs ? `?${qs}` : ''}`);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async sports(league: string): Promise<EventsResponse> {
|
|
20
|
+
return this.request<EventsResponse>('GET', `/events/sports/${encodeURIComponent(league)}`);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async esports(params?: EsportsParams): Promise<EventsResponse> {
|
|
24
|
+
const query = new URLSearchParams();
|
|
25
|
+
if (params?.videogame) query.set('videogame', params.videogame);
|
|
26
|
+
if (params?.page != null) query.set('page', String(params.page));
|
|
27
|
+
if (params?.limit != null) query.set('limit', String(params.limit));
|
|
28
|
+
const qs = query.toString();
|
|
29
|
+
return this.request<EventsResponse>('GET', `/events/esports${qs ? `?${qs}` : ''}`);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async esportsMatch(matchId: string): Promise<EsportsMatchResponse> {
|
|
33
|
+
return this.request<EsportsMatchResponse>('GET', `/events/esports/match/${encodeURIComponent(matchId)}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { BaseResource } from './base';
|
|
2
|
+
import type {
|
|
3
|
+
CustomGameConfirmParams,
|
|
4
|
+
CustomGameConfirmResponse,
|
|
5
|
+
CustomGameCreateParams,
|
|
6
|
+
CustomGameCreateResponse,
|
|
7
|
+
Game,
|
|
8
|
+
GameConfirmParams,
|
|
9
|
+
GameConfirmResponse,
|
|
10
|
+
GameCreateParams,
|
|
11
|
+
GameCreateResponse,
|
|
12
|
+
GameJoinParams,
|
|
13
|
+
GameJoinResponse,
|
|
14
|
+
GameListParams,
|
|
15
|
+
GameListResponse,
|
|
16
|
+
LiveScoreResponse,
|
|
17
|
+
NetworkGamesParams,
|
|
18
|
+
NetworkGamesResponse,
|
|
19
|
+
ValidateResponse,
|
|
20
|
+
} from '../types';
|
|
21
|
+
|
|
22
|
+
export class GamesResource extends BaseResource {
|
|
23
|
+
async validate(eventId: string): Promise<ValidateResponse> {
|
|
24
|
+
return this.request<ValidateResponse>('GET', `/games/validate?eventId=${encodeURIComponent(eventId)}`);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async create(params: GameCreateParams): Promise<GameCreateResponse> {
|
|
28
|
+
return this.request<GameCreateResponse>('POST', '/games/create', JSON.stringify(params));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async join(params: GameJoinParams): Promise<GameJoinResponse> {
|
|
32
|
+
return this.request<GameJoinResponse>('POST', '/games/join', JSON.stringify(params));
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async confirm(params: GameConfirmParams): Promise<GameConfirmResponse> {
|
|
36
|
+
return this.request<GameConfirmResponse>('POST', '/games/confirm', JSON.stringify(params));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async get(gameId: string): Promise<{ game: Game }> {
|
|
40
|
+
return this.request<{ game: Game }>('GET', `/games/${encodeURIComponent(gameId)}`);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async list(params?: GameListParams): Promise<GameListResponse> {
|
|
44
|
+
const query = new URLSearchParams();
|
|
45
|
+
if (params?.status) query.set('status', params.status);
|
|
46
|
+
if (params?.limit != null) query.set('limit', String(params.limit));
|
|
47
|
+
if (params?.offset != null) query.set('offset', String(params.offset));
|
|
48
|
+
const qs = query.toString();
|
|
49
|
+
return this.request<GameListResponse>('GET', `/games${qs ? `?${qs}` : ''}`);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async network(params?: NetworkGamesParams): Promise<NetworkGamesResponse> {
|
|
53
|
+
const query = new URLSearchParams();
|
|
54
|
+
if (params?.limit != null) query.set('limit', String(params.limit));
|
|
55
|
+
if (params?.offset != null) query.set('offset', String(params.offset));
|
|
56
|
+
const qs = query.toString();
|
|
57
|
+
return this.request<NetworkGamesResponse>('GET', `/games/network${qs ? `?${qs}` : ''}`);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
async liveScore(gameId: string): Promise<LiveScoreResponse> {
|
|
61
|
+
return this.request<LiveScoreResponse>('GET', `/games/${encodeURIComponent(gameId)}/live-score`);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
async customCreate(params: CustomGameCreateParams): Promise<CustomGameCreateResponse> {
|
|
65
|
+
return this.request<CustomGameCreateResponse>('POST', '/games/custom/create', JSON.stringify(params));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
async customConfirm(params: CustomGameConfirmParams): Promise<CustomGameConfirmResponse> {
|
|
69
|
+
return this.request<CustomGameConfirmResponse>('POST', '/games/custom/confirm', JSON.stringify(params));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { BaseResource } from './base';
|
|
2
|
+
export type { RequestFn } from './base';
|
|
3
|
+
export { AuthResource } from './auth';
|
|
4
|
+
export { UsersResource } from './users';
|
|
5
|
+
export { EventsResource } from './events';
|
|
6
|
+
export { GamesResource } from './games';
|
|
7
|
+
export { TransactionsResource } from './transactions';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { BaseResource } from './base';
|
|
2
|
+
import type { BuildClaimParams, BuildClaimResponse } from '../types';
|
|
3
|
+
|
|
4
|
+
export class TransactionsResource extends BaseResource {
|
|
5
|
+
async buildClaim(params: BuildClaimParams): Promise<BuildClaimResponse> {
|
|
6
|
+
return this.request<BuildClaimResponse>('POST', '/transactions/build-claim', JSON.stringify(params));
|
|
7
|
+
}
|
|
8
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { BaseResource } from './base';
|
|
2
|
+
import type { UserResponse, UsersListParams, UsersListResponse } from '../types';
|
|
3
|
+
|
|
4
|
+
export class UsersResource extends BaseResource {
|
|
5
|
+
async get(walletAddress: string): Promise<UserResponse> {
|
|
6
|
+
return this.request<UserResponse>('GET', `/users/${encodeURIComponent(walletAddress)}`);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
async list(params?: UsersListParams): Promise<UsersListResponse> {
|
|
10
|
+
const query = new URLSearchParams();
|
|
11
|
+
if (params?.limit != null) query.set('limit', String(params.limit));
|
|
12
|
+
if (params?.offset != null) query.set('offset', String(params.offset));
|
|
13
|
+
const qs = query.toString();
|
|
14
|
+
return this.request<UsersListResponse>('GET', `/users${qs ? `?${qs}` : ''}`);
|
|
15
|
+
}
|
|
16
|
+
}
|
package/src/types.ts
CHANGED
|
@@ -35,3 +35,234 @@ export interface WebhookEvent {
|
|
|
35
35
|
timestamp: string;
|
|
36
36
|
data: Record<string, unknown>;
|
|
37
37
|
}
|
|
38
|
+
|
|
39
|
+
// ── Shared shapes ──
|
|
40
|
+
|
|
41
|
+
export interface User {
|
|
42
|
+
walletAddress: string;
|
|
43
|
+
username: string;
|
|
44
|
+
avatar?: string;
|
|
45
|
+
createdAt: string;
|
|
46
|
+
updatedAt: string;
|
|
47
|
+
[key: string]: unknown;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface Game {
|
|
51
|
+
id: string;
|
|
52
|
+
status: string;
|
|
53
|
+
gameMode: number;
|
|
54
|
+
eventId?: string;
|
|
55
|
+
wagerAmount: number;
|
|
56
|
+
players: Record<string, unknown>[];
|
|
57
|
+
winner?: string | null;
|
|
58
|
+
createdAt: string;
|
|
59
|
+
updatedAt: string;
|
|
60
|
+
[key: string]: unknown;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface Event {
|
|
64
|
+
id: string;
|
|
65
|
+
name: string;
|
|
66
|
+
type: string;
|
|
67
|
+
league?: string;
|
|
68
|
+
startTime: string;
|
|
69
|
+
status: string;
|
|
70
|
+
teams: { home: string; away: string };
|
|
71
|
+
[key: string]: unknown;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// ── Auth types ──
|
|
75
|
+
|
|
76
|
+
export interface NonceParams {
|
|
77
|
+
walletAddress: string;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export interface NonceResponse {
|
|
81
|
+
nonce: string;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export interface AuthenticateParams {
|
|
85
|
+
walletAddress: string;
|
|
86
|
+
signature: string;
|
|
87
|
+
nonce: string;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export interface AuthenticateResponse {
|
|
91
|
+
token: string;
|
|
92
|
+
user: User;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export interface RegisterParams {
|
|
96
|
+
walletAddress: string;
|
|
97
|
+
signature: string;
|
|
98
|
+
nonce: string;
|
|
99
|
+
username: string;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export interface RegisterResponse {
|
|
103
|
+
token: string;
|
|
104
|
+
user: User;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export interface MeResponse {
|
|
108
|
+
user: User;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export interface CheckUsernameResponse {
|
|
112
|
+
available: boolean;
|
|
113
|
+
username: string;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// ── Users types ──
|
|
117
|
+
|
|
118
|
+
export interface UserResponse {
|
|
119
|
+
user: User;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export interface UsersListParams {
|
|
123
|
+
limit?: number;
|
|
124
|
+
offset?: number;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export interface UsersListResponse {
|
|
128
|
+
users: User[];
|
|
129
|
+
total: number;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// ── Events types ──
|
|
133
|
+
|
|
134
|
+
export interface UpcomingEventsParams {
|
|
135
|
+
type?: string;
|
|
136
|
+
page?: number;
|
|
137
|
+
limit?: number;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export interface EventsResponse {
|
|
141
|
+
events: Event[];
|
|
142
|
+
total?: number;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export interface EsportsParams {
|
|
146
|
+
videogame?: string;
|
|
147
|
+
page?: number;
|
|
148
|
+
limit?: number;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export interface EsportsMatchResponse {
|
|
152
|
+
match: Record<string, unknown>;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// ── Games types ──
|
|
156
|
+
|
|
157
|
+
export interface ValidateParams {
|
|
158
|
+
eventId: string;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export interface ValidateResponse {
|
|
162
|
+
valid: boolean;
|
|
163
|
+
event: Event;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export interface GameCreateParams {
|
|
167
|
+
id: string;
|
|
168
|
+
playerWallet: string;
|
|
169
|
+
teamChoice: string;
|
|
170
|
+
wagerAmount: number;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
export interface GameCreateResponse {
|
|
174
|
+
game: Game;
|
|
175
|
+
transaction: string;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export interface GameJoinParams {
|
|
179
|
+
playerWallet: string;
|
|
180
|
+
gameId: string;
|
|
181
|
+
teamChoice: string;
|
|
182
|
+
amount: number;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
export interface GameJoinResponse {
|
|
186
|
+
game: Game;
|
|
187
|
+
transaction: string;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export interface GameConfirmParams {
|
|
191
|
+
gameId: string;
|
|
192
|
+
playerWallet: string;
|
|
193
|
+
signature: string;
|
|
194
|
+
[key: string]: unknown;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export interface GameConfirmResponse {
|
|
198
|
+
game: Game;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
export interface GameListParams {
|
|
202
|
+
status?: string;
|
|
203
|
+
limit?: number;
|
|
204
|
+
offset?: number;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export interface GameListResponse {
|
|
208
|
+
games: Game[];
|
|
209
|
+
total: number;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
export interface NetworkGamesParams {
|
|
213
|
+
limit?: number;
|
|
214
|
+
offset?: number;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
export interface NetworkGamesResponse {
|
|
218
|
+
games: Game[];
|
|
219
|
+
total: number;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export interface LiveScoreResponse {
|
|
223
|
+
gameId: string;
|
|
224
|
+
score: Record<string, unknown>;
|
|
225
|
+
status: string;
|
|
226
|
+
[key: string]: unknown;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
export interface CustomGameCreateParams {
|
|
230
|
+
playerWallet: string;
|
|
231
|
+
teamChoice: string;
|
|
232
|
+
wagerAmount: number;
|
|
233
|
+
[key: string]: unknown;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
export interface CustomGameCreateResponse {
|
|
237
|
+
game: Game;
|
|
238
|
+
transaction: string;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
export interface CustomGameConfirmParams {
|
|
242
|
+
gameId: string;
|
|
243
|
+
playerWallet: string;
|
|
244
|
+
signature: string;
|
|
245
|
+
[key: string]: unknown;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
export interface CustomGameConfirmResponse {
|
|
249
|
+
game: Game;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// ── Transactions types ──
|
|
253
|
+
|
|
254
|
+
export interface BuildClaimParams {
|
|
255
|
+
playerWallet: string;
|
|
256
|
+
gameId: string;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
export interface BuildClaimResponse {
|
|
260
|
+
transaction: string;
|
|
261
|
+
[key: string]: unknown;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// ── Config types ──
|
|
265
|
+
|
|
266
|
+
export interface AppConfigResponse {
|
|
267
|
+
[key: string]: unknown;
|
|
268
|
+
}
|