@jetezra/bridge 0.0.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.
@@ -0,0 +1,560 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // src/index.js
20
+ var index_exports = {};
21
+ __export(index_exports, {
22
+ BRIDGE: () => BRIDGE,
23
+ BRIDGE_VERSION: () => BRIDGE_VERSION,
24
+ ChoogaBridge: () => ChoogaBridge,
25
+ default: () => index_default
26
+ });
27
+ module.exports = __toCommonJS(index_exports);
28
+ var BRIDGE = {
29
+ // Host → mini-app
30
+ SESSION: "chooga.session",
31
+ USER: "chooga.user",
32
+ THEME: "chooga.theme",
33
+ SAFE_AREA: "chooga.safeArea",
34
+ CAPABILITY_RESULT: "chooga.capabilityResult",
35
+ NAVIGATE_RESULT: "chooga.navigateResult",
36
+ PAYMENTS_RESULT: "chooga.payments.result",
37
+ ACTIVITY_RESULT: "chooga.activityResult",
38
+ CALL_RESULT: "chooga.callResult",
39
+ EVENT: "chooga.event",
40
+ HOST_INFO: "chooga.hostInfo",
41
+ // Mini-app → host
42
+ READY: "chooga.ready",
43
+ CLOSE: "chooga.close",
44
+ OPEN_EXTERNAL: "chooga.openExternal",
45
+ REQUEST_CAPABILITY: "chooga.requestCapability",
46
+ NAVIGATE: "chooga.navigate",
47
+ PAYMENTS_INITIATE: "chooga.payments.initiate",
48
+ PROGRESS_SHOW: "chooga.progress.show",
49
+ PROGRESS_DISMISS: "chooga.progress.dismiss",
50
+ ACTIVITY: "chooga.activity",
51
+ TOAST: "chooga.toast",
52
+ USER_GET: "chooga.user.get",
53
+ HOST_INFO_GET: "chooga.hostInfo.get",
54
+ CALL: "chooga.call"
55
+ };
56
+ var BRIDGE_VERSION = "1.2.0";
57
+ var state = {
58
+ hostConnected: false,
59
+ readySent: false,
60
+ session: null,
61
+ user: null,
62
+ theme: null,
63
+ safeArea: null,
64
+ hostInfo: null,
65
+ lastCapability: null,
66
+ lastPayment: null,
67
+ lastActivity: null,
68
+ lastEvent: null,
69
+ lastMessage: null
70
+ };
71
+ var listeners = /* @__PURE__ */ new Set();
72
+ var eventHandlers = /* @__PURE__ */ new Map();
73
+ var pending = /* @__PURE__ */ new Map();
74
+ var requestSeq = 0;
75
+ var initialized = false;
76
+ function nextRequestId() {
77
+ requestSeq += 1;
78
+ return `cb_${Date.now().toString(36)}_${requestSeq}`;
79
+ }
80
+ function getState() {
81
+ return {
82
+ hostConnected: state.hostConnected,
83
+ readySent: state.readySent,
84
+ session: state.session,
85
+ user: state.user,
86
+ theme: state.theme,
87
+ safeArea: state.safeArea,
88
+ hostInfo: state.hostInfo,
89
+ lastCapability: state.lastCapability,
90
+ lastPayment: state.lastPayment,
91
+ lastActivity: state.lastActivity,
92
+ lastEvent: state.lastEvent,
93
+ lastMessage: state.lastMessage
94
+ };
95
+ }
96
+ function notify() {
97
+ const snapshot = getState();
98
+ listeners.forEach((fn) => {
99
+ try {
100
+ fn(snapshot);
101
+ } catch (_) {
102
+ }
103
+ });
104
+ }
105
+ function emitLocalEvent(name, detail) {
106
+ state.lastEvent = { name, detail, at: (/* @__PURE__ */ new Date()).toISOString() };
107
+ const set = eventHandlers.get(name);
108
+ if (set) {
109
+ set.forEach((fn) => {
110
+ try {
111
+ fn(detail);
112
+ } catch (_) {
113
+ }
114
+ });
115
+ }
116
+ const all = eventHandlers.get("*");
117
+ if (all) {
118
+ all.forEach((fn) => {
119
+ try {
120
+ fn({ name, detail });
121
+ } catch (_) {
122
+ }
123
+ });
124
+ }
125
+ }
126
+ function detectHost() {
127
+ return !!(typeof window !== "undefined" && window.ReactNativeWebView && typeof window.ReactNativeWebView.postMessage === "function");
128
+ }
129
+ function ensureChoogaHostShim() {
130
+ if (typeof window === "undefined") {
131
+ return;
132
+ }
133
+ if (!window.ChoogaHost) {
134
+ window.ChoogaHost = {
135
+ postToHost(msg) {
136
+ try {
137
+ const payload = typeof msg === "string" ? msg : JSON.stringify(msg);
138
+ if (window.ReactNativeWebView && window.ReactNativeWebView.postMessage) {
139
+ window.ReactNativeWebView.postMessage(payload);
140
+ }
141
+ } catch (_) {
142
+ }
143
+ },
144
+ getTheme() {
145
+ return window.ChoogaTheme || {};
146
+ }
147
+ };
148
+ }
149
+ window.ChoogaTheme = window.ChoogaTheme || {};
150
+ }
151
+ function postToHost(msg) {
152
+ ensureChoogaHostShim();
153
+ if (window.ChoogaHost && typeof window.ChoogaHost.postToHost === "function") {
154
+ window.ChoogaHost.postToHost(msg);
155
+ }
156
+ }
157
+ function applyTheme(theme) {
158
+ if (typeof document === "undefined" || !theme) {
159
+ return;
160
+ }
161
+ const primary = theme.primary_color;
162
+ const mode = theme.mode || "light";
163
+ if (primary) {
164
+ document.documentElement.style.setProperty("--chooga-primary", primary);
165
+ document.documentElement.style.setProperty("--chooga-color-primary", primary);
166
+ }
167
+ document.documentElement.setAttribute("data-chooga-theme", mode);
168
+ window.ChoogaTheme = Object.assign({}, window.ChoogaTheme || {}, {
169
+ primary_color: primary || void 0,
170
+ mode
171
+ });
172
+ }
173
+ function settlePending(requestId, result) {
174
+ if (!requestId || !pending.has(requestId)) {
175
+ return;
176
+ }
177
+ const entry = pending.get(requestId);
178
+ pending.delete(requestId);
179
+ if (entry.timer) {
180
+ clearTimeout(entry.timer);
181
+ }
182
+ try {
183
+ if (typeof entry.onResult === "function") {
184
+ entry.onResult(result);
185
+ }
186
+ } catch (_) {
187
+ }
188
+ if (result && result.ok === false) {
189
+ entry.reject(
190
+ Object.assign(new Error(result.reason || result.status || "failed"), {
191
+ result
192
+ })
193
+ );
194
+ } else {
195
+ entry.resolve(result);
196
+ }
197
+ }
198
+ function trackRequest(options = {}) {
199
+ const requestId = options.requestId || nextRequestId();
200
+ const timeoutMs = options.timeoutMs != null ? options.timeoutMs : 12e4;
201
+ return new Promise((resolve, reject) => {
202
+ const timer = timeoutMs > 0 ? setTimeout(() => {
203
+ if (pending.has(requestId)) {
204
+ pending.delete(requestId);
205
+ reject(Object.assign(new Error("timeout"), { reason: "timeout" }));
206
+ }
207
+ }, timeoutMs) : null;
208
+ pending.set(requestId, {
209
+ resolve,
210
+ reject,
211
+ onResult: options.onResult,
212
+ timer
213
+ });
214
+ });
215
+ }
216
+ function handleHostMessage(raw) {
217
+ let msg = raw;
218
+ if (typeof raw === "string") {
219
+ try {
220
+ msg = JSON.parse(raw);
221
+ } catch (_) {
222
+ return;
223
+ }
224
+ }
225
+ if (!msg || typeof msg !== "object" || !msg.type) {
226
+ return;
227
+ }
228
+ state.hostConnected = true;
229
+ state.lastMessage = msg;
230
+ switch (msg.type) {
231
+ case BRIDGE.SESSION:
232
+ state.session = {
233
+ token: msg.token || null,
234
+ expires_at: msg.expires_at || null
235
+ };
236
+ break;
237
+ case BRIDGE.USER:
238
+ state.user = msg.user || null;
239
+ break;
240
+ case BRIDGE.THEME:
241
+ state.theme = {
242
+ mode: msg.mode || "light",
243
+ primary_color: msg.primary_color || null
244
+ };
245
+ applyTheme(state.theme);
246
+ break;
247
+ case BRIDGE.SAFE_AREA:
248
+ state.safeArea = msg.insets || null;
249
+ break;
250
+ case BRIDGE.HOST_INFO: {
251
+ const { type: _t, ...rest } = msg;
252
+ state.hostInfo = rest;
253
+ break;
254
+ }
255
+ case BRIDGE.CAPABILITY_RESULT:
256
+ state.lastCapability = {
257
+ key: msg.key,
258
+ granted: !!msg.granted,
259
+ reason: msg.reason || null
260
+ };
261
+ break;
262
+ case BRIDGE.NAVIGATE_RESULT:
263
+ settlePending(msg.requestId, {
264
+ ok: !!msg.ok,
265
+ reason: msg.reason || null
266
+ });
267
+ break;
268
+ case BRIDGE.PAYMENTS_RESULT: {
269
+ const { type: _t, requestId, ...rest } = msg;
270
+ state.lastPayment = rest;
271
+ settlePending(requestId, rest);
272
+ break;
273
+ }
274
+ case BRIDGE.ACTIVITY_RESULT: {
275
+ const { type: _t, requestId, ...rest } = msg;
276
+ state.lastActivity = rest;
277
+ settlePending(requestId, rest);
278
+ break;
279
+ }
280
+ case BRIDGE.CALL_RESULT: {
281
+ const { type: _t, requestId, ...rest } = msg;
282
+ settlePending(requestId, rest);
283
+ break;
284
+ }
285
+ case BRIDGE.EVENT:
286
+ emitLocalEvent(msg.name, msg.detail || {});
287
+ break;
288
+ default:
289
+ break;
290
+ }
291
+ notify();
292
+ }
293
+ function onWindowMessage(event) {
294
+ handleHostMessage(event && event.data);
295
+ }
296
+ function init(options = {}) {
297
+ if (initialized) {
298
+ return ChoogaBridge;
299
+ }
300
+ initialized = true;
301
+ ensureChoogaHostShim();
302
+ state.hostConnected = detectHost();
303
+ if (typeof window !== "undefined") {
304
+ window.ChoogaMiniApp = window.ChoogaMiniApp || {};
305
+ window.ChoogaMiniApp.onHostMessage = handleHostMessage;
306
+ window.addEventListener("message", onWindowMessage);
307
+ if (typeof document !== "undefined") {
308
+ document.addEventListener("message", onWindowMessage);
309
+ }
310
+ }
311
+ if (options.autoReady !== false) {
312
+ ready();
313
+ }
314
+ notify();
315
+ return ChoogaBridge;
316
+ }
317
+ function ready() {
318
+ postToHost({ type: BRIDGE.READY });
319
+ state.readySent = true;
320
+ notify();
321
+ }
322
+ function close() {
323
+ postToHost({ type: BRIDGE.CLOSE });
324
+ }
325
+ function openExternal(url) {
326
+ postToHost({ type: BRIDGE.OPEN_EXTERNAL, url });
327
+ }
328
+ function requestCapability(key) {
329
+ postToHost({ type: BRIDGE.REQUEST_CAPABILITY, key });
330
+ }
331
+ function showProgress(options = {}) {
332
+ const opts = typeof options === "string" ? { message: options } : options || {};
333
+ postToHost({
334
+ type: BRIDGE.PROGRESS_SHOW,
335
+ title: opts.title,
336
+ message: opts.message
337
+ });
338
+ }
339
+ function dismissProgress() {
340
+ postToHost({ type: BRIDGE.PROGRESS_DISMISS });
341
+ }
342
+ function toast(message, tone) {
343
+ const opts = typeof message === "string" ? { message, tone } : { message: (message == null ? void 0 : message.message) || (message == null ? void 0 : message.text), tone: (message == null ? void 0 : message.tone) || tone };
344
+ postToHost({
345
+ type: BRIDGE.TOAST,
346
+ message: opts.message,
347
+ tone: opts.tone || "success"
348
+ });
349
+ }
350
+ function activity(name, params = {}, options = {}) {
351
+ const requestId = nextRequestId();
352
+ const promise = trackRequest({
353
+ requestId,
354
+ onResult: options.onResult,
355
+ timeoutMs: options.timeoutMs
356
+ });
357
+ postToHost({
358
+ type: BRIDGE.ACTIVITY,
359
+ requestId,
360
+ name,
361
+ params
362
+ });
363
+ if (!detectHost()) {
364
+ settlePending(requestId, { ok: false, reason: "no_host" });
365
+ }
366
+ return promise;
367
+ }
368
+ function getUser(options = {}) {
369
+ const requestId = nextRequestId();
370
+ const promise = trackRequest({
371
+ requestId,
372
+ onResult: options.onResult,
373
+ timeoutMs: options.timeoutMs
374
+ });
375
+ postToHost({ type: BRIDGE.USER_GET, requestId });
376
+ if (!detectHost()) {
377
+ settlePending(requestId, { ok: false, reason: "no_host" });
378
+ }
379
+ return promise.then((result) => {
380
+ if (result == null ? void 0 : result.user) {
381
+ state.user = result.user;
382
+ notify();
383
+ }
384
+ return result;
385
+ });
386
+ }
387
+ function getHostInfo(options = {}) {
388
+ const requestId = nextRequestId();
389
+ const promise = trackRequest({
390
+ requestId,
391
+ onResult: options.onResult,
392
+ timeoutMs: options.timeoutMs != null ? options.timeoutMs : 15e3
393
+ });
394
+ postToHost({ type: BRIDGE.HOST_INFO_GET, requestId });
395
+ if (!detectHost()) {
396
+ settlePending(requestId, { ok: false, reason: "no_host" });
397
+ }
398
+ return promise;
399
+ }
400
+ function has(key) {
401
+ if (!key) {
402
+ return false;
403
+ }
404
+ const info = state.hostInfo;
405
+ if (info) {
406
+ if (Array.isArray(info.granted) && info.granted.includes(key)) {
407
+ return true;
408
+ }
409
+ if (Array.isArray(info.capabilities) && info.capabilities.includes(key)) {
410
+ return true;
411
+ }
412
+ if (Array.isArray(info.activities) && info.activities.includes(key)) {
413
+ return true;
414
+ }
415
+ }
416
+ if (state.lastCapability && state.lastCapability.key === key) {
417
+ return !!state.lastCapability.granted;
418
+ }
419
+ return false;
420
+ }
421
+ function hostVersion() {
422
+ return state.hostInfo && (state.hostInfo.host_version || state.hostInfo.version) || BRIDGE_VERSION;
423
+ }
424
+ function on(name, handler) {
425
+ if (!name || typeof handler !== "function") {
426
+ return () => {
427
+ };
428
+ }
429
+ if (!eventHandlers.has(name)) {
430
+ eventHandlers.set(name, /* @__PURE__ */ new Set());
431
+ }
432
+ eventHandlers.get(name).add(handler);
433
+ return () => off(name, handler);
434
+ }
435
+ function off(name, handler) {
436
+ const set = eventHandlers.get(name);
437
+ if (!set) {
438
+ return;
439
+ }
440
+ set.delete(handler);
441
+ if (set.size === 0) {
442
+ eventHandlers.delete(name);
443
+ }
444
+ }
445
+ function navigate(options = {}) {
446
+ const requestId = nextRequestId();
447
+ const promise = trackRequest({ requestId, timeoutMs: options.timeoutMs });
448
+ postToHost({
449
+ type: BRIDGE.NAVIGATE,
450
+ requestId,
451
+ path: options.path,
452
+ url: options.url
453
+ });
454
+ if (!detectHost()) {
455
+ settlePending(requestId, { ok: false, reason: "no_host" });
456
+ }
457
+ return promise;
458
+ }
459
+ function initiatePayment(options = {}) {
460
+ const requestId = nextRequestId();
461
+ const deliverResult = options.deliverResult !== false;
462
+ const { onResult, timeoutMs, ...rest } = options;
463
+ if (deliverResult) {
464
+ const promise = trackRequest({ requestId, onResult, timeoutMs });
465
+ postToHost({
466
+ type: BRIDGE.PAYMENTS_INITIATE,
467
+ requestId,
468
+ deliverResult: true,
469
+ ...rest
470
+ });
471
+ if (!detectHost()) {
472
+ settlePending(requestId, {
473
+ ok: false,
474
+ status: "error",
475
+ reason: "no_host"
476
+ });
477
+ }
478
+ return promise;
479
+ }
480
+ postToHost({
481
+ type: BRIDGE.PAYMENTS_INITIATE,
482
+ requestId,
483
+ deliverResult: false,
484
+ ...rest
485
+ });
486
+ return Promise.resolve({ ok: true, status: "redirecting" });
487
+ }
488
+ function call(method, params = {}, options = {}) {
489
+ const requestId = nextRequestId();
490
+ const promise = trackRequest({
491
+ requestId,
492
+ onResult: options.onResult,
493
+ timeoutMs: options.timeoutMs
494
+ });
495
+ postToHost({
496
+ type: BRIDGE.CALL,
497
+ requestId,
498
+ method,
499
+ params
500
+ });
501
+ if (!detectHost()) {
502
+ settlePending(requestId, { ok: false, reason: "no_host" });
503
+ }
504
+ return promise;
505
+ }
506
+ function subscribe(listener) {
507
+ if (typeof listener !== "function") {
508
+ return () => {
509
+ };
510
+ }
511
+ listeners.add(listener);
512
+ listener(getState());
513
+ return () => listeners.delete(listener);
514
+ }
515
+ var payments = {
516
+ /** @see initiatePayment */
517
+ initiate: initiatePayment
518
+ };
519
+ var progress = {
520
+ show: showProgress,
521
+ dismiss: dismissProgress
522
+ };
523
+ var user = {
524
+ get: getUser
525
+ };
526
+ var ChoogaBridge = {
527
+ BRIDGE,
528
+ BRIDGE_VERSION,
529
+ init,
530
+ ready,
531
+ close,
532
+ openExternal,
533
+ requestCapability,
534
+ showProgress,
535
+ dismissProgress,
536
+ toast,
537
+ activity,
538
+ getUser,
539
+ getHostInfo,
540
+ has,
541
+ hostVersion,
542
+ on,
543
+ off,
544
+ navigate,
545
+ call,
546
+ payments,
547
+ progress,
548
+ user,
549
+ subscribe,
550
+ getState,
551
+ /** @deprecated Prefer getState() */
552
+ get state() {
553
+ return getState();
554
+ }
555
+ };
556
+ if (typeof window !== "undefined") {
557
+ window.ChoogaBridge = ChoogaBridge;
558
+ }
559
+ var index_default = ChoogaBridge;
560
+ //# sourceMappingURL=chooga-bridge.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.js"],
4
+ "sourcesContent": ["/**\n * @jetezra/bridge \u2014 mini-app client for Chooga / Awash host WebViews.\n *\n * Usage\n * ESM: import ChoogaBridge from '@jetezra/bridge'\n * CDN: <script src=\"\u2026/chooga-bridge.min.js\"></script> \u2192 window.ChoogaBridge\n *\n * Mental model (mirrors host)\n * Activities \u2014 native UI that returns a result (activity / wallet.pick)\n * Services \u2014 background host work (progress, toast, user.get)\n * Events \u2014 host \u2192 mini-app pushes (on / off)\n *\n * Flow\n * 1. ChoogaBridge.init() \u2014 bind listeners, optionally send ready\n * 2. Host injects session/user/theme/safeArea + hostInfo\n * 3. Mini-app calls activity / services / navigate / payments\n *\n * Outside a WebView, hostConnected stays false so demos still run.\n * Keep BRIDGE.* strings identical to the host bridge/types.js contract.\n *\n * @see README.md\n * @see RELEASE.md\n */\n\n// \u2500\u2500\u2500 Message types (public contract with the host) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Wire message `type` strings. Grouped by direction.\n * Changing a value requires a matching host update.\n */\nexport const BRIDGE = {\n // Host \u2192 mini-app\n SESSION: 'chooga.session',\n USER: 'chooga.user',\n THEME: 'chooga.theme',\n SAFE_AREA: 'chooga.safeArea',\n CAPABILITY_RESULT: 'chooga.capabilityResult',\n NAVIGATE_RESULT: 'chooga.navigateResult',\n PAYMENTS_RESULT: 'chooga.payments.result',\n ACTIVITY_RESULT: 'chooga.activityResult',\n CALL_RESULT: 'chooga.callResult',\n EVENT: 'chooga.event',\n HOST_INFO: 'chooga.hostInfo',\n\n // Mini-app \u2192 host\n READY: 'chooga.ready',\n CLOSE: 'chooga.close',\n OPEN_EXTERNAL: 'chooga.openExternal',\n REQUEST_CAPABILITY: 'chooga.requestCapability',\n NAVIGATE: 'chooga.navigate',\n PAYMENTS_INITIATE: 'chooga.payments.initiate',\n PROGRESS_SHOW: 'chooga.progress.show',\n PROGRESS_DISMISS: 'chooga.progress.dismiss',\n ACTIVITY: 'chooga.activity',\n TOAST: 'chooga.toast',\n USER_GET: 'chooga.user.get',\n HOST_INFO_GET: 'chooga.hostInfo.get',\n CALL: 'chooga.call',\n};\n\n/** Client package protocol version (host may advertise a different host_version). */\nexport const BRIDGE_VERSION = '1.2.0';\n\n// \u2500\u2500\u2500 Internal state \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Latest context injected by the host (and last outbound results). */\nconst state = {\n hostConnected: false,\n readySent: false,\n session: null,\n user: null,\n theme: null,\n safeArea: null,\n hostInfo: null,\n lastCapability: null,\n lastPayment: null,\n lastActivity: null,\n lastEvent: null,\n lastMessage: null,\n};\n\n/** Subscribers notified whenever state changes. */\nconst listeners = new Set();\n\n/** Event name \u2192 Set of handlers (host push events). */\nconst eventHandlers = new Map();\n\n/**\n * In-flight requestId \u2192 { resolve, reject, onResult, timer }.\n * Used by navigate / payments / activity / call Promise APIs.\n */\nconst pending = new Map();\n\nlet requestSeq = 0;\nlet initialized = false;\n\n/** Unique id for correlating host replies with pending Promises. */\nfunction nextRequestId() {\n requestSeq += 1;\n return `cb_${Date.now().toString(36)}_${requestSeq}`;\n}\n\n/** Snapshot of public state (never expose mutable internals). */\nfunction getState() {\n return {\n hostConnected: state.hostConnected,\n readySent: state.readySent,\n session: state.session,\n user: state.user,\n theme: state.theme,\n safeArea: state.safeArea,\n hostInfo: state.hostInfo,\n lastCapability: state.lastCapability,\n lastPayment: state.lastPayment,\n lastActivity: state.lastActivity,\n lastEvent: state.lastEvent,\n lastMessage: state.lastMessage,\n };\n}\n\n/** Push a state snapshot to every subscriber. Errors in listeners are swallowed. */\nfunction notify() {\n const snapshot = getState();\n listeners.forEach(fn => {\n try {\n fn(snapshot);\n } catch (_) {\n /* ignore subscriber errors */\n }\n });\n}\n\nfunction emitLocalEvent(name, detail) {\n state.lastEvent = {name, detail, at: new Date().toISOString()};\n const set = eventHandlers.get(name);\n if (set) {\n set.forEach(fn => {\n try {\n fn(detail);\n } catch (_) {\n /* ignore */\n }\n });\n }\n // Wildcard listeners\n const all = eventHandlers.get('*');\n if (all) {\n all.forEach(fn => {\n try {\n fn({name, detail});\n } catch (_) {\n /* ignore */\n }\n });\n }\n}\n\n// \u2500\u2500\u2500 Transport (mini-app \u2192 host) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** True when running inside a React Native WebView with postMessage. */\nfunction detectHost() {\n return !!(\n typeof window !== 'undefined' &&\n window.ReactNativeWebView &&\n typeof window.ReactNativeWebView.postMessage === 'function'\n );\n}\n\n/**\n * Ensure window.ChoogaHost / ChoogaTheme exist.\n * In a real host, preload JS already installs these; in a browser we no-op posts.\n */\nfunction ensureChoogaHostShim() {\n if (typeof window === 'undefined') {\n return;\n }\n if (!window.ChoogaHost) {\n window.ChoogaHost = {\n postToHost(msg) {\n try {\n const payload = typeof msg === 'string' ? msg : JSON.stringify(msg);\n if (\n window.ReactNativeWebView &&\n window.ReactNativeWebView.postMessage\n ) {\n window.ReactNativeWebView.postMessage(payload);\n }\n } catch (_) {\n /* ignore */\n }\n },\n getTheme() {\n return window.ChoogaTheme || {};\n },\n };\n }\n window.ChoogaTheme = window.ChoogaTheme || {};\n}\n\n/** Send a JSON message to the native host (no-op when not in a WebView). */\nfunction postToHost(msg) {\n ensureChoogaHostShim();\n if (window.ChoogaHost && typeof window.ChoogaHost.postToHost === 'function') {\n window.ChoogaHost.postToHost(msg);\n }\n}\n\n// \u2500\u2500\u2500 Theme (host \u2192 DOM) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Apply host theme tokens as CSS variables + window.ChoogaTheme. */\nfunction applyTheme(theme) {\n if (typeof document === 'undefined' || !theme) {\n return;\n }\n const primary = theme.primary_color;\n const mode = theme.mode || 'light';\n if (primary) {\n document.documentElement.style.setProperty('--chooga-primary', primary);\n document.documentElement.style.setProperty('--chooga-color-primary', primary);\n }\n document.documentElement.setAttribute('data-chooga-theme', mode);\n window.ChoogaTheme = Object.assign({}, window.ChoogaTheme || {}, {\n primary_color: primary || undefined,\n mode,\n });\n}\n\n// \u2500\u2500\u2500 Request / response correlation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Resolve or reject a pending Promise when the host replies.\n * Rejects when result.ok === false; otherwise resolves with the result bag.\n */\nfunction settlePending(requestId, result) {\n if (!requestId || !pending.has(requestId)) {\n return;\n }\n const entry = pending.get(requestId);\n pending.delete(requestId);\n if (entry.timer) {\n clearTimeout(entry.timer);\n }\n try {\n if (typeof entry.onResult === 'function') {\n entry.onResult(result);\n }\n } catch (_) {\n /* ignore callback errors */\n }\n if (result && result.ok === false) {\n entry.reject(\n Object.assign(new Error(result.reason || result.status || 'failed'), {\n result,\n }),\n );\n } else {\n entry.resolve(result);\n }\n}\n\n/**\n * Register a pending request and return its Promise.\n * @param {{ requestId?: string, onResult?: function, timeoutMs?: number }} options\n */\nfunction trackRequest(options = {}) {\n const requestId = options.requestId || nextRequestId();\n const timeoutMs = options.timeoutMs != null ? options.timeoutMs : 120000;\n\n return new Promise((resolve, reject) => {\n const timer =\n timeoutMs > 0\n ? setTimeout(() => {\n if (pending.has(requestId)) {\n pending.delete(requestId);\n reject(Object.assign(new Error('timeout'), {reason: 'timeout'}));\n }\n }, timeoutMs)\n : null;\n\n pending.set(requestId, {\n resolve,\n reject,\n onResult: options.onResult,\n timer,\n });\n });\n}\n\n// \u2500\u2500\u2500 Inbound host messages \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Handle a message from the host (session, user, theme, *Result, event, \u2026).\n * Accepts a parsed object or a JSON string.\n */\nfunction handleHostMessage(raw) {\n let msg = raw;\n if (typeof raw === 'string') {\n try {\n msg = JSON.parse(raw);\n } catch (_) {\n return;\n }\n }\n if (!msg || typeof msg !== 'object' || !msg.type) {\n return;\n }\n\n state.hostConnected = true;\n state.lastMessage = msg;\n\n switch (msg.type) {\n case BRIDGE.SESSION:\n state.session = {\n token: msg.token || null,\n expires_at: msg.expires_at || null,\n };\n break;\n\n case BRIDGE.USER:\n state.user = msg.user || null;\n break;\n\n case BRIDGE.THEME:\n state.theme = {\n mode: msg.mode || 'light',\n primary_color: msg.primary_color || null,\n };\n applyTheme(state.theme);\n break;\n\n case BRIDGE.SAFE_AREA:\n state.safeArea = msg.insets || null;\n break;\n\n case BRIDGE.HOST_INFO: {\n const {type: _t, ...rest} = msg;\n state.hostInfo = rest;\n break;\n }\n\n case BRIDGE.CAPABILITY_RESULT:\n state.lastCapability = {\n key: msg.key,\n granted: !!msg.granted,\n reason: msg.reason || null,\n };\n break;\n\n case BRIDGE.NAVIGATE_RESULT:\n settlePending(msg.requestId, {\n ok: !!msg.ok,\n reason: msg.reason || null,\n });\n break;\n\n case BRIDGE.PAYMENTS_RESULT: {\n const {type: _t, requestId, ...rest} = msg;\n state.lastPayment = rest;\n settlePending(requestId, rest);\n break;\n }\n\n case BRIDGE.ACTIVITY_RESULT: {\n const {type: _t, requestId, ...rest} = msg;\n state.lastActivity = rest;\n settlePending(requestId, rest);\n break;\n }\n\n case BRIDGE.CALL_RESULT: {\n const {type: _t, requestId, ...rest} = msg;\n settlePending(requestId, rest);\n break;\n }\n\n case BRIDGE.EVENT:\n emitLocalEvent(msg.name, msg.detail || {});\n break;\n\n default:\n // Unknown types are kept on lastMessage for forward compatibility.\n break;\n }\n\n notify();\n}\n\n/** window / document `message` event adapter. */\nfunction onWindowMessage(event) {\n handleHostMessage(event && event.data);\n}\n\n// \u2500\u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Bind host listeners once. Safe to call repeatedly.\n * @param {{ autoReady?: boolean }} [options] autoReady defaults to true\n * @returns {typeof ChoogaBridge}\n */\nfunction init(options = {}) {\n if (initialized) {\n return ChoogaBridge;\n }\n initialized = true;\n\n ensureChoogaHostShim();\n state.hostConnected = detectHost();\n\n if (typeof window !== 'undefined') {\n // Direct inject path used by the host's postToWebView helper\n window.ChoogaMiniApp = window.ChoogaMiniApp || {};\n window.ChoogaMiniApp.onHostMessage = handleHostMessage;\n\n // Standard DOM message events (also fired by host inject)\n window.addEventListener('message', onWindowMessage);\n if (typeof document !== 'undefined') {\n document.addEventListener('message', onWindowMessage);\n }\n }\n\n if (options.autoReady !== false) {\n ready();\n }\n\n notify();\n return ChoogaBridge;\n}\n\n/** Tell the host the mini-app is ready for session / user / theme injection. */\nfunction ready() {\n postToHost({type: BRIDGE.READY});\n state.readySent = true;\n notify();\n}\n\n/** Ask the host to dismiss the WebView. */\nfunction close() {\n postToHost({type: BRIDGE.CLOSE});\n}\n\n/** Ask the host to open an https URL outside the WebView. */\nfunction openExternal(url) {\n postToHost({type: BRIDGE.OPEN_EXTERNAL, url});\n}\n\n/** Ask whether a permission key is granted (host replies with capabilityResult). */\nfunction requestCapability(key) {\n postToHost({type: BRIDGE.REQUEST_CAPABILITY, key});\n}\n\n/**\n * Show the host loading overlay while the mini-app performs network work.\n * Pair with dismissProgress() when the request finishes (success or error).\n *\n * @param {{ title?: string, message?: string }|string} [options]\n * Pass a string as a shorthand for `{ message }`.\n */\nfunction showProgress(options = {}) {\n const opts =\n typeof options === 'string' ? {message: options} : options || {};\n postToHost({\n type: BRIDGE.PROGRESS_SHOW,\n title: opts.title,\n message: opts.message,\n });\n}\n\n/** Dismiss the host loading overlay. */\nfunction dismissProgress() {\n postToHost({type: BRIDGE.PROGRESS_DISMISS});\n}\n\n/**\n * Show a short host toast / snackbar.\n * @param {string|{ message?: string, text?: string, tone?: string }} message\n * @param {string} [tone]\n */\nfunction toast(message, tone) {\n const opts =\n typeof message === 'string'\n ? {message, tone}\n : {message: message?.message || message?.text, tone: message?.tone || tone};\n postToHost({\n type: BRIDGE.TOAST,\n message: opts.message,\n tone: opts.tone || 'success',\n });\n}\n\n/**\n * Open a host activity (native UI) and await its result.\n * @param {string} name e.g. 'wallet.pick' | 'host.confirm'\n * @param {object} [params]\n * @param {{ onResult?: function, timeoutMs?: number }} [options]\n * @returns {Promise<object>}\n */\nfunction activity(name, params = {}, options = {}) {\n const requestId = nextRequestId();\n const promise = trackRequest({\n requestId,\n onResult: options.onResult,\n timeoutMs: options.timeoutMs,\n });\n postToHost({\n type: BRIDGE.ACTIVITY,\n requestId,\n name,\n params,\n });\n if (!detectHost()) {\n settlePending(requestId, {ok: false, reason: 'no_host'});\n }\n return promise;\n}\n\n/**\n * Fetch fresh user claims from the host (also refreshes injected snapshot).\n * @returns {Promise<{ ok: boolean, user?: object }>}\n */\nfunction getUser(options = {}) {\n const requestId = nextRequestId();\n const promise = trackRequest({\n requestId,\n onResult: options.onResult,\n timeoutMs: options.timeoutMs,\n });\n postToHost({type: BRIDGE.USER_GET, requestId});\n if (!detectHost()) {\n settlePending(requestId, {ok: false, reason: 'no_host'});\n }\n return promise.then(result => {\n if (result?.user) {\n state.user = result.user;\n notify();\n }\n return result;\n });\n}\n\n/**\n * Refresh host capabilities / activity list into state.hostInfo.\n * @returns {Promise<object>}\n */\nfunction getHostInfo(options = {}) {\n const requestId = nextRequestId();\n const promise = trackRequest({\n requestId,\n onResult: options.onResult,\n timeoutMs: options.timeoutMs != null ? options.timeoutMs : 15000,\n });\n postToHost({type: BRIDGE.HOST_INFO_GET, requestId});\n if (!detectHost()) {\n settlePending(requestId, {ok: false, reason: 'no_host'});\n }\n return promise;\n}\n\n/**\n * True if the host advertised the capability or activity (from hostInfo).\n * Falls back to lastCapability for permission keys after requestCapability.\n * @param {string} key permission key or activity name\n */\nfunction has(key) {\n if (!key) {\n return false;\n }\n const info = state.hostInfo;\n if (info) {\n if (Array.isArray(info.granted) && info.granted.includes(key)) {\n return true;\n }\n if (Array.isArray(info.capabilities) && info.capabilities.includes(key)) {\n return true;\n }\n if (Array.isArray(info.activities) && info.activities.includes(key)) {\n return true;\n }\n }\n if (state.lastCapability && state.lastCapability.key === key) {\n return !!state.lastCapability.granted;\n }\n return false;\n}\n\n/** Host protocol version from last hostInfo, else client BRIDGE_VERSION. */\nfunction hostVersion() {\n return (\n (state.hostInfo &&\n (state.hostInfo.host_version || state.hostInfo.version)) ||\n BRIDGE_VERSION\n );\n}\n\n/**\n * Subscribe to a host push event (theme.changed, user.updated, \u2026).\n * Use name `*` for all events: handler receives `{ name, detail }`.\n * @param {string} name\n * @param {(detail: object) => void} handler\n * @returns {() => void} unsubscribe\n */\nfunction on(name, handler) {\n if (!name || typeof handler !== 'function') {\n return () => {};\n }\n if (!eventHandlers.has(name)) {\n eventHandlers.set(name, new Set());\n }\n eventHandlers.get(name).add(handler);\n return () => off(name, handler);\n}\n\nfunction off(name, handler) {\n const set = eventHandlers.get(name);\n if (!set) {\n return;\n }\n set.delete(handler);\n if (set.size === 0) {\n eventHandlers.delete(name);\n }\n}\n\n/**\n * Navigate inside the WebView (path under mini-app origin, or allowlisted url).\n * @param {{ path?: string, url?: string, timeoutMs?: number }} [options]\n * @returns {Promise<{ ok: boolean, reason?: string }>}\n */\nfunction navigate(options = {}) {\n const requestId = nextRequestId();\n const promise = trackRequest({requestId, timeoutMs: options.timeoutMs});\n postToHost({\n type: BRIDGE.NAVIGATE,\n requestId,\n path: options.path,\n url: options.url,\n });\n if (!detectHost()) {\n settlePending(requestId, {ok: false, reason: 'no_host'});\n }\n return promise;\n}\n\n/**\n * Start a host-mediated payment.\n *\n * Callback mode (default): await / onResult \u2192 host posts chooga.payments.result.\n * Redirect mode: `{ deliverResult: false, return_url? }` \u2192 host navigates with query params.\n *\n * @param {object} [options]\n * @param {function} [options.onResult]\n * @param {boolean} [options.deliverResult] default true\n * @param {string} [options.return_url]\n * @param {string|number} [options.amount]\n * @param {string} [options.currency]\n * @param {string} [options.reference]\n * @param {string} [options.description]\n * @param {object} [options.params]\n * @param {object} [options.metadata]\n * @param {number} [options.timeoutMs]\n * @returns {Promise<object>}\n */\nfunction initiatePayment(options = {}) {\n const requestId = nextRequestId();\n const deliverResult = options.deliverResult !== false;\n const {onResult, timeoutMs, ...rest} = options;\n\n if (deliverResult) {\n const promise = trackRequest({requestId, onResult, timeoutMs});\n postToHost({\n type: BRIDGE.PAYMENTS_INITIATE,\n requestId,\n deliverResult: true,\n ...rest,\n });\n if (!detectHost()) {\n settlePending(requestId, {\n ok: false,\n status: 'error',\n reason: 'no_host',\n });\n }\n return promise;\n }\n\n // Redirect mode \u2014 no Promise settlement from the host\n postToHost({\n type: BRIDGE.PAYMENTS_INITIATE,\n requestId,\n deliverResult: false,\n ...rest,\n });\n return Promise.resolve({ok: true, status: 'redirecting'});\n}\n\n/**\n * Generic RPC into the host method map (navigate, payments.initiate, activity, \u2026).\n * Prefer dedicated helpers when available.\n *\n * @param {string} method\n * @param {object} [params]\n * @param {{ onResult?: function, timeoutMs?: number }} [options]\n * @returns {Promise<object>}\n */\nfunction call(method, params = {}, options = {}) {\n const requestId = nextRequestId();\n const promise = trackRequest({\n requestId,\n onResult: options.onResult,\n timeoutMs: options.timeoutMs,\n });\n postToHost({\n type: BRIDGE.CALL,\n requestId,\n method,\n params,\n });\n if (!detectHost()) {\n settlePending(requestId, {ok: false, reason: 'no_host'});\n }\n return promise;\n}\n\n/**\n * Subscribe to state changes. Invokes listener immediately with current state.\n * @param {(state: object) => void} listener\n * @returns {() => void} unsubscribe\n */\nfunction subscribe(listener) {\n if (typeof listener !== 'function') {\n return () => {};\n }\n listeners.add(listener);\n listener(getState());\n return () => listeners.delete(listener);\n}\n\n// \u2500\u2500\u2500 Public surface \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst payments = {\n /** @see initiatePayment */\n initiate: initiatePayment,\n};\n\nconst progress = {\n show: showProgress,\n dismiss: dismissProgress,\n};\n\nconst user = {\n get: getUser,\n};\n\nconst ChoogaBridge = {\n BRIDGE,\n BRIDGE_VERSION,\n init,\n ready,\n close,\n openExternal,\n requestCapability,\n showProgress,\n dismissProgress,\n toast,\n activity,\n getUser,\n getHostInfo,\n has,\n hostVersion,\n on,\n off,\n navigate,\n call,\n payments,\n progress,\n user,\n subscribe,\n getState,\n /** @deprecated Prefer getState() */\n get state() {\n return getState();\n },\n};\n\n// CDN / IIFE builds also assign the global (footer in build.js reinforces this)\nif (typeof window !== 'undefined') {\n window.ChoogaBridge = ChoogaBridge;\n}\n\nexport {ChoogaBridge};\nexport default ChoogaBridge;\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,56 @@
1
+ export declare const BRIDGE: Record<string, string>;
2
+ export declare const BRIDGE_VERSION: string;
3
+
4
+ export interface ChoogaBridgeState {
5
+ hostConnected: boolean;
6
+ readySent: boolean;
7
+ session: { token: string | null; expires_at: string | null } | null;
8
+ user: unknown;
9
+ theme: { mode: string; primary_color: string | null } | null;
10
+ safeArea: unknown;
11
+ hostInfo: Record<string, unknown> | null;
12
+ lastCapability: { key: string; granted: boolean; reason: string | null } | null;
13
+ lastPayment: Record<string, unknown> | null;
14
+ lastActivity: Record<string, unknown> | null;
15
+ lastEvent: { name: string; detail: unknown; at: string } | null;
16
+ lastMessage: unknown;
17
+ }
18
+
19
+ export interface ChoogaBridgeApi {
20
+ BRIDGE: typeof BRIDGE;
21
+ BRIDGE_VERSION: string;
22
+ init(options?: { autoReady?: boolean }): ChoogaBridgeApi;
23
+ ready(): void;
24
+ close(): void;
25
+ openExternal(url: string): void;
26
+ requestCapability(key: string): void;
27
+ showProgress(options?: { title?: string; message?: string } | string): void;
28
+ dismissProgress(): void;
29
+ toast(message: string | { message?: string; text?: string; tone?: string }, tone?: string): void;
30
+ activity(name: string, params?: object, options?: { onResult?: (r: unknown) => void; timeoutMs?: number }): Promise<Record<string, unknown>>;
31
+ getUser(options?: { onResult?: (r: unknown) => void; timeoutMs?: number }): Promise<Record<string, unknown>>;
32
+ getHostInfo(options?: { onResult?: (r: unknown) => void; timeoutMs?: number }): Promise<Record<string, unknown>>;
33
+ has(key: string): boolean;
34
+ hostVersion(): string;
35
+ on(name: string, handler: (detail: unknown) => void): () => void;
36
+ off(name: string, handler: (detail: unknown) => void): void;
37
+ navigate(options?: { path?: string; url?: string; timeoutMs?: number }): Promise<Record<string, unknown>>;
38
+ call(method: string, params?: object, options?: { onResult?: (r: unknown) => void; timeoutMs?: number }): Promise<Record<string, unknown>>;
39
+ payments: {
40
+ initiate(options?: Record<string, unknown> & { onResult?: (r: unknown) => void }): Promise<Record<string, unknown>>;
41
+ };
42
+ progress: {
43
+ show(options?: { title?: string; message?: string } | string): void;
44
+ dismiss(): void;
45
+ };
46
+ user: {
47
+ get(options?: { onResult?: (r: unknown) => void; timeoutMs?: number }): Promise<Record<string, unknown>>;
48
+ };
49
+ subscribe(listener: (state: ChoogaBridgeState) => void): () => void;
50
+ getState(): ChoogaBridgeState;
51
+ readonly state: ChoogaBridgeState;
52
+ }
53
+
54
+ declare const ChoogaBridge: ChoogaBridgeApi;
55
+ export { ChoogaBridge, BRIDGE_VERSION };
56
+ export default ChoogaBridge;