@kalamba/sdk 0.2.1 → 0.4.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.cjs CHANGED
@@ -2,4 +2,4 @@
2
2
  * BSD 3-Clause License
3
3
  * Copyright (c) 2024, Kalamba Games Limited
4
4
  */
5
- "use strict";var E=Object.defineProperty;var w=(s,r,e)=>r in s?E(s,r,{enumerable:!0,configurable:!0,writable:!0,value:e}):s[r]=e;var c=(s,r,e)=>(w(s,typeof r!="symbol"?r+"":r,e),e),p=(s,r,e)=>{if(!r.has(s))throw TypeError("Cannot "+e)};var u=(s,r,e)=>(p(s,r,"read from private field"),e?e.call(s):r.get(s)),l=(s,r,e)=>{if(r.has(s))throw TypeError("Cannot add the same private member more than once");r instanceof WeakSet?r.add(s):r.set(s,e)},d=(s,r,e,o)=>(p(s,r,"write to private field"),o?o.call(s,e):r.set(s,e),e);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const g=()=>{};class h extends Error{constructor(e){super("OpenGameError");c(this,"error");this.name="OpenGameError",this.error=e}}class y extends Error{constructor(e){super("PlayError");c(this,"error");this.name="PlayError",this.error=e}}class m extends Error{constructor(){super("TimeoutError"),this.name="TimeoutError"}}var i;class f{constructor({messagePort:r}){c(this,"config");l(this,i,void 0);d(this,i,r),this.on("configured",e=>{this.config=e})}request(r,...[e]){return new Promise(o=>{this.on(`${r}Response`,t=>o({type:"response",response:t}),{once:!0}),this.on(`${r}Error`,t=>o({type:"error",error:t}),{once:!0}),this.send(r,e)})}on(r,e,o){const t=function n(a){a.data.message===`kalamba:wrapper:${r}`&&(g("on",a.data.message.replace(/^kalamba:/,""),a.data.payload),e(a.data.payload),o!=null&&o.once&&window.removeEventListener("message",n))};window.addEventListener("message",t)}send(r,...[e]){u(this,i).postMessage({message:`kalamba:sdk:${r}`,payload:e},"*")}async openGame(r){var o;const[,e]=await Promise.all([new Promise(t=>this.on("configured",t,{once:!0})),this.request("openGame",r)]);if(e.type==="response")return e.response;throw((o=e.error)==null?void 0:o.type)==="timeout"?new m:new h(e.error)}async play(r,e={},o="SPIN"){var a;const t={contract:r,extra:e,actionType:o},n=await this.request("play",t);if(n.type==="response")return n.response;throw((a=n.error)==null?void 0:a.type)==="timeout"?new m:new y(n.error)}}i=new WeakMap;exports.KalambaSdk=f;exports.OpenGameError=h;exports.PlayError=y;exports.TimeoutError=m;
5
+ "use strict";var P=Object.defineProperty;var A=(r,i,t)=>i in r?P(r,i,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[i]=t;var f=(r,i,t)=>(A(r,typeof i!="symbol"?i+"":i,t),t),E=(r,i,t)=>{if(!i.has(r))throw TypeError("Cannot "+t)};var o=(r,i,t)=>(E(r,i,"read from private field"),t?t.call(r):i.get(r)),F=(r,i,t)=>{if(i.has(r))throw TypeError("Cannot add the same private member more than once");i instanceof WeakSet?i.add(r):i.set(r,t)},y=(r,i,t,m)=>(E(r,i,"write to private field"),m?m.call(r,t):i.set(r,t),t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function B(r,i){return r*i/100}function w(r,i,t){if(!["string","number"].includes(typeof i))return"NaN";const{locales:m}=r;try{return new Intl.NumberFormat(m,{...t,numberingSystem:"latn",style:"decimal"}).format(+i)}catch{return`${i}`}}const h="XTS";var u=(r=>(r.Currency="Currency",r.Number="Number",r))(u||{}),c=(r=>(r.Coins="Coins",r.Money="Money",r))(c||{});const p={ARSB:{displayAs:"ARS",maximumFractionDigits:2,minimumFractionDigits:2},CHIPS:{maximumFractionDigits:0,minimumFractionDigits:0},BNB:{maximumFractionDigits:6,minimumFractionDigits:6},BUSD:{maximumFractionDigits:4,minimumFractionDigits:4},BTC:{maximumFractionDigits:8,minimumFractionDigits:2},mBTC:{maximumFractionDigits:5,minimumFractionDigits:2},uBTC:{maximumFractionDigits:2,minimumFractionDigits:2},BCH:{maximumFractionDigits:8,minimumFractionDigits:2},mBCH:{maximumFractionDigits:2,minimumFractionDigits:2},ETH:{maximumFractionDigits:8,minimumFractionDigits:2},mETH:{maximumFractionDigits:5,minimumFractionDigits:2},uETH:{maximumFractionDigits:2,minimumFractionDigits:2},SOC:{maximumFractionDigits:8,minimumFractionDigits:2},LTC:{maximumFractionDigits:8,minimumFractionDigits:2},mLTC:{maximumFractionDigits:5,minimumFractionDigits:2},uLTC:{maximumFractionDigits:2,minimumFractionDigits:2},DOG:{maximumFractionDigits:4,minimumFractionDigits:2},USDC:{maximumFractionDigits:4,minimumFractionDigits:4},USDT:{maximumFractionDigits:4,minimumFractionDigits:2},TRX:{maximumFractionDigits:2,minimumFractionDigits:2},TUSD:{maximumFractionDigits:2,minimumFractionDigits:2},DAI:{maximumFractionDigits:2,minimumFractionDigits:2},XMR:{maximumFractionDigits:4,minimumFractionDigits:4},CBET:{maximumFractionDigits:0,minimumFractionDigits:0},kCBET:{maximumFractionDigits:2,minimumFractionDigits:2},SHIB:{maximumFractionDigits:0,minimumFractionDigits:0},kSHIB:{maximumFractionDigits:4,minimumFractionDigits:2},NEO:{maximumFractionDigits:4,minimumFractionDigits:4},BSV:{maximumFractionDigits:4,minimumFractionDigits:4},EOS:{maximumFractionDigits:4,minimumFractionDigits:4},DASH:{maximumFractionDigits:4,minimumFractionDigits:4},XLM:{maximumFractionDigits:2,minimumFractionDigits:2},KRW:{maximumFractionDigits:2,minimumFractionDigits:2},kVND:{maximumFractionDigits:4,minimumFractionDigits:2},kIDR:{maximumFractionDigits:4,minimumFractionDigits:2},RSD:{maximumFractionDigits:2,minimumFractionDigits:2},STAKEGC:{displayAs:"GC",maximumFractionDigits:0,minimumFractionDigits:0},STAKESC:{displayAs:"SC",maximumFractionDigits:2,minimumFractionDigits:2},"FC.":{maximumFractionDigits:2,minimumFractionDigits:2},"GC.":{maximumFractionDigits:2,minimumFractionDigits:2},"SC.":{maximumFractionDigits:2,minimumFractionDigits:2},SVC:{maximumFractionDigits:2,minimumFractionDigits:2},DOT:{maximumFractionDigits:4,minimumFractionDigits:4},SOL:{maximumFractionDigits:4,minimumFractionDigits:4},XRP:{maximumFractionDigits:4,minimumFractionDigits:4},ADA:{maximumFractionDigits:4,minimumFractionDigits:4},TON:{maximumFractionDigits:4,minimumFractionDigits:4},FTN:{maximumFractionDigits:4,minimumFractionDigits:4}};function T(r){return r in p}function I(r){return T(r)?{...p[r],currency:h}:{currency:r}}function R(r,i,t){const m=i.format(+r);return T(t)?m.replace(h,p[t].displayAs??t):m}function k(r,i,t){const{maximumFractionDigits:m,minimumFractionDigits:n}=t.resolvedOptions();return w(r,i,{maximumFractionDigits:m,minimumFractionDigits:n})}function G(r,i,{as:t}={as:"Currency"}){const{canShowCurrency:m,currency:n}=r;return t==="Number"||!m?`${i}`:`${i} ${n}`}function H(r,i,{as:t,from:m}={as:"Currency",from:"Money"},n){if(!["string","number"].includes(typeof i))return"NaN";const{canShowCurrency:s=!0,coinValueInCents:a,currency:C,locales:S}=r;m==="Coins"&&(i=B(+i,a));try{const O=I(C),d=new Intl.NumberFormat(S,{...O,...n,currencyDisplay:"symbol",numberingSystem:"latn",style:"currency"});return t==="Number"||!s?k(r,i,d):R(i,d,C)}catch{return G(r,i,{as:t})}}var e;class N{constructor({config:i}){F(this,e,void 0);y(this,e,i)}formatNumber(i,t){const m={locales:[o(this,e).ui.language]};return w(m,i,t)}formatCurrency(i,t={as:u.Currency,from:c.Money},m){const n=o(this,e).ui.feature.showCurrency,s=o(this,e).api.coinValueInCents,a=o(this,e).api.currency||h,C=[o(this,e).ui.language];return H({canShowCurrency:n,coinValueInCents:s,currency:a,locales:C},i,t,m)}formatCoins(i,t){return this.formatCurrency(i,{as:u.Number,from:c.Coins},t)}formatCoinsWithCurrency(i,t){return this.formatCurrency(i,{as:u.Currency,from:c.Coins},t)}formatMoney(i,t){return this.formatCurrency(i,{as:u.Number,from:c.Money},t)}formatMoneyWithCurrency(i,t){return this.formatCurrency(i,{as:u.Currency,from:c.Money},t)}}e=new WeakMap;const U=()=>{};class b extends Error{constructor(t){super("OpenGameError");f(this,"error");this.name="OpenGameError",this.error=t}}class M extends Error{constructor(t){super("PlayError");f(this,"error");this.name="PlayError",this.error=t}}class x extends Error{constructor(){super("TimeoutError"),this.name="TimeoutError"}}var g,D,l;class ${constructor({messagePort:i}){F(this,g,void 0);F(this,D,void 0);F(this,l,void 0);y(this,l,i),this.on("configured",t=>{y(this,g,t),y(this,D,new N({config:t}))})}get config(){if(!o(this,g))throw new Error("config is not initialized, you must open game first");return o(this,g)}get i18n(){if(!o(this,D))throw new Error("i18n is not initialized, you must open game first");return o(this,D)}request(i,...[t]){return new Promise(m=>{this.on(`${i}Response`,n=>m({type:"response",response:n}),{once:!0}),this.on(`${i}Error`,n=>m({type:"error",error:n}),{once:!0}),this.send(i,t)})}on(i,t,m){const n=function s(a){a.data.message===`kalamba:wrapper:${i}`&&(U("on",a.data.message.replace(/^kalamba:/,""),a.data.payload),t(a.data.payload),m!=null&&m.once&&window.removeEventListener("message",s))};window.addEventListener("message",n)}send(i,...[t]){o(this,l).postMessage({message:`kalamba:sdk:${i}`,payload:t},"*")}async openGame(i){var m;const[,t]=await Promise.all([new Promise(n=>this.on("configured",n,{once:!0})),this.request("openGame",i)]);if(t.type==="response")return t.response;throw((m=t.error)==null?void 0:m.type)==="timeout"?new x:new b(t.error)}async play(i,t={},m="SPIN"){var a;const n={contract:i,extra:t,actionType:m},s=await this.request("play",n);if(s.type==="response")return s.response;throw((a=s.error)==null?void 0:a.type)==="timeout"?new x:new M(s.error)}}g=new WeakMap,D=new WeakMap,l=new WeakMap;exports.KalambaSdk=$;exports.OpenGameError=b;exports.PlayError=M;exports.TimeoutError=x;exports.i18n=N;
package/dist/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import { FormatCurrencyOptions } from '@kalamba/common/src/utils/format/currency';
2
+
1
3
  declare interface AddEventListenerOptions_2 {
2
4
  once: boolean;
3
5
  }
@@ -83,8 +85,6 @@ export { Error_2 as Error }
83
85
 
84
86
  export declare type ExtraPlayPayload = {
85
87
  [key: string]: any;
86
- } & {
87
- bet?: never;
88
88
  };
89
89
 
90
90
  export declare type ForwardToPluginsMessage<P extends PluginDomain> = keyof ForwardToPluginsMessageMap<'sdk'>[P] | keyof ForwardToPluginsMessageMap<'rgs'>[P] | keyof ForwardToPluginsMessageMap<'casino'>[P] | keyof ForwardToPluginsMessageMap<'telemetry'>[P];
@@ -106,12 +106,26 @@ declare type History_2 = {
106
106
  };
107
107
  export { History_2 as History }
108
108
 
109
+ export declare class i18n {
110
+ #private;
111
+ constructor({ config }: {
112
+ config: SdkConfig;
113
+ });
114
+ formatNumber(number: string | number, formatOptions?: Intl.NumberFormatOptions): string;
115
+ formatCurrency(number: string | number, options?: FormatCurrencyOptions, formatOptions?: Intl.NumberFormatOptions): string;
116
+ formatCoins(amount: number | string, formatOptions?: Intl.NumberFormatOptions): string;
117
+ formatCoinsWithCurrency(amount: number | string, formatOptions?: Intl.NumberFormatOptions): string;
118
+ formatMoney(amount: number | string, formatOptions?: Intl.NumberFormatOptions): string;
119
+ formatMoneyWithCurrency(amount: number | string, formatOptions?: Intl.NumberFormatOptions): string;
120
+ }
121
+
109
122
  export declare class KalambaSdk {
110
123
  #private;
111
- config: SdkConfig;
112
124
  constructor({ messagePort }: {
113
125
  messagePort: Window;
114
126
  });
127
+ get config(): SdkConfig;
128
+ get i18n(): i18n;
115
129
  protected request<M extends DomainMessage<'sdk'>>(message: M, ...[payload]: DomainMessagePayload<'sdk', M> extends never ? [] : [payload: DomainMessagePayload<'sdk', M>]): Promise<RgsResponse<M>>;
116
130
  on<M extends DomainMessage<'wrapper'> | ForwardToSdkMessage>(message: M, listener: (payload: M extends DomainMessage<'wrapper'> ? DomainMessagePayload<'wrapper', M> : M extends ForwardToSdkMessage ? ForwardToSdkMessagePayload<M> : never) => void, options?: AddEventListenerOptions_2): void;
117
131
  send<M extends DomainMessage<'sdk'>>(message: M, ...[payload]: DomainMessagePayload<'sdk', M> extends never ? [] : [DomainMessagePayload<'sdk', M>]): void;
@@ -147,8 +161,47 @@ export declare type OpenGameRequest = {
147
161
  };
148
162
 
149
163
  export declare type OpenGameResponse = {
150
- balance: number;
151
- data: any;
164
+ contract: {
165
+ bet: {
166
+ available: Record<number, number[]>;
167
+ default: {
168
+ base: number;
169
+ multiplier: number;
170
+ };
171
+ max: number;
172
+ last: Bet | null;
173
+ lastPaid: Bet | null;
174
+ };
175
+ balance: {
176
+ coins: number;
177
+ version: number;
178
+ };
179
+ gameModel: string;
180
+ metaData: {
181
+ rtpValues: {
182
+ key: string;
183
+ rtpValue: string;
184
+ }[];
185
+ maxWin: {
186
+ key: string;
187
+ maxWinValueXBet: number;
188
+ maxWinOdds: number;
189
+ }[];
190
+ version: string;
191
+ };
192
+ serverTime: number;
193
+ sessionId: string;
194
+ stateType: {
195
+ thisRound: string;
196
+ nextRound: string;
197
+ };
198
+ uiMessages: unknown[];
199
+ win: {
200
+ round: number;
201
+ total: number;
202
+ };
203
+ };
204
+ data: unknown;
152
205
  };
153
206
 
154
207
  export declare class PlayError extends Error {
@@ -168,8 +221,28 @@ export declare type PlayRequest = {
168
221
  };
169
222
 
170
223
  export declare type PlayResponse = {
171
- balance: number;
172
- data: any;
224
+ contract: {
225
+ bet: {
226
+ last: Bet | null;
227
+ lastPaid: Bet;
228
+ };
229
+ balance: {
230
+ coins: number;
231
+ version: number;
232
+ };
233
+ serverTime: number;
234
+ roundId: string;
235
+ stateType: {
236
+ thisRound: string;
237
+ nextRound: string;
238
+ };
239
+ uiMessages: unknown[];
240
+ win: {
241
+ round: number;
242
+ total: number;
243
+ };
244
+ };
245
+ data: unknown;
173
246
  };
174
247
 
175
248
  export declare type PluginDomain = keyof ForwardToPluginsMessageMap<any>;
@@ -240,6 +313,8 @@ export declare interface SdkConfig {
240
313
  jurisdiction: string;
241
314
  playMode: 'FUN' | 'REAL';
242
315
  user: string;
316
+ sessionId: string;
317
+ lastRoundId?: string;
243
318
  };
244
319
  ui: {
245
320
  autoplay: {
package/dist/index.js CHANGED
@@ -2,97 +2,303 @@
2
2
  * BSD 3-Clause License
3
3
  * Copyright (c) 2024, Kalamba Games Limited
4
4
  */
5
- var h = Object.defineProperty;
6
- var w = (s, e, r) => e in s ? h(s, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : s[e] = r;
7
- var c = (s, e, r) => (w(s, typeof e != "symbol" ? e + "" : e, r), r), p = (s, e, r) => {
8
- if (!e.has(s))
9
- throw TypeError("Cannot " + r);
5
+ var b = Object.defineProperty;
6
+ var M = (r, i, t) => i in r ? b(r, i, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[i] = t;
7
+ var l = (r, i, t) => (M(r, typeof i != "symbol" ? i + "" : i, t), t), d = (r, i, t) => {
8
+ if (!i.has(r))
9
+ throw TypeError("Cannot " + t);
10
10
  };
11
- var m = (s, e, r) => (p(s, e, "read from private field"), r ? r.call(s) : e.get(s)), u = (s, e, r) => {
12
- if (e.has(s))
11
+ var o = (r, i, t) => (d(r, i, "read from private field"), t ? t.call(r) : i.get(r)), F = (r, i, t) => {
12
+ if (i.has(r))
13
13
  throw TypeError("Cannot add the same private member more than once");
14
- e instanceof WeakSet ? e.add(s) : e.set(s, r);
15
- }, l = (s, e, r, o) => (p(s, e, "write to private field"), o ? o.call(s, r) : e.set(s, r), r);
16
- const y = () => {
14
+ i instanceof WeakSet ? i.add(r) : i.set(r, t);
15
+ }, y = (r, i, t, m) => (d(r, i, "write to private field"), m ? m.call(r, t) : i.set(r, t), t);
16
+ function A(r, i) {
17
+ return r * i / 100;
18
+ }
19
+ function w(r, i, t) {
20
+ if (!["string", "number"].includes(typeof i))
21
+ return "NaN";
22
+ const { locales: m } = r;
23
+ try {
24
+ return new Intl.NumberFormat(m, {
25
+ ...t,
26
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
27
+ // @ts-ignore
28
+ numberingSystem: "latn",
29
+ style: "decimal"
30
+ }).format(+i);
31
+ } catch {
32
+ return `${i}`;
33
+ }
34
+ }
35
+ const x = "XTS";
36
+ var u = /* @__PURE__ */ ((r) => (r.Currency = "Currency", r.Number = "Number", r))(u || {}), c = /* @__PURE__ */ ((r) => (r.Coins = "Coins", r.Money = "Money", r))(c || {});
37
+ const h = {
38
+ /* eslint-disable sort-keys-fix/sort-keys-fix */
39
+ // ARSB is the internal currency relevant for invoicing purposes, players should see it as ARS
40
+ ARSB: { displayAs: "ARS", maximumFractionDigits: 2, minimumFractionDigits: 2 },
41
+ // Social Casino chips
42
+ CHIPS: { maximumFractionDigits: 0, minimumFractionDigits: 0 },
43
+ // Binance Coin
44
+ BNB: { maximumFractionDigits: 6, minimumFractionDigits: 6 },
45
+ // Binance USD
46
+ BUSD: { maximumFractionDigits: 4, minimumFractionDigits: 4 },
47
+ // Bitcoin
48
+ BTC: { maximumFractionDigits: 8, minimumFractionDigits: 2 },
49
+ mBTC: { maximumFractionDigits: 5, minimumFractionDigits: 2 },
50
+ uBTC: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
51
+ // Bitcoin Cash
52
+ BCH: { maximumFractionDigits: 8, minimumFractionDigits: 2 },
53
+ mBCH: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
54
+ // Ethereum
55
+ ETH: { maximumFractionDigits: 8, minimumFractionDigits: 2 },
56
+ mETH: { maximumFractionDigits: 5, minimumFractionDigits: 2 },
57
+ uETH: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
58
+ // SocialCoin
59
+ SOC: { maximumFractionDigits: 8, minimumFractionDigits: 2 },
60
+ // Litecoins
61
+ LTC: { maximumFractionDigits: 8, minimumFractionDigits: 2 },
62
+ mLTC: { maximumFractionDigits: 5, minimumFractionDigits: 2 },
63
+ uLTC: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
64
+ // Dogecoin
65
+ DOG: { maximumFractionDigits: 4, minimumFractionDigits: 2 },
66
+ // USD Coin
67
+ USDC: { maximumFractionDigits: 4, minimumFractionDigits: 4 },
68
+ // Tether
69
+ USDT: { maximumFractionDigits: 4, minimumFractionDigits: 2 },
70
+ // Tron
71
+ TRX: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
72
+ // TrueUSD
73
+ TUSD: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
74
+ // Dai
75
+ DAI: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
76
+ // Monero
77
+ XMR: { maximumFractionDigits: 4, minimumFractionDigits: 4 },
78
+ // CBET
79
+ CBET: { maximumFractionDigits: 0, minimumFractionDigits: 0 },
80
+ kCBET: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
81
+ // Shiba Inu
82
+ SHIB: { maximumFractionDigits: 0, minimumFractionDigits: 0 },
83
+ kSHIB: { maximumFractionDigits: 4, minimumFractionDigits: 2 },
84
+ // Neo
85
+ NEO: { maximumFractionDigits: 4, minimumFractionDigits: 4 },
86
+ // Bitcoin SV
87
+ BSV: { maximumFractionDigits: 4, minimumFractionDigits: 4 },
88
+ // EOS
89
+ EOS: { maximumFractionDigits: 4, minimumFractionDigits: 4 },
90
+ // Dash
91
+ DASH: { maximumFractionDigits: 4, minimumFractionDigits: 4 },
92
+ // Stellar
93
+ XLM: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
94
+ // South Korean Won
95
+ // While the jeon (1/100th of Won) is no longer used for everyday transactions,
96
+ // we received complaint from operator that we should show 2 fraction digits though, so we override it here.
97
+ KRW: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
98
+ // Vietnamese dong
99
+ kVND: { maximumFractionDigits: 4, minimumFractionDigits: 2 },
100
+ // Indonesian rupiah
101
+ kIDR: { maximumFractionDigits: 4, minimumFractionDigits: 2 },
102
+ // Serbian dinar
103
+ // There is a difference how browsers handle currency data:
104
+ // - Google Chrome uses CLDR, which defines 0 minor digits for RSD currency.
105
+ // - Firefox, Edge, Safari use ISO 4217, which defines 2 minor digits for RSD currency.
106
+ // We received complaint from operator that we should show 2 fraction digits though, so we override it here.
107
+ RSD: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
108
+ // Social currency on Stake
109
+ STAKEGC: { displayAs: "GC", maximumFractionDigits: 0, minimumFractionDigits: 0 },
110
+ STAKESC: { displayAs: "SC", maximumFractionDigits: 2, minimumFractionDigits: 2 },
111
+ // Social currency on Relax
112
+ "FC.": { maximumFractionDigits: 2, minimumFractionDigits: 2 },
113
+ "GC.": { maximumFractionDigits: 2, minimumFractionDigits: 2 },
114
+ "SC.": { maximumFractionDigits: 2, minimumFractionDigits: 2 },
115
+ // Silvercash
116
+ SVC: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
117
+ // Polkadot
118
+ DOT: { maximumFractionDigits: 4, minimumFractionDigits: 4 },
119
+ // Solana
120
+ SOL: { maximumFractionDigits: 4, minimumFractionDigits: 4 },
121
+ // XRP
122
+ XRP: { maximumFractionDigits: 4, minimumFractionDigits: 4 },
123
+ // Cardano
124
+ ADA: { maximumFractionDigits: 4, minimumFractionDigits: 4 },
125
+ // Toncoin
126
+ TON: { maximumFractionDigits: 4, minimumFractionDigits: 4 },
127
+ // Fasttoken
128
+ FTN: { maximumFractionDigits: 4, minimumFractionDigits: 4 }
129
+ /* eslint-enable sort-keys-fix/sort-keys-fix */
17
130
  };
18
- class E extends Error {
19
- constructor(r) {
131
+ function T(r) {
132
+ return r in h;
133
+ }
134
+ function O(r) {
135
+ return T(r) ? {
136
+ ...h[r],
137
+ currency: x
138
+ } : {
139
+ currency: r
140
+ };
141
+ }
142
+ function B(r, i, t) {
143
+ const m = i.format(+r);
144
+ return T(t) ? m.replace(x, h[t].displayAs ?? t) : m;
145
+ }
146
+ function P(r, i, t) {
147
+ const { maximumFractionDigits: m, minimumFractionDigits: n } = t.resolvedOptions();
148
+ return w(r, i, { maximumFractionDigits: m, minimumFractionDigits: n });
149
+ }
150
+ function I(r, i, { as: t } = {
151
+ as: "Currency"
152
+ /* Currency */
153
+ }) {
154
+ const { canShowCurrency: m, currency: n } = r;
155
+ return t === "Number" || !m ? `${i}` : `${i} ${n}`;
156
+ }
157
+ function R(r, i, { as: t, from: m } = {
158
+ as: "Currency",
159
+ from: "Money"
160
+ /* Money */
161
+ }, n) {
162
+ if (!["string", "number"].includes(typeof i))
163
+ return "NaN";
164
+ const { canShowCurrency: s = !0, coinValueInCents: a, currency: f, locales: p } = r;
165
+ m === "Coins" && (i = A(+i, a));
166
+ try {
167
+ const N = O(f), S = new Intl.NumberFormat(p, {
168
+ ...N,
169
+ ...n,
170
+ currencyDisplay: "symbol",
171
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
172
+ // @ts-ignore
173
+ numberingSystem: "latn",
174
+ style: "currency"
175
+ });
176
+ return t === "Number" || !s ? P(r, i, S) : B(i, S, f);
177
+ } catch {
178
+ return I(r, i, { as: t });
179
+ }
180
+ }
181
+ var e;
182
+ class k {
183
+ constructor({ config: i }) {
184
+ F(this, e, void 0);
185
+ y(this, e, i);
186
+ }
187
+ formatNumber(i, t) {
188
+ const m = { locales: [o(this, e).ui.language] };
189
+ return w(m, i, t);
190
+ }
191
+ formatCurrency(i, t = { as: u.Currency, from: c.Money }, m) {
192
+ const n = o(this, e).ui.feature.showCurrency, s = o(this, e).api.coinValueInCents, a = o(this, e).api.currency || x, f = [o(this, e).ui.language];
193
+ return R({
194
+ canShowCurrency: n,
195
+ coinValueInCents: s,
196
+ currency: a,
197
+ locales: f
198
+ }, i, t, m);
199
+ }
200
+ formatCoins(i, t) {
201
+ return this.formatCurrency(i, { as: u.Number, from: c.Coins }, t);
202
+ }
203
+ formatCoinsWithCurrency(i, t) {
204
+ return this.formatCurrency(i, { as: u.Currency, from: c.Coins }, t);
205
+ }
206
+ formatMoney(i, t) {
207
+ return this.formatCurrency(i, { as: u.Number, from: c.Money }, t);
208
+ }
209
+ formatMoneyWithCurrency(i, t) {
210
+ return this.formatCurrency(i, { as: u.Currency, from: c.Money }, t);
211
+ }
212
+ }
213
+ e = new WeakMap();
214
+ const G = () => {
215
+ };
216
+ class H extends Error {
217
+ constructor(t) {
20
218
  super("OpenGameError");
21
- c(this, "error");
22
- this.name = "OpenGameError", this.error = r;
219
+ l(this, "error");
220
+ this.name = "OpenGameError", this.error = t;
23
221
  }
24
222
  }
25
- class g extends Error {
26
- constructor(r) {
223
+ class U extends Error {
224
+ constructor(t) {
27
225
  super("PlayError");
28
- c(this, "error");
29
- this.name = "PlayError", this.error = r;
226
+ l(this, "error");
227
+ this.name = "PlayError", this.error = t;
30
228
  }
31
229
  }
32
- class d extends Error {
230
+ class E extends Error {
33
231
  constructor() {
34
232
  super("TimeoutError"), this.name = "TimeoutError";
35
233
  }
36
234
  }
37
- var i;
38
- class P {
39
- constructor({ messagePort: e }) {
40
- // after open game we can be sure that config is set
41
- // it's much easier to use it with type `SdkConfig` instead of `SdkConfig | undefined`
42
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
43
- // @ts-ignore
44
- c(this, "config");
45
- u(this, i, void 0);
46
- l(this, i, e), this.on("configured", (r) => {
47
- this.config = r;
235
+ var g, D, C;
236
+ class L {
237
+ constructor({ messagePort: i }) {
238
+ F(this, g, void 0);
239
+ F(this, D, void 0);
240
+ F(this, C, void 0);
241
+ y(this, C, i), this.on("configured", (t) => {
242
+ y(this, g, t), y(this, D, new k({ config: t }));
48
243
  });
49
244
  }
50
- request(e, ...[r]) {
51
- return new Promise((o) => {
52
- this.on(`${e}Response`, (t) => o({ type: "response", response: t }), {
245
+ get config() {
246
+ if (!o(this, g))
247
+ throw new Error("config is not initialized, you must open game first");
248
+ return o(this, g);
249
+ }
250
+ get i18n() {
251
+ if (!o(this, D))
252
+ throw new Error("i18n is not initialized, you must open game first");
253
+ return o(this, D);
254
+ }
255
+ request(i, ...[t]) {
256
+ return new Promise((m) => {
257
+ this.on(`${i}Response`, (n) => m({ type: "response", response: n }), {
53
258
  once: !0
54
- }), this.on(`${e}Error`, (t) => o({ type: "error", error: t }), { once: !0 }), this.send(e, r);
259
+ }), this.on(`${i}Error`, (n) => m({ type: "error", error: n }), { once: !0 }), this.send(i, t);
55
260
  });
56
261
  }
57
- on(e, r, o) {
58
- const t = function n(a) {
59
- a.data.message === `kalamba:wrapper:${e}` && (y("on", a.data.message.replace(/^kalamba:/, ""), a.data.payload), r(a.data.payload), o != null && o.once && window.removeEventListener("message", n));
262
+ on(i, t, m) {
263
+ const n = function s(a) {
264
+ a.data.message === `kalamba:wrapper:${i}` && (G("on", a.data.message.replace(/^kalamba:/, ""), a.data.payload), t(a.data.payload), m != null && m.once && window.removeEventListener("message", s));
60
265
  };
61
- window.addEventListener("message", t);
266
+ window.addEventListener("message", n);
62
267
  }
63
268
  // TODO error messages
64
- send(e, ...[r]) {
65
- m(this, i).postMessage(
269
+ send(i, ...[t]) {
270
+ o(this, C).postMessage(
66
271
  {
67
- message: `kalamba:sdk:${e}`,
68
- payload: r
272
+ message: `kalamba:sdk:${i}`,
273
+ payload: t
69
274
  },
70
275
  "*"
71
276
  );
72
277
  }
73
- async openGame(e) {
74
- var o;
75
- const [, r] = await Promise.all([
278
+ async openGame(i) {
279
+ var m;
280
+ const [, t] = await Promise.all([
76
281
  // TODO: return promise from call to this.on if listener is not provided
77
- new Promise((t) => this.on("configured", t, { once: !0 })),
78
- this.request("openGame", e)
282
+ new Promise((n) => this.on("configured", n, { once: !0 })),
283
+ this.request("openGame", i)
79
284
  ]);
80
- if (r.type === "response")
81
- return r.response;
82
- throw ((o = r.error) == null ? void 0 : o.type) === "timeout" ? new d() : new E(r.error);
285
+ if (t.type === "response")
286
+ return t.response;
287
+ throw ((m = t.error) == null ? void 0 : m.type) === "timeout" ? new E() : new H(t.error);
83
288
  }
84
- async play(e, r = {}, o = "SPIN") {
289
+ async play(i, t = {}, m = "SPIN") {
85
290
  var a;
86
- const t = { contract: e, extra: r, actionType: o }, n = await this.request("play", t);
87
- if (n.type === "response")
88
- return n.response;
89
- throw ((a = n.error) == null ? void 0 : a.type) === "timeout" ? new d() : new g(n.error);
291
+ const n = { contract: i, extra: t, actionType: m }, s = await this.request("play", n);
292
+ if (s.type === "response")
293
+ return s.response;
294
+ throw ((a = s.error) == null ? void 0 : a.type) === "timeout" ? new E() : new U(s.error);
90
295
  }
91
296
  }
92
- i = new WeakMap();
297
+ g = new WeakMap(), D = new WeakMap(), C = new WeakMap();
93
298
  export {
94
- P as KalambaSdk,
95
- E as OpenGameError,
96
- g as PlayError,
97
- d as TimeoutError
299
+ L as KalambaSdk,
300
+ H as OpenGameError,
301
+ U as PlayError,
302
+ E as TimeoutError,
303
+ k as i18n
98
304
  };