@jetezra/bridge 0.0.1 → 0.0.2
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/CHANGELOG.md +16 -0
- package/README.md +410 -97
- package/dist/chooga-bridge.cjs +311 -20
- package/dist/chooga-bridge.cjs.map +2 -2
- package/dist/chooga-bridge.d.ts +44 -11
- package/dist/chooga-bridge.min.js +1 -1
- package/dist/chooga-bridge.min.js.map +3 -3
- package/dist/chooga-bridge.mjs +311 -20
- package/dist/chooga-bridge.mjs.map +2 -2
- package/package.json +3 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
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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",
|
|
4
|
+
"sourcesContent": ["/**\n * @jetezra/bridge \u2014 mini-app client for Chooga 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({ debug?, allowedOrigins?, autoReady? })\n * 2. Host injects session/user/theme/safeArea/hostInfo + optional params\n * 3. Mini-app calls activity / services / navigate / payments\n *\n * Outside a WebView, use mockHost() for local demos, or hostConnected stays false.\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 /** Open bag of host-defined fields for getState() / subscribe. */\n PARAMS: 'chooga.params',\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 = '0.0.2';\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/**\n * Keys reserved on getState() snapshots. Host `params` with these names are\n * still available under `state.params` but do not overwrite the reserved fields.\n */\nconst RESERVED_STATE_KEYS = new Set([\n 'hostConnected',\n 'readySent',\n 'session',\n 'user',\n 'theme',\n 'safeArea',\n 'hostInfo',\n 'params',\n 'lastCapability',\n 'lastPayment',\n 'lastActivity',\n 'lastEvent',\n 'lastMessage',\n]);\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 /** Host-defined open bag \u2014 any keys the host wants the mini-app to see. */\n params: {},\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 / requestCapability Promise APIs.\n */\nconst pending = new Map();\n\nlet requestSeq = 0;\nlet initialized = false;\nlet debugEnabled = false;\n/** @type {string[]|null} null = allow all origins (typical for RN WebView). */\nlet allowedOrigins = null;\nlet mockHostActive = 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\nfunction logDebug(direction, payload) {\n if (!debugEnabled) {\n return;\n }\n const label =\n direction === 'out' ? '[ChoogaBridge \u2192 host]' : '[ChoogaBridge \u2190 host]';\n try {\n // eslint-disable-next-line no-console\n console.log(label, payload);\n } catch (_) {\n /* ignore console failures */\n }\n}\n\nfunction logWarn(message, detail) {\n if (!debugEnabled) {\n return;\n }\n try {\n // eslint-disable-next-line no-console\n console.warn('[ChoogaBridge]', message, detail);\n } catch (_) {\n /* ignore */\n }\n}\n\n/**\n * Apply a host params update.\n * - `{ type, params: { \u2026 } }` uses the nested object\n * - `{ type, locale, cartCount, \u2026 }` uses top-level fields (minus type/replace)\n * - `replace: true` replaces the bag; otherwise shallow-merges\n * - Set a key to `null` to remove it on merge\n */\nfunction applyHostParams(msg) {\n const {type: _t, replace, params: nested, ...rest} = msg || {};\n const incoming =\n nested && typeof nested === 'object' && !Array.isArray(nested)\n ? {...nested}\n : {...rest};\n\n if (replace) {\n state.params = incoming;\n return;\n }\n\n const next = {...state.params};\n Object.keys(incoming).forEach(key => {\n if (incoming[key] === null) {\n delete next[key];\n } else {\n next[key] = incoming[key];\n }\n });\n state.params = next;\n}\n\n/**\n * Snapshot of public state (never expose mutable internals).\n *\n * Always includes the known fields. Also spreads host `params` onto the\n * top level (reserved keys win) so mini-apps can read host-specific fields\n * without a schema change in this package:\n *\n * const { session, locale, featureFlags } = ChoogaBridge.getState();\n * // or: ChoogaBridge.getState().params.locale\n */\nfunction getState() {\n const params = {...state.params};\n const known = {\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 params,\n lastCapability: state.lastCapability,\n lastPayment: state.lastPayment,\n lastActivity: state.lastActivity,\n lastEvent: state.lastEvent,\n lastMessage: state.lastMessage,\n };\n\n const extras = {};\n Object.keys(params).forEach(key => {\n if (!RESERVED_STATE_KEYS.has(key)) {\n extras[key] = params[key];\n }\n });\n\n return {...extras, ...known};\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 (or mockHost). */\nfunction detectHost() {\n if (mockHostActive) {\n return true;\n }\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 * unless mockHost() installed a ReactNativeWebView shim.\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 / mock). */\nfunction postToHost(msg) {\n logDebug('out', 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 logWarn('request timed out', {requestId, timeoutMs});\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 logWarn('ignored non-JSON host message', raw);\n return;\n }\n }\n if (!msg || typeof msg !== 'object' || !msg.type) {\n return;\n }\n\n logDebug('in', msg);\n\n state.hostConnected = true;\n state.lastMessage = msg;\n\n switch (msg.type) {\n case BRIDGE.SESSION: {\n const {type: _t, ...rest} = msg;\n state.session = {\n ...rest,\n token: rest.token != null ? rest.token : null,\n expires_at: rest.expires_at != null ? rest.expires_at : null,\n };\n break;\n }\n\n case BRIDGE.USER:\n state.user = msg.user != null ? msg.user : null;\n if (msg.requestId) {\n settlePending(msg.requestId, {ok: true, user: state.user});\n }\n break;\n\n case BRIDGE.THEME: {\n const {type: _t, ...rest} = msg;\n state.theme = {\n ...rest,\n mode: rest.mode || 'light',\n primary_color:\n rest.primary_color != null ? rest.primary_color : null,\n };\n applyTheme(state.theme);\n break;\n }\n\n case BRIDGE.SAFE_AREA: {\n if (msg.insets != null) {\n state.safeArea = msg.insets;\n } else {\n const {type: _t, ...rest} = msg;\n state.safeArea = Object.keys(rest).length ? rest : null;\n }\n break;\n }\n\n case BRIDGE.HOST_INFO: {\n const {type: _t, requestId, ...rest} = msg;\n state.hostInfo = rest;\n if (requestId) {\n settlePending(requestId, {ok: true, ...rest});\n }\n break;\n }\n\n case BRIDGE.PARAMS:\n applyHostParams(msg);\n break;\n\n case BRIDGE.CAPABILITY_RESULT: {\n const {type: _t, requestId, ...rest} = msg;\n const result = {\n ...rest,\n key: rest.key,\n granted: !!rest.granted,\n reason: rest.reason != null ? rest.reason : null,\n };\n state.lastCapability = result;\n // granted:false is a valid answer \u2014 do not reject the Promise.\n if (requestId) {\n settlePending(requestId, {ok: true, ...result});\n }\n break;\n }\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 logWarn('unknown host message type', msg.type);\n break;\n }\n\n notify();\n}\n\n/** window / document `message` event adapter (optional origin allowlist). */\nfunction onWindowMessage(event) {\n if (allowedOrigins && allowedOrigins.length > 0) {\n const origin = event && event.origin;\n const allowAll = allowedOrigins.indexOf('*') !== -1;\n const isOpaque =\n origin == null || origin === '' || origin === 'null';\n if (\n !allowAll &&\n !isOpaque &&\n allowedOrigins.indexOf(origin) === -1\n ) {\n logWarn('ignored message from disallowed origin', origin);\n return;\n }\n }\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 * Enable or disable bridge wire logging (also available via init({ debug })).\n * @param {boolean} enabled\n */\nfunction setDebug(enabled) {\n debugEnabled = !!enabled;\n return ChoogaBridge;\n}\n\n/**\n * Bind host listeners once. Safe to call repeatedly.\n * Re-calling still updates `debug` / `allowedOrigins`.\n *\n * @param {{\n * autoReady?: boolean,\n * debug?: boolean,\n * allowedOrigins?: string[],\n * }} [options]\n * @returns {typeof ChoogaBridge}\n */\nfunction init(options = {}) {\n if (options.debug != null) {\n debugEnabled = !!options.debug;\n }\n if (options.allowedOrigins != null) {\n allowedOrigins = Array.isArray(options.allowedOrigins)\n ? options.allowedOrigins.slice()\n : null;\n }\n\n if (initialized) {\n logDebug('out', {note: 'init() already called \u2014 updated debug/allowedOrigins only'});\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 (debugEnabled) {\n logDebug('out', {\n note: 'bridge initialized',\n version: BRIDGE_VERSION,\n hostConnected: state.hostConnected,\n allowedOrigins,\n });\n }\n\n if (options.autoReady !== false) {\n ready();\n }\n\n notify();\n return ChoogaBridge;\n}\n\n/**\n * Install a fake host for browser demos / local development.\n * Call before `init()` (or use `init({ autoReady: false })` then `ready()`).\n *\n * @param {{\n * delayMs?: number,\n * context?: {\n * session?: object,\n * user?: object,\n * theme?: object,\n * params?: object,\n * activities?: string[],\n * capabilities?: string[],\n * granted?: string[],\n * },\n * onMessage?: (msg: object, reply: (msg: object) => void) => void,\n * }} [options]\n */\nfunction mockHost(options = {}) {\n if (typeof window === 'undefined') {\n return ChoogaBridge;\n }\n\n ensureChoogaHostShim();\n mockHostActive = true;\n state.hostConnected = true;\n\n const delayMs = options.delayMs != null ? options.delayMs : 0;\n const context = options.context || {};\n\n function reply(msg) {\n const run = () => handleHostMessage(msg);\n if (delayMs > 0) {\n setTimeout(run, delayMs);\n } else {\n run();\n }\n }\n\n window.ReactNativeWebView = {\n postMessage(payload) {\n let msg = payload;\n if (typeof payload === 'string') {\n try {\n msg = JSON.parse(payload);\n } catch (_) {\n return;\n }\n }\n if (!msg || typeof msg !== 'object') {\n return;\n }\n\n if (typeof options.onMessage === 'function') {\n options.onMessage(msg, reply);\n return;\n }\n\n switch (msg.type) {\n case BRIDGE.READY:\n reply({\n type: BRIDGE.SESSION,\n token: 'mock-token',\n expires_at: null,\n ...(context.session || {}),\n });\n reply({\n type: BRIDGE.USER,\n user: context.user || {id: 'mock-user', name: 'Demo User'},\n });\n reply({\n type: BRIDGE.THEME,\n mode: 'light',\n primary_color: null,\n ...(context.theme || {}),\n });\n if (context.params) {\n reply({\n type: BRIDGE.PARAMS,\n replace: true,\n params: context.params,\n });\n }\n reply({\n type: BRIDGE.HOST_INFO,\n version: BRIDGE_VERSION,\n host_version: BRIDGE_VERSION,\n activities: context.activities || ['wallet.pick', 'host.confirm'],\n capabilities: context.capabilities || ['payments'],\n granted: context.granted || ['payments'],\n });\n break;\n\n case BRIDGE.ACTIVITY:\n reply({\n type: BRIDGE.ACTIVITY_RESULT,\n requestId: msg.requestId,\n ok: true,\n name: msg.name,\n mock: true,\n ...(msg.params || {}),\n });\n break;\n\n case BRIDGE.CALL:\n reply({\n type: BRIDGE.CALL_RESULT,\n requestId: msg.requestId,\n ok: true,\n method: msg.method,\n mock: true,\n ...(msg.params || {}),\n });\n break;\n\n case BRIDGE.NAVIGATE:\n reply({\n type: BRIDGE.NAVIGATE_RESULT,\n requestId: msg.requestId,\n ok: true,\n reason: null,\n });\n break;\n\n case BRIDGE.USER_GET:\n reply({\n type: BRIDGE.USER,\n requestId: msg.requestId,\n user: context.user || {id: 'mock-user', name: 'Demo User'},\n });\n break;\n\n case BRIDGE.HOST_INFO_GET:\n reply({\n type: BRIDGE.HOST_INFO,\n requestId: msg.requestId,\n version: BRIDGE_VERSION,\n host_version: BRIDGE_VERSION,\n activities: context.activities || ['wallet.pick', 'host.confirm'],\n capabilities: context.capabilities || ['payments'],\n granted: context.granted || ['payments'],\n });\n break;\n\n case BRIDGE.REQUEST_CAPABILITY:\n reply({\n type: BRIDGE.CAPABILITY_RESULT,\n requestId: msg.requestId,\n key: msg.key,\n granted: true,\n reason: null,\n });\n break;\n\n case BRIDGE.PAYMENTS_INITIATE:\n if (msg.deliverResult === false) {\n break;\n }\n reply({\n type: BRIDGE.PAYMENTS_RESULT,\n requestId: msg.requestId,\n ok: true,\n status: 'succeeded',\n reference: msg.reference || null,\n mock: true,\n });\n break;\n\n default:\n break;\n }\n },\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/**\n * Ask whether a permission key is granted.\n * Awaits `chooga.capabilityResult` (same requestId). `granted: false` still resolves.\n *\n * @param {string} key\n * @param {{ onResult?: function, timeoutMs?: number }} [options]\n * @returns {Promise<{ ok: boolean, key: string, granted: boolean, reason?: string|null }>}\n */\nfunction requestCapability(key, options = {}) {\n const requestId = nextRequestId();\n const promise = trackRequest({\n requestId,\n onResult: options.onResult,\n timeoutMs: options.timeoutMs != null ? options.timeoutMs : 30000,\n });\n postToHost({type: BRIDGE.REQUEST_CAPABILITY, requestId, key});\n if (!detectHost()) {\n settlePending(requestId, {ok: false, key, granted: false, reason: 'no_host'});\n }\n return promise;\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 * Requires the host to advertise the activity (see hostInfo / has()).\n *\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, onResult?: function }} [options]\n * @returns {Promise<{ ok: boolean, reason?: string }>}\n */\nfunction navigate(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.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 * Requires host capability `payments` (check has('payments') / hostInfo).\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. Requires a host that implements the method.\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 setDebug,\n mockHost,\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
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jetezra/bridge",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2",
|
|
4
4
|
"description": "Chooga mini-app bridge client for host WebViews (npm + CDN)",
|
|
5
5
|
"main": "./dist/chooga-bridge.cjs",
|
|
6
6
|
"module": "./dist/chooga-bridge.mjs",
|
|
@@ -20,11 +20,12 @@
|
|
|
20
20
|
"files": [
|
|
21
21
|
"dist",
|
|
22
22
|
"README.md",
|
|
23
|
+
"CHANGELOG.md",
|
|
23
24
|
"LICENSE"
|
|
24
25
|
],
|
|
25
26
|
"scripts": {
|
|
26
27
|
"build": "node ./scripts/build.js",
|
|
27
|
-
"test": "node ./scripts/verify-dist.js",
|
|
28
|
+
"test": "node ./scripts/verify-dist.js && node ./scripts/test-bridge.js",
|
|
28
29
|
"prepublishOnly": "npm run build && npm test",
|
|
29
30
|
"check-version": "node ./scripts/check-version.js",
|
|
30
31
|
"wait-cdn": "node ./scripts/wait-cdn.js"
|