@kalamba/sdk 0.3.0 → 0.4.1

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
  }
@@ -81,10 +83,6 @@ declare type Error_2 = {
81
83
  };
82
84
  export { Error_2 as Error }
83
85
 
84
- export declare type ExtraPlayPayload = {
85
- [key: string]: any;
86
- };
87
-
88
86
  export declare type ForwardToPluginsMessage<P extends PluginDomain> = keyof ForwardToPluginsMessageMap<'sdk'>[P] | keyof ForwardToPluginsMessageMap<'rgs'>[P] | keyof ForwardToPluginsMessageMap<'casino'>[P] | keyof ForwardToPluginsMessageMap<'telemetry'>[P];
89
87
 
90
88
  export declare interface ForwardToPluginsMessageMap<SourceDomain extends DomainPrefix> {
@@ -104,17 +102,31 @@ declare type History_2 = {
104
102
  };
105
103
  export { History_2 as History }
106
104
 
105
+ export declare class i18n {
106
+ #private;
107
+ constructor({ config }: {
108
+ config: SdkConfig;
109
+ });
110
+ formatNumber(number: string | number, formatOptions?: Intl.NumberFormatOptions): string;
111
+ formatCurrency(number: string | number, options?: FormatCurrencyOptions, formatOptions?: Intl.NumberFormatOptions): string;
112
+ formatCoins(amount: number | string, formatOptions?: Intl.NumberFormatOptions): string;
113
+ formatCoinsWithCurrency(amount: number | string, formatOptions?: Intl.NumberFormatOptions): string;
114
+ formatMoney(amount: number | string, formatOptions?: Intl.NumberFormatOptions): string;
115
+ formatMoneyWithCurrency(amount: number | string, formatOptions?: Intl.NumberFormatOptions): string;
116
+ }
117
+
107
118
  export declare class KalambaSdk {
108
119
  #private;
109
- config: SdkConfig;
110
120
  constructor({ messagePort }: {
111
121
  messagePort: Window;
112
122
  });
123
+ get config(): SdkConfig;
124
+ get i18n(): i18n;
113
125
  protected request<M extends DomainMessage<'sdk'>>(message: M, ...[payload]: DomainMessagePayload<'sdk', M> extends never ? [] : [payload: DomainMessagePayload<'sdk', M>]): Promise<RgsResponse<M>>;
114
126
  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;
115
127
  send<M extends DomainMessage<'sdk'>>(message: M, ...[payload]: DomainMessagePayload<'sdk', M> extends never ? [] : [DomainMessagePayload<'sdk', M>]): void;
116
128
  openGame(payload: DomainMessagePayload<'sdk', 'openGame'>): Promise<OpenGameResponse>;
117
- play(contract: ContractPlayPayload, extra?: ExtraPlayPayload, actionType?: string): Promise<PlayResponse>;
129
+ play(contract: ContractPlayPayload, extra?: unknown, actionType?: string): Promise<PlayResponse>;
118
130
  }
119
131
 
120
132
  export declare type Message = keyof MessageMap;
@@ -200,7 +212,7 @@ declare type PlayError_2 = {
200
212
 
201
213
  export declare type PlayRequest = {
202
214
  contract: ContractPlayPayload;
203
- extra: ExtraPlayPayload;
215
+ extra?: unknown;
204
216
  actionType: string;
205
217
  };
206
218
 
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
  };
package/dist/plugins.d.ts CHANGED
@@ -91,10 +91,6 @@ declare type Error_2 = {
91
91
  type: 'CLOSE' | 'RELOAD' | 'CONTINUE';
92
92
  };
93
93
 
94
- declare type ExtraPlayPayload = {
95
- [key: string]: any;
96
- };
97
-
98
94
  declare type ForwardToPluginsMessage<P extends PluginDomain> = keyof ForwardToPluginsMessageMap<'sdk'>[P] | keyof ForwardToPluginsMessageMap<'rgs'>[P] | keyof ForwardToPluginsMessageMap<'casino'>[P] | keyof ForwardToPluginsMessageMap<'telemetry'>[P];
99
95
 
100
96
  declare interface ForwardToPluginsMessageMap<SourceDomain extends DomainPrefix> {
@@ -391,7 +387,7 @@ declare type PlayError = {
391
387
 
392
388
  declare type PlayRequest = {
393
389
  contract: ContractPlayPayload;
394
- extra: ExtraPlayPayload;
390
+ extra?: unknown;
395
391
  actionType: string;
396
392
  };
397
393
 
package/dist/wrapper.d.ts CHANGED
@@ -86,10 +86,6 @@ declare type Error_2 = {
86
86
  type: 'CLOSE' | 'RELOAD' | 'CONTINUE';
87
87
  };
88
88
 
89
- declare type ExtraPlayPayload = {
90
- [key: string]: any;
91
- };
92
-
93
89
  declare type ForwardToPluginsMessage<P extends PluginDomain> = keyof ForwardToPluginsMessageMap<'sdk'>[P] | keyof ForwardToPluginsMessageMap<'rgs'>[P] | keyof ForwardToPluginsMessageMap<'casino'>[P] | keyof ForwardToPluginsMessageMap<'telemetry'>[P];
94
90
 
95
91
  declare interface ForwardToPluginsMessageMap<SourceDomain extends DomainPrefix> {
@@ -196,7 +192,7 @@ declare type PlayError = {
196
192
 
197
193
  declare type PlayRequest = {
198
194
  contract: ContractPlayPayload;
199
- extra: ExtraPlayPayload;
195
+ extra?: unknown;
200
196
  actionType: string;
201
197
  };
202
198
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kalamba/sdk",
3
- "version": "0.3.0",
3
+ "version": "0.4.1",
4
4
  "license": "BSD-3-Clause",
5
5
  "type": "module",
6
6
  "files": [