@cloudparse/up-miniapps-sdk 0.1.4 → 0.1.6
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/README.md +0 -1
- package/dist/index.browser.min.js +1 -1
- package/dist/index.browser.min.js.map +1 -1
- package/dist/index.d.mts +33 -46
- package/dist/index.d.ts +33 -46
- package/dist/index.js +127 -96
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +127 -96
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -53,7 +53,6 @@ Local SQLite Storage and Hardware-level Secure Storage (Keychain/Keystore). Data
|
|
|
53
53
|
<details>
|
|
54
54
|
<summary><b>👤 User & Identity</b></summary>
|
|
55
55
|
|
|
56
|
-
- `sdk.user.getIdentityToken(scopes?: string[]): Promise<string>` - Fetch a short-lived Scoped Identity Token (JWT) signed by UP Hub.
|
|
57
56
|
- `sdk.user.getProfile(fields?: string[]): Promise<Partial<UserProfile>>` - Fetch user profile data (e.g., `fullName`, `username`).
|
|
58
57
|
|
|
59
58
|
</details>
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var MiniAppSDK=(()=>{var
|
|
1
|
+
"use strict";var MiniAppSDK=(()=>{var c=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var h=(n,e)=>{for(var t in e)c(n,t,{get:e[t],enumerable:!0})},I=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of y(e))!T.call(n,r)&&r!==t&&c(n,r,{get:()=>e[r],enumerable:!(i=m(e,r))||i.enumerable});return n};var E=n=>I(c({},"__esModule",{value:!0}),n);var O={};h(O,{MiniAppSDK:()=>d,UIEvent:()=>b,default:()=>w,sdk:()=>l});var a=class{callbacks=new Map;eventListeners=new Map;constructor(){if(typeof window<"u"){let e=Object.freeze({onNativeMessage:t=>this.handleNativeMessage(t)});Object.defineProperty(window,"__MiniAppBridge",{configurable:!1,value:e,writable:!1}),window.addEventListener("message",t=>{if(t.data)try{let i=typeof t.data=="string"?JSON.parse(t.data):t.data;i&&typeof i=="object"&&(i.callbackId||i.event)&&this.handleNativeMessage(i)}catch{}})}}on(e,t){let i=this.eventListeners.get(e);return i||(i=[],this.eventListeners.set(e,i)),i.push(t),()=>this.off(e,t)}off(e,t){let i=this.eventListeners.get(e);i&&this.eventListeners.set(e,i.filter(r=>r!==t))}send(e,t,i=3e4){return new Promise((r,o)=>{let s=`${e}_${Date.now()}_${Math.random().toString(36).substring(2,9)}`,u=setTimeout(()=>{this.callbacks.has(s)&&(this.callbacks.delete(s),o(new Error(`Bridge request timeout: ${e}`)))},i);this.callbacks.set(s,{reject:o,resolve:r,timeout:u});let f={callbackId:s,payload:t,type:e},g=window;g.ReactNativeWebView?.postMessage?g.ReactNativeWebView.postMessage(JSON.stringify(f)):(clearTimeout(u),this.callbacks.delete(s),o(new Error("Bridge not available")))})}handleNativeMessage(e){if(!e||typeof e!="object")return;let t=e.callbackId;if(t&&typeof t=="string"){let r=this.callbacks.get(t);if(r){clearTimeout(r.timeout);let{resolve:o,reject:s}=r;e.success===!1||e.error?s(e.error||"Unknown error"):o(e.value??e.payload??e),this.callbacks.delete(t);return}}let i=e.event;if(i&&typeof i=="string"){let r=this.eventListeners.get(i);if(r)for(let o of r)try{o(e.payload||e.value)}catch(s){console.error(`Error in event listener for ${i}:`,s)}}}};function p(n){let e=Object.getOwnPropertyNames(n);for(let t of e){let i=n[t];i&&typeof i=="object"&&!Object.isFrozen(i)&&!(i instanceof a)&&p(i)}return Object.freeze(n)}var d=class{bridge;storage=Object.freeze({get:e=>this.bridge.send("STORAGE_GET",{key:e}),getAll:()=>this.bridge.send("STORAGE_GET_ALL"),set:(e,t)=>this.bridge.send("STORAGE_SET",{key:e,value:t})});secureStore=Object.freeze({get:e=>this.bridge.send("SECURE_GET",{key:e}),set:(e,t)=>this.bridge.send("SECURE_SET",{key:e,value:t})});database=Object.freeze({getUserData:()=>this.bridge.send("DATABASE_GET_USER_DATA"),setUserData:e=>this.bridge.send("DATABASE_SET_USER_DATA",{data:e})});location=Object.freeze({getCurrentPosition:()=>this.bridge.send("GET_LOCATION")});user=Object.freeze({getProfile:e=>this.bridge.send("GET_USER_PROFILE",{fields:e})});permission=Object.freeze({request:((e,t)=>this.bridge.send("REQUEST_PERMISSION",{fields:t,type:e}))});payment=Object.freeze({request:e=>this.bridge.send("PAYMENT_REQUEST",e)});activity=Object.freeze({start:(e,t,i)=>this.bridge.send("START_ACTIVITY",{id:e,status:i,title:t})});haptic=Object.freeze({trigger:e=>this.bridge.send("TRIGGER_HAPTIC",{style:e})});network=Object.freeze({request:e=>this.bridge.send("NETWORK_REQUEST",e)});fidelity=Object.freeze({getFidelityBalance:()=>this.bridge.send("GET_FIDELITY_BALANCE"),getFidelityHistory:e=>this.bridge.send("GET_FIDELITY_HISTORY",e),spendFPoints:e=>this.bridge.send("SPEND_FPOINTS",{intentUuid:e})});ui=Object.freeze({exit:()=>this.bridge.send("EXIT"),setScrollConfig:e=>this.bridge.send("SET_SCROLL_CONFIG",e)});debug=Object.freeze({log:(...e)=>this.bridge.send("DEBUG_LOG",{message:e})});constructor(){this.bridge=new a,this.initialize=this.initialize.bind(this),this.on=this.on.bind(this),this.off=this.off.bind(this)}initialize(e){return this.bridge.send("INITIALIZE",e)}on(e,t){return this.bridge.on(e,t)}off(e,t){this.bridge.off(e,t)}},l=p(new d);var b=(t=>(t.TOP_SCROLL_MORE="TOP_SCROLL_MORE",t.BOTTOM_SCROLL_MORE="BOTTOM_SCROLL_MORE",t))(b||{});var w=l;return E(O);})();
|
|
2
2
|
//# sourceMappingURL=index.browser.min.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/bridge.ts","../src/sdk.ts","../src/types/types.ts"],"sourcesContent":["export { MiniAppSDK, sdk } from \"@miniapps-sdk/sdk\";\nexport * from \"@miniapps-sdk/types\";\n\nimport { sdk } from \"@miniapps-sdk/sdk\";\nexport default sdk;\n","import type { IBridgeEnvelope } from \"@miniapps-sdk/types\";\n\n/**\n * The Bridge handles low-level communication between the Mini-App WebView\n * and the Native Host Shell (iOS/Android).\n *\n * It manages asynchronous request-response cycles via callbacks and\n * supports subscription to pushed events from the native environment.\n */\nexport class Bridge {\n private callbacks: Record<\n string,\n { resolve: (val: unknown) => void; reject: (err: unknown) => void }\n > = {};\n private eventListeners: Record<string, ((data: unknown) => void)[]> = {};\n\n /**\n * Registers a global listener for messages coming from the native shell.\n * Also listens for standard browser `message` events to support multiple\n * communication channels (e.g., React Native WebView postMessage).\n */\n constructor() {\n if (typeof window !== \"undefined\") {\n // Set up the global bridge receiver for React Native WebView\n (window as unknown as { __MiniAppBridge: unknown }).__MiniAppBridge = {\n onNativeMessage: (envelope: IBridgeEnvelope) =>\n this.handleNativeMessage(envelope),\n };\n\n // Also listen for postMessage events\n window.addEventListener(\"message\", (event) => {\n try {\n const data =\n typeof event.data === \"string\"\n ? JSON.parse(event.data)\n : event.data;\n this.handleNativeMessage(data);\n } catch (_e) {\n // Ignore non-JSON messages\n }\n });\n }\n }\n\n /**\n * Internal handler for all incoming messages from the native shell.\n * Matches incoming payloads to either pending callbacks or event listeners.\n *\n * @internal\n * @param envelope The message envelope received from native code.\n */\n private handleNativeMessage(envelope: IBridgeEnvelope) {\n if (!envelope || typeof envelope !== \"object\") return;\n\n // 1. Handle Response Callbacks\n if (\n envelope.callbackId &&\n typeof envelope.callbackId === \"string\" &&\n this.callbacks[envelope.callbackId]\n ) {\n const { callbackId } = envelope;\n const { resolve, reject } = this.callbacks[callbackId];\n\n if (envelope.success === false || envelope.error) {\n reject(envelope.error || \"Unknown error\");\n } else {\n resolve(envelope.value ?? envelope.payload ?? envelope);\n }\n\n delete this.callbacks[callbackId];\n return;\n }\n\n // 2. Handle Pushed Events\n if (envelope.event && typeof envelope.event === \"string\") {\n const listeners = this.eventListeners[envelope.event];\n if (listeners) {\n for (const listener of listeners) {\n try {\n listener(envelope.payload || envelope.value);\n } catch (e) {\n console.error(`Error in event listener for ${envelope.event}:`, e);\n }\n }\n }\n }\n }\n\n /**\n * Subscribes to a pushed event from the native shell.\n *\n * @param event The event name to listen for.\n * @param callback Function to execute when the event occurs.\n * @returns An unsubscription function.\n */\n public on(event: string, callback: (data: unknown) => void) {\n if (!this.eventListeners[event]) {\n this.eventListeners[event] = [];\n }\n this.eventListeners[event].push(callback);\n return () => this.off(event, callback);\n }\n\n /**\n * Unsubscribes a specific callback from an event.\n *\n * @param event The event name.\n * @param callback The callback function to remove.\n */\n public off(event: string, callback: (data: unknown) => void) {\n if (!this.eventListeners[event]) return;\n this.eventListeners[event] = this.eventListeners[event].filter(\n (cb) => cb !== callback,\n );\n }\n\n /**\n * Sends a message to the native shell and waits for a response.\n *\n * @template T The expected response type.\n * @param type The action type (e.g., \"GET_LOCATION\").\n * @param payload Data associated with the action.\n * @returns A promise that resolves with the native response.\n */\n public send<T = unknown>(type: string, payload?: unknown): Promise<T> {\n return new Promise((resolve, reject) => {\n const callbackId = `${type}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n this.callbacks[callbackId] = {\n reject,\n resolve: resolve as (val: unknown) => void,\n };\n\n const message = {\n callbackId,\n payload,\n type,\n };\n\n const win = window as unknown as {\n ReactNativeWebView?: { postMessage: (msg: string) => void };\n };\n\n if (win.ReactNativeWebView?.postMessage) {\n win.ReactNativeWebView.postMessage(JSON.stringify(message));\n } else {\n console.warn(\n \"UP Bridge not available. Are you running inside the UP Shell?\",\n );\n delete this.callbacks[callbackId];\n reject(new Error(\"Bridge not available\"));\n }\n });\n }\n}\n","import { Bridge } from \"@miniapps-sdk/bridge\";\nimport type {\n HapticStyleType,\n IFidelityBalance,\n IFidelityHistoryParams,\n IFidelityTransaction,\n IInitializationOptions,\n IInitializationResponse,\n ILocationData,\n INetworkOptions,\n INetworkResponse,\n IPaymentRequest,\n IUserProfile,\n ScrollConfig,\n SDKEvent,\n} from \"@miniapps-sdk/types/types\";\n\n/**\n * Main SDK for UP Mini-Apps.\n * Provides access to native device features, storage, identity, and shell UI.\n */\nexport class MiniAppSDK {\n private bridge: Bridge;\n\n constructor() {\n this.bridge = new Bridge();\n }\n\n /**\n * The starting point for the Mini-App. Must be called before any other SDK methods.\n * @param options The options to provide to the shell app\n */\n public initialize(\n options: IInitializationOptions,\n ): Promise<IInitializationResponse> {\n return this.bridge.send(\"INITIALIZE\", options);\n }\n\n /**\n * Local SQLite Storage.\n * Data is persisted on the device and is isolated per Mini-App.\n */\n public storage = {\n /** Retrieves a value by key. */\n get: (key: string): Promise<string | null> =>\n this.bridge.send(\"STORAGE_GET\", { key }),\n /** Retrieves all key-value pairs stored for this Mini-App. */\n getAll: (): Promise<Record<string, string>> =>\n this.bridge.send(\"STORAGE_GET_ALL\"),\n /** Sets a value for a specific key. */\n set: (key: string, value: string): Promise<void> =>\n this.bridge.send(\"STORAGE_SET\", { key, value }),\n };\n\n /**\n * Hardware-level Secure Storage.\n * Data is stored in the device's secure enclave (Keychain/Keystore) and is isolated per Mini-App.\n */\n public secureStore = {\n /** Retrieves a value by key from secure storage. */\n get: (key: string): Promise<string | null> =>\n this.bridge.send(\"SECURE_GET\", { key }),\n /** Sets a value for a specific key in secure storage. */\n set: (key: string, value: string): Promise<void> =>\n this.bridge.send(\"SECURE_SET\", { key, value }),\n };\n\n /**\n * Database Storage.\n * Access to user-app specific persistent database storage.\n */\n public database = {\n /** Retrieves the user data stored in the backend database. */\n getUserData: <T = unknown>(): Promise<T> =>\n this.bridge.send<T>(\"DATABASE_GET_USER_DATA\"),\n /** Updates the user data stored in the backend database. */\n setUserData: <T = unknown>(data: T): Promise<void> =>\n this.bridge.send<void>(\"DATABASE_SET_USER_DATA\", { data }),\n };\n\n /**\n * Device Location services.\n */\n public location = {\n /** Retrieves the current GPS position of the device. */\n getCurrentPosition: (): Promise<ILocationData> =>\n this.bridge.send(\"GET_LOCATION\"),\n };\n\n /**\n * Identity & Profile management.\n */\n public user = {\n /**\n * Fetch a short-lived Scoped Identity Token (JWT).\n * This token is signed by the UP Hub and can be verified by your backend.\n * @param scopes Optional list of scopes requested (e.g., ['profile', 'email']).\n */\n getIdentityToken: (scopes?: string[]): Promise<string> =>\n this.bridge.send(\"GET_IDENTITY_TOKEN\", { scopes }),\n /**\n * Fetch user profile data.\n * @param fields Optional list of specific fields to retrieve (e.g., ['fullName', 'username']).\n */\n getProfile: <T extends keyof IUserProfile>(\n fields?: T[],\n ): Promise<Partial<IUserProfile>> =>\n this.bridge.send(\"GET_USER_PROFILE\", { fields }),\n };\n\n /**\n * Explicit Permission Management.\n * Allows requesting access to sensitive device features or user data.\n */\n public permission = {\n /**\n * Explicitly request access to sensitive data.\n * @param type The type of permission to request ('location' or 'profile').\n * @param fields If requesting 'profile', the specific fields required.\n */\n request: ((type: \"location\" | \"profile\", fields?: string[]) => {\n return this.bridge.send(\"REQUEST_PERMISSION\", { fields, type });\n }) as {\n (type: \"location\"): Promise<boolean>;\n (type: \"profile\", fields: (keyof IUserProfile)[]): Promise<boolean>;\n },\n };\n\n /**\n * Payments integration.\n */\n public payment = {\n /**\n * Triggers the native payment flow.\n * @param payload Amount, currency, and itemized list for the payment.\n */\n request: (\n payload: IPaymentRequest,\n ): Promise<{ success: true; transactionId: string }> =>\n this.bridge.send(\"PAYMENT_REQUEST\", payload),\n };\n\n /**\n * Live Activities & Notifications.\n * Allows the Mini-App to display real-time updates in the host shell.\n */\n public activity = {\n /**\n * Starts a new live activity.\n * @param id Unique identifier for the activity.\n * @param title Display title for the activity.\n * @param status Initial status message.\n */\n start: (id: string, title: string, status: string): Promise<void> =>\n this.bridge.send(\"START_ACTIVITY\", { id, status, title }),\n };\n\n /**\n * Haptic feedback.\n */\n public haptic = {\n /**\n * Triggers a haptic vibration on the device.\n * @param style The style of haptic feedback (e.g., 'light', 'medium', 'heavy', 'success', 'warning', 'error').\n */\n trigger: (style: HapticStyleType): Promise<void> =>\n this.bridge.send(\"TRIGGER_HAPTIC\", { style }),\n };\n\n /**\n * Network Proxy.\n * Allows the Mini-App to make network requests through the host shell to bypass CORS or use host-level authentication.\n */\n public network = {\n /**\n * Performs a network request via the host shell.\n * @param options Request method, URL, headers, and body.\n */\n request: (options: INetworkOptions): Promise<INetworkResponse> =>\n this.bridge.send(\"NETWORK_REQUEST\", options),\n };\n\n /**\n * Fidelity & Rewards program integration.\n */\n public fidelity = {\n /** Returns current fidelity balance. */\n getFidelityBalance: (): Promise<IFidelityBalance> =>\n this.bridge.send(\"GET_FIDELITY_BALANCE\"),\n /**\n * Retrieves fidelity transaction history.\n * @param params Filtering and pagination parameters.\n */\n getFidelityHistory: (\n params?: IFidelityHistoryParams,\n ): Promise<IFidelityTransaction[]> =>\n this.bridge.send(\"GET_FIDELITY_HISTORY\", params),\n /**\n * Authorize spending fidelity points (FPoints) via Two-Phase Authorization.\n * @param intentUuid UUID generated by your backend for the transaction.\n */\n spendFPoints: (\n intentUuid: string,\n ): Promise<{ success: boolean; transactionId: string }> =>\n this.bridge.send(\"SPEND_FPOINTS\", { intentUuid }),\n };\n\n /**\n * UI and Navigation controls.\n */\n public ui = {\n /** Closes the Mini-App and returns to the host shell. */\n exit: (): Promise<void> => this.bridge.send(\"EXIT\"),\n /**\n * Configures native scroll behaviors like Pull-to-Refresh and Infinite Scroll.\n * @param config Scroll configuration for top/bottom detection.\n */\n setScrollConfig: (config: ScrollConfig): Promise<void> =>\n this.bridge.send(\"SET_SCROLL_CONFIG\", config),\n };\n\n /**\n * Debug controls\n */\n public debug = {\n /**\n * Log to the shell app\n * @param message\n */\n log: (...message: unknown[]) => this.bridge.send(\"DEBUG_LOG\", { message }),\n };\n\n /**\n * Registers a callback for a specific event from the native shell.\n * @param event The name of the event to listen for.\n * @param callback The function to execute when the event is triggered.\n * @returns A function to unregister the listener.\n */\n public on(event: SDKEvent, callback: (data: unknown) => void) {\n return this.bridge.on(event as string, callback);\n }\n\n /**\n * Unregisters a previously registered event listener.\n * @param event The name of the event.\n * @param callback The callback function to remove.\n */\n public off(event: SDKEvent, callback: (data: unknown) => void) {\n this.bridge.off(event as string, callback);\n }\n}\n\n/**\n * Singleton instance of the MiniAppSDK.\n */\nexport const sdk = new MiniAppSDK();\n","/**\n * UP Mini-App SDK Types\n */\n\n/**\n * Represents the user's profile information.\n */\nexport interface IUserProfile {\n /** Unique identifier for the user. */\n uuid: string;\n /** Full legal name of the user. */\n fullName: string;\n /** Primary email address. */\n email: string;\n /** Chosen username within the UP ecosystem. */\n username: string;\n /** ISO country code (e.g., \"FR\", \"US\"). */\n countryCode: string;\n /** Phone number without country code. */\n localNumber: string;\n}\n\n/**\n * Geographic location data.\n */\nexport interface ILocationData {\n coords: {\n /** Latitude in decimal degrees. */\n latitude: number;\n /** Longitude in decimal degrees. */\n longitude: number;\n /** Altitude in meters above the WGS 84 reference ellipsoid, or null if not available. */\n altitude: number | null;\n /** Accuracy of the latitude and longitude properties in meters. */\n accuracy: number | null;\n /** Accuracy of the altitude property in meters. */\n altitudeAccuracy: number | null;\n /** The direction in which the device is traveling, in degrees (0-360). */\n heading: number | null;\n /** The velocity of the device in meters per second. */\n speed: number | null;\n };\n /** The time at which the location was retrieved (Unix timestamp). */\n timestamp: number;\n}\n\n/**\n * Request payload for triggering a payment flow.\n */\nexport interface IPaymentRequest {\n /** The specific amount to charge. */\n amount: number;\n /** ISO currency code (e.g., \"EUR\", \"USD\"). */\n currency: string;\n /** Total amount including taxes/fees. */\n total: number;\n /** Itemized breakdown of the purchase. */\n items: Array<{\n /** Name or description of the item. */\n item: string;\n /** Price per unit. */\n price?: number;\n /** Number of units. */\n quantity?: number;\n }>;\n}\n\n/**\n * Style of haptic feedback.\n */\nexport type HapticStyleType =\n | \"light\"\n | \"medium\"\n | \"heavy\"\n | \"rigid\"\n | \"soft\"\n | \"success\"\n | \"warning\"\n | \"error\";\n\n/**\n * Network Proxy Types\n */\n\n/**\n * The HTTP method to use as request method\n */\nexport type NetworkMethodType = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n\n/**\n * Configuration for network proxy requests.\n */\nexport interface INetworkOptions {\n /** Full URL for the request. */\n url: string;\n /** HTTP method to use. */\n method: NetworkMethodType;\n /** Request body for POST/PUT/PATCH. */\n body?: unknown;\n /** Custom HTTP headers. */\n headers?: Record<string, string>;\n}\n\n/**\n * Response from a network proxy request.\n */\nexport interface INetworkResponse<T = unknown> {\n /** HTTP status code. */\n status: number;\n /** Response data payload. */\n data: T;\n /** Response headers. */\n headers: Headers;\n}\n\n/**\n * Fidelity & Rewards Types\n */\n\n/**\n * Fidelity program balance information.\n */\nexport interface IFidelityBalance {\n /** Current point or currency balance. */\n balance: number;\n /** Name or symbol of the fidelity currency (e.g., \"FPoints\"). */\n currency: string;\n}\n\n/**\n * Parameters for retrieving fidelity transaction history.\n */\nexport interface IFidelityHistoryParams {\n /** Maximum number of records to return. */\n limit?: number;\n\n /** Cursor for pagination; null for the first page. */\n cursor?: string | null;\n}\n\n/** Type of transaction: credit (add) or debit (remove). */\nexport type FidelityTransactionTypeType = \"credit\" | \"debit\";\n\n/**\n * A single fidelity program transaction.\n */\nexport interface IFidelityTransaction {\n /** Unique identifier for the transaction. */\n id: string;\n /** Amount of the transaction. */\n amount: number;\n /** Human-readable description. */\n description: string;\n /** ISO 8601 date string. */\n date: string;\n /** Type of transaction */\n type: FidelityTransactionTypeType;\n}\n\n/**\n * The initialization options required to set up the Mini-App SDK.\n */\nexport type IInitializationOptions = {};\n\n/**\n * The post initialization response\n */\nexport interface IInitializationResponse<\n Env extends Record<string, unknown> = Record<string, unknown>,\n UserData extends Record<string, unknown> = Record<string, unknown>,\n Params extends Record<string, unknown> = Record<string, unknown>,\n> {\n /** The name of the mini app */\n name: string;\n /** The uuid of the mini app */\n uuid: string;\n /** The description of the mini app */\n description: string;\n /** The authors of the mini app */\n authors?: string;\n /** The current version in the registry */\n version?: string;\n /** The identity token got from the shell's backend */\n identityToken: string;\n /** The scoped profile based on the requested fields during initialization or the getUserProfile call */\n profile: Partial<IUserProfile | null>;\n /** The environment variables defined for the mini app in the shell's backend */\n env: Env;\n /** The user data passed during the initialization or the setUserData call */\n userData: UserData;\n /** The params passed during the initialization */\n params: Params;\n}\n\n/**\n * Events emitted by the UI module.\n */\nexport enum UIEvent {\n /** Triggered when the user performs a native \"Pull-to-Refresh\". */\n TOP_SCROLL_MORE = \"TOP_SCROLL_MORE\",\n /** Triggered when the user scrolls near the bottom of the page (within 200px threshold). */\n BOTTOM_SCROLL_MORE = \"BOTTOM_SCROLL_MORE\",\n}\n\n/**\n * Union type for all SDK events, allowing for both known enums and custom strings.\n * The (string & {}) pattern preserves IntelliSense for enum members.\n */\nexport type SDKEvent = UIEvent | (string & {});\n\n/**\n * Configuration for native scroll interactions managed by the Host Shell.\n */\nexport interface ScrollConfig {\n /** Configuration for Pull-to-Refresh (Top). */\n topScrollMore?: {\n /** Show/hide the native RefreshControl. */\n enabled: boolean;\n /** Set to true to show the loading spinner, false to hide it. */\n refreshing?: boolean;\n };\n /** Configuration for Infinite Scroll (Bottom). */\n bottomScrollMore?: {\n /** Enable/disable bottom scroll detection. */\n enabled: boolean;\n /** If false, detection stops and the indicator is hidden. */\n hasMore?: boolean;\n /** Set to true to show the bottom ActivityIndicator. */\n loadingMore?: boolean;\n };\n}\n"],"mappings":"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","names":["index_exports","__export","MiniAppSDK","UIEvent","index_default","sdk","Bridge","envelope","event","data","callbackId","resolve","reject","listeners","listener","e","callback","cb","type","payload","message","win","MiniAppSDK","Bridge","options","key","value","data","scopes","fields","type","payload","id","title","status","style","params","intentUuid","config","message","event","callback","sdk","UIEvent","index_default","sdk"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/bridge.ts","../src/sdk.ts","../src/types/types.ts"],"sourcesContent":["export { MiniAppSDK, sdk } from \"@miniapps-sdk/sdk\";\nexport * from \"@miniapps-sdk/types\";\n\nimport { sdk } from \"@miniapps-sdk/sdk\";\n\nexport default sdk;\n","import type { IBridgeEnvelope } from \"@miniapps-sdk/types\";\n\n/**\n * The Bridge handles low-level communication between the Mini-App WebView\n * and the Native Host Shell (iOS/Android).\n *\n * It manages asynchronous request-response cycles via callbacks and\n * supports subscription to pushed events from the native environment.\n */\nexport class Bridge {\n private callbacks = new Map<\n string,\n {\n resolve: (val: unknown) => void;\n reject: (err: unknown) => void;\n timeout: ReturnType<typeof setTimeout>;\n }\n >();\n private eventListeners = new Map<string, ((data: unknown) => void)[]>();\n\n /**\n * Registers a global listener for messages coming from the native shell.\n * Also listens for standard browser `message` events to support multiple\n * communication channels (e.g., React Native WebView postMessage).\n */\n constructor() {\n if (typeof window !== \"undefined\") {\n const bridgeReceiver = Object.freeze({\n onNativeMessage: (envelope: IBridgeEnvelope) =>\n this.handleNativeMessage(envelope),\n });\n\n // Use defineProperty to prevent re-assignment or deletion of the bridge\n Object.defineProperty(window, \"__MiniAppBridge\", {\n configurable: false,\n value: bridgeReceiver,\n writable: false,\n });\n\n window.addEventListener(\"message\", (event) => {\n // SECURITY: Filter events. If inside a mobile shell, the origin of native postMessage\n // varies by platform (e.g., file://, or specific app schemes).\n // For production, this should be restricted to the expected host origin.\n if (!event.data) return;\n\n try {\n const data =\n typeof event.data === \"string\"\n ? JSON.parse(event.data)\n : event.data;\n\n // SECURITY: Basic envelope validation\n if (\n data &&\n typeof data === \"object\" &&\n (data.callbackId || data.event)\n ) {\n this.handleNativeMessage(data);\n }\n } catch (_e) {\n // Ignore non-JSON or malformed messages\n }\n });\n }\n }\n\n /**\n * Subscribes to a pushed event from the native shell.\n *\n * @param event The event name to listen for.\n * @param callback Function to execute when the event occurs.\n * @returns An unsubscription function.\n */\n public on(event: string, callback: (data: unknown) => void) {\n let listeners = this.eventListeners.get(event);\n if (!listeners) {\n listeners = [];\n this.eventListeners.set(event, listeners);\n }\n listeners.push(callback);\n return () => this.off(event, callback);\n }\n\n /**\n * Unsubscribes a specific callback from an event.\n *\n * @param event The event name.\n * @param callback The callback function to remove.\n */\n public off(event: string, callback: (data: unknown) => void) {\n const listeners = this.eventListeners.get(event);\n if (!listeners) return;\n this.eventListeners.set(\n event,\n listeners.filter((cb) => cb !== callback),\n );\n }\n\n /**\n * Sends a message to the native shell and waits for a response.\n *\n * @template T The expected response type.\n * @param type The action type (e.g., \"GET_LOCATION\").\n * @param payload Data associated with the action.\n * @param timeoutMs Time in milliseconds to wait for a response before rejecting.\n * @returns A promise that resolves with the native response.\n */\n public send<T = unknown>(\n type: string,\n payload?: unknown,\n timeoutMs = 30000,\n ): Promise<T> {\n return new Promise((resolve, reject) => {\n const callbackId = `${type}_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n\n const timeout = setTimeout(() => {\n if (this.callbacks.has(callbackId)) {\n this.callbacks.delete(callbackId);\n reject(new Error(`Bridge request timeout: ${type}`));\n }\n }, timeoutMs);\n\n this.callbacks.set(callbackId, {\n reject,\n resolve: resolve as (val: unknown) => void,\n timeout,\n });\n\n const message = {\n callbackId,\n payload,\n type,\n };\n\n const win = window as unknown as {\n ReactNativeWebView?: { postMessage: (msg: string) => void };\n };\n\n if (win.ReactNativeWebView?.postMessage) {\n win.ReactNativeWebView.postMessage(JSON.stringify(message));\n } else {\n clearTimeout(timeout);\n this.callbacks.delete(callbackId);\n reject(new Error(\"Bridge not available\"));\n }\n });\n }\n\n /**\n * Internal handler for all incoming messages from the native shell.\n * Matches incoming payloads to either pending callbacks or event listeners.\n *\n * @internal\n * @param envelope The message envelope received from native code.\n */\n private handleNativeMessage(envelope: IBridgeEnvelope) {\n if (!envelope || typeof envelope !== \"object\") return;\n\n // 1. Handle Response Callbacks\n const callbackId = envelope.callbackId;\n if (callbackId && typeof callbackId === \"string\") {\n const callback = this.callbacks.get(callbackId);\n if (callback) {\n clearTimeout(callback.timeout);\n const { resolve, reject } = callback;\n\n if (envelope.success === false || envelope.error) {\n reject(envelope.error || \"Unknown error\");\n } else {\n resolve(envelope.value ?? envelope.payload ?? envelope);\n }\n\n this.callbacks.delete(callbackId);\n return;\n }\n }\n\n // 2. Handle Pushed Events\n const eventName = envelope.event;\n if (eventName && typeof eventName === \"string\") {\n const listeners = this.eventListeners.get(eventName);\n if (listeners) {\n for (const listener of listeners) {\n try {\n listener(envelope.payload || envelope.value);\n } catch (e) {\n console.error(`Error in event listener for ${eventName}:`, e);\n }\n }\n }\n }\n }\n}\n","import { Bridge } from \"@miniapps-sdk/bridge\";\nimport type {\n HapticStyleType,\n IFidelityBalance,\n IFidelityHistoryParams,\n IFidelityTransaction,\n IInitializationOptions,\n IInitializationResponse,\n ILocationData,\n INetworkOptions,\n INetworkResponse,\n IPaymentRequest,\n IUserProfile,\n ScrollConfig,\n SDKEvent,\n} from \"@miniapps-sdk/types/types\";\n\n/**\n * Deep freezes an object and its nested properties.\n * @param obj The object to freeze.\n * @returns The frozen object.\n */\nfunction deepFreeze<T extends object>(obj: T): T {\n // Retrieve the property names defined on obj\n const propNames = Object.getOwnPropertyNames(obj);\n\n // Freeze properties before freezing self\n for (const name of propNames) {\n const value = (obj as Record<string, unknown>)[name];\n\n if (\n value &&\n typeof value === \"object\" &&\n !Object.isFrozen(value) &&\n // Skip freezing of native objects or circular refs if any (though not expected here)\n !(value instanceof Bridge)\n ) {\n deepFreeze(value as object);\n }\n }\n\n return Object.freeze(obj);\n}\n\n/**\n * Main SDK for UP Mini-Apps.\n * Provides access to native device features, storage, identity, and shell UI.\n */\nexport class MiniAppSDK {\n private bridge: Bridge;\n /**\n * Local SQLite Storage.\n * Data is persisted on the device and is isolated per Mini-App.\n */\n public readonly storage = Object.freeze({\n /** Retrieves a value by key. */\n get: (key: string): Promise<string | null> =>\n this.bridge.send(\"STORAGE_GET\", { key }),\n /** Retrieves all key-value pairs stored for this Mini-App. */\n getAll: (): Promise<Record<string, string>> =>\n this.bridge.send(\"STORAGE_GET_ALL\"),\n /** Sets a value for a specific key. */\n set: (key: string, value: string): Promise<void> =>\n this.bridge.send(\"STORAGE_SET\", { key, value }),\n });\n /**\n * Hardware-level Secure Storage.\n * Data is stored in the device's secure enclave (Keychain/Keystore) and is isolated per Mini-App.\n */\n public readonly secureStore = Object.freeze({\n /** Retrieves a value by key from secure storage. */\n get: (key: string): Promise<string | null> =>\n this.bridge.send(\"SECURE_GET\", { key }),\n /** Sets a value for a specific key in secure storage. */\n set: (key: string, value: string): Promise<void> =>\n this.bridge.send(\"SECURE_SET\", { key, value }),\n });\n /**\n * Database Storage.\n * Access to user-app specific persistent database storage.\n */\n public readonly database = Object.freeze({\n /** Retrieves the user data stored in the backend database. */\n getUserData: <T = unknown>(): Promise<T> =>\n this.bridge.send<T>(\"DATABASE_GET_USER_DATA\"),\n /** Updates the user data stored in the backend database. */\n setUserData: <T = unknown>(data: T): Promise<void> =>\n this.bridge.send<void>(\"DATABASE_SET_USER_DATA\", { data }),\n });\n /**\n * Device Location services.\n */\n public readonly location = Object.freeze({\n /** Retrieves the current GPS position of the device. */\n getCurrentPosition: (): Promise<ILocationData> =>\n this.bridge.send(\"GET_LOCATION\"),\n });\n /**\n * Identity & Profile management.\n */\n public readonly user = Object.freeze({\n /**\n * Fetch user profile data.\n * @param fields Optional list of specific fields to retrieve (e.g., ['fullName', 'username']).\n */\n getProfile: <T extends keyof IUserProfile>(\n fields?: T[],\n ): Promise<Partial<IUserProfile>> =>\n this.bridge.send(\"GET_USER_PROFILE\", { fields }),\n });\n /**\n * Explicit Permission Management.\n * Allows requesting access to sensitive device features or user data.\n */\n public readonly permission = Object.freeze({\n /**\n * Explicitly request access to sensitive data.\n * @param type The type of permission to request ('location' or 'profile').\n * @param fields If requesting 'profile', the specific fields required.\n */\n request: ((type: \"location\" | \"profile\", fields?: string[]) => {\n return this.bridge.send(\"REQUEST_PERMISSION\", { fields, type });\n }) as {\n (type: \"location\"): Promise<boolean>;\n (type: \"profile\", fields: (keyof IUserProfile)[]): Promise<boolean>;\n },\n });\n /**\n * Payments integration.\n */\n public readonly payment = Object.freeze({\n /**\n * Triggers the native payment flow.\n * @param payload Amount, currency, and itemized list for the payment.\n */\n request: (\n payload: IPaymentRequest,\n ): Promise<{ success: true; transactionId: string }> =>\n this.bridge.send(\"PAYMENT_REQUEST\", payload),\n });\n /**\n * Live Activities & Notifications.\n * Allows the Mini-App to display real-time updates in the host shell.\n */\n public readonly activity = Object.freeze({\n /**\n * Starts a new live activity.\n * @param id Unique identifier for the activity.\n * @param title Display title for the activity.\n * @param status Initial status message.\n */\n start: (id: string, title: string, status: string): Promise<void> =>\n this.bridge.send(\"START_ACTIVITY\", { id, status, title }),\n });\n /**\n * Haptic feedback.\n */\n public readonly haptic = Object.freeze({\n /**\n * Triggers a haptic vibration on the device.\n * @param style The style of haptic feedback (e.g., 'light', 'medium', 'heavy', 'success', 'warning', 'error').\n */\n trigger: (style: HapticStyleType): Promise<void> =>\n this.bridge.send(\"TRIGGER_HAPTIC\", { style }),\n });\n /**\n * Network Proxy.\n * Allows the Mini-App to make network requests through the host shell to bypass CORS or use host-level authentication.\n */\n public readonly network = Object.freeze({\n /**\n * Performs a network request via the host shell.\n * @param options Request method, URL, headers, and body.\n */\n request: (options: INetworkOptions): Promise<INetworkResponse> =>\n this.bridge.send(\"NETWORK_REQUEST\", options),\n });\n /**\n * Fidelity & Rewards program integration.\n */\n public readonly fidelity = Object.freeze({\n /** Returns current fidelity balance. */\n getFidelityBalance: (): Promise<IFidelityBalance> =>\n this.bridge.send(\"GET_FIDELITY_BALANCE\"),\n /**\n * Retrieves fidelity transaction history.\n * @param params Filtering and pagination parameters.\n */\n getFidelityHistory: (\n params?: IFidelityHistoryParams,\n ): Promise<IFidelityTransaction[]> =>\n this.bridge.send(\"GET_FIDELITY_HISTORY\", params),\n /**\n * Authorize spending fidelity points (FPoints) via Two-Phase Authorization.\n * @param intentUuid UUID generated by your backend for the transaction.\n */\n spendFPoints: (\n intentUuid: string,\n ): Promise<{ success: boolean; transactionId: string }> =>\n this.bridge.send(\"SPEND_FPOINTS\", { intentUuid }),\n });\n /**\n * UI and Navigation controls.\n */\n public readonly ui = Object.freeze({\n /** Closes the Mini-App and returns to the host shell. */\n exit: (): Promise<void> => this.bridge.send(\"EXIT\"),\n /**\n * Configures native scroll behaviors like Pull-to-Refresh and Infinite Scroll.\n * @param config Scroll configuration for top/bottom detection.\n */\n setScrollConfig: (config: ScrollConfig): Promise<void> =>\n this.bridge.send(\"SET_SCROLL_CONFIG\", config),\n });\n /**\n * Debug controls\n */\n public readonly debug = Object.freeze({\n /**\n * Log to the shell app\n * @param message\n */\n log: (...message: unknown[]) => this.bridge.send(\"DEBUG_LOG\", { message }),\n });\n\n constructor() {\n this.bridge = new Bridge();\n\n // Bind methods to this instance to preserve context if pulled out\n this.initialize = this.initialize.bind(this);\n this.on = this.on.bind(this);\n this.off = this.off.bind(this);\n }\n\n /**\n * The starting point for the Mini-App. Must be called before any other SDK methods.\n * @param options The options to provide to the shell app\n */\n public initialize(\n options: IInitializationOptions,\n ): Promise<IInitializationResponse> {\n return this.bridge.send(\"INITIALIZE\", options);\n }\n\n /**\n * Registers a callback for a specific event from the native shell.\n * @param event The name of the event to listen for.\n * @param callback The function to execute when the event is triggered.\n * @returns A function to unregister the listener.\n */\n public on(event: SDKEvent, callback: (data: unknown) => void) {\n return this.bridge.on(event as string, callback);\n }\n\n /**\n * Unregisters a previously registered event listener.\n * @param event The name of the event.\n * @param callback The callback function to remove.\n */\n public off(event: SDKEvent, callback: (data: unknown) => void) {\n this.bridge.off(event as string, callback);\n }\n}\n\n/**\n * Singleton instance of the MiniAppSDK.\n * Frozen to prevent tampering.\n */\nexport const sdk = deepFreeze(new MiniAppSDK());\n","/**\n * UP Mini-App SDK Types\n */\n\n/**\n * Represents the user's profile information.\n */\nexport interface IUserProfile {\n /** Unique identifier for the user. */\n uuid: string;\n /** Full legal name of the user. */\n fullName: string;\n /** Primary email address. */\n email: string;\n /** Chosen username within the UP ecosystem. */\n username: string;\n /** ISO country code (e.g., \"FR\", \"US\"). */\n countryCode: string;\n /** Phone number without country code. */\n localNumber: string;\n}\n\n/**\n * Geographic location data.\n */\nexport interface ILocationData {\n coords: {\n /** Latitude in decimal degrees. */\n latitude: number;\n /** Longitude in decimal degrees. */\n longitude: number;\n /** Altitude in meters above the WGS 84 reference ellipsoid, or null if not available. */\n altitude: number | null;\n /** Accuracy of the latitude and longitude properties in meters. */\n accuracy: number | null;\n /** Accuracy of the altitude property in meters. */\n altitudeAccuracy: number | null;\n /** The direction in which the device is traveling, in degrees (0-360). */\n heading: number | null;\n /** The velocity of the device in meters per second. */\n speed: number | null;\n };\n /** The time at which the location was retrieved (Unix timestamp). */\n timestamp: number;\n}\n\n/**\n * Request payload for triggering a payment flow.\n */\nexport interface IPaymentRequest {\n /** The specific amount to charge. */\n amount: number;\n /** ISO currency code (e.g., \"EUR\", \"USD\"). */\n currency: string;\n /** Total amount including taxes/fees. */\n total: number;\n /** Itemized breakdown of the purchase. */\n items: Array<{\n /** Name or description of the item. */\n item: string;\n /** Price per unit. */\n price?: number;\n /** Number of units. */\n quantity?: number;\n }>;\n}\n\n/**\n * Style of haptic feedback.\n */\nexport type HapticStyleType =\n | \"light\"\n | \"medium\"\n | \"heavy\"\n | \"rigid\"\n | \"soft\"\n | \"success\"\n | \"warning\"\n | \"error\";\n\n/**\n * Network Proxy Types\n */\n\n/**\n * The HTTP method to use as request method\n */\nexport type NetworkMethodType = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n\n/**\n * Configuration for network proxy requests.\n */\nexport interface INetworkOptions {\n /** Full URL for the request. */\n url: string;\n /** HTTP method to use. */\n method: NetworkMethodType;\n /** Request body for POST/PUT/PATCH. */\n body?: unknown;\n /** Custom HTTP headers. */\n headers?: Record<string, string>;\n}\n\n/**\n * Response from a network proxy request.\n */\nexport interface INetworkResponse<T = unknown> {\n /** HTTP status code. */\n status: number;\n /** Response data payload. */\n data: T;\n /** Response headers. */\n headers: Headers;\n}\n\n/**\n * Fidelity & Rewards Types\n */\n\n/**\n * Fidelity program balance information.\n */\nexport interface IFidelityBalance {\n /** Current point or currency balance. */\n balance: number;\n /** Name or symbol of the fidelity currency (e.g., \"FPoints\"). */\n currency: string;\n}\n\n/**\n * Parameters for retrieving fidelity transaction history.\n */\nexport interface IFidelityHistoryParams {\n /** Maximum number of records to return. */\n limit?: number;\n\n /** Cursor for pagination; null for the first page. */\n cursor?: string | null;\n}\n\n/** Type of transaction: credit (add) or debit (remove). */\nexport type FidelityTransactionTypeType = \"credit\" | \"debit\";\n\n/**\n * A single fidelity program transaction.\n */\nexport interface IFidelityTransaction {\n /** Unique identifier for the transaction. */\n id: string;\n /** Amount of the transaction. */\n amount: number;\n /** Human-readable description. */\n description: string;\n /** ISO 8601 date string. */\n date: string;\n /** Type of transaction */\n type: FidelityTransactionTypeType;\n}\n\n/**\n * The initialization options required to set up the Mini-App SDK.\n */\nexport type IInitializationOptions = {};\n\n/**\n * The post initialization response\n */\nexport interface IInitializationResponse<\n Env extends Record<string, unknown> = Record<string, unknown>,\n UserData extends Record<string, unknown> = Record<string, unknown>,\n Params extends Record<string, unknown> = Record<string, unknown>,\n> {\n /** The name of the mini app */\n name: string;\n /** The uuid of the mini app */\n uuid: string;\n /** The description of the mini app */\n description: string;\n /** The authors of the mini app */\n authors?: string;\n /** The current version in the registry */\n version?: string;\n /** The scoped profile based on the requested fields during initialization or the getUserProfile call */\n profile: Partial<IUserProfile | null>;\n /** The environment variables defined for the mini app in the shell's backend */\n env: Env;\n /** The user data passed during the initialization or the setUserData call */\n userData: UserData;\n /** The params passed during the initialization */\n params: Params;\n}\n\n/**\n * Events emitted by the UI module.\n */\nexport enum UIEvent {\n /** Triggered when the user performs a native \"Pull-to-Refresh\". */\n TOP_SCROLL_MORE = \"TOP_SCROLL_MORE\",\n /** Triggered when the user scrolls near the bottom of the page (within 200px threshold). */\n BOTTOM_SCROLL_MORE = \"BOTTOM_SCROLL_MORE\",\n}\n\n/**\n * Union type for all SDK events, allowing for both known enums and custom strings.\n * The (string & {}) pattern preserves IntelliSense for enum members.\n */\nexport type SDKEvent = UIEvent | (string & {});\n\n/**\n * Configuration for native scroll interactions managed by the Host Shell.\n */\nexport interface ScrollConfig {\n /** Configuration for Pull-to-Refresh (Top). */\n topScrollMore?: {\n /** Show/hide the native RefreshControl. */\n enabled: boolean;\n /** Set to true to show the loading spinner, false to hide it. */\n refreshing?: boolean;\n };\n /** Configuration for Infinite Scroll (Bottom). */\n bottomScrollMore?: {\n /** Enable/disable bottom scroll detection. */\n enabled: boolean;\n /** If false, detection stops and the indicator is hidden. */\n hasMore?: boolean;\n /** Set to true to show the bottom ActivityIndicator. */\n loadingMore?: boolean;\n };\n}\n"],"mappings":"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","names":["index_exports","__export","MiniAppSDK","UIEvent","index_default","sdk","Bridge","bridgeReceiver","envelope","event","data","callback","listeners","cb","type","payload","timeoutMs","resolve","reject","callbackId","timeout","message","win","eventName","listener","e","deepFreeze","obj","propNames","name","value","Bridge","MiniAppSDK","key","data","fields","type","payload","id","title","status","style","options","params","intentUuid","config","message","event","callback","sdk","UIEvent","index_default","sdk"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -152,8 +152,6 @@ interface IInitializationResponse<Env extends Record<string, unknown> = Record<s
|
|
|
152
152
|
authors?: string;
|
|
153
153
|
/** The current version in the registry */
|
|
154
154
|
version?: string;
|
|
155
|
-
/** The identity token got from the shell's backend */
|
|
156
|
-
identityToken: string;
|
|
157
155
|
/** The scoped profile based on the requested fields during initialization or the getUserProfile call */
|
|
158
156
|
profile: Partial<IUserProfile | null>;
|
|
159
157
|
/** The environment variables defined for the mini app in the shell's backend */
|
|
@@ -205,72 +203,60 @@ interface ScrollConfig {
|
|
|
205
203
|
*/
|
|
206
204
|
declare class MiniAppSDK {
|
|
207
205
|
private bridge;
|
|
208
|
-
constructor();
|
|
209
|
-
/**
|
|
210
|
-
* The starting point for the Mini-App. Must be called before any other SDK methods.
|
|
211
|
-
* @param options The options to provide to the shell app
|
|
212
|
-
*/
|
|
213
|
-
initialize(options: IInitializationOptions): Promise<IInitializationResponse>;
|
|
214
206
|
/**
|
|
215
207
|
* Local SQLite Storage.
|
|
216
208
|
* Data is persisted on the device and is isolated per Mini-App.
|
|
217
209
|
*/
|
|
218
|
-
storage: {
|
|
210
|
+
readonly storage: Readonly<{
|
|
219
211
|
/** Retrieves a value by key. */
|
|
220
212
|
get: (key: string) => Promise<string | null>;
|
|
221
213
|
/** Retrieves all key-value pairs stored for this Mini-App. */
|
|
222
214
|
getAll: () => Promise<Record<string, string>>;
|
|
223
215
|
/** Sets a value for a specific key. */
|
|
224
216
|
set: (key: string, value: string) => Promise<void>;
|
|
225
|
-
}
|
|
217
|
+
}>;
|
|
226
218
|
/**
|
|
227
219
|
* Hardware-level Secure Storage.
|
|
228
220
|
* Data is stored in the device's secure enclave (Keychain/Keystore) and is isolated per Mini-App.
|
|
229
221
|
*/
|
|
230
|
-
secureStore: {
|
|
222
|
+
readonly secureStore: Readonly<{
|
|
231
223
|
/** Retrieves a value by key from secure storage. */
|
|
232
224
|
get: (key: string) => Promise<string | null>;
|
|
233
225
|
/** Sets a value for a specific key in secure storage. */
|
|
234
226
|
set: (key: string, value: string) => Promise<void>;
|
|
235
|
-
}
|
|
227
|
+
}>;
|
|
236
228
|
/**
|
|
237
229
|
* Database Storage.
|
|
238
230
|
* Access to user-app specific persistent database storage.
|
|
239
231
|
*/
|
|
240
|
-
database: {
|
|
232
|
+
readonly database: Readonly<{
|
|
241
233
|
/** Retrieves the user data stored in the backend database. */
|
|
242
234
|
getUserData: <T = unknown>() => Promise<T>;
|
|
243
235
|
/** Updates the user data stored in the backend database. */
|
|
244
236
|
setUserData: <T = unknown>(data: T) => Promise<void>;
|
|
245
|
-
}
|
|
237
|
+
}>;
|
|
246
238
|
/**
|
|
247
239
|
* Device Location services.
|
|
248
240
|
*/
|
|
249
|
-
location: {
|
|
241
|
+
readonly location: Readonly<{
|
|
250
242
|
/** Retrieves the current GPS position of the device. */
|
|
251
243
|
getCurrentPosition: () => Promise<ILocationData>;
|
|
252
|
-
}
|
|
244
|
+
}>;
|
|
253
245
|
/**
|
|
254
246
|
* Identity & Profile management.
|
|
255
247
|
*/
|
|
256
|
-
user: {
|
|
257
|
-
/**
|
|
258
|
-
* Fetch a short-lived Scoped Identity Token (JWT).
|
|
259
|
-
* This token is signed by the UP Hub and can be verified by your backend.
|
|
260
|
-
* @param scopes Optional list of scopes requested (e.g., ['profile', 'email']).
|
|
261
|
-
*/
|
|
262
|
-
getIdentityToken: (scopes?: string[]) => Promise<string>;
|
|
248
|
+
readonly user: Readonly<{
|
|
263
249
|
/**
|
|
264
250
|
* Fetch user profile data.
|
|
265
251
|
* @param fields Optional list of specific fields to retrieve (e.g., ['fullName', 'username']).
|
|
266
252
|
*/
|
|
267
253
|
getProfile: <T extends keyof IUserProfile>(fields?: T[]) => Promise<Partial<IUserProfile>>;
|
|
268
|
-
}
|
|
254
|
+
}>;
|
|
269
255
|
/**
|
|
270
256
|
* Explicit Permission Management.
|
|
271
257
|
* Allows requesting access to sensitive device features or user data.
|
|
272
258
|
*/
|
|
273
|
-
permission: {
|
|
259
|
+
readonly permission: Readonly<{
|
|
274
260
|
/**
|
|
275
261
|
* Explicitly request access to sensitive data.
|
|
276
262
|
* @param type The type of permission to request ('location' or 'profile').
|
|
@@ -280,11 +266,11 @@ declare class MiniAppSDK {
|
|
|
280
266
|
(type: "location"): Promise<boolean>;
|
|
281
267
|
(type: "profile", fields: (keyof IUserProfile)[]): Promise<boolean>;
|
|
282
268
|
};
|
|
283
|
-
}
|
|
269
|
+
}>;
|
|
284
270
|
/**
|
|
285
271
|
* Payments integration.
|
|
286
272
|
*/
|
|
287
|
-
payment: {
|
|
273
|
+
readonly payment: Readonly<{
|
|
288
274
|
/**
|
|
289
275
|
* Triggers the native payment flow.
|
|
290
276
|
* @param payload Amount, currency, and itemized list for the payment.
|
|
@@ -293,12 +279,12 @@ declare class MiniAppSDK {
|
|
|
293
279
|
success: true;
|
|
294
280
|
transactionId: string;
|
|
295
281
|
}>;
|
|
296
|
-
}
|
|
282
|
+
}>;
|
|
297
283
|
/**
|
|
298
284
|
* Live Activities & Notifications.
|
|
299
285
|
* Allows the Mini-App to display real-time updates in the host shell.
|
|
300
286
|
*/
|
|
301
|
-
activity: {
|
|
287
|
+
readonly activity: Readonly<{
|
|
302
288
|
/**
|
|
303
289
|
* Starts a new live activity.
|
|
304
290
|
* @param id Unique identifier for the activity.
|
|
@@ -306,32 +292,32 @@ declare class MiniAppSDK {
|
|
|
306
292
|
* @param status Initial status message.
|
|
307
293
|
*/
|
|
308
294
|
start: (id: string, title: string, status: string) => Promise<void>;
|
|
309
|
-
}
|
|
295
|
+
}>;
|
|
310
296
|
/**
|
|
311
297
|
* Haptic feedback.
|
|
312
298
|
*/
|
|
313
|
-
haptic: {
|
|
299
|
+
readonly haptic: Readonly<{
|
|
314
300
|
/**
|
|
315
301
|
* Triggers a haptic vibration on the device.
|
|
316
302
|
* @param style The style of haptic feedback (e.g., 'light', 'medium', 'heavy', 'success', 'warning', 'error').
|
|
317
303
|
*/
|
|
318
304
|
trigger: (style: HapticStyleType) => Promise<void>;
|
|
319
|
-
}
|
|
305
|
+
}>;
|
|
320
306
|
/**
|
|
321
307
|
* Network Proxy.
|
|
322
308
|
* Allows the Mini-App to make network requests through the host shell to bypass CORS or use host-level authentication.
|
|
323
309
|
*/
|
|
324
|
-
network: {
|
|
310
|
+
readonly network: Readonly<{
|
|
325
311
|
/**
|
|
326
312
|
* Performs a network request via the host shell.
|
|
327
313
|
* @param options Request method, URL, headers, and body.
|
|
328
314
|
*/
|
|
329
315
|
request: (options: INetworkOptions) => Promise<INetworkResponse>;
|
|
330
|
-
}
|
|
316
|
+
}>;
|
|
331
317
|
/**
|
|
332
318
|
* Fidelity & Rewards program integration.
|
|
333
319
|
*/
|
|
334
|
-
fidelity: {
|
|
320
|
+
readonly fidelity: Readonly<{
|
|
335
321
|
/** Returns current fidelity balance. */
|
|
336
322
|
getFidelityBalance: () => Promise<IFidelityBalance>;
|
|
337
323
|
/**
|
|
@@ -347,11 +333,11 @@ declare class MiniAppSDK {
|
|
|
347
333
|
success: boolean;
|
|
348
334
|
transactionId: string;
|
|
349
335
|
}>;
|
|
350
|
-
}
|
|
336
|
+
}>;
|
|
351
337
|
/**
|
|
352
338
|
* UI and Navigation controls.
|
|
353
339
|
*/
|
|
354
|
-
ui: {
|
|
340
|
+
readonly ui: Readonly<{
|
|
355
341
|
/** Closes the Mini-App and returns to the host shell. */
|
|
356
342
|
exit: () => Promise<void>;
|
|
357
343
|
/**
|
|
@@ -359,17 +345,23 @@ declare class MiniAppSDK {
|
|
|
359
345
|
* @param config Scroll configuration for top/bottom detection.
|
|
360
346
|
*/
|
|
361
347
|
setScrollConfig: (config: ScrollConfig) => Promise<void>;
|
|
362
|
-
}
|
|
348
|
+
}>;
|
|
363
349
|
/**
|
|
364
350
|
* Debug controls
|
|
365
351
|
*/
|
|
366
|
-
debug: {
|
|
352
|
+
readonly debug: Readonly<{
|
|
367
353
|
/**
|
|
368
354
|
* Log to the shell app
|
|
369
355
|
* @param message
|
|
370
356
|
*/
|
|
371
357
|
log: (...message: unknown[]) => Promise<unknown>;
|
|
372
|
-
}
|
|
358
|
+
}>;
|
|
359
|
+
constructor();
|
|
360
|
+
/**
|
|
361
|
+
* The starting point for the Mini-App. Must be called before any other SDK methods.
|
|
362
|
+
* @param options The options to provide to the shell app
|
|
363
|
+
*/
|
|
364
|
+
initialize(options: IInitializationOptions): Promise<IInitializationResponse>;
|
|
373
365
|
/**
|
|
374
366
|
* Registers a callback for a specific event from the native shell.
|
|
375
367
|
* @param event The name of the event to listen for.
|
|
@@ -386,6 +378,7 @@ declare class MiniAppSDK {
|
|
|
386
378
|
}
|
|
387
379
|
/**
|
|
388
380
|
* Singleton instance of the MiniAppSDK.
|
|
381
|
+
* Frozen to prevent tampering.
|
|
389
382
|
*/
|
|
390
383
|
declare const sdk: MiniAppSDK;
|
|
391
384
|
|
|
@@ -472,12 +465,6 @@ type BridgeMessageType = {
|
|
|
472
465
|
fields?: string[];
|
|
473
466
|
};
|
|
474
467
|
callbackId: string;
|
|
475
|
-
} | {
|
|
476
|
-
type: "GET_IDENTITY_TOKEN";
|
|
477
|
-
payload?: {
|
|
478
|
-
scopes?: string[];
|
|
479
|
-
};
|
|
480
|
-
callbackId: string;
|
|
481
468
|
} | {
|
|
482
469
|
type: "SPEND_FPOINTS";
|
|
483
470
|
payload: {
|
package/dist/index.d.ts
CHANGED
|
@@ -152,8 +152,6 @@ interface IInitializationResponse<Env extends Record<string, unknown> = Record<s
|
|
|
152
152
|
authors?: string;
|
|
153
153
|
/** The current version in the registry */
|
|
154
154
|
version?: string;
|
|
155
|
-
/** The identity token got from the shell's backend */
|
|
156
|
-
identityToken: string;
|
|
157
155
|
/** The scoped profile based on the requested fields during initialization or the getUserProfile call */
|
|
158
156
|
profile: Partial<IUserProfile | null>;
|
|
159
157
|
/** The environment variables defined for the mini app in the shell's backend */
|
|
@@ -205,72 +203,60 @@ interface ScrollConfig {
|
|
|
205
203
|
*/
|
|
206
204
|
declare class MiniAppSDK {
|
|
207
205
|
private bridge;
|
|
208
|
-
constructor();
|
|
209
|
-
/**
|
|
210
|
-
* The starting point for the Mini-App. Must be called before any other SDK methods.
|
|
211
|
-
* @param options The options to provide to the shell app
|
|
212
|
-
*/
|
|
213
|
-
initialize(options: IInitializationOptions): Promise<IInitializationResponse>;
|
|
214
206
|
/**
|
|
215
207
|
* Local SQLite Storage.
|
|
216
208
|
* Data is persisted on the device and is isolated per Mini-App.
|
|
217
209
|
*/
|
|
218
|
-
storage: {
|
|
210
|
+
readonly storage: Readonly<{
|
|
219
211
|
/** Retrieves a value by key. */
|
|
220
212
|
get: (key: string) => Promise<string | null>;
|
|
221
213
|
/** Retrieves all key-value pairs stored for this Mini-App. */
|
|
222
214
|
getAll: () => Promise<Record<string, string>>;
|
|
223
215
|
/** Sets a value for a specific key. */
|
|
224
216
|
set: (key: string, value: string) => Promise<void>;
|
|
225
|
-
}
|
|
217
|
+
}>;
|
|
226
218
|
/**
|
|
227
219
|
* Hardware-level Secure Storage.
|
|
228
220
|
* Data is stored in the device's secure enclave (Keychain/Keystore) and is isolated per Mini-App.
|
|
229
221
|
*/
|
|
230
|
-
secureStore: {
|
|
222
|
+
readonly secureStore: Readonly<{
|
|
231
223
|
/** Retrieves a value by key from secure storage. */
|
|
232
224
|
get: (key: string) => Promise<string | null>;
|
|
233
225
|
/** Sets a value for a specific key in secure storage. */
|
|
234
226
|
set: (key: string, value: string) => Promise<void>;
|
|
235
|
-
}
|
|
227
|
+
}>;
|
|
236
228
|
/**
|
|
237
229
|
* Database Storage.
|
|
238
230
|
* Access to user-app specific persistent database storage.
|
|
239
231
|
*/
|
|
240
|
-
database: {
|
|
232
|
+
readonly database: Readonly<{
|
|
241
233
|
/** Retrieves the user data stored in the backend database. */
|
|
242
234
|
getUserData: <T = unknown>() => Promise<T>;
|
|
243
235
|
/** Updates the user data stored in the backend database. */
|
|
244
236
|
setUserData: <T = unknown>(data: T) => Promise<void>;
|
|
245
|
-
}
|
|
237
|
+
}>;
|
|
246
238
|
/**
|
|
247
239
|
* Device Location services.
|
|
248
240
|
*/
|
|
249
|
-
location: {
|
|
241
|
+
readonly location: Readonly<{
|
|
250
242
|
/** Retrieves the current GPS position of the device. */
|
|
251
243
|
getCurrentPosition: () => Promise<ILocationData>;
|
|
252
|
-
}
|
|
244
|
+
}>;
|
|
253
245
|
/**
|
|
254
246
|
* Identity & Profile management.
|
|
255
247
|
*/
|
|
256
|
-
user: {
|
|
257
|
-
/**
|
|
258
|
-
* Fetch a short-lived Scoped Identity Token (JWT).
|
|
259
|
-
* This token is signed by the UP Hub and can be verified by your backend.
|
|
260
|
-
* @param scopes Optional list of scopes requested (e.g., ['profile', 'email']).
|
|
261
|
-
*/
|
|
262
|
-
getIdentityToken: (scopes?: string[]) => Promise<string>;
|
|
248
|
+
readonly user: Readonly<{
|
|
263
249
|
/**
|
|
264
250
|
* Fetch user profile data.
|
|
265
251
|
* @param fields Optional list of specific fields to retrieve (e.g., ['fullName', 'username']).
|
|
266
252
|
*/
|
|
267
253
|
getProfile: <T extends keyof IUserProfile>(fields?: T[]) => Promise<Partial<IUserProfile>>;
|
|
268
|
-
}
|
|
254
|
+
}>;
|
|
269
255
|
/**
|
|
270
256
|
* Explicit Permission Management.
|
|
271
257
|
* Allows requesting access to sensitive device features or user data.
|
|
272
258
|
*/
|
|
273
|
-
permission: {
|
|
259
|
+
readonly permission: Readonly<{
|
|
274
260
|
/**
|
|
275
261
|
* Explicitly request access to sensitive data.
|
|
276
262
|
* @param type The type of permission to request ('location' or 'profile').
|
|
@@ -280,11 +266,11 @@ declare class MiniAppSDK {
|
|
|
280
266
|
(type: "location"): Promise<boolean>;
|
|
281
267
|
(type: "profile", fields: (keyof IUserProfile)[]): Promise<boolean>;
|
|
282
268
|
};
|
|
283
|
-
}
|
|
269
|
+
}>;
|
|
284
270
|
/**
|
|
285
271
|
* Payments integration.
|
|
286
272
|
*/
|
|
287
|
-
payment: {
|
|
273
|
+
readonly payment: Readonly<{
|
|
288
274
|
/**
|
|
289
275
|
* Triggers the native payment flow.
|
|
290
276
|
* @param payload Amount, currency, and itemized list for the payment.
|
|
@@ -293,12 +279,12 @@ declare class MiniAppSDK {
|
|
|
293
279
|
success: true;
|
|
294
280
|
transactionId: string;
|
|
295
281
|
}>;
|
|
296
|
-
}
|
|
282
|
+
}>;
|
|
297
283
|
/**
|
|
298
284
|
* Live Activities & Notifications.
|
|
299
285
|
* Allows the Mini-App to display real-time updates in the host shell.
|
|
300
286
|
*/
|
|
301
|
-
activity: {
|
|
287
|
+
readonly activity: Readonly<{
|
|
302
288
|
/**
|
|
303
289
|
* Starts a new live activity.
|
|
304
290
|
* @param id Unique identifier for the activity.
|
|
@@ -306,32 +292,32 @@ declare class MiniAppSDK {
|
|
|
306
292
|
* @param status Initial status message.
|
|
307
293
|
*/
|
|
308
294
|
start: (id: string, title: string, status: string) => Promise<void>;
|
|
309
|
-
}
|
|
295
|
+
}>;
|
|
310
296
|
/**
|
|
311
297
|
* Haptic feedback.
|
|
312
298
|
*/
|
|
313
|
-
haptic: {
|
|
299
|
+
readonly haptic: Readonly<{
|
|
314
300
|
/**
|
|
315
301
|
* Triggers a haptic vibration on the device.
|
|
316
302
|
* @param style The style of haptic feedback (e.g., 'light', 'medium', 'heavy', 'success', 'warning', 'error').
|
|
317
303
|
*/
|
|
318
304
|
trigger: (style: HapticStyleType) => Promise<void>;
|
|
319
|
-
}
|
|
305
|
+
}>;
|
|
320
306
|
/**
|
|
321
307
|
* Network Proxy.
|
|
322
308
|
* Allows the Mini-App to make network requests through the host shell to bypass CORS or use host-level authentication.
|
|
323
309
|
*/
|
|
324
|
-
network: {
|
|
310
|
+
readonly network: Readonly<{
|
|
325
311
|
/**
|
|
326
312
|
* Performs a network request via the host shell.
|
|
327
313
|
* @param options Request method, URL, headers, and body.
|
|
328
314
|
*/
|
|
329
315
|
request: (options: INetworkOptions) => Promise<INetworkResponse>;
|
|
330
|
-
}
|
|
316
|
+
}>;
|
|
331
317
|
/**
|
|
332
318
|
* Fidelity & Rewards program integration.
|
|
333
319
|
*/
|
|
334
|
-
fidelity: {
|
|
320
|
+
readonly fidelity: Readonly<{
|
|
335
321
|
/** Returns current fidelity balance. */
|
|
336
322
|
getFidelityBalance: () => Promise<IFidelityBalance>;
|
|
337
323
|
/**
|
|
@@ -347,11 +333,11 @@ declare class MiniAppSDK {
|
|
|
347
333
|
success: boolean;
|
|
348
334
|
transactionId: string;
|
|
349
335
|
}>;
|
|
350
|
-
}
|
|
336
|
+
}>;
|
|
351
337
|
/**
|
|
352
338
|
* UI and Navigation controls.
|
|
353
339
|
*/
|
|
354
|
-
ui: {
|
|
340
|
+
readonly ui: Readonly<{
|
|
355
341
|
/** Closes the Mini-App and returns to the host shell. */
|
|
356
342
|
exit: () => Promise<void>;
|
|
357
343
|
/**
|
|
@@ -359,17 +345,23 @@ declare class MiniAppSDK {
|
|
|
359
345
|
* @param config Scroll configuration for top/bottom detection.
|
|
360
346
|
*/
|
|
361
347
|
setScrollConfig: (config: ScrollConfig) => Promise<void>;
|
|
362
|
-
}
|
|
348
|
+
}>;
|
|
363
349
|
/**
|
|
364
350
|
* Debug controls
|
|
365
351
|
*/
|
|
366
|
-
debug: {
|
|
352
|
+
readonly debug: Readonly<{
|
|
367
353
|
/**
|
|
368
354
|
* Log to the shell app
|
|
369
355
|
* @param message
|
|
370
356
|
*/
|
|
371
357
|
log: (...message: unknown[]) => Promise<unknown>;
|
|
372
|
-
}
|
|
358
|
+
}>;
|
|
359
|
+
constructor();
|
|
360
|
+
/**
|
|
361
|
+
* The starting point for the Mini-App. Must be called before any other SDK methods.
|
|
362
|
+
* @param options The options to provide to the shell app
|
|
363
|
+
*/
|
|
364
|
+
initialize(options: IInitializationOptions): Promise<IInitializationResponse>;
|
|
373
365
|
/**
|
|
374
366
|
* Registers a callback for a specific event from the native shell.
|
|
375
367
|
* @param event The name of the event to listen for.
|
|
@@ -386,6 +378,7 @@ declare class MiniAppSDK {
|
|
|
386
378
|
}
|
|
387
379
|
/**
|
|
388
380
|
* Singleton instance of the MiniAppSDK.
|
|
381
|
+
* Frozen to prevent tampering.
|
|
389
382
|
*/
|
|
390
383
|
declare const sdk: MiniAppSDK;
|
|
391
384
|
|
|
@@ -472,12 +465,6 @@ type BridgeMessageType = {
|
|
|
472
465
|
fields?: string[];
|
|
473
466
|
};
|
|
474
467
|
callbackId: string;
|
|
475
|
-
} | {
|
|
476
|
-
type: "GET_IDENTITY_TOKEN";
|
|
477
|
-
payload?: {
|
|
478
|
-
scopes?: string[];
|
|
479
|
-
};
|
|
480
|
-
callbackId: string;
|
|
481
468
|
} | {
|
|
482
469
|
type: "SPEND_FPOINTS";
|
|
483
470
|
payload: {
|