@kalamba/sdk 0.30.0 → 0.37.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.js CHANGED
@@ -1,353 +1,107 @@
1
1
  /**
2
2
  * BSD 3-Clause License
3
- * Copyright (c) 2025, Kalamba Games Limited
3
+ * Copyright (c) 2026, Kalamba Games Limited
4
4
  */
5
- var S = (t) => {
6
- throw TypeError(t);
5
+ import { i as TimeoutError, r as RgsErrorCode, t as RgsError } from "./errors-CakYyMwc.js";
6
+ import { t as I18n } from "./i18n-vzEFUHe0.js";
7
+
8
+ //#region src/sdk/KalambaSdk.ts
9
+ const logIn = () => {};
10
+ const logOut = () => {};
11
+ const passThroughCodec = {
12
+ encode: (value) => value,
13
+ decode: (value) => value
7
14
  };
8
- var h = (t, i, m) => i.has(t) || S("Cannot " + m);
9
- var a = (t, i, m) => (h(t, i, "read from private field"), m ? m.call(t) : i.get(t)), F = (t, i, m) => i.has(t) ? S("Cannot add the same private member more than once") : i instanceof WeakSet ? i.add(t) : i.set(t, m), C = (t, i, m, n) => (h(t, i, "write to private field"), n ? n.call(t, m) : i.set(t, m), m);
10
- import { T as A, R as T } from "./errors-NnLrKjTz.js";
11
- import { a as X } from "./errors-NnLrKjTz.js";
12
- import { d as $, e as V } from "./encoders-BDr7fjKQ.js";
13
- function N(t, i) {
14
- return t * i / 100;
15
- }
16
- function w(t, i, m) {
17
- if (!["string", "number"].includes(typeof i))
18
- return "NaN";
19
- const { locales: n } = t;
20
- try {
21
- return new Intl.NumberFormat(n, {
22
- ...m,
23
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
24
- // @ts-ignore
25
- numberingSystem: "latn",
26
- style: "decimal"
27
- }).format(+i);
28
- } catch {
29
- return `${i}`;
30
- }
31
- }
32
- const l = "XTS";
33
- var u = /* @__PURE__ */ ((t) => (t.Currency = "Currency", t.Number = "Number", t))(u || {}), c = /* @__PURE__ */ ((t) => (t.Coins = "Coins", t.Money = "Money", t))(c || {});
34
- const f = {
35
- /* eslint-disable sort-keys-fix/sort-keys-fix */
36
- // ARSB is the internal currency relevant for invoicing purposes, players should see it as ARS
37
- ARSB: { displayAs: "ARS", maximumFractionDigits: 2, minimumFractionDigits: 2 },
38
- // Social Casino chips
39
- CHIPS: { maximumFractionDigits: 0, minimumFractionDigits: 0 },
40
- // Binance Coin
41
- BNB: { maximumFractionDigits: 6, minimumFractionDigits: 6 },
42
- // Binance USD
43
- BUSD: { maximumFractionDigits: 4, minimumFractionDigits: 4 },
44
- // Bitcoin
45
- BTC: { maximumFractionDigits: 8, minimumFractionDigits: 2 },
46
- mBTC: { maximumFractionDigits: 5, minimumFractionDigits: 2 },
47
- uBTC: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
48
- // Bitcoin Cash
49
- BCH: { maximumFractionDigits: 8, minimumFractionDigits: 2 },
50
- mBCH: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
51
- // Ethereum
52
- ETH: { maximumFractionDigits: 8, minimumFractionDigits: 2 },
53
- mETH: { maximumFractionDigits: 5, minimumFractionDigits: 2 },
54
- uETH: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
55
- // SocialCoin
56
- SOC: { maximumFractionDigits: 8, minimumFractionDigits: 2 },
57
- // Litecoins
58
- LTC: { maximumFractionDigits: 8, minimumFractionDigits: 2 },
59
- mLTC: { maximumFractionDigits: 5, minimumFractionDigits: 2 },
60
- uLTC: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
61
- // Dogecoin
62
- DOG: { maximumFractionDigits: 4, minimumFractionDigits: 2 },
63
- // USD Coin
64
- USDC: { maximumFractionDigits: 4, minimumFractionDigits: 4 },
65
- // Tether
66
- USDT: { maximumFractionDigits: 4, minimumFractionDigits: 2 },
67
- // Tron
68
- TRX: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
69
- // TrueUSD
70
- TUSD: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
71
- // Dai
72
- DAI: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
73
- // Monero
74
- XMR: { maximumFractionDigits: 4, minimumFractionDigits: 4 },
75
- // CBET
76
- CBET: { maximumFractionDigits: 0, minimumFractionDigits: 0 },
77
- kCBET: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
78
- // Shiba Inu
79
- SHIB: { maximumFractionDigits: 0, minimumFractionDigits: 0 },
80
- kSHIB: { maximumFractionDigits: 4, minimumFractionDigits: 2 },
81
- // Neo
82
- NEO: { maximumFractionDigits: 4, minimumFractionDigits: 4 },
83
- // Bitcoin SV
84
- BSV: { maximumFractionDigits: 4, minimumFractionDigits: 4 },
85
- // EOS
86
- EOS: { maximumFractionDigits: 4, minimumFractionDigits: 4 },
87
- // Dash
88
- DASH: { maximumFractionDigits: 4, minimumFractionDigits: 4 },
89
- // Stellar
90
- XLM: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
91
- // South Korean Won
92
- // While the jeon (1/100th of Won) is no longer used for everyday transactions,
93
- // we received complaint from operator that we should show 2 fraction digits though, so we override it here.
94
- KRW: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
95
- // Vietnamese dong
96
- kVND: { maximumFractionDigits: 4, minimumFractionDigits: 2 },
97
- // Indonesian rupiah
98
- kIDR: { maximumFractionDigits: 4, minimumFractionDigits: 2 },
99
- // Serbian dinar
100
- // There is a difference how browsers handle currency data:
101
- // - Google Chrome uses CLDR, which defines 0 minor digits for RSD currency.
102
- // - Firefox, Edge, Safari use ISO 4217, which defines 2 minor digits for RSD currency.
103
- // We received complaint from operator that we should show 2 fraction digits though, so we override it here.
104
- RSD: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
105
- // Social currency on Stake
106
- STAKEGC: { displayAs: "GC", maximumFractionDigits: 0, minimumFractionDigits: 0 },
107
- STAKESC: { displayAs: "SC", maximumFractionDigits: 2, minimumFractionDigits: 2 },
108
- // Social currency on Relax
109
- "BK.": { maximumFractionDigits: 2, minimumFractionDigits: 2 },
110
- "BT.": { maximumFractionDigits: 2, minimumFractionDigits: 2 },
111
- "FC.": { maximumFractionDigits: 2, minimumFractionDigits: 2 },
112
- "GC.": { maximumFractionDigits: 2, minimumFractionDigits: 2 },
113
- "SC.": { maximumFractionDigits: 2, minimumFractionDigits: 2 },
114
- GC: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
115
- SC: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
116
- GLD: { displayAs: "GC.", maximumFractionDigits: 2, minimumFractionDigits: 2 },
117
- SS1: { displayAs: "SC.", maximumFractionDigits: 2, minimumFractionDigits: 2 },
118
- // Softswiss
119
- SWEP: { displayAs: "SC.", maximumFractionDigits: 2, minimumFractionDigits: 2 },
120
- GCLC: { displayAs: "GC.", maximumFractionDigits: 2, minimumFractionDigits: 2 },
121
- SWPC: { displayAs: "SC", maximumFractionDigits: 2, minimumFractionDigits: 2 },
122
- LUKC: { displayAs: "LC", maximumFractionDigits: 2, minimumFractionDigits: 2 },
123
- TTSC: { displayAs: "SC", maximumFractionDigits: 2, minimumFractionDigits: 2 },
124
- TTGC: { displayAs: "GC", maximumFractionDigits: 2, minimumFractionDigits: 2 },
125
- // Silvercash
126
- SVC: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
127
- // Polkadot
128
- DOT: { maximumFractionDigits: 4, minimumFractionDigits: 4 },
129
- // Solana
130
- SOL: { maximumFractionDigits: 4, minimumFractionDigits: 4 },
131
- // XRP
132
- XRP: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
133
- // Cardano
134
- ADA: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
135
- // Toncoin
136
- TON: { maximumFractionDigits: 4, minimumFractionDigits: 4 },
137
- // Fasttoken
138
- FTN: { maximumFractionDigits: 4, minimumFractionDigits: 4 },
139
- // Omani Rial
140
- OMR: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
141
- // Jordanian Dinar
142
- JOD: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
143
- // Bahraini Dinar
144
- BHD: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
145
- // Kuwaiti Dinar
146
- KWD: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
147
- // MicroGame
148
- BNS: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
149
- // Quanta
150
- GRSC: { displayAs: "SC", maximumFractionDigits: 2, minimumFractionDigits: 2 },
151
- GRGC: { displayAs: "GC", maximumFractionDigits: 2, minimumFractionDigits: 2 },
152
- // Softswiss
153
- EEGP: { displayAs: "EP", maximumFractionDigits: 2, minimumFractionDigits: 2 },
154
- EPGP: { displayAs: "PP", maximumFractionDigits: 2, minimumFractionDigits: 2 },
155
- LUCK: { displayAs: "LUCK", maximumFractionDigits: 2, minimumFractionDigits: 2 },
156
- CXCO: { displayAs: "CC", maximumFractionDigits: 2, minimumFractionDigits: 2 },
157
- GZCO: { displayAs: "GC", maximumFractionDigits: 2, minimumFractionDigits: 2 },
158
- // gametech
159
- FC: { displayAs: "", maximumFractionDigits: 2, minimumFractionDigits: 2 },
160
- RC: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
161
- MWSC: { displayAs: "MC", maximumFractionDigits: 2, minimumFractionDigits: 2 },
162
- MWGC: { displayAs: "GC", maximumFractionDigits: 2, minimumFractionDigits: 2 },
163
- // https://kalamba.atlassian.net/browse/FRAM-1829
164
- // Myanmar Kyat
165
- MMK: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
166
- // West African CFA franc
167
- XOF: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
168
- // Vietnamese dong
169
- VND: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
170
- // Burundian franc
171
- BIF: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
172
- // Chilean peso
173
- CLP: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
174
- // Guinean franc
175
- GNF: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
176
- // Iraqi dinar
177
- IQD: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
178
- // Icelandic króna
179
- ISK: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
180
- // Paraguayan guaraní
181
- PYG: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
182
- // Central African CFA franc
183
- XAF: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
184
- // Lao kip
185
- LAK: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
186
- // Lebanese pound
187
- LBP: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
188
- // Malagasy ariary
189
- MGA: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
190
- // Somali shilling
191
- SOS: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
192
- // Ugandan shilling
193
- UGX: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
194
- // Albanian lek
195
- ALL: { maximumFractionDigits: 2, minimumFractionDigits: 2 },
196
- // Iranian rial
197
- IRR: { maximumFractionDigits: 2, minimumFractionDigits: 2 }
198
- /* eslint-enable sort-keys-fix/sort-keys-fix */
15
+ const defaultCodecs = {
16
+ openGame: {
17
+ request: passThroughCodec,
18
+ response: passThroughCodec
19
+ },
20
+ play: {
21
+ request: passThroughCodec,
22
+ response: passThroughCodec
23
+ }
199
24
  };
200
- function G(t) {
201
- return t in f;
202
- }
203
- function M(t) {
204
- return G(t) ? {
205
- ...f[t],
206
- currency: l
207
- } : {
208
- currency: t
209
- };
210
- }
211
- function R(t, i, m) {
212
- const n = i.format(+t);
213
- return G(m) ? n.replace(l, f[m].displayAs ?? m) : n;
214
- }
215
- function P(t, i, m) {
216
- const { maximumFractionDigits: n, minimumFractionDigits: r } = m.resolvedOptions();
217
- return w(t, i, { maximumFractionDigits: n, minimumFractionDigits: r });
218
- }
219
- function B(t, i, { as: m } = {
220
- as: "Currency"
221
- /* Currency */
222
- }) {
223
- const { canShowCurrency: n, currency: r } = t;
224
- return m === "Number" || !n ? `${i}` : `${i} ${r}`;
225
- }
226
- function L(t, i, { as: m, from: n } = {
227
- as: "Currency",
228
- from: "Money"
229
- /* Money */
230
- }, r) {
231
- if (!["string", "number"].includes(typeof i))
232
- return "NaN";
233
- const { canShowCurrency: D = !0, coinValueInCents: o, currency: y, locales: p } = t;
234
- n === "Coins" && (i = N(+i, o));
235
- try {
236
- const E = M(y), d = new Intl.NumberFormat(p, {
237
- ...E,
238
- ...r,
239
- currencyDisplay: "symbol",
240
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
241
- // @ts-ignore
242
- numberingSystem: "latn",
243
- style: "currency"
244
- });
245
- return m === "Number" || !D ? P(t, i, d) : R(i, d, y);
246
- } catch {
247
- return B(t, i, { as: m });
248
- }
249
- }
250
- var s;
251
- class O {
252
- constructor({ config: i }) {
253
- F(this, s);
254
- C(this, s, i);
255
- }
256
- formatNumber(i, m) {
257
- const n = { locales: [a(this, s).ui.language] };
258
- return w(n, i, m);
259
- }
260
- formatCurrency(i, m = { as: u.Currency, from: c.Money }, n) {
261
- const r = a(this, s).ui.feature.showCurrency, D = a(this, s).api.coinValueInCents, o = a(this, s).api.currency || l, y = [a(this, s).ui.language];
262
- return L({
263
- canShowCurrency: r,
264
- coinValueInCents: D,
265
- currency: o,
266
- locales: y
267
- }, i, m, n);
268
- }
269
- formatCoins(i, m) {
270
- return this.formatCurrency(i, { as: u.Number, from: c.Coins }, m);
271
- }
272
- formatCoinsWithCurrency(i, m) {
273
- return this.formatCurrency(i, { as: u.Currency, from: c.Coins }, m);
274
- }
275
- formatMoney(i, m) {
276
- return this.formatCurrency(i, { as: u.Number, from: c.Money }, m);
277
- }
278
- formatMoneyWithCurrency(i, m) {
279
- return this.formatCurrency(i, { as: u.Currency, from: c.Money }, m);
280
- }
281
- }
282
- s = new WeakMap();
283
- const I = () => {
284
- };
285
- var e, g, x;
286
- class U {
287
- constructor({ messagePort: i }) {
288
- F(this, e);
289
- F(this, g);
290
- F(this, x);
291
- C(this, x, i), this.on("configured", (m) => {
292
- C(this, e, m), C(this, g, new O({ config: m }));
293
- });
294
- }
295
- get config() {
296
- if (!a(this, e))
297
- throw new Error("config is not initialized, you must open game first");
298
- return a(this, e);
299
- }
300
- get i18n() {
301
- if (!a(this, g))
302
- throw new Error("i18n is not initialized, you must open game first");
303
- return a(this, g);
304
- }
305
- request(i, ...[m]) {
306
- return new Promise((n) => {
307
- this.on(`${i}Response`, (r) => n({ type: "response", response: r }), {
308
- once: !0
309
- }), this.on(`${i}Error`, (r) => n({ type: "error", error: r }), { once: !0 }), this.send(i, m);
310
- });
311
- }
312
- on(i, m, n) {
313
- const r = function D(o) {
314
- o.data.message === `kalamba:wrapper:${i}` && (I("on", o.data.message.replace(/^kalamba:/, ""), o.data.payload), m(o.data.payload), n != null && n.once && window.removeEventListener("message", D));
315
- };
316
- window.addEventListener("message", r);
317
- }
318
- // TODO error messages
319
- send(i, ...[m]) {
320
- a(this, x).postMessage(
321
- {
322
- message: `kalamba:sdk:${i}`,
323
- payload: m
324
- },
325
- "*"
326
- );
327
- }
328
- configure(i) {
329
- this.send("configure", i);
330
- }
331
- async openGame() {
332
- const i = new Promise((n) => this.on("configured", n, { once: !0 })), m = await this.request("openGame");
333
- if (m.type === "response")
334
- return await i, m.response;
335
- throw m.error.type === "timeout" ? new A() : new T(m.error.data);
336
- }
337
- async play(i, m) {
338
- const n = { contract: i, extra: m }, r = await this.request("play", n);
339
- if (r.type === "response")
340
- return r.response;
341
- throw r.error.type === "timeout" ? new A() : new T(r.error.data);
342
- }
343
- }
344
- e = new WeakMap(), g = new WeakMap(), x = new WeakMap();
345
- export {
346
- O as I18n,
347
- U as KalambaSdk,
348
- T as RgsError,
349
- X as RgsErrorCode,
350
- A as TimeoutError,
351
- $ as decoders,
352
- V as encoders
25
+ var KalambaSdk = class {
26
+ #config;
27
+ #i18n;
28
+ #messagePort;
29
+ #codecs;
30
+ constructor({ messagePort, codecs }) {
31
+ this.#messagePort = messagePort;
32
+ this.#codecs = codecs ?? defaultCodecs;
33
+ this.on("configured", (config) => {
34
+ this.#config = config;
35
+ this.#i18n = new I18n({ config });
36
+ });
37
+ }
38
+ get config() {
39
+ if (!this.#config) throw new Error("config is not initialized, you must open game first");
40
+ return this.#config;
41
+ }
42
+ get i18n() {
43
+ if (!this.#i18n) throw new Error("i18n is not initialized, you must open game first");
44
+ return this.#i18n;
45
+ }
46
+ request(message, ...[payload]) {
47
+ return new Promise((resolve) => {
48
+ this.on(`${message}Response`, (response) => resolve({
49
+ type: "response",
50
+ response
51
+ }), { once: true });
52
+ this.on(`${message}Error`, (error) => resolve({
53
+ type: "error",
54
+ error
55
+ }), { once: true });
56
+ this.send(message, payload);
57
+ });
58
+ }
59
+ on(message, listener, options) {
60
+ window.addEventListener("message", function onMessage(event) {
61
+ if (event.data.message !== `kalamba:wrapper:${message}`) return;
62
+ logIn("on", event.data.message.replace(/^kalamba:/, ""), event.data.payload);
63
+ listener(event.data.payload);
64
+ if (options?.once) window.removeEventListener("message", onMessage);
65
+ });
66
+ }
67
+ send(message, ...[payload]) {
68
+ logOut("send", message, payload);
69
+ this.#messagePort.postMessage({
70
+ message: `kalamba:sdk:${message}`,
71
+ payload
72
+ }, "*");
73
+ }
74
+ configure(payload) {
75
+ this.send("configure", payload);
76
+ }
77
+ async openGame() {
78
+ const configuredPromise = new Promise((resolve) => this.on("configured", resolve, { once: true }));
79
+ const responseData = await this.request("openGame");
80
+ if (responseData.type === "response") {
81
+ await configuredPromise;
82
+ return {
83
+ contract: responseData.response.contract,
84
+ data: this.#codecs.openGame.response.decode(responseData.response.data)
85
+ };
86
+ } else if (responseData.error.type === "timeout") throw new TimeoutError();
87
+ else throw new RgsError(responseData.error.data);
88
+ }
89
+ async play(contract, extra) {
90
+ console.log("debug 1 payload", contract, extra);
91
+ const payload = {
92
+ contract,
93
+ extra: this.#codecs.play.request.encode(extra)
94
+ };
95
+ console.log("debug payload", payload);
96
+ const responseData = await this.request("play", payload);
97
+ if (responseData.type === "response") return {
98
+ contract: responseData.response.contract,
99
+ data: this.#codecs.play.response.decode(responseData.response.data)
100
+ };
101
+ else if (responseData.error.type === "timeout") throw new TimeoutError();
102
+ else throw new RgsError(responseData.error.data);
103
+ }
353
104
  };
105
+
106
+ //#endregion
107
+ export { I18n, KalambaSdk, RgsError, RgsErrorCode, TimeoutError };
@@ -0,0 +1,28 @@
1
+ /**
2
+ * BSD 3-Clause License
3
+ * Copyright (c) 2026, Kalamba Games Limited
4
+ */
5
+
6
+ //#region src/common/logger.ts
7
+ function createLogger(prefix, style) {
8
+ return (message, ...args) => {
9
+ console.log(`[%c${prefix}\x1B[m] %s`, style, message, ...args);
10
+ };
11
+ }
12
+ var WithLogger = class {
13
+ static LOG_PREFIX;
14
+ static LOG_STYLES = "color:#000000;font-weight:bold;";
15
+ log;
16
+ constructor() {
17
+ const ctor = new.target;
18
+ this.log = createLogger(ctor.LOG_PREFIX ?? ctor.name, ctor.LOG_STYLES);
19
+ }
20
+ };
21
+
22
+ //#endregion
23
+ Object.defineProperty(exports, 'WithLogger', {
24
+ enumerable: true,
25
+ get: function () {
26
+ return WithLogger;
27
+ }
28
+ });
@@ -0,0 +1,22 @@
1
+ /**
2
+ * BSD 3-Clause License
3
+ * Copyright (c) 2026, Kalamba Games Limited
4
+ */
5
+ //#region src/common/logger.ts
6
+ function createLogger(prefix, style) {
7
+ return (message, ...args) => {
8
+ console.log(`[%c${prefix}\x1B[m] %s`, style, message, ...args);
9
+ };
10
+ }
11
+ var WithLogger = class {
12
+ static LOG_PREFIX;
13
+ static LOG_STYLES = "color:#000000;font-weight:bold;";
14
+ log;
15
+ constructor() {
16
+ const ctor = new.target;
17
+ this.log = createLogger(ctor.LOG_PREFIX ?? ctor.name, ctor.LOG_STYLES);
18
+ }
19
+ };
20
+
21
+ //#endregion
22
+ export { WithLogger as t };