@trlogic/tracker-web
Version:
Formica Tracker Web SDK
207 lines (156 loc) • 6.79 kB
Markdown
# @trlogic/tracker-web
Formica Tracker Web SDK — browser-side fraud detection, risk scoring, and event tracking. Architecture mirrors the Android and iOS Tracker SDKs (DI container, collector pipeline, event coordinator, filter engine).
## Installation
```bash
npm install @trlogic/tracker-web
```
## Quick Start
```typescript
import { TrackerSDK, TrackerConfiguration } from "@trlogic/tracker-web";
const config: TrackerConfiguration = {
tenant: "your-tenant",
apiUrl: "https://your-api-url.com",
apiKey: "your-api-key",
};
const tracker = new TrackerSDK.Builder().setConfiguration(config).build();
tracker.initialize({
onSuccess: () => console.log("Tracker initialized"),
onError: (error) => console.error("Init failed", error),
});
```
## Features
### Event Tracking
The SDK automatically tracks browser events via built-in listeners:
| Event Type | Trigger |
| ------------------- | ------------------------------------------------ |
| `PAGE_VIEW` | SPA navigation (pushState/replaceState/popstate) |
| `CLICK` | Document click events |
| `SCROLL` | Window scroll events (debounced) |
| `VISIBILITY_CHANGE` | Tab focus/blur |
| `RISK_ALERT` | Risk score threshold exceeded |
### Custom Events
```typescript
// Fire-and-forget
tracker.triggerCustomEvent("checkout", { orderId: "12345", amount: 99.99 });
// With callback
tracker.triggerCustomEventSync(
"payment",
{ method: "card" },
{
onSuccess: (result) => console.log("Event sent", result),
onError: (error) => console.error("Failed", error),
},
);
```
### User-Defined Values
```typescript
tracker.setUserDefinedValue("userId", "usr_abc123");
tracker.setUserDefinedValue("sessionType", "premium");
const values = tracker.getUserDefinedValues();
```
### Variable Collection (39+ Types)
| Category | Variables |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **Device** | `DEVICE_FINGERPRINT`, `SCREEN_RESOLUTION`, `USER_AGENT`, `BROWSER`, `OS`, `LANGUAGE`, `TIMEZONE`, `PLATFORM`, `SDK_VERSION` |
| **Network** | `IP_ADDRESS`, `REACHABLE` |
| **Risk Metrics** | `SUSPICIOUS_ACTIVITY`, `SUSPICIOUS_BROWSER`, `REMOTE_ACCESS_SCORE`, `REMOTE_ACCESS_FLAGS_JSON`, `ENVIRONMENT_CHANGE_SCORE`, `ENVIRONMENT_CHANGE_FLAGS` |
| **Behavior** | `NO_MOUSE_MOVE_DURATION_MS`, `CLICK_ONLY_PATTERN`, `FAST_PAGE_TRANSITION`, `NAVIGATION_VELOCITY`, `FORM_FILL_ANOMALY`, `INPUT_PASTE_RATIO` |
| **Detection** | `HEADLESS_INDICATOR_COUNT`, `REDIRECT_DETECTED` |
| **Screen** | `VIEW_DURATION`, `URL`, `ELEMENT`, `COOKIE`, `JAVASCRIPT`, `EVENT` |
### Risk Scoring
The `SecurityCollector` computes a composite remote access score (0–1) from:
- Unnatural mouse movement patterns
- Clipboard paste anomalies
- Low FPS detection (screen sharing/remote control)
- Click-only patterns (no mouse movement)
- Headless browser indicators (WebGL, plugins, webdriver)
- Environment change detection (language/timezone/OS/browser drift)
- Form fill timing anomalies
## Configuration
```typescript
const config: TrackerConfiguration = {
tenant: "your-tenant",
apiUrl: "https://api.example.com",
apiKey: "your-api-key",
timeout: 10000, // HTTP timeout (ms), default: 10000
queueProcessInterval: 5000, // Event queue drain interval (ms), default: 5000
};
```
## Bundle Formats
| Format | File | Use Case |
| ------ | ----------------------- | -------------------------------------------- |
| ESM | `dist/index.esm.min.js` | Modern bundlers (Vite, Webpack 5, Rollup) |
| UMD | `dist/index.umd.min.js` | Universal (Node.js + browser) |
| AMD | `dist/index.amd.js` | RequireJS |
| IIFE | `dist/index.js` | `<script>` tag (exposes `TrackerWeb` global) |
| CJS | `dist/bundle.js` | Legacy Node.js / CommonJS |
### Script Tag Usage
```html
<script src="dist/index.js"></script>
<script>
const { TrackerSDK } = TrackerWeb;
const tracker = new TrackerSDK.Builder()
.setConfiguration({ tenant: "t", apiUrl: "https://...", apiKey: "k" })
.build();
tracker.initialize();
</script>
```
## Architecture
```
src/
├── core/
│ ├── model/ # TrackerEventType, TrackerVariableType, FilterOperator, etc.
│ ├── contract/ # DataCollector, EventStorage, NetworkService interfaces
│ ├── engine/ # FilterEngine, EventCoordinator, TrackerEngine
│ ├── base/ # BaseDataCollector, CachedDataCollector
│ └── scheduler/ # PeriodicDataScheduler
├── collector/ # DeviceCollector, NetworkCollector, SecurityCollector, ScreenActivityCollector
├── listener/ # PageViewListener, ClickListener, ScrollListener, VisibilityListener
├── service/ # InMemoryEventStorage, DefaultNetworkService, EventService
├── di/ # DataPayload, TrackerModule (DI container)
├── util/ # Logger, HttpClient, BrowserDetector, FilterUtil
├── tracker.ts # TrackerSDK (public API with Builder pattern)
└── index.ts # Barrel exports
```
## Development
```bash
# Install dependencies
npm install
# Build all formats
npm run build
# Run tests
npm test
# Run tests in watch mode
npm run test:watch
# Lint
npm run lint
# Format code
npm run format
# Check formatting
npm run format:check
# Clean build artifacts
npm run clean
```
## Testing with Tracker CLI
Start the local test server:
```bash
# In the tracker CLI project
./tracker server -p 8000
# Web SDK config is served at:
# GET http://localhost:8000/sentinel/v1
# Headers: api-key, tenant, platform: web
```
Then use the example app:
```bash
cd example
npm install
npm start
# Open http://localhost:3000
```
## Browser Support
- Chrome 80+
- Firefox 78+
- Safari 14+
- Edge 80+
## License
This project is licensed under the terms specified in the LICENSE file.