Web platform adapters for One Payments SDK
npm install @one-payments/adapters-webWeb platform adapters for One Payments SDK. Provides browser-based implementations for HTTP, Storage, Crypto, and Timer operations.
- 🌐 Browser APIs - Built on native Web APIs (Fetch, LocalStorage, Web Crypto, setTimeout)
- 🔒 Secure - Uses Web Crypto API for HMAC generation
- 💾 Persistent Storage - LocalStorage for session management
- ⚡ Lightweight - No external dependencies
- 🎯 TypeScript - Full type safety
- 🧩 Framework Agnostic - Works with React, Vue, Angular, and vanilla JS
``bash`
npm install @one-payments/adapters-webor
yarn add @one-payments/adapters-webor
pnpm add @one-payments/adapters-web
`typescript
import { createWebAdapters } from '@one-payments/adapters-web';
// Create adapters instance
const adapters = createWebAdapters();
// Use with any One Payments component
// React example:
adapters={adapters}
amount={5000}
currency="USD"
orderId="order-123"
/>
`
`tsx
import { createWebAdapters } from '@one-payments/adapters-web';
import { OnePayment } from '@one-payments/react';
function CheckoutPage() {
const adapters = createWebAdapters();
return (
adapters={adapters}
{...paymentProps}
/>
);
}
`
`vue
:adapters="adapters"
v-bind="paymentProps"
/>
`
`typescript
import { Component } from '@angular/core';
import { createWebAdapters } from '@one-payments/adapters-web';
import { OnePaymentComponent } from '@one-payments/angular';
@Component({
selector: 'app-checkout',
standalone: true,
imports: [OnePaymentComponent],
template:
[adapters]="adapters"
/>
`
})
export class CheckoutComponent {
adapters = createWebAdapters();
}
`html
`
Important: This package uses browser-only APIs and cannot be used during server-side rendering. Initialize adapters on the client-side only.
For Next.js (and other SSR frameworks), dynamically import and initialize adapters in useEffect:
`tsx
'use client';
import { useState, useEffect } from 'react';
import dynamic from 'next/dynamic';
import type { Adapters } from '@one-payments/core';
// Dynamic import of payment component
const OnePayment = dynamic(
() => import('@one-payments/react').then((mod) => mod.OnePayment),
{ ssr: false }
);
export default function CheckoutPage() {
const [adapters, setAdapters] = useState
// Initialize adapters on client-side only
useEffect(() => {
import('@one-payments/adapters-web').then(({ createWebAdapters }) => {
setAdapters(createWebAdapters());
});
}, []);
if (!adapters) {
return
return (
adapters={adapters}
{...props}
/>
);
}
`
Why this is needed:
- Web APIs like window, localStorage, crypto.subtle don't exist in Node.jsssr: false
- SSR renders on the server first, causing "ReferenceError: window is not defined"
- Dynamic import with ensures code only runs in the browser
See the Next.js Integration Guide for complete instructions.
`vue
`
Uses the native fetch API for HTTP requests:
`typescript
interface HttpAdapter {
fetch(url: string, options?: RequestInit): Promise
}
// Implementation
const httpAdapter = {
fetch: (url, options) => window.fetch(url, options)
};
`
Uses localStorage for persistent client-side storage:
`typescript
interface StorageAdapter {
getItem(key: string): Promise
setItem(key: string, value: string): Promise
removeItem(key: string): Promise
}
// Implementation
const storageAdapter = {
getItem: (key) => Promise.resolve(localStorage.getItem(key)),
setItem: (key, value) => Promise.resolve(localStorage.setItem(key, value)),
removeItem: (key) => Promise.resolve(localStorage.removeItem(key))
};
`
Storage Keys Used:
- one-payments-session-* - Payment session dataone-payments-config-*
- - Cached configuration
Uses Web Crypto API for secure cryptographic operations:
`typescript
interface CryptoAdapter {
generateHMAC(message: string, secret: string): Promise
randomUUID(): string;
}
// Implementation uses crypto.subtle for HMAC-SHA256
const cryptoAdapter = {
generateHMAC: async (message, secret) => {
const encoder = new TextEncoder();
const keyData = encoder.encode(secret);
const messageData = encoder.encode(message);
const key = await crypto.subtle.importKey(
'raw',
keyData,
{ name: 'HMAC', hash: 'SHA-256' },
false,
['sign']
);
const signature = await crypto.subtle.sign('HMAC', key, messageData);
return Array.from(new Uint8Array(signature))
.map(b => b.toString(16).padStart(2, '0'))
.join('');
},
randomUUID: () => crypto.randomUUID()
};
`
Uses native JavaScript timer functions:
`typescript
interface TimerAdapter {
setTimeout(callback: () => void, delay: number): number;
clearTimeout(id: number): void;
}
// Implementation
const timerAdapter = {
setTimeout: (callback, delay) => window.setTimeout(callback, delay),
clearTimeout: (id) => window.clearTimeout(id)
};
`
- Fetch API - All modern browsers (IE11 needs polyfill)
- LocalStorage - All browsers supporting Web Storage API
- Web Crypto API - Chrome 37+, Firefox 34+, Safari 11+, Edge 12+
- crypto.randomUUID() - Chrome 92+, Firefox 95+, Safari 15.4+
For older browsers, you may need polyfills:
`html
`
| Browser | Minimum Version | Notes |
|---------|----------------|-------|
| Chrome | 92+ | Full support |
| Firefox | 95+ | Full support |
| Safari | 15.4+ | Full support |
| Edge | 92+ | Full support |
| Mobile Safari | iOS 15.4+ | Full support |
| Chrome Mobile | 92+ | Full support |
- Uses Web Crypto API's crypto.subtle for secure HMAC-SHA256
- Secret keys never leave the browser
- HMAC signatures used for API request authentication
- Uses localStorage which is origin-isolated
- Data is accessible only to your domain
- No sensitive card data is stored (PCI compliance)
- Session tokens expire after use
If your site uses CSP, ensure these directives:
`http`
Content-Security-Policy:
script-src 'self' 'unsafe-eval';
connect-src 'self' https://*.one.ooo;
frame-src https://*.one.ooo;
| Feature | adapters-web | adapters-crypto-js |
|---------|--------------|-------------------|
| Environment | Modern browsers | Legacy browsers, WebView |
| Crypto | Web Crypto API | CryptoJS library |
| Bundle Size | ~2KB | ~50KB |
| Performance | Native (faster) | JavaScript (slower) |
| Use Case | Standard web apps | React Native WebView, IE11 |
Use @one-payments/adapters-crypto-js when:
- Supporting IE11 or older browsers
- Using React Native WebView (no Web Crypto API)
- Server-side rendering with crypto operations
Use @one-payments/adapters-web when:
- Building modern web applications
- Supporting Chrome, Firefox, Safari, Edge (latest versions)
- Performance is a priority
| Feature | adapters-web | adapters-native |
|---------|--------------|-----------------|
| Platform | Web browsers | React Native |
| Storage | localStorage | AsyncStorage |
| HTTP | fetch | React Native fetch |
| Use Case | Web apps | Native mobile apps |
Cause: Trying to import adapters during SSR
Solution: Initialize in useEffect (React) or onMounted (Vue):
`tsx
// ❌ Don't do this
const adapters = createWebAdapters();
// ✅ Do this
const [adapters, setAdapters] = useState(null);
useEffect(() => {
import('@one-payments/adapters-web').then(({ createWebAdapters }) => {
setAdapters(createWebAdapters());
});
}, []);
`
Cause: Page not served over HTTPS (Web Crypto requires secure context)
Solution:
- Use HTTPS in production
- For localhost, modern browsers allow HTTP
- For testing, use chrome://flags/#unsafely-treat-insecure-origin-as-secure
Cause: Browser privacy mode or storage disabled
Solution: Check if storage is available:
`typescript`
try {
const adapters = createWebAdapters();
} catch (error) {
console.error('Storage not available:', error);
// Show message to user to disable privacy mode
}
Mock adapters in tests:
`typescript
// test-utils.ts
export const mockAdapters = {
http: {
fetch: jest.fn()
},
storage: {
getItem: jest.fn(),
setItem: jest.fn(),
removeItem: jest.fn()
},
crypto: {
generateHMAC: jest.fn().mockResolvedValue('mock-hmac'),
randomUUID: jest.fn().mockReturnValue('mock-uuid')
},
timer: {
setTimeout: jest.fn(),
clearTimeout: jest.fn()
}
};
// Your test
it('should process payment', () => {
render(
// ...
});
``
- @one-payments/core - Core types and interfaces
- @one-payments/react - React wrapper
- @one-payments/vue - Vue wrapper
- @one-payments/angular - Angular wrapper
- @one-payments/adapters-crypto-js - CryptoJS-based adapter
- @one-payments/adapters-native - React Native adapter
- Modern browser with ES2020 support
- HTTPS (for Web Crypto API)
- LocalStorage enabled
- Minified: ~2KB
- Gzipped: ~1KB
MIT