infinite-games-sdk 0.0.1 → 0.0.3
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 +193 -1
- package/dist/errors.d.ts +4 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +11 -0
- package/dist/errors.js.map +1 -0
- package/dist/history/HistoryClient.d.ts +20 -0
- package/dist/history/HistoryClient.d.ts.map +1 -0
- package/dist/history/HistoryClient.js +96 -0
- package/dist/history/HistoryClient.js.map +1 -0
- package/dist/history/index.d.ts +4 -0
- package/dist/history/index.d.ts.map +1 -0
- package/dist/history/index.js +8 -0
- package/dist/history/index.js.map +1 -0
- package/dist/history/types.d.ts +14 -0
- package/dist/history/types.d.ts.map +1 -0
- package/dist/history/types.js +3 -0
- package/dist/history/types.js.map +1 -0
- package/dist/history/useHistoryClient.d.ts +15 -0
- package/dist/history/useHistoryClient.d.ts.map +1 -0
- package/dist/history/useHistoryClient.js +84 -0
- package/dist/history/useHistoryClient.js.map +1 -0
- package/dist/index.d.ts +11 -5
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -20
- package/dist/index.js.map +1 -0
- package/dist/launcher/index.d.ts +4 -0
- package/dist/launcher/index.d.ts.map +1 -0
- package/dist/launcher/index.js +9 -0
- package/dist/launcher/index.js.map +1 -0
- package/dist/launcher/types.d.ts +59 -0
- package/dist/launcher/types.d.ts.map +1 -0
- package/dist/launcher/types.js +20 -0
- package/dist/launcher/types.js.map +1 -0
- package/dist/launcher/useGameLauncher.d.ts +3 -0
- package/dist/launcher/useGameLauncher.d.ts.map +1 -0
- package/dist/launcher/useGameLauncher.js +137 -0
- package/dist/launcher/useGameLauncher.js.map +1 -0
- package/dist/session/SessionClient.d.ts +38 -0
- package/dist/session/SessionClient.d.ts.map +1 -0
- package/dist/session/SessionClient.js +129 -0
- package/dist/session/SessionClient.js.map +1 -0
- package/dist/session/index.d.ts +4 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +10 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/tokens.d.ts +15 -0
- package/dist/session/tokens.d.ts.map +1 -0
- package/dist/session/tokens.js +55 -0
- package/dist/session/tokens.js.map +1 -0
- package/dist/session/types.d.ts +21 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +3 -0
- package/dist/session/types.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/scale.d.ts +4 -0
- package/dist/utils/scale.d.ts.map +1 -0
- package/dist/utils/scale.js +13 -0
- package/dist/utils/scale.js.map +1 -0
- package/package.json +22 -14
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/src/index.ts +0 -19
- package/tsconfig.json +0 -17
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export interface WalletState {
|
|
2
|
+
address: string | null;
|
|
3
|
+
connected: boolean;
|
|
4
|
+
chain: string | null;
|
|
5
|
+
}
|
|
6
|
+
export interface LaunchMutation {
|
|
7
|
+
mutateAsync: (params: {
|
|
8
|
+
gameType: string;
|
|
9
|
+
}) => Promise<{
|
|
10
|
+
origin: string;
|
|
11
|
+
token: string;
|
|
12
|
+
chain: string;
|
|
13
|
+
}>;
|
|
14
|
+
reset: () => void;
|
|
15
|
+
}
|
|
16
|
+
export interface GameLauncherConfig {
|
|
17
|
+
/** Game type identifier (e.g., 'baccarat', 'blackjack', 'range') */
|
|
18
|
+
gameType: string;
|
|
19
|
+
/** Default game origin URL (used when no token in URL) */
|
|
20
|
+
defaultOrigin: string;
|
|
21
|
+
/** Optional local development origin */
|
|
22
|
+
localOrigin?: string;
|
|
23
|
+
/** Use local origin instead of production */
|
|
24
|
+
useLocal?: boolean;
|
|
25
|
+
/** Message type for table creation events (e.g., 'baccarat-table-created') */
|
|
26
|
+
tableCreatedMessageType?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface UseGameLauncherOptions {
|
|
29
|
+
/** Wallet state from useWallet() */
|
|
30
|
+
wallet: WalletState;
|
|
31
|
+
/** Launch mutation from useAuth() */
|
|
32
|
+
launch: LaunchMutation;
|
|
33
|
+
/** Function to get current URL search params */
|
|
34
|
+
getSearchParams: () => URLSearchParams;
|
|
35
|
+
/** Function to set URL search params */
|
|
36
|
+
setSearchParams: (params: Record<string, string>, options?: {
|
|
37
|
+
replace?: boolean;
|
|
38
|
+
}) => void;
|
|
39
|
+
}
|
|
40
|
+
export interface GameLauncherState {
|
|
41
|
+
/** Ready-to-use iframe src URL, or null if not ready */
|
|
42
|
+
iframeSrc: string | null;
|
|
43
|
+
/** Current iframe height from postMessage, or null */
|
|
44
|
+
iframeHeight: number | null;
|
|
45
|
+
/** Current iframe origin for security checks */
|
|
46
|
+
iframeOrigin: string | null;
|
|
47
|
+
/** Error message if launch failed */
|
|
48
|
+
error: string | null;
|
|
49
|
+
/** Whether the game is currently loading */
|
|
50
|
+
isLoading: boolean;
|
|
51
|
+
/** Whether the user needs to connect their wallet */
|
|
52
|
+
showConnectPrompt: boolean;
|
|
53
|
+
/** Retry the launch after an error */
|
|
54
|
+
retry: () => void;
|
|
55
|
+
}
|
|
56
|
+
export declare const VALID_COINS: Record<string, string[]>;
|
|
57
|
+
/** Get coin type: use URL param if compatible with chain, otherwise default */
|
|
58
|
+
export declare function getCompatibleCoinType(chain: string, urlCoinType: string | null): string;
|
|
59
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/launcher/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC;QACrD,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;IACH,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,aAAa,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8EAA8E;IAC9E,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,sBAAsB;IACrC,oCAAoC;IACpC,MAAM,EAAE,WAAW,CAAC;IACpB,qCAAqC;IACrC,MAAM,EAAE,cAAc,CAAC;IACvB,gDAAgD;IAChD,eAAe,EAAE,MAAM,eAAe,CAAC;IACvC,wCAAwC;IACxC,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;CAC5F;AAED,MAAM,WAAW,iBAAiB;IAChC,wDAAwD;IACxD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,sDAAsD;IACtD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,gDAAgD;IAChD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,qCAAqC;IACrC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,4CAA4C;IAC5C,SAAS,EAAE,OAAO,CAAC;IACnB,qDAAqD;IACrD,iBAAiB,EAAE,OAAO,CAAC;IAC3B,sCAAsC;IACtC,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAGD,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAGhD,CAAC;AAEF,+EAA+E;AAC/E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAMvF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VALID_COINS = void 0;
|
|
4
|
+
exports.getCompatibleCoinType = getCompatibleCoinType;
|
|
5
|
+
// Valid coin types per chain
|
|
6
|
+
exports.VALID_COINS = {
|
|
7
|
+
sui: ['sui/sui', 'sui/usdc'],
|
|
8
|
+
solana: ['solana/sol', 'solana/usdc'],
|
|
9
|
+
};
|
|
10
|
+
/** Get coin type: use URL param if compatible with chain, otherwise default */
|
|
11
|
+
function getCompatibleCoinType(chain, urlCoinType) {
|
|
12
|
+
const defaultCoin = chain === 'solana' ? 'solana/sol' : 'sui/sui';
|
|
13
|
+
if (!urlCoinType)
|
|
14
|
+
return defaultCoin;
|
|
15
|
+
const validCoins = exports.VALID_COINS[chain] ?? [];
|
|
16
|
+
if (validCoins.includes(urlCoinType))
|
|
17
|
+
return urlCoinType;
|
|
18
|
+
return defaultCoin;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/launcher/types.ts"],"names":[],"mappings":";;;AA+DA,sDAMC;AAbD,6BAA6B;AAChB,QAAA,WAAW,GAA6B;IACnD,GAAG,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;IAC5B,MAAM,EAAE,CAAC,YAAY,EAAE,aAAa,CAAC;CACtC,CAAC;AAEF,+EAA+E;AAC/E,SAAgB,qBAAqB,CAAC,KAAa,EAAE,WAA0B;IAC7E,MAAM,WAAW,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;IAClE,IAAI,CAAC,WAAW;QAAE,OAAO,WAAW,CAAC;IACrC,MAAM,UAAU,GAAG,mBAAW,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAC5C,IAAI,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,WAAW,CAAC;IACzD,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGameLauncher.d.ts","sourceRoot":"","sources":["../../src/launcher/useGameLauncher.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EAElB,MAAM,SAAS,CAAC;AAEjB,wBAAgB,eAAe,CAC7B,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,sBAAsB,GAC9B,iBAAiB,CAyInB"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useGameLauncher = useGameLauncher;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
const types_1 = require("./types");
|
|
6
|
+
function useGameLauncher(config, options) {
|
|
7
|
+
const { gameType, defaultOrigin, localOrigin, useLocal = false, tableCreatedMessageType } = config;
|
|
8
|
+
const { wallet, launch, getSearchParams, setSearchParams } = options;
|
|
9
|
+
const { mutateAsync: launchGame, reset } = launch;
|
|
10
|
+
// Derive the message type from gameType if not provided
|
|
11
|
+
const tableCreatedType = tableCreatedMessageType ?? `${gameType}-table-created`;
|
|
12
|
+
// Get URL params
|
|
13
|
+
const searchParams = getSearchParams();
|
|
14
|
+
const tokenParam = searchParams.get('token');
|
|
15
|
+
const urlCoinType = searchParams.get('coinType');
|
|
16
|
+
const [iframeOrigin, setIframeOrigin] = (0, react_1.useState)(null);
|
|
17
|
+
const [sessionToken, setSessionToken] = (0, react_1.useState)(null);
|
|
18
|
+
const [launchError, setLaunchError] = (0, react_1.useState)(null);
|
|
19
|
+
const [launchCoinType, setLaunchCoinType] = (0, react_1.useState)(null);
|
|
20
|
+
const [iframeHeight, setIframeHeight] = (0, react_1.useState)(null);
|
|
21
|
+
const launchInProgress = (0, react_1.useRef)(false);
|
|
22
|
+
// Determine the origin to use
|
|
23
|
+
const resolvedOrigin = useLocal && localOrigin ? localOrigin : defaultOrigin;
|
|
24
|
+
// Main launch effect
|
|
25
|
+
(0, react_1.useEffect)(() => {
|
|
26
|
+
async function run() {
|
|
27
|
+
// Load directly from URL token (shareable link or spectator)
|
|
28
|
+
if (tokenParam) {
|
|
29
|
+
if (sessionToken === tokenParam)
|
|
30
|
+
return;
|
|
31
|
+
setLaunchError(null);
|
|
32
|
+
setSessionToken(tokenParam);
|
|
33
|
+
setIframeOrigin(resolvedOrigin);
|
|
34
|
+
setLaunchCoinType(null); // Will be set by iframe message
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
// Need wallet to launch
|
|
38
|
+
if (!wallet.address || !wallet.connected || !wallet.chain) {
|
|
39
|
+
setSessionToken(null);
|
|
40
|
+
setIframeOrigin(null);
|
|
41
|
+
setLaunchError(null);
|
|
42
|
+
setLaunchCoinType(null);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
// Skip if already have session, error, or launch in progress
|
|
46
|
+
if (sessionToken || launchError || launchInProgress.current)
|
|
47
|
+
return;
|
|
48
|
+
launchInProgress.current = true;
|
|
49
|
+
try {
|
|
50
|
+
const { origin, token, chain } = await launchGame({ gameType });
|
|
51
|
+
setSessionToken(token);
|
|
52
|
+
setIframeOrigin(useLocal && localOrigin ? localOrigin : origin);
|
|
53
|
+
// Use selected coin type if compatible, otherwise default
|
|
54
|
+
setLaunchCoinType((0, types_1.getCompatibleCoinType)(chain, urlCoinType));
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
setLaunchError(error instanceof Error ? error.message : String(error));
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
launchInProgress.current = false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
run();
|
|
64
|
+
}, [
|
|
65
|
+
wallet.address,
|
|
66
|
+
wallet.connected,
|
|
67
|
+
wallet.chain,
|
|
68
|
+
sessionToken,
|
|
69
|
+
launchError,
|
|
70
|
+
launchGame,
|
|
71
|
+
tokenParam,
|
|
72
|
+
urlCoinType,
|
|
73
|
+
gameType,
|
|
74
|
+
resolvedOrigin,
|
|
75
|
+
useLocal,
|
|
76
|
+
localOrigin,
|
|
77
|
+
]);
|
|
78
|
+
// Handle iframe messages
|
|
79
|
+
(0, react_1.useEffect)(() => {
|
|
80
|
+
const handleMessage = (event) => {
|
|
81
|
+
if (!iframeOrigin || event.origin !== iframeOrigin)
|
|
82
|
+
return;
|
|
83
|
+
if (event.data?.type === tableCreatedType && event.data.tableId) {
|
|
84
|
+
// Table created - include coinType so selector shows correct coin (disabled)
|
|
85
|
+
const coinType = event.data.coinType || launchCoinType;
|
|
86
|
+
const newParams = { token: event.data.tableId };
|
|
87
|
+
if (coinType)
|
|
88
|
+
newParams.coinType = coinType;
|
|
89
|
+
setSessionToken(event.data.tableId);
|
|
90
|
+
setLaunchCoinType(null);
|
|
91
|
+
setSearchParams(newParams, { replace: true });
|
|
92
|
+
}
|
|
93
|
+
if (event.data?.type === 'table-info' && event.data.coinType) {
|
|
94
|
+
// Existing table loaded - set coinType in URL so selector shows correct coin
|
|
95
|
+
const currentToken = getSearchParams().get('token');
|
|
96
|
+
if (currentToken) {
|
|
97
|
+
setSearchParams({ token: currentToken, coinType: event.data.coinType }, { replace: true });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (event.data?.type === 'iframe-height' && event.data.height) {
|
|
101
|
+
setIframeHeight(event.data.height);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
window.addEventListener('message', handleMessage);
|
|
105
|
+
return () => window.removeEventListener('message', handleMessage);
|
|
106
|
+
}, [iframeOrigin, launchCoinType, tableCreatedType, getSearchParams, setSearchParams]);
|
|
107
|
+
const retry = (0, react_1.useCallback)(() => {
|
|
108
|
+
launchInProgress.current = false;
|
|
109
|
+
setSessionToken(null);
|
|
110
|
+
setIframeOrigin(null);
|
|
111
|
+
setLaunchError(null);
|
|
112
|
+
setLaunchCoinType(null);
|
|
113
|
+
reset();
|
|
114
|
+
}, [reset]);
|
|
115
|
+
const iframeSrc = (0, react_1.useMemo)(() => {
|
|
116
|
+
if (!iframeOrigin || !sessionToken)
|
|
117
|
+
return null;
|
|
118
|
+
const url = new URL('/', iframeOrigin);
|
|
119
|
+
url.searchParams.set('token', sessionToken);
|
|
120
|
+
if (launchCoinType)
|
|
121
|
+
url.searchParams.set('coinType', launchCoinType);
|
|
122
|
+
return url.toString();
|
|
123
|
+
}, [iframeOrigin, sessionToken, launchCoinType]);
|
|
124
|
+
// Determine UI state
|
|
125
|
+
const showConnectPrompt = !tokenParam && !wallet.connected;
|
|
126
|
+
const isLoading = !showConnectPrompt && !launchError && !iframeSrc;
|
|
127
|
+
return {
|
|
128
|
+
iframeSrc,
|
|
129
|
+
iframeHeight,
|
|
130
|
+
iframeOrigin,
|
|
131
|
+
error: launchError,
|
|
132
|
+
isLoading,
|
|
133
|
+
showConnectPrompt,
|
|
134
|
+
retry,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=useGameLauncher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGameLauncher.js","sourceRoot":"","sources":["../../src/launcher/useGameLauncher.ts"],"names":[],"mappings":";;AAQA,0CA4IC;AApJD,iCAA0E;AAC1E,mCAKiB;AAEjB,SAAgB,eAAe,CAC7B,MAA0B,EAC1B,OAA+B;IAE/B,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,GAAG,KAAK,EAAE,uBAAuB,EAAE,GAAG,MAAM,CAAC;IACnG,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;IACrE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IAElD,wDAAwD;IACxD,MAAM,gBAAgB,GAAG,uBAAuB,IAAI,GAAG,QAAQ,gBAAgB,CAAC;IAEhF,iBAAiB;IACjB,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAEjD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,IAAA,gBAAQ,EAAgB,IAAI,CAAC,CAAC;IACtE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,IAAA,gBAAQ,EAAgB,IAAI,CAAC,CAAC;IACtE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,IAAA,gBAAQ,EAAgB,IAAI,CAAC,CAAC;IACpE,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,IAAA,gBAAQ,EAAgB,IAAI,CAAC,CAAC;IAC1E,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,IAAA,gBAAQ,EAAgB,IAAI,CAAC,CAAC;IAEtE,MAAM,gBAAgB,GAAG,IAAA,cAAM,EAAC,KAAK,CAAC,CAAC;IAEvC,8BAA8B;IAC9B,MAAM,cAAc,GAAG,QAAQ,IAAI,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC;IAE7E,qBAAqB;IACrB,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,KAAK,UAAU,GAAG;YAChB,6DAA6D;YAC7D,IAAI,UAAU,EAAE,CAAC;gBACf,IAAI,YAAY,KAAK,UAAU;oBAAE,OAAO;gBACxC,cAAc,CAAC,IAAI,CAAC,CAAC;gBACrB,eAAe,CAAC,UAAU,CAAC,CAAC;gBAC5B,eAAe,CAAC,cAAc,CAAC,CAAC;gBAChC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,gCAAgC;gBACzD,OAAO;YACT,CAAC;YAED,wBAAwB;YACxB,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAC1D,eAAe,CAAC,IAAI,CAAC,CAAC;gBACtB,eAAe,CAAC,IAAI,CAAC,CAAC;gBACtB,cAAc,CAAC,IAAI,CAAC,CAAC;gBACrB,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBACxB,OAAO;YACT,CAAC;YAED,6DAA6D;YAC7D,IAAI,YAAY,IAAI,WAAW,IAAI,gBAAgB,CAAC,OAAO;gBAAE,OAAO;YAEpE,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC;YAChC,IAAI,CAAC;gBACH,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAChE,eAAe,CAAC,KAAK,CAAC,CAAC;gBACvB,eAAe,CAAC,QAAQ,IAAI,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBAChE,0DAA0D;gBAC1D,iBAAiB,CAAC,IAAA,6BAAqB,EAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;YAC/D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,cAAc,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACzE,CAAC;oBAAS,CAAC;gBACT,gBAAgB,CAAC,OAAO,GAAG,KAAK,CAAC;YACnC,CAAC;QACH,CAAC;QACD,GAAG,EAAE,CAAC;IACR,CAAC,EAAE;QACD,MAAM,CAAC,OAAO;QACd,MAAM,CAAC,SAAS;QAChB,MAAM,CAAC,KAAK;QACZ,YAAY;QACZ,WAAW;QACX,UAAU;QACV,UAAU;QACV,WAAW;QACX,QAAQ;QACR,cAAc;QACd,QAAQ;QACR,WAAW;KACZ,CAAC,CAAC;IAEH,yBAAyB;IACzB,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,MAAM,aAAa,GAAG,CAAC,KAAmB,EAAE,EAAE;YAC5C,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,MAAM,KAAK,YAAY;gBAAE,OAAO;YAE3D,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,KAAK,gBAAgB,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAChE,6EAA6E;gBAC7E,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,cAAc,CAAC;gBACvD,MAAM,SAAS,GAA2B,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACxE,IAAI,QAAQ;oBAAE,SAAS,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBAC5C,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACpC,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBACxB,eAAe,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAChD,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,KAAK,YAAY,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC7D,6EAA6E;gBAC7E,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACpD,IAAI,YAAY,EAAE,CAAC;oBACjB,eAAe,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC7F,CAAC;YACH,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,KAAK,eAAe,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC9D,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrC,CAAC;QACH,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QAClD,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACpE,CAAC,EAAE,CAAC,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,CAAC,CAAC,CAAC;IAEvF,MAAM,KAAK,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE;QAC7B,gBAAgB,CAAC,OAAO,GAAG,KAAK,CAAC;QACjC,eAAe,CAAC,IAAI,CAAC,CAAC;QACtB,eAAe,CAAC,IAAI,CAAC,CAAC;QACtB,cAAc,CAAC,IAAI,CAAC,CAAC;QACrB,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACxB,KAAK,EAAE,CAAC;IACV,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,SAAS,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE;QAC7B,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC;QAChD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACvC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC5C,IAAI,cAAc;YAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QACrE,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;IACxB,CAAC,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC;IAEjD,qBAAqB;IACrB,MAAM,iBAAiB,GAAG,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;IAC3D,MAAM,SAAS,GAAG,CAAC,iBAAiB,IAAI,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC;IAEnE,OAAO;QACL,SAAS;QACT,YAAY;QACZ,YAAY;QACZ,KAAK,EAAE,WAAW;QAClB,SAAS;QACT,iBAAiB;QACjB,KAAK;KACN,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { SessionConfig, LaunchParams, LaunchResult, InitializeResult, TokenType } from './types';
|
|
2
|
+
export declare class SessionClient {
|
|
3
|
+
private baseUrl;
|
|
4
|
+
constructor(config?: SessionConfig);
|
|
5
|
+
/**
|
|
6
|
+
* Get a launch URL with one-time token for a game.
|
|
7
|
+
* Used by the parent site (e.g., doubleup-io) to launch games.
|
|
8
|
+
*
|
|
9
|
+
* @param params - Wallet address, signature, chain, and game type
|
|
10
|
+
* @returns Launch URL containing the one-time token
|
|
11
|
+
*/
|
|
12
|
+
getLaunchUrl(params: LaunchParams): Promise<LaunchResult>;
|
|
13
|
+
/**
|
|
14
|
+
* Exchange a one-time token (OTT) for a session JWT.
|
|
15
|
+
*
|
|
16
|
+
* @param oneTimeToken - The one-time token from the launch URL
|
|
17
|
+
* @returns The session JWT token
|
|
18
|
+
* @throws AuthError if the token is invalid or expired
|
|
19
|
+
*/
|
|
20
|
+
getSessionToken(oneTimeToken: string): Promise<string>;
|
|
21
|
+
/**
|
|
22
|
+
* Initialize a game session from a URL token.
|
|
23
|
+
* Handles the full flow: detect token type → exchange OTT → return session info.
|
|
24
|
+
*
|
|
25
|
+
* This is the main entry point for game frontends (baccarat, blackjack, range).
|
|
26
|
+
*
|
|
27
|
+
* @param urlToken - Token from URL (can be OTT, session JWT, or table ID)
|
|
28
|
+
* @returns Session initialization result with token type and session token
|
|
29
|
+
* @throws AuthError if authentication fails
|
|
30
|
+
*/
|
|
31
|
+
initializeSession(urlToken: string): Promise<InitializeResult>;
|
|
32
|
+
/**
|
|
33
|
+
* Get the token type without making any network calls.
|
|
34
|
+
* Useful for quick UI decisions before full initialization.
|
|
35
|
+
*/
|
|
36
|
+
getTokenType(token: string): TokenType;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=SessionClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionClient.d.ts","sourceRoot":"","sources":["../../src/session/SessionClient.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAKjG,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,GAAE,aAAkB;IAItC;;;;;;OAMG;IACG,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAuC/D;;;;;;OAMG;IACG,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAwB5D;;;;;;;;;OASG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA6BpE;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS;CAMvC"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SessionClient = void 0;
|
|
4
|
+
const errors_1 = require("../errors");
|
|
5
|
+
const tokens_1 = require("./tokens");
|
|
6
|
+
const DEFAULT_BASE_URL = 'https://sessiondev.infiniteedgers.com';
|
|
7
|
+
class SessionClient {
|
|
8
|
+
constructor(config = {}) {
|
|
9
|
+
this.baseUrl = config.baseUrl || DEFAULT_BASE_URL;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Get a launch URL with one-time token for a game.
|
|
13
|
+
* Used by the parent site (e.g., doubleup-io) to launch games.
|
|
14
|
+
*
|
|
15
|
+
* @param params - Wallet address, signature, chain, and game type
|
|
16
|
+
* @returns Launch URL containing the one-time token
|
|
17
|
+
*/
|
|
18
|
+
async getLaunchUrl(params) {
|
|
19
|
+
const response = await fetch(`${this.baseUrl}/api/get_launch_url`, {
|
|
20
|
+
method: 'POST',
|
|
21
|
+
headers: {
|
|
22
|
+
'Content-Type': 'application/json',
|
|
23
|
+
},
|
|
24
|
+
body: JSON.stringify({
|
|
25
|
+
address: params.address,
|
|
26
|
+
signature: params.signature,
|
|
27
|
+
chain: params.chain,
|
|
28
|
+
gameType: params.gameType,
|
|
29
|
+
}),
|
|
30
|
+
});
|
|
31
|
+
if (!response.ok) {
|
|
32
|
+
const errorText = await response.text();
|
|
33
|
+
throw new Error(errorText || 'Failed to get launch URL');
|
|
34
|
+
}
|
|
35
|
+
const data = await response.json();
|
|
36
|
+
const launchUrl = (data.launchUrl ?? data.launch_url);
|
|
37
|
+
if (!launchUrl) {
|
|
38
|
+
throw new Error('Missing launch URL in response');
|
|
39
|
+
}
|
|
40
|
+
// Parse the launch URL to extract origin and token
|
|
41
|
+
const parsed = new URL(launchUrl);
|
|
42
|
+
const token = parsed.searchParams.get('token');
|
|
43
|
+
if (!token) {
|
|
44
|
+
throw new Error('Missing token in launch URL');
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
launchUrl,
|
|
48
|
+
origin: parsed.origin,
|
|
49
|
+
token,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Exchange a one-time token (OTT) for a session JWT.
|
|
54
|
+
*
|
|
55
|
+
* @param oneTimeToken - The one-time token from the launch URL
|
|
56
|
+
* @returns The session JWT token
|
|
57
|
+
* @throws AuthError if the token is invalid or expired
|
|
58
|
+
*/
|
|
59
|
+
async getSessionToken(oneTimeToken) {
|
|
60
|
+
const response = await fetch(`${this.baseUrl}/api/get_session_token`, {
|
|
61
|
+
method: 'POST',
|
|
62
|
+
headers: {
|
|
63
|
+
Authorization: `Bearer ${oneTimeToken}`,
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
if (response.status === 401) {
|
|
67
|
+
throw new errors_1.AuthError('Invalid or expired one-time token');
|
|
68
|
+
}
|
|
69
|
+
if (!response.ok) {
|
|
70
|
+
const errorText = await response.text();
|
|
71
|
+
throw new Error(errorText || 'Failed to get session token');
|
|
72
|
+
}
|
|
73
|
+
const data = await response.json();
|
|
74
|
+
if (data.error) {
|
|
75
|
+
throw new Error(data.error);
|
|
76
|
+
}
|
|
77
|
+
return data.token;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Initialize a game session from a URL token.
|
|
81
|
+
* Handles the full flow: detect token type → exchange OTT → return session info.
|
|
82
|
+
*
|
|
83
|
+
* This is the main entry point for game frontends (baccarat, blackjack, range).
|
|
84
|
+
*
|
|
85
|
+
* @param urlToken - Token from URL (can be OTT, session JWT, or table ID)
|
|
86
|
+
* @returns Session initialization result with token type and session token
|
|
87
|
+
* @throws AuthError if authentication fails
|
|
88
|
+
*/
|
|
89
|
+
async initializeSession(urlToken) {
|
|
90
|
+
// Case 1: Token is a table ID (UUID) - spectator or returning player
|
|
91
|
+
if ((0, tokens_1.isTableId)(urlToken)) {
|
|
92
|
+
return {
|
|
93
|
+
tokenType: 'table_id',
|
|
94
|
+
tableId: urlToken,
|
|
95
|
+
sessionToken: null,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
// Case 2: Token is a one-time token - exchange for session JWT
|
|
99
|
+
if ((0, tokens_1.isOneTimeToken)(urlToken)) {
|
|
100
|
+
const sessionToken = await this.getSessionToken(urlToken);
|
|
101
|
+
return {
|
|
102
|
+
tokenType: 'ott',
|
|
103
|
+
tableId: null,
|
|
104
|
+
sessionToken,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
// Case 3: Token looks like a JWT but is not an OTT - likely expired/used
|
|
108
|
+
if ((0, tokens_1.looksLikeJwt)(urlToken)) {
|
|
109
|
+
throw new errors_1.AuthError('This launch link has expired or was already used. Please launch the game again.');
|
|
110
|
+
}
|
|
111
|
+
// Case 4: Unknown token format
|
|
112
|
+
throw new Error('Invalid token format');
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get the token type without making any network calls.
|
|
116
|
+
* Useful for quick UI decisions before full initialization.
|
|
117
|
+
*/
|
|
118
|
+
getTokenType(token) {
|
|
119
|
+
if ((0, tokens_1.isTableId)(token))
|
|
120
|
+
return 'table_id';
|
|
121
|
+
if ((0, tokens_1.isOneTimeToken)(token))
|
|
122
|
+
return 'ott';
|
|
123
|
+
if ((0, tokens_1.looksLikeJwt)(token))
|
|
124
|
+
return 'expired_jwt';
|
|
125
|
+
return 'unknown';
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
exports.SessionClient = SessionClient;
|
|
129
|
+
//# sourceMappingURL=SessionClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionClient.js","sourceRoot":"","sources":["../../src/session/SessionClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACnE,YAAY,EACV,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,gBAAgB,GACjB,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isTableId = exports.isOneTimeToken = exports.looksLikeJwt = exports.SessionClient = void 0;
|
|
4
|
+
var SessionClient_1 = require("./SessionClient");
|
|
5
|
+
Object.defineProperty(exports, "SessionClient", { enumerable: true, get: function () { return SessionClient_1.SessionClient; } });
|
|
6
|
+
var tokens_1 = require("./tokens");
|
|
7
|
+
Object.defineProperty(exports, "looksLikeJwt", { enumerable: true, get: function () { return tokens_1.looksLikeJwt; } });
|
|
8
|
+
Object.defineProperty(exports, "isOneTimeToken", { enumerable: true, get: function () { return tokens_1.isOneTimeToken; } });
|
|
9
|
+
Object.defineProperty(exports, "isTableId", { enumerable: true, get: function () { return tokens_1.isTableId; } });
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":";;;AAAA,iDAAgD;AAAvC,8GAAA,aAAa,OAAA;AACtB,mCAAmE;AAA1D,sGAAA,YAAY,OAAA;AAAE,wGAAA,cAAc,OAAA;AAAE,mGAAA,SAAS,OAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check if a token looks like a JWT (has 3 non-empty parts separated by dots).
|
|
3
|
+
*/
|
|
4
|
+
export declare function looksLikeJwt(token: string | null | undefined): boolean;
|
|
5
|
+
/**
|
|
6
|
+
* Check if a token is a one-time token (OTT) based on JWT audience claim.
|
|
7
|
+
* OTTs have aud: "login" in their payload.
|
|
8
|
+
*/
|
|
9
|
+
export declare function isOneTimeToken(token: string): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Check if a token looks like a UUID (table_id format).
|
|
12
|
+
* UUIDs are 36 characters: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
|
13
|
+
*/
|
|
14
|
+
export declare function isTableId(token: string): boolean;
|
|
15
|
+
//# sourceMappingURL=tokens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/session/tokens.ts"],"names":[],"mappings":"AAyBA;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAItE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAIhD"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.looksLikeJwt = looksLikeJwt;
|
|
4
|
+
exports.isOneTimeToken = isOneTimeToken;
|
|
5
|
+
exports.isTableId = isTableId;
|
|
6
|
+
/**
|
|
7
|
+
* Decode a base64url encoded string (used for JWT payloads).
|
|
8
|
+
*/
|
|
9
|
+
function base64UrlDecode(input) {
|
|
10
|
+
// Convert base64url to standard base64
|
|
11
|
+
const base64 = input.replace(/-/g, '+').replace(/_/g, '/');
|
|
12
|
+
// Add padding if needed
|
|
13
|
+
const padded = base64 + '='.repeat((4 - (base64.length % 4)) % 4);
|
|
14
|
+
return atob(padded);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Extract the audience claim from a JWT token.
|
|
18
|
+
*/
|
|
19
|
+
function getTokenAudience(token) {
|
|
20
|
+
try {
|
|
21
|
+
const parts = token.split('.');
|
|
22
|
+
if (parts.length < 2)
|
|
23
|
+
return null;
|
|
24
|
+
const payload = JSON.parse(base64UrlDecode(parts[1]));
|
|
25
|
+
return payload.aud;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Check if a token looks like a JWT (has 3 non-empty parts separated by dots).
|
|
33
|
+
*/
|
|
34
|
+
function looksLikeJwt(token) {
|
|
35
|
+
if (!token || typeof token !== 'string')
|
|
36
|
+
return false;
|
|
37
|
+
const parts = token.split('.');
|
|
38
|
+
return parts.length === 3 && parts.every((p) => p.length > 0);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Check if a token is a one-time token (OTT) based on JWT audience claim.
|
|
42
|
+
* OTTs have aud: "login" in their payload.
|
|
43
|
+
*/
|
|
44
|
+
function isOneTimeToken(token) {
|
|
45
|
+
return getTokenAudience(token) === 'login';
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Check if a token looks like a UUID (table_id format).
|
|
49
|
+
* UUIDs are 36 characters: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
|
50
|
+
*/
|
|
51
|
+
function isTableId(token) {
|
|
52
|
+
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
53
|
+
return uuidRegex.test(token);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/session/tokens.ts"],"names":[],"mappings":";;AA4BA,oCAIC;AAMD,wCAEC;AAMD,8BAIC;AAlDD;;GAEG;AACH,SAAS,eAAe,CAAC,KAAa;IACpC,uCAAuC;IACvC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC3D,wBAAwB;IACxB,MAAM,MAAM,GAAG,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAClE,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,KAAa;IACrC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,OAAO,OAAO,CAAC,GAAG,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,KAAgC;IAC3D,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAChE,CAAC;AAED;;;GAGG;AACH,SAAgB,cAAc,CAAC,KAAa;IAC1C,OAAO,gBAAgB,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,SAAgB,SAAS,CAAC,KAAa;IACrC,MAAM,SAAS,GACb,iEAAiE,CAAC;IACpE,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface SessionConfig {
|
|
2
|
+
baseUrl?: string;
|
|
3
|
+
}
|
|
4
|
+
export interface LaunchParams {
|
|
5
|
+
address: string;
|
|
6
|
+
signature: string;
|
|
7
|
+
chain: string;
|
|
8
|
+
gameType: string;
|
|
9
|
+
}
|
|
10
|
+
export interface LaunchResult {
|
|
11
|
+
launchUrl: string;
|
|
12
|
+
origin: string;
|
|
13
|
+
token: string;
|
|
14
|
+
}
|
|
15
|
+
export type TokenType = 'ott' | 'table_id' | 'expired_jwt' | 'unknown';
|
|
16
|
+
export interface InitializeResult {
|
|
17
|
+
tokenType: TokenType;
|
|
18
|
+
tableId: string | null;
|
|
19
|
+
sessionToken: string | null;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/session/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,UAAU,GAAG,aAAa,GAAG,SAAS,CAAC;AAEvE,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/session/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fromBackendScale = exports.toBackendScale = exports.SCALE_FACTOR = void 0;
|
|
4
|
+
var scale_1 = require("./scale");
|
|
5
|
+
Object.defineProperty(exports, "SCALE_FACTOR", { enumerable: true, get: function () { return scale_1.SCALE_FACTOR; } });
|
|
6
|
+
Object.defineProperty(exports, "toBackendScale", { enumerable: true, get: function () { return scale_1.toBackendScale; } });
|
|
7
|
+
Object.defineProperty(exports, "fromBackendScale", { enumerable: true, get: function () { return scale_1.fromBackendScale; } });
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;AAAA,iCAAyE;AAAhE,qGAAA,YAAY,OAAA;AAAE,uGAAA,cAAc,OAAA;AAAE,yGAAA,gBAAgB,OAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scale.d.ts","sourceRoot":"","sources":["../../src/utils/scale.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,aAAgB,CAAC;AAE1C,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEvD"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SCALE_FACTOR = void 0;
|
|
4
|
+
exports.toBackendScale = toBackendScale;
|
|
5
|
+
exports.fromBackendScale = fromBackendScale;
|
|
6
|
+
exports.SCALE_FACTOR = 1000000000;
|
|
7
|
+
function toBackendScale(amount) {
|
|
8
|
+
return Math.round(amount * exports.SCALE_FACTOR);
|
|
9
|
+
}
|
|
10
|
+
function fromBackendScale(amount) {
|
|
11
|
+
return amount / exports.SCALE_FACTOR;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=scale.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scale.js","sourceRoot":"","sources":["../../src/utils/scale.ts"],"names":[],"mappings":";;;AAEA,wCAEC;AAED,4CAEC;AARY,QAAA,YAAY,GAAG,UAAa,CAAC;AAE1C,SAAgB,cAAc,CAAC,MAAc;IAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,oBAAY,CAAC,CAAC;AAC3C,CAAC;AAED,SAAgB,gBAAgB,CAAC,MAAc;IAC7C,OAAO,MAAM,GAAG,oBAAY,CAAC;AAC/B,CAAC"}
|