Native plugin wrappers for Cordova and Ionic with TypeScript, ES6+, Promise and Observable support
—
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
HTTP requests, network status monitoring, and in-app browser functionality for connected applications and web-based interactions.
Advanced HTTP client for making secure requests with custom headers, authentication, and SSL configuration.
/**
* HTTP response interface
*/
interface HTTPResponse {
/** HTTP status code */
status: number;
/** Response data (parsed JSON if applicable) */
data?: any;
/** Response headers */
headers: any;
/** Request URL */
url: string;
}
/**
* HTTP class for making network requests
*/
class HTTP {
/**
* Set basic authentication credentials
* @param username Basic auth username
* @param password Basic auth password
*/
static useBasicAuth(username: string, password: string): void;
/**
* Set global request header
* @param header Header name
* @param value Header value
*/
static setHeader(header: string, value: string): void;
/**
* Enable or disable SSL pinning
* @param enable Whether to enable SSL pinning
*/
static enableSSLPinning(enable: boolean): void;
/**
* Accept all SSL certificates (disable validation)
* @param allow Whether to accept all certificates
*/
static acceptAllCerts(allow: boolean): void;
/**
* Validate domain name in SSL certificate
* @param validate Whether to validate domain name
*/
static validateDomainName(validate: boolean): void;
/**
* Make GET request
* @param url Request URL
* @param parameters URL parameters
* @param headers Request headers
* @returns Promise resolving to HTTPResponse
*/
static get(url: string, parameters: any, headers: any): Promise<HTTPResponse>;
/**
* Make POST request
* @param url Request URL
* @param body Request body
* @param headers Request headers
* @returns Promise resolving to HTTPResponse
*/
static post(url: string, body: any, headers: any): Promise<HTTPResponse>;
/**
* Make PUT request
* @param url Request URL
* @param body Request body
* @param headers Request headers
* @returns Promise resolving to HTTPResponse
*/
static put(url: string, body: any, headers: any): Promise<HTTPResponse>;
/**
* Make PATCH request
* @param url Request URL
* @param body Request body
* @param headers Request headers
* @returns Promise resolving to HTTPResponse
*/
static patch(url: string, body: any, headers: any): Promise<HTTPResponse>;
/**
* Make DELETE request
* @param url Request URL
* @param parameters URL parameters
* @param headers Request headers
* @returns Promise resolving to HTTPResponse
*/
static delete(url: string, parameters: any, headers: any): Promise<HTTPResponse>;
/**
* Make HEAD request
* @param url Request URL
* @param parameters URL parameters
* @param headers Request headers
* @returns Promise resolving to HTTPResponse
*/
static head(url: string, parameters: any, headers: any): Promise<HTTPResponse>;
/**
* Upload file via HTTP
* @param url Upload URL
* @param body Additional form data
* @param headers Request headers
* @param filePath Local file path to upload
* @param name Form field name for file
* @returns Promise resolving to upload response
*/
static uploadFile(url: string, body: any, headers: any, filePath: string, name: string): Promise<any>;
/**
* Download file via HTTP
* @param url Download URL
* @param body Request body
* @param headers Request headers
* @param filePath Local file path to save to
* @returns Promise resolving to download result
*/
static downloadFile(url: string, body: any, headers: any, filePath: string): Promise<any>;
}Usage Examples:
import { HTTP } from 'ionic-native';
// Configure HTTP client
function configureHTTP() {
// Set global headers
HTTP.setHeader('Content-Type', 'application/json');
HTTP.setHeader('User-Agent', 'MyApp/1.0');
// Configure SSL settings
HTTP.enableSSLPinning(false);
HTTP.acceptAllCerts(true);
HTTP.validateDomainName(true);
}
// GET request with parameters
async function fetchUser(userId: string) {
try {
const response = await HTTP.get(
'https://api.example.com/users',
{ id: userId },
{ 'Authorization': 'Bearer your-token' }
);
console.log('User data:', response.data);
return response.data;
} catch (error) {
console.error('Failed to fetch user:', error);
throw error;
}
}
// POST request with JSON body
async function createUser(userData: any) {
try {
const response = await HTTP.post(
'https://api.example.com/users',
userData,
{
'Authorization': 'Bearer your-token',
'Content-Type': 'application/json'
}
);
if (response.status === 201) {
console.log('User created:', response.data);
return response.data;
}
} catch (error) {
console.error('Failed to create user:', error);
throw error;
}
}
// File upload with progress monitoring
async function uploadProfileImage(filePath: string, userId: string) {
try {
const result = await HTTP.uploadFile(
'https://api.example.com/users/avatar',
{ userId },
{ 'Authorization': 'Bearer your-token' },
filePath,
'avatar'
);
console.log('Image uploaded successfully:', result);
return result;
} catch (error) {
console.error('Failed to upload image:', error);
throw error;
}
}
// File download
async function downloadDocument(documentId: string, localPath: string) {
try {
await HTTP.downloadFile(
`https://api.example.com/documents/${documentId}/download`,
{},
{ 'Authorization': 'Bearer your-token' },
localPath
);
console.log('Document downloaded to:', localPath);
} catch (error) {
console.error('Failed to download document:', error);
throw error;
}
}
// Authentication with basic auth
async function authenticateUser(username: string, password: string) {
HTTP.useBasicAuth(username, password);
try {
const response = await HTTP.post(
'https://api.example.com/auth/login',
{},
{}
);
return response.data.token;
} catch (error) {
console.error('Authentication failed:', error);
throw error;
}
}Monitor network connection status and connection type for handling offline scenarios.
/**
* Network class for monitoring connection status
*/
class Network {
/** Current connection type (wifi, cellular, ethernet, none, etc.) */
static type: string;
/** Maximum downlink speed in Mbps */
static downlinkMax: number;
/**
* Observable for network connection events
* @returns Observable emitting connection events
*/
static onConnect(): Observable<any>;
/**
* Observable for network disconnection events
* @returns Observable emitting disconnection events
*/
static onDisconnect(): Observable<any>;
}
/**
* Connection type constants
*/
interface Connection {
/** Unknown connection */
UNKNOWN: 'unknown';
/** Ethernet connection */
ETHERNET: 'ethernet';
/** WiFi connection */
WIFI: 'wifi';
/** 2G cellular connection */
CELL_2G: '2g';
/** 3G cellular connection */
CELL_3G: '3g';
/** 4G cellular connection */
CELL_4G: '4g';
/** Cellular connection */
CELL: 'cellular';
/** No network connection */
NONE: 'none';
}Usage Examples:
import { Network } from 'ionic-native';
// Check current network status
function checkNetworkStatus() {
console.log('Connection type:', Network.type);
console.log('Downlink max:', Network.downlinkMax);
switch (Network.type) {
case 'wifi':
console.log('Connected to WiFi');
break;
case 'cellular':
console.log('Connected to cellular network');
break;
case 'none':
console.log('No network connection');
break;
default:
console.log('Connection type:', Network.type);
}
}
// Monitor network changes
function setupNetworkMonitoring() {
// Listen for connection events
Network.onConnect().subscribe(() => {
console.log('Network connected');
console.log('New connection type:', Network.type);
// Sync offline data when reconnected
syncOfflineData();
});
// Listen for disconnection events
Network.onDisconnect().subscribe(() => {
console.log('Network disconnected');
// Switch to offline mode
handleOfflineMode();
});
}
// Handle offline functionality
function handleOfflineMode() {
console.log('Switching to offline mode');
// Show offline indicator
showOfflineIndicator();
// Queue operations for later sync
enableOfflineQueue();
}
// Sync data when coming back online
async function syncOfflineData() {
console.log('Syncing offline data');
try {
// Upload queued operations
await uploadQueuedOperations();
// Download latest data
await downloadLatestData();
console.log('Sync completed');
hideOfflineIndicator();
} catch (error) {
console.error('Sync failed:', error);
}
}
// Network-aware API calls
async function makeNetworkAwareRequest(url: string, data: any) {
if (Network.type === 'none') {
// Queue for later when network is available
queueForLaterSync(url, data);
return Promise.reject(new Error('No network connection'));
}
try {
// Make request based on connection type
if (Network.type === 'wifi') {
// Full quality for WiFi
return await makeRequest(url, data, { quality: 'high' });
} else if (Network.type.includes('cellular')) {
// Reduced quality for cellular
return await makeRequest(url, data, { quality: 'medium' });
}
} catch (error) {
// Queue for retry on network error
queueForLaterSync(url, data);
throw error;
}
}Open web content within the app with full browser functionality and communication between app and web content.
/**
* In-App Browser event
*/
interface InAppBrowserEvent {
/** Event type (loadstart, loadstop, loaderror, exit) */
type: string;
/** Event URL */
url: string;
/** Error code (for loaderror events) */
code?: number;
/** Error message (for loaderror events) */
message?: string;
}
/**
* In-App Browser configuration options
*/
interface InAppBrowserOptions {
/** Location bar visibility (yes/no) */
location?: 'yes' | 'no';
/** Hidden browser (yes/no) */
hidden?: 'yes' | 'no';
/** Clear browser cache (yes/no) */
clearcache?: 'yes' | 'no';
/** Clear session cache (yes/no) */
clearsessioncache?: 'yes' | 'no';
/** Zoom controls (yes/no) */
zoom?: 'yes' | 'no';
/** Hardware back button (yes/no) */
hardwareback?: 'yes' | 'no';
/** Media playback requires user action (yes/no) */
mediaPlaybackRequiresUserAction?: 'yes' | 'no';
/** Should pause on suspend (yes/no) */
shouldPauseOnSuspend?: 'yes' | 'no';
/** User agent string */
useragent?: string;
/** Close button caption */
closebuttoncaption?: string;
/** Close button color */
closebuttoncolor?: string;
/** Left-to-right layout (yes/no) */
lefttoright?: 'yes' | 'no';
/** Toolbar visibility (yes/no) */
toolbar?: 'yes' | 'no';
/** Navigation buttons visibility (yes/no) */
navigationbuttoncolor?: string;
/** Toolbar color */
toolbarcolor?: string;
/** Toolbar translucency (yes/no) */
toolbartranslucent?: 'yes' | 'no';
/** Toolbar position (top/bottom) */
toolbarposition?: 'top' | 'bottom';
/** Footer visibility (yes/no) */
footer?: 'yes' | 'no';
/** Footer color */
footercolor?: string;
/** Presentation style (pagesheet/formsheet/fullscreen) */
presentationstyle?: 'pagesheet' | 'formsheet' | 'fullscreen';
/** Transition style (fliphorizontal/crossdissolve/coververtical) */
transitionstyle?: 'fliphorizontal' | 'crossdissolve' | 'coververtical';
}
/**
* In-App Browser object for controlling browser instance
*/
interface InAppBrowserObject {
/**
* Show the browser (if hidden)
*/
show(): void;
/**
* Close the browser
*/
close(): void;
/**
* Hide the browser
*/
hide(): void;
/**
* Execute JavaScript in the browser context
* @param script Script object with code or file
* @returns Promise resolving to script result
*/
executeScript(script: { code?: string; file?: string; }): Promise<any>;
/**
* Insert CSS into the browser
* @param css CSS object with code or file
* @returns Promise indicating insertion completion
*/
insertCSS(css: { code?: string; file?: string; }): Promise<any>;
/**
* Subscribe to browser events
* @param event Event name (loadstart, loadstop, loaderror, exit)
* @returns Observable emitting InAppBrowserEvent objects
*/
on(event: string): Observable<InAppBrowserEvent>;
}
/**
* InAppBrowser class for opening web content
*/
class InAppBrowser {
/**
* Open URL in in-app browser
* @param url URL to open
* @param target Target (_blank, _self, _system)
* @param options Browser configuration options
* @returns InAppBrowserObject instance
*/
static create(url: string, target?: string, options?: string | InAppBrowserOptions): InAppBrowserObject;
}Usage Examples:
import { InAppBrowser, InAppBrowserObject, InAppBrowserOptions } from 'ionic-native';
// Open web page with custom options
function openWebPage(url: string) {
const options: InAppBrowserOptions = {
location: 'yes',
hidden: 'no',
clearcache: 'yes',
clearsessioncache: 'yes',
zoom: 'yes',
hardwareback: 'yes',
mediaPlaybackRequiresUserAction: 'no',
shouldPauseOnSuspend: 'no',
closebuttoncaption: 'Close',
closebuttoncolor: '#0000ff',
toolbar: 'yes',
toolbarcolor: '#f0f0f0',
toolbarposition: 'top'
};
const browser = InAppBrowser.create(url, '_blank', options);
// Handle browser events
browser.on('loadstart').subscribe(event => {
console.log('Loading started:', event.url);
});
browser.on('loadstop').subscribe(event => {
console.log('Loading finished:', event.url);
// Inject custom CSS
browser.insertCSS({
code: `
body {
background-color: #f5f5f5;
font-family: Arial, sans-serif;
}
`
});
// Execute custom JavaScript
browser.executeScript({
code: `
document.addEventListener('DOMContentLoaded', function() {
console.log('Page loaded in InAppBrowser');
});
`
});
});
browser.on('loaderror').subscribe(event => {
console.error('Loading error:', event.message);
});
browser.on('exit').subscribe(event => {
console.log('Browser closed');
});
return browser;
}
// Open payment gateway
function openPaymentGateway(paymentUrl: string, amount: number) {
const options: InAppBrowserOptions = {
location: 'no',
toolbar: 'no',
zoom: 'no',
hardwareback: 'no',
clearcache: 'yes',
clearsessioncache: 'yes'
};
const browser = InAppBrowser.create(paymentUrl, '_blank', options);
return new Promise((resolve, reject) => {
browser.on('loadstop').subscribe(event => {
// Check if payment is completed
browser.executeScript({
code: 'window.location.href'
}).then(result => {
const currentUrl = result[0];
if (currentUrl.includes('payment-success')) {
browser.close();
resolve({ success: true, amount });
} else if (currentUrl.includes('payment-failed')) {
browser.close();
reject(new Error('Payment failed'));
}
});
});
browser.on('exit').subscribe(() => {
reject(new Error('Payment cancelled'));
});
});
}
// Social login with OAuth
function socialLogin(provider: string) {
const authUrl = `https://auth.example.com/oauth/${provider}`;
const redirectUrl = 'https://myapp.com/auth/callback';
const options: InAppBrowserOptions = {
location: 'yes',
clearcache: 'yes',
toolbar: 'yes',
closebuttoncaption: 'Cancel'
};
const browser = InAppBrowser.create(authUrl, '_blank', options);
return new Promise((resolve, reject) => {
browser.on('loadstart').subscribe(event => {
if (event.url.startsWith(redirectUrl)) {
// Parse OAuth callback URL
const url = new URL(event.url);
const code = url.searchParams.get('code');
const error = url.searchParams.get('error');
browser.close();
if (code) {
resolve({ code, provider });
} else if (error) {
reject(new Error(`OAuth error: ${error}`));
}
}
});
browser.on('exit').subscribe(() => {
reject(new Error('Login cancelled'));
});
});
}
// Help and documentation viewer
function openHelpDocs(section?: string) {
const baseUrl = 'https://docs.myapp.com';
const url = section ? `${baseUrl}/${section}` : baseUrl;
const options: InAppBrowserOptions = {
location: 'no',
toolbar: 'yes',
toolbarcolor: '#2196F3',
toolbarposition: 'top',
closebuttoncaption: 'Done',
zoom: 'yes',
hardwareback: 'yes'
};
const browser = InAppBrowser.create(url, '_blank', options);
// Add custom navigation
browser.on('loadstop').subscribe(() => {
browser.executeScript({
code: `
// Add back to app button
const backButton = document.createElement('button');
backButton.innerText = 'Back to App';
backButton.style.position = 'fixed';
backButton.style.top = '10px';
backButton.style.right = '10px';
backButton.style.zIndex = '9999';
backButton.onclick = function() {
window.location.href = 'close://';
};
document.body.appendChild(backButton);
`
});
});
browser.on('loadstart').subscribe(event => {
if (event.url === 'close://') {
browser.close();
}
});
return browser;
}