@safepassage/sdk 3.4.1 → 3.4.3

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 CHANGED
@@ -1,22 +1,15 @@
1
- # SafePassage SDK v3.0.12 - Performance-Optimized
1
+ # SafePassage SDK v3.4
2
2
 
3
- A lightweight SDK for integrating SafePassage age verification using a simple redirect flow.
4
-
5
- ## What's New in v3.0.12
6
-
7
- - **40% faster launch times**: Removed blocking config fetch, saving 100-300ms
8
- - **Instant redirects**: SDK now redirects immediately without API calls
9
- - **Improved reliability**: Eliminates dependency on config endpoint
3
+ A lightweight SDK for integrating SafePassage age verification into your website or application.
10
4
 
11
5
  ## Features
12
6
 
13
- - **Ultra-lightweight**: 17.6KB minified
14
- - **Instant verification**: No blocking API calls during launch
15
- - **Simple integration**: Just 10 lines of code
7
+ - **Ultra-lightweight**: ~18KB minified
8
+ - **Simple integration**: 5 lines of code to get started
16
9
  - **Two modes**: Same-tab redirect or new-tab popup
17
10
  - **TypeScript support**: Full type definitions included
18
- - **Auto-environment detection**: Works seamlessly in development
19
- - **Secure**: Merchant-generated session IDs prevent attacks
11
+ - **Auto-environment detection**: Works seamlessly across environments
12
+ - **Secure**: HMAC-signed state parameters, automatic session management
20
13
  - **Compliant**: Enforces minimum age of 25
21
14
 
22
15
  ## Installation
@@ -25,286 +18,327 @@ A lightweight SDK for integrating SafePassage age verification using a simple re
25
18
  npm install @safepassage/sdk
26
19
  ```
27
20
 
21
+ Or load directly from jsDelivr CDN (no bundler required):
22
+
23
+ ```html
24
+ <script src="https://cdn.jsdelivr.net/npm/@safepassage/sdk@latest/dist/safepassage.min.js"></script>
25
+ ```
26
+
28
27
  ## Quick Start
29
28
 
29
+ ### With npm/bundler
30
+
30
31
  ```javascript
31
- // Initialize SDK
32
- const safePassage = new SafePassage({
33
- apiKey: 'sk_xxxxx', // Your API key
34
- returnUrl: 'https://yoursite.com/verified'
32
+ import { SafePassage } from '@safepassage/sdk';
33
+
34
+ const sp = new SafePassage({
35
+ apiKey: 'pk_...', // Your public key from the dashboard
36
+ returnUrl: window.location.origin + '/verified'
35
37
  });
36
38
 
37
- // Generate a session ID (must be UUID v4)
38
- const sessionId = crypto.randomUUID();
39
+ // Start verification - redirects user to SafePassage
40
+ await sp.verify();
41
+ ```
39
42
 
40
- // Trigger verification
41
- safePassage.verify({
42
- sessionId: sessionId, // Required: merchant-generated UUID
43
- challengeAge: 25, // Optional: minimum age (25 or higher)
44
- verificationMode: 'L1' // Optional: 'L1' or 'L2'
45
- });
43
+ ### With CDN (no bundler)
44
+
45
+ ```html
46
+ <script src="https://cdn.jsdelivr.net/npm/@safepassage/sdk@latest/dist/safepassage.min.js"></script>
47
+ <script>
48
+ const sp = new SafePassage({
49
+ apiKey: 'pk_...',
50
+ returnUrl: window.location.origin + '/verified'
51
+ });
52
+
53
+ document.getElementById('verify-btn').onclick = () => sp.verify();
54
+ </script>
46
55
  ```
47
56
 
57
+ That's it! The SDK handles session creation automatically.
58
+
48
59
  ## Configuration
49
60
 
50
61
  | Option | Type | Required | Description |
51
62
  |--------|------|----------|-------------|
52
- | apiKey | string | Yes | Your API key (pk_xxx for client-side, sk_xxx for server-side) |
53
- | returnUrl | string | Yes | URL to redirect after successful verification |
54
- | environment | string | No | 'production', 'staging', or 'development' (auto-detected) |
55
- | mode | string | No | 'redirect' (default) or 'new-tab' |
56
- | onComplete | function | No | Callback for new-tab mode completion |
63
+ | apiKey | string | Yes | Your public API key (`pk_...`) |
64
+ | returnUrl | string | Yes | URL to redirect after verification |
65
+ | environment | string | No | `'production'` or `'staging'` (auto-detected) |
66
+ | mode | string | No | `'redirect'` (default) or `'new-tab'` |
67
+ | defaultChallengeAge | number | No | Default minimum age (25 or higher) |
68
+ | defaultVerificationMode | string | No | `'L1'` or `'L2'` |
69
+ | onComplete | function | No | Callback for new-tab mode |
70
+ | onCancel | function | No | Called when user closes popup (new-tab mode) |
57
71
  | onError | function | No | Error handler |
58
72
 
59
- ### API Key Types
60
-
61
- SafePassage provides two types of API keys:
62
-
63
- - **Public Keys (`pk_`)**: Safe for client-side use (websites, mobile apps)
64
- - Limited to creating and initiating verifications
65
- - Cannot read verification results or override settings
66
- - SDK auto-generates sessionId if not provided
67
-
68
- - **Secret Keys (`sk_`)**: Server-side only - keep these private!
69
- - Full API access including reading verification results
70
- - Can override challenge age and verification mode
71
- - Requires merchant-generated sessionId
72
-
73
73
  ## Verification Options
74
74
 
75
- ```javascript
76
- safePassage.verify({
77
- sessionId: 'uuid-v4', // Required for sk_ keys, optional for pk_ keys
78
- challengeAge: 30, // Optional: min 25 (sk_ keys only)
79
- verificationMode: 'L2' // Optional: 'L1' or 'L2' (sk_ keys only)
80
- });
81
- ```
82
-
83
- ### Configuration Override Behavior
84
-
85
- When you pass `challengeAge` or `verificationMode` to the `verify()` method, these values take precedence over your dashboard configuration for that specific verification session:
75
+ Override settings per-verification:
86
76
 
87
- - **No overrides**: Uses your current dashboard settings
88
- - **With overrides**: SDK values are used instead of dashboard settings
89
- - **Challenge age**: Must be 25 or higher (lower values will be rejected)
90
- - **Verification mode**:
91
- - `'L1'`: Age estimation with computer vision
92
- - `'L2'`: Always requires ID verification
93
-
94
- Example use cases:
95
77
  ```javascript
96
- // Use dashboard defaults
97
- safePassage.verify({ sessionId: crypto.randomUUID() });
98
-
99
- // Override just challenge age
100
- safePassage.verify({
101
- sessionId: crypto.randomUUID(),
102
- challengeAge: 30 // Require age 30+ for this session
78
+ await sp.verify({
79
+ challengeAge: 30, // Override minimum age for this session
80
+ verificationMode: 'L2', // Force ID verification for this session
81
+ externalUserId: 'user-123', // Your user ID (returned in webhooks)
82
+ skipIntro: true, // Skip intro screen
83
+ autoReturn: true // Auto-redirect after success
103
84
  });
85
+ ```
104
86
 
105
- // Override just verification mode
106
- safePassage.verify({
107
- sessionId: crypto.randomUUID(),
108
- verificationMode: 'L2' // Force ID check for this session
109
- });
87
+ ### Verification Modes
110
88
 
111
- // Override both
112
- safePassage.verify({
113
- sessionId: crypto.randomUUID(),
114
- challengeAge: 30,
115
- verificationMode: 'L2' // ID required for 30+ verification
116
- });
117
- ```
89
+ - **L1**: Age estimation using computer vision (faster, less friction)
90
+ - **L2**: Full ID document verification (more thorough)
118
91
 
119
- ## Modes
92
+ ## Integration Modes
120
93
 
121
94
  ### Same-Tab Redirect (Default)
122
- User is redirected to SafePassage, then back to your site:
95
+
96
+ User is redirected to SafePassage, then back to your `returnUrl`:
123
97
 
124
98
  ```javascript
125
- const safePassage = new SafePassage({
126
- apiKey: 'sk_xxxxx',
99
+ const sp = new SafePassage({
100
+ apiKey: 'pk_...',
127
101
  returnUrl: '/age-verified'
128
102
  });
129
103
 
130
- safePassage.verify({ sessionId: crypto.randomUUID() });
104
+ await sp.verify();
105
+ // User is redirected to SafePassage...
106
+ // After verification, user returns to /age-verified?sessionId=xxx&status=verified
131
107
  ```
132
108
 
133
109
  ### New-Tab Mode
110
+
134
111
  Verification opens in a popup window:
135
112
 
136
113
  ```javascript
137
- const safePassage = new SafePassage({
138
- apiKey: 'sk_xxxxx',
114
+ const sp = new SafePassage({
115
+ apiKey: 'pk_...',
139
116
  returnUrl: '/age-verified',
140
117
  mode: 'new-tab',
141
118
  onComplete: (result) => {
142
- console.log('Verified:', result.sessionId);
143
- // Validate on your server!
119
+ console.log('Verification complete:', result.sessionId, result.status);
120
+ // Validate on your server, then update UI
121
+ },
122
+ onCancel: () => {
123
+ console.log('User closed the verification window');
124
+ },
125
+ onError: (error) => {
126
+ console.error('Verification error:', error.message);
144
127
  }
145
128
  });
146
129
 
147
- safePassage.verify({ sessionId: crypto.randomUUID() });
148
- ```
149
-
150
- ## URL Query Parameters
151
-
152
- SafePassage supports optional query parameters for streamlined verification flows:
153
-
154
- ### skip_intro
155
- Skip the introductory screen and navigate directly to camera access:
156
-
157
- ```javascript
158
- // Via SDK (automatic)
159
- safePassage.verify({ sessionId: crypto.randomUUID() });
160
-
161
- // Via server-side session creation
162
- const url = new URL(verifyUrl);
163
- url.searchParams.set('skip_intro', 'true');
164
- window.location.href = url.toString();
130
+ await sp.verify();
165
131
  ```
166
132
 
167
- ### auto_return
168
- Automatically redirect to `returnUrl` after successful verification (redirect mode only):
133
+ ## Server-Side Validation (Required!)
169
134
 
170
- ```javascript
171
- // Via server-side session creation
172
- const url = new URL(verifyUrl);
173
- url.searchParams.set('auto_return', 'true');
174
- window.location.href = url.toString();
175
- ```
135
+ After verification completes, **always validate the result on your server** before granting access:
176
136
 
177
- ### Combined Example
178
137
  ```javascript
179
- const url = new URL(verifyUrl);
180
- url.searchParams.set('skip_intro', 'true');
181
- url.searchParams.set('auto_return', 'true');
182
- // Result: Streamlined flow with minimal user interaction
183
- window.location.href = url.toString();
184
- ```
185
-
186
- **For comprehensive parameter documentation, usage examples, and integration patterns, see [URL Parameters Reference](../../../docs/technical/api/VERIFY_UI_PARAMETERS.md).**
187
-
188
- ## Server-Side Validation (Required!)
138
+ // Node.js / Express example
139
+ app.get('/age-verified', async (req, res) => {
140
+ const { sessionId } = req.query;
141
+
142
+ // Validate with your SECRET key (sk_...)
143
+ const response = await fetch(
144
+ `https://api.safepassageapp.com/api/v1/sessions/${sessionId}`,
145
+ {
146
+ headers: {
147
+ 'Authorization': `Bearer ${process.env.SAFEPASSAGE_SECRET_KEY}`
148
+ }
149
+ }
150
+ );
189
151
 
190
- Always validate the session on your server:
152
+ const session = await response.json();
191
153
 
192
- ```javascript
193
- // Node.js example
194
- const response = await fetch('https://api.safepassageapp.com/v1/sessions/validate', {
195
- method: 'POST',
196
- headers: {
197
- 'Authorization': 'Bearer sk_xxxxx', // Secret key
198
- 'Content-Type': 'application/json'
199
- },
200
- body: JSON.stringify({ sessionId })
154
+ if (session.status === 'VERIFIED') {
155
+ // Grant access
156
+ req.session.ageVerified = true;
157
+ res.redirect('/content');
158
+ } else {
159
+ res.redirect('/age-verification-failed');
160
+ }
201
161
  });
202
-
203
- const result = await response.json();
204
- if (result.verified && result.estimatedAge >= result.challengeAge) {
205
- // Grant access
206
- }
207
162
  ```
208
163
 
209
- ## UUID Generation
164
+ > **Security Note**: Never trust client-side verification status alone. Always validate server-side using your secret key.
165
+
166
+ ## Webhooks (Recommended)
210
167
 
211
- You must generate session IDs on your end. Use the built-in crypto.randomUUID() when available:
168
+ For reliable verification tracking, configure webhooks in your dashboard:
212
169
 
213
170
  ```javascript
214
- // Modern browsers and Node.js 16+
215
- const sessionId = crypto.randomUUID();
216
-
217
- // Fallback for older environments
218
- function generateUUID() {
219
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
220
- const r = Math.random() * 16 | 0;
221
- const v = c === 'x' ? r : (r & 0x3 | 0x8);
222
- return v.toString(16);
223
- });
171
+ // Webhook payload example
172
+ {
173
+ "event": "verification.completed",
174
+ "sessionId": "abc-123",
175
+ "verified": true,
176
+ "externalUserId": "your-user-id", // If provided during verify()
177
+ "timestamp": "2025-01-15T10:30:00Z"
224
178
  }
225
179
  ```
226
180
 
227
181
  ## Complete Example
228
182
 
183
+ ### HTML + CDN
184
+
229
185
  ```html
230
186
  <!DOCTYPE html>
231
187
  <html>
232
188
  <head>
233
- <!-- Install via NPM: npm install @safepassage/sdk -->
234
- <script src="node_modules/@safepassage/sdk/dist/safepassage.min.js"></script>
189
+ <title>Age Verification</title>
190
+ <script src="https://cdn.jsdelivr.net/npm/@safepassage/sdk@latest/dist/safepassage.min.js"></script>
235
191
  </head>
236
192
  <body>
237
- <button onclick="verifyAge()">Verify Your Age</button>
193
+ <button id="verify-btn">Verify Your Age</button>
238
194
 
239
195
  <script>
240
- const safePassage = new SafePassage({
241
- apiKey: 'sk_xxxxx',
242
- returnUrl: window.location.href + '?verified=true'
196
+ const sp = new SafePassage({
197
+ apiKey: 'pk_...',
198
+ returnUrl: window.location.origin + '/verified'
243
199
  });
244
200
 
245
- function verifyAge() {
246
- // Use crypto.randomUUID() if available, otherwise fallback
247
- const sessionId = typeof crypto.randomUUID === 'function'
248
- ? crypto.randomUUID()
249
- : 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
250
- const r = Math.random() * 16 | 0;
251
- const v = c === 'x' ? r : (r & 0x3 | 0x8);
252
- return v.toString(16);
253
- });
254
-
255
- sessionStorage.setItem('pendingVerification', sessionId);
256
- safePassage.verify({ sessionId });
257
- }
258
-
259
- // Check if returning from verification
260
- const urlParams = new URLSearchParams(window.location.search);
261
- if (urlParams.get('verified') === 'true') {
262
- const sessionId = sessionStorage.getItem('pendingVerification');
263
- // Validate session server-side here
264
- console.log('Validate session:', sessionId);
265
- }
201
+ document.getElementById('verify-btn').onclick = () => sp.verify();
266
202
  </script>
267
203
  </body>
268
204
  </html>
269
205
  ```
270
206
 
207
+ ### React Component
208
+
209
+ ```jsx
210
+ import { useState } from 'react';
211
+ import { SafePassage } from '@safepassage/sdk';
212
+
213
+ function AgeGate() {
214
+ const [verifying, setVerifying] = useState(false);
215
+
216
+ const sp = new SafePassage({
217
+ apiKey: process.env.NEXT_PUBLIC_SAFEPASSAGE_KEY,
218
+ returnUrl: window.location.origin + '/verified'
219
+ });
220
+
221
+ const handleVerify = async () => {
222
+ setVerifying(true);
223
+ try {
224
+ await sp.verify();
225
+ } catch (error) {
226
+ console.error('Failed to start verification:', error);
227
+ setVerifying(false);
228
+ }
229
+ };
230
+
231
+ return (
232
+ <button onClick={handleVerify} disabled={verifying}>
233
+ {verifying ? 'Redirecting...' : 'Verify Your Age'}
234
+ </button>
235
+ );
236
+ }
237
+ ```
238
+
271
239
  ## TypeScript
272
240
 
273
241
  Full TypeScript support included:
274
242
 
275
243
  ```typescript
276
- import { SafePassage, SafePassageConfig } from '@safepassage/sdk';
244
+ import { SafePassage, SafePassageConfig, VerificationResult } from '@safepassage/sdk';
277
245
 
278
246
  const config: SafePassageConfig = {
279
- apiKey: process.env.SAFEPASSAGE_PUBLIC_KEY!,
280
- returnUrl: '/verified'
247
+ apiKey: process.env.NEXT_PUBLIC_SAFEPASSAGE_KEY!,
248
+ returnUrl: '/verified',
249
+ mode: 'new-tab',
250
+ onComplete: (result: VerificationResult) => {
251
+ console.log(`Session ${result.sessionId}: ${result.status}`);
252
+ }
281
253
  };
282
254
 
283
- const safePassage = new SafePassage(config);
255
+ const sp = new SafePassage(config);
256
+ ```
257
+
258
+ ## Skip Parameters
259
+
260
+ For streamlined embedded flows:
261
+
262
+ ```javascript
263
+ // Skip intro screen (go directly to camera)
264
+ await sp.verify({ skipIntro: true });
265
+
266
+ // Auto-redirect after success (no success screen)
267
+ await sp.verify({ autoReturn: true });
268
+
269
+ // Both - minimal user interaction
270
+ await sp.verify({ skipIntro: true, autoReturn: true });
284
271
  ```
285
272
 
286
- ## Migration from v2
273
+ ## Error Handling
287
274
 
288
- New streamlined approach (10 lines):
289
275
  ```javascript
290
- const safePassage = new SafePassage({
291
- apiKey: 'sk_xxxxx',
292
- returnUrl: '/verified'
276
+ const sp = new SafePassage({
277
+ apiKey: 'pk_...',
278
+ returnUrl: '/verified',
279
+ onError: (error) => {
280
+ if (error.message.includes('popup')) {
281
+ alert('Please allow popups for age verification');
282
+ } else if (error.message.includes('rate limit')) {
283
+ alert('Too many attempts. Please wait a moment.');
284
+ } else {
285
+ console.error('Verification error:', error);
286
+ }
287
+ }
293
288
  });
294
- safePassage.verify({ sessionId: crypto.randomUUID() });
295
289
  ```
296
290
 
291
+ ## API Keys
292
+
293
+ SafePassage uses two types of API keys:
294
+
295
+ | Key Type | Prefix | Use Case |
296
+ |----------|--------|----------|
297
+ | Public Key | `pk_` | Client-side SDK (this package) |
298
+ | Secret Key | `sk_` | Server-side validation only |
299
+
300
+ > **Important**: This SDK only works with public keys (`pk_`). For server-side integrations using secret keys, use the [Direct API](https://docs.safepassageapp.com/api) instead.
301
+
297
302
  ## Browser Support
298
303
 
299
304
  - Chrome 60+
300
305
  - Firefox 60+
301
306
  - Safari 12+
302
307
  - Edge 79+
303
- - Mobile browsers
308
+ - Mobile browsers (iOS Safari, Chrome for Android)
309
+
310
+ ## Security Best Practices
311
+
312
+ 1. **Use public keys client-side** - Never expose secret keys in browser code
313
+ 2. **Validate server-side** - Always verify results using your secret key
314
+ 3. **Configure webhooks** - For reliable, tamper-proof verification notifications
315
+ 4. **Register callback URLs** - Pre-register your `returnUrl` in the dashboard
316
+ 5. **Use HTTPS** - SDK enforces HTTPS in production
317
+
318
+ ## Cleanup
319
+
320
+ When done with the SDK (e.g., in SPA route changes):
321
+
322
+ ```javascript
323
+ sp.destroy();
324
+ ```
325
+
326
+ ## Migration from v3.0.x
327
+
328
+ If you were using merchant-generated session IDs:
329
+
330
+ ```javascript
331
+ // Old (v3.0.x)
332
+ safePassage.verify({ sessionId: crypto.randomUUID() });
333
+
334
+ // New (v3.4+) - sessionId is auto-generated
335
+ await sp.verify();
336
+ ```
337
+
338
+ The SDK now creates sessions automatically via the API when using public keys.
304
339
 
305
- ## Security Notes
340
+ ## Support
306
341
 
307
- 1. Always generate session IDs on the merchant side
308
- 2. Validate sessions server-side before granting access
309
- 3. Pre-register callback URLs in your dashboard
310
- 4. Never expose your secret key (sk_xxx)
342
+ - [Documentation](https://docs.safepassageapp.com)
343
+ - [API Reference](https://docs.safepassageapp.com/api)
344
+ - [Dashboard](https://portal.safepassageapp.com)
@@ -49,6 +49,7 @@ export declare class SafePassage {
49
49
  private currentSessionId;
50
50
  private lastVerifyUrl;
51
51
  private lastSessionToken;
52
+ private temporaryHandoffToken;
52
53
  /**
53
54
  * Initialize SafePassage SDK
54
55
  *
@@ -63,6 +63,8 @@ export class SafePassage {
63
63
  this.lastVerifyUrl = null;
64
64
  // Server-provided session token (WS auth)
65
65
  this.lastSessionToken = null;
66
+ // Temporary storage for QR handoff token to include in state
67
+ this.temporaryHandoffToken = null;
66
68
  validateConfig(config);
67
69
  // Normalize environment: treat 'development' or any unknown value as 'production'
68
70
  let normalizedEnvironment = config.environment || this.detectEnvironment();
@@ -210,7 +212,7 @@ export class SafePassage {
210
212
  qualityThreshold: 0.6,
211
213
  },
212
214
  // Include handoffToken if available (for QR code desktop flow)
213
- handoffToken: this._temporaryHandoffToken,
215
+ handoffToken: this.temporaryHandoffToken || undefined,
214
216
  // Include sessionToken and verifyUrl to make UI auth deterministic
215
217
  sessionToken: this.lastSessionToken || undefined,
216
218
  verifyUrl: this.lastVerifyUrl || undefined,
@@ -285,7 +287,7 @@ export class SafePassage {
285
287
  }
286
288
  // Set up PostMessage listener with enhanced security
287
289
  this.messageListener = (event) => {
288
- var _a, _b, _c, _d, _e, _f, _g, _h;
290
+ var _a, _b, _c, _d, _e, _f;
289
291
  // Enhanced origin validation with strict allowlist
290
292
  if (!validatePostMessageOrigin(event, this.config.environment)) {
291
293
  logSecurityEvent('POSTMESSAGE_ORIGIN_BLOCKED', {
@@ -330,11 +332,9 @@ export class SafePassage {
330
332
  if (result.status === 'verified') {
331
333
  (_d = (_c = this.config).onComplete) === null || _d === void 0 ? void 0 : _d.call(_c, result);
332
334
  }
333
- else if (result.status === 'cancelled') {
334
- (_f = (_e = this.config).onCancel) === null || _f === void 0 ? void 0 : _f.call(_e);
335
- }
336
335
  else {
337
- (_h = (_g = this.config).onError) === null || _h === void 0 ? void 0 : _h.call(_g, new Error(`Verification failed: ${result.status}`));
336
+ // Status is 'failed' - trigger error callback
337
+ (_f = (_e = this.config).onError) === null || _f === void 0 ? void 0 : _f.call(_e, new Error(`Verification failed: ${result.status}`));
338
338
  }
339
339
  };
340
340
  window.addEventListener('message', this.messageListener);
@@ -611,7 +611,7 @@ export class SafePassage {
611
611
  // Store the handoffToken if it exists for desktop QR flow
612
612
  if (sessionData.handoffToken) {
613
613
  // Store it temporarily so it can be included in the state
614
- this._temporaryHandoffToken = sessionData.handoffToken;
614
+ this.temporaryHandoffToken = sessionData.handoffToken;
615
615
  }
616
616
  // Log successful session creation
617
617
  logSecurityEvent('INTERNAL_SESSION_CREATED', {
package/dist/index.d.ts CHANGED
@@ -18,4 +18,4 @@
18
18
  */
19
19
  export { SafePassage, SafePassage as default } from './core/SafePassageSDK';
20
20
  export type { SafePassageConfig, VerificationOptions, VerificationResult, SessionValidationResponse, } from './types';
21
- export declare const VERSION = "3.4.1";
21
+ export declare const VERSION = "3.4.3";