@ozura/elements 0.1.0-beta.6 → 0.1.0-beta.7

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
@@ -4,7 +4,7 @@ PCI-compliant card tokenization SDK for the Ozura Vault.
4
4
 
5
5
  OzElements renders secure, iframe-isolated card input fields on your page and tokenizes card data directly to the Ozura Vault. Your JavaScript never touches raw card numbers, CVVs, or expiry dates — the iframes handle everything. You get back a token. Use it with your own payment processor, your own backend systems, or with the Ozura Pay API.
6
6
 
7
- All you need is a vault API key.
7
+ You need a **vault public key** (`pk_…`) for the browser SDK and your **vault API key** on the server only — it mints short-lived **wax keys** so the secret never reaches the browser. **Integration expectations and examples are in this README** (section [Wax keys (merchant integration)](#wax-keys-merchant-integration)). [WAX_KEY_IMPLEMENTATION.md](./WAX_KEY_IMPLEMENTATION.md) is an optional deep dive (design history, dev server, security notes).
8
8
 
9
9
  ---
10
10
 
@@ -14,7 +14,7 @@ If you need to collect card data, you have a PCI compliance problem. OzElements
14
14
 
15
15
  The Ozura Vault stores and tokenizes sensitive card data. OzElements is the frontend SDK for the vault — it gives you drop-in card fields that are fully isolated inside Ozura-controlled iframes. Your page never sees raw card data, which keeps your PCI scope minimal (SAQ-A).
16
16
 
17
- **You don't need to be an OzuraPay merchant to use this.** You just need a vault API key. Once you have a token, you can use it however you want — with your own processor, your own systems, or optionally with the Ozura Pay API.
17
+ **You don't need to be an OzuraPay merchant to use this.** You need vault credentials: a **public key** for the browser and the **vault API key** on your server (for minting wax only). Once you have a token, you can use it however you want — with your own processor, your own systems, or optionally with the Ozura Pay API.
18
18
 
19
19
  ---
20
20
 
@@ -25,7 +25,7 @@ Your page (yoursite.com)
25
25
 
26
26
  │ import { OzVault } from '@ozura/elements'
27
27
 
28
- │ const vault = new OzVault('vault_api_key');
28
+ │ const vault = await OzVault.create({ pubKey, fetchWaxKey });
29
29
 
30
30
  │ const cardNumber = vault.createElement('cardNumber', { style: { ... } });
31
31
  │ cardNumber.mount('#card-number');
@@ -47,6 +47,8 @@ Your page (yoursite.com)
47
47
 
48
48
  Raw card data travels one path: element iframe → tokenizer iframe (direct same-origin `postMessage`). Your SDK only ever sees metadata (valid/complete/cardBrand) and the final token.
49
49
 
50
+ The tokenizer POSTs to the vault with **`X-Wax-Key`** (minted on your backend). The vault secret must **never** appear in the browser or in tokenize requests.
51
+
50
52
  ---
51
53
 
52
54
  ## Installation
@@ -70,8 +72,17 @@ For production, pin a version: `.../npm/@ozura/elements@1.0.0/dist/oz-elements.u
70
72
  ```js
71
73
  import { OzVault } from '@ozura/elements';
72
74
 
73
- const vault = new OzVault('your_vault_api_key', {
75
+ const vault = await OzVault.create({
74
76
  pubKey: 'your_pub_key',
77
+ fetchWaxKey: async (sessionId) => {
78
+ // Your backend mints a session-bound wax key using the vault secret
79
+ const { waxKey } = await fetch('/api/mint-wax', {
80
+ method: 'POST',
81
+ headers: { 'Content-Type': 'application/json' },
82
+ body: JSON.stringify({ sessionId }),
83
+ }).then(r => r.json());
84
+ return waxKey;
85
+ },
75
86
  });
76
87
 
77
88
  const cardNumber = vault.createElement('cardNumber', {
@@ -113,16 +124,135 @@ document.getElementById('tokenize').addEventListener('click', async () => {
113
124
 
114
125
  ---
115
126
 
127
+ ## Wax keys (merchant integration)
128
+
129
+ The vault `/tokenize` call must not use your vault secret from the browser. Instead:
130
+
131
+ 1. During `OzVault.create()`, the SDK generates a `sessionId` (UUID) and calls **`fetchWaxKey(sessionId)`** once.
132
+ 2. Your **`fetchWaxKey`** implementation should `POST` to **your** backend (e.g. `/api/mint-wax`) with that `sessionId`.
133
+ 3. Your backend uses the **vault API key only on the server** to mint a short-lived **wax key** from the vault, then returns `{ waxKey }` to the browser.
134
+ 4. The hidden tokenizer iframe sends **`X-Wax-Key`** (and related headers) to the vault — **never `X-API-Key`**.
135
+
136
+ ### Vault mint contract (your backend → vault)
137
+
138
+ Your server calls the vault (the SDK’s `Ozura.mintWaxKey` does this for you):
139
+
140
+ | | |
141
+ |---|---|
142
+ | **Method / URL** | `POST {vaultBaseUrl}/internal/wax-session` |
143
+ | **Auth** | `X-API-Key: <vault API key>` (server only) |
144
+ | **Body** | `{ "checkout_session_id": "<sessionId>" }` — optional; correlates with the SDK session. `{}` is valid. |
145
+ | **Success** | HTTP **201** · `{ "data": { "wax_key": "<uuid>", "expires_in_seconds": 1800 } }` (TTL is typically 30 minutes) |
146
+ | **Errors** | JSON such as `{ "message", "error_code" }` — treat like any API error |
147
+
148
+ If your vault hostname differs from the default used by published iframe builds, pass **`vaultUrl`** on `Ozura` so mint/revoke hit the correct host.
149
+
150
+ ### One-line handlers (`@ozura/elements/server`)
151
+
152
+ Both helpers accept **`sessionId`** or **`tokenizationSessionId`** in the JSON body. They respond with **`{ waxKey }`** on success.
153
+
154
+ **Next.js App Router** (or any runtime with `Request` / `Response`):
155
+
156
+ ```ts
157
+ import { Ozura, createMintWaxHandler } from '@ozura/elements/server';
158
+
159
+ const ozura = new Ozura({
160
+ merchantId: process.env.MERCHANT_ID!,
161
+ apiKey: process.env.MERCHANT_API_KEY!,
162
+ vaultKey: process.env.VAULT_API_KEY!,
163
+ // vaultUrl: process.env.VAULT_URL, // optional override
164
+ });
165
+
166
+ export const POST = createMintWaxHandler(ozura);
167
+ ```
168
+
169
+ **Express** (register JSON body parsing **before** the middleware):
170
+
171
+ ```ts
172
+ import express from 'express';
173
+ import { Ozura, createMintWaxMiddleware } from '@ozura/elements/server';
174
+
175
+ const app = express();
176
+ const ozura = new Ozura({
177
+ merchantId: process.env.MERCHANT_ID!,
178
+ apiKey: process.env.MERCHANT_API_KEY!,
179
+ vaultKey: process.env.VAULT_API_KEY!,
180
+ });
181
+
182
+ app.use(express.json());
183
+ app.post('/api/mint-wax', createMintWaxMiddleware(ozura));
184
+ ```
185
+
186
+ ### Manual route
187
+
188
+ Use this if you need to persist `waxKey` server-side for later revocation:
189
+
190
+ ```ts
191
+ app.post('/api/mint-wax', async (req, res) => {
192
+ const sessionId = req.body?.sessionId ?? req.body?.tokenizationSessionId;
193
+ const { waxKey, expiresInSeconds } = await ozura.mintWaxKey(
194
+ typeof sessionId === 'string' && sessionId
195
+ ? { tokenizationSessionId: sessionId }
196
+ : {},
197
+ );
198
+ // await saveWaxForSession(sessionId, waxKey);
199
+ res.json({ waxKey });
200
+ });
201
+ ```
202
+
203
+ `mintWaxKey` throws **`OzuraError`** on failure (vault 4xx/5xx). The one-line handlers catch that and respond with **`{ error: string }`**: HTTP status is the vault status when ≥ 400, otherwise **502** (e.g. network failure).
204
+
205
+ ### Browser: handle mint failures
206
+
207
+ Check the response from your mint endpoint before calling `createToken`:
208
+
209
+ ```js
210
+ fetchWaxKey: async (sessionId) => {
211
+ const res = await fetch('/api/mint-wax', {
212
+ method: 'POST',
213
+ headers: { 'Content-Type': 'application/json' },
214
+ body: JSON.stringify({ sessionId }),
215
+ });
216
+ const data = await res.json().catch(() => ({}));
217
+ if (!res.ok) {
218
+ throw new Error(typeof data.error === 'string' ? data.error : 'Could not mint wax key');
219
+ }
220
+ if (!data.waxKey) throw new Error('Mint response missing waxKey');
221
+ return data.waxKey;
222
+ },
223
+ ```
224
+
225
+ ### Optional: revoke when the checkout session ends
226
+
227
+ To shorten exposure before TTL, call **`await ozura.revokeWaxKey(waxKey)`** from your server when the session completes successfully, the user cancels, or your session times out. It is best-effort (does not throw). **Do not** revoke on card decline — the user may fix the card and call `createToken()` again without a full new `OzVault.create()`.
228
+
229
+ ### Expired or consumed wax
230
+
231
+ If tokenization fails with an auth-style error after the wax key expired or was consumed, create a **new** vault instance: `await OzVault.create({ pubKey, fetchWaxKey })` so `fetchWaxKey` runs again.
232
+
233
+ ### More detail
234
+
235
+ [WAX_KEY_IMPLEMENTATION.md](./WAX_KEY_IMPLEMENTATION.md) covers revocation scenarios, local dev-server behaviour, and security notes in depth.
236
+
237
+ ---
238
+
116
239
  ## API
117
240
 
118
- ### `new OzVault(apiKey, options)`
241
+ ### `OzVault.create(options)`
242
+
243
+ Returns `Promise<OzVault>`. The static factory is the only way to create a vault — the constructor is private.
119
244
 
120
245
  | Option | Type | Default | Description |
121
246
  |---|---|---|---|
122
- | `apiKey` | `string` | required | Your Ozura vault API key |
123
247
  | `options.pubKey` | `string` | required | System pub key for the tokenize endpoint. Obtain from Ozura admin. |
124
- | `options.apiUrl` | `string` | Ozura prod vault | Vault base URL |
248
+ | `options.fetchWaxKey` | `(sessionId: string) => Promise<string>` | required | Called once during `create()`. Receives an SDK-generated session UUID; your implementation passes it to your backend, which mints a session-bound wax key from the vault using your vault secret. Returns the wax key string. |
125
249
  | `options.frameBaseUrl` | `string` | `https://elements.ozura.com` | Where iframe assets are served from |
250
+ | `options.fonts` | `FontSource[]` | `[]` | Custom fonts to inject into element iframes |
251
+ | `options.appearance` | `ElementStyleConfig` | — | Default style applied to all created elements |
252
+ | `options.onLoadError` | `() => void` | — | Called if the tokenizer iframe fails to load within `loadTimeoutMs` |
253
+ | `options.loadTimeoutMs` | `number` | `10000` | Timeout in ms before `onLoadError` fires |
254
+
255
+ Implement **`/api/mint-wax`** on your server using `@ozura/elements/server` — see [Wax keys (merchant integration)](#wax-keys-merchant-integration) for Next.js, Express, manual mint, errors, and optional revocation.
126
256
 
127
257
  ### `vault.createElement(type, options?)`
128
258
 
@@ -235,6 +365,23 @@ Updates `style`, `placeholder`, or `disabled` on a mounted element without remou
235
365
 
236
366
  ---
237
367
 
368
+ ## Server SDK (`@ozura/elements/server`)
369
+
370
+ Import `Ozura` and optional wax helpers from `@ozura/elements/server`:
371
+
372
+ | Export | Role |
373
+ |--------|------|
374
+ | `new Ozura({ merchantId, apiKey, vaultKey, apiUrl?, vaultUrl?, … })` | Pay API (`cardSale`, `listTransactions`) and vault wax calls |
375
+ | `ozura.mintWaxKey({ tokenizationSessionId? })` | `POST /internal/wax-session` — implement or use helpers below |
376
+ | `ozura.revokeWaxKey(waxKey)` | Best-effort revoke when the checkout session ends |
377
+ | `createMintWaxHandler(ozura)` | Fetch API handler (Next.js App Router, Workers, Edge) → `{ waxKey }` |
378
+ | `createMintWaxMiddleware(ozura)` | Express / Connect middleware → `{ waxKey }` |
379
+ | `getClientIp(req)` | Helper for `cardSale` client IP |
380
+
381
+ See [Wax keys (merchant integration)](#wax-keys-merchant-integration) in this README for vault contract, examples, and client error handling. Extra depth (dev server, threat notes): [WAX_KEY_IMPLEMENTATION.md](./WAX_KEY_IMPLEMENTATION.md).
382
+
383
+ ---
384
+
238
385
  ## React
239
386
 
240
387
  ```bash
@@ -336,8 +483,15 @@ function CheckoutForm() {
336
483
  export default function App() {
337
484
  return (
338
485
  <OzElements
339
- apiKey="your_vault_api_key"
340
486
  pubKey="your_pub_key"
487
+ fetchWaxKey={async (sessionId) => {
488
+ const { waxKey } = await fetch('/api/mint-wax', {
489
+ method: 'POST',
490
+ headers: { 'Content-Type': 'application/json' },
491
+ body: JSON.stringify({ sessionId }),
492
+ }).then(r => r.json());
493
+ return waxKey;
494
+ }}
341
495
  frameBaseUrl="https://elements.ozura.com"
342
496
  >
343
497
  <CheckoutForm />
@@ -350,9 +504,13 @@ export default function App() {
350
504
 
351
505
  | Prop | Type | Description |
352
506
  |---|---|---|
353
- | `apiKey` | `string` | Your Ozura vault API key |
354
- | `apiUrl` | `string?` | Vault API base URL |
507
+ | `fetchWaxKey` | `(sessionId: string) => Promise<string>` | Called once on mount. Pass the received `sessionId` to your backend; your backend mints a wax key from the vault and returns it. |
508
+ | `pubKey` | `string` | System pub key for the tokenize endpoint |
355
509
  | `frameBaseUrl` | `string?` | Where iframe assets are hosted |
510
+ | `fonts` | `FontSource[]?` | Custom fonts to inject into element iframes |
511
+ | `onLoadError` | `() => void?` | Called if vault init fails (fetchWaxKey error or tokenizer iframe timeout) |
512
+ | `loadTimeoutMs` | `number?` | Timeout before `onLoadError` fires (default: 10 000) |
513
+ | `appearance` | `Appearance?` | Global theme / variable overrides |
356
514
 
357
515
  ### `useOzElements()` return
358
516
 
@@ -382,7 +540,7 @@ If you're an OzuraPay merchant and want to charge cards through Ozura's processo
382
540
 
383
541
  | Credential | Where it goes |
384
542
  |-----------|---------------|
385
- | Vault API key | Frontend: `new OzVault(vaultApiKey)`. Backend: `vault-api-key` header |
543
+ | Vault API key | **Server only.** Browser calls `fetchWaxKey` your backend mints a wax key with this secret; never send the secret in the browser. Pay API `cardSale` also sends it as `vault-api-key` from the server. |
386
544
  | Pay API key | Backend only: `x-api-key` header |
387
545
  | Merchant ID | Backend only: `merchantId` in request body |
388
546
 
@@ -393,8 +551,16 @@ For the full credential setup, billing form field requirements, validation rules
393
551
  ```js
394
552
  import { OzVault, normalizeCardSaleError } from '@ozura/elements';
395
553
 
396
- const vault = new OzVault('vault_api_key_here', {
554
+ const vault = await OzVault.create({
397
555
  pubKey: 'your_pub_key',
556
+ fetchWaxKey: async (sessionId) => {
557
+ const { waxKey } = await fetch('/api/mint-wax', {
558
+ method: 'POST',
559
+ headers: { 'Content-Type': 'application/json' },
560
+ body: JSON.stringify({ sessionId }),
561
+ }).then(r => r.json());
562
+ return waxKey;
563
+ },
398
564
  });
399
565
 
400
566
  // … mount card elements …
@@ -654,8 +820,8 @@ The test suite covers: Luhn algorithm, card brand detection, card number formatt
654
820
  ```bash
655
821
  npm install
656
822
  npm run dev # build + serve demo at http://localhost:4242/demo/index.html
657
- npm run build # production build
658
823
  npm run watch # rebuild on save
824
+ npm run build # production build
659
825
  ```
660
826
 
661
827
  Build outputs in `dist/`:
@@ -668,8 +834,9 @@ Build outputs in `dist/`:
668
834
  | `frame/tokenizer-frame.js` | IIFE | loaded by tokenizer iframe |
669
835
  | `react/index.esm.js` | ESM | `import ... from '@ozura/elements/react'` |
670
836
  | `react/index.cjs.js` | CJS | `require('@ozura/elements/react')` |
837
+ | `server/index.*.js` | ESM + CJS | `import { Ozura, createMintWaxHandler } from '@ozura/elements/server'` |
671
838
 
672
- See [ARCHITECTURE.md](./ARCHITECTURE.md) for architecture detail, security model, and pre-production requirements.
839
+ Maintainer notes: [DEVELOPMENT.md](./DEVELOPMENT.md). Merchants: [Wax keys (merchant integration)](#wax-keys-merchant-integration) in this file; supplementary detail in [WAX_KEY_IMPLEMENTATION.md](./WAX_KEY_IMPLEMENTATION.md).
673
840
 
674
841
  ---
675
842
 
@@ -67,7 +67,8 @@ var _OzTokenizerFrame = (function (exports) {
67
67
  this.pending.set(msg.requestId, {
68
68
  kind: 'card',
69
69
  requestId: msg.requestId,
70
- apiKey: msg.apiKey,
70
+ waxKey: msg.waxKey || '',
71
+ tokenizationSessionId: msg.tokenizationSessionId || '',
71
72
  pubKey: msg.pubKey || '',
72
73
  firstName: msg.firstName || '',
73
74
  lastName: msg.lastName || '',
@@ -83,7 +84,8 @@ var _OzTokenizerFrame = (function (exports) {
83
84
  this.pendingBank.set(msg.requestId, {
84
85
  kind: 'bank',
85
86
  requestId: msg.requestId,
86
- apiKey: msg.apiKey,
87
+ waxKey: msg.waxKey || '',
88
+ tokenizationSessionId: msg.tokenizationSessionId || '',
87
89
  pubKey: msg.pubKey || '',
88
90
  firstName: msg.firstName || '',
89
91
  lastName: msg.lastName || '',
@@ -141,7 +143,7 @@ var _OzTokenizerFrame = (function (exports) {
141
143
  * `token` string, or `null` if an error was already reported via
142
144
  * postMessage to `target`.
143
145
  */
144
- async postToVault(requestId, apiUrl, apiKey, pubKey, body, target, logLabel) {
146
+ async postToVault(requestId, apiUrl, waxKey, pubKey, body, target, logLabel, tokenizationSessionId) {
145
147
  var _a, _b;
146
148
  if (!isAllowedVaultOrigin(apiUrl)) {
147
149
  let error;
@@ -156,15 +158,39 @@ var _OzTokenizerFrame = (function (exports) {
156
158
  window.parent.postMessage({ __oz: true, vaultId: this.vaultId, type: 'OZ_TOKEN_ERROR', requestId, error, errorCode: 'config' }, target);
157
159
  return null;
158
160
  }
161
+ if (!waxKey) {
162
+ const error = 'Wax key is missing. Ensure OzVault.create() completed successfully before calling createToken().';
163
+ console.error(`[OzTokenizer] ${error}`);
164
+ window.parent.postMessage({ __oz: true, vaultId: this.vaultId, type: 'OZ_TOKEN_ERROR', requestId, error, errorCode: 'config' }, target);
165
+ return null;
166
+ }
159
167
  try {
160
168
  const headers = {
161
169
  'Content-Type': 'application/json',
162
- 'X-API-Key': apiKey,
170
+ 'X-Wax-Key': waxKey,
163
171
  'X-Request-ID': requestId,
164
172
  };
165
173
  if (pubKey) {
166
174
  headers['X-Pub-Key'] = pubKey;
167
175
  }
176
+ if (tokenizationSessionId) {
177
+ headers['X-Tokenization-Session-Id'] = tokenizationSessionId;
178
+ }
179
+ // ── Security enforcement ──────────────────────────────────────────────
180
+ // x-api-key is a merchant secret and must NEVER be sent to the vault
181
+ // tokenize endpoint. The vault authenticates tokenize requests via
182
+ // X-Wax-Key (session-scoped) only. Any accidental inclusion here is a
183
+ // configuration bug that must surface immediately, not silently degrade.
184
+ const forbiddenKey = Object.keys(headers).find(k => k.toLowerCase() === 'x-api-key');
185
+ if (forbiddenKey) {
186
+ const msg = `[OzTokenizer] SECURITY: 'x-api-key' must not be sent to the vault ` +
187
+ `tokenize endpoint (found as '${forbiddenKey}'). ` +
188
+ `Vault tokenize authenticates via X-Wax-Key only.`;
189
+ console.error(msg);
190
+ window.parent.postMessage({ __oz: true, vaultId: this.vaultId, type: 'OZ_TOKEN_ERROR', requestId, error: msg, errorCode: 'config' }, target);
191
+ return null;
192
+ }
193
+ // ─────────────────────────────────────────────────────────────────────
168
194
  const data = await this.fetchWithRetry(`${apiUrl}/tokenize`, {
169
195
  method: 'POST',
170
196
  headers,
@@ -190,7 +216,7 @@ var _OzTokenizerFrame = (function (exports) {
190
216
  }
191
217
  async tokenize(session) {
192
218
  var _a, _b, _c, _d;
193
- const { requestId, apiKey, pubKey, firstName, lastName, values, cardMeta, hostOrigin } = session;
219
+ const { requestId, waxKey, tokenizationSessionId, pubKey, firstName, lastName, values, cardMeta, hostOrigin } = session;
194
220
  const target = hostOrigin || window.location.origin;
195
221
  const cardNumber = values.get('cardNumber') || '';
196
222
  const cvv = values.get('cvv') || '';
@@ -213,7 +239,7 @@ var _OzTokenizerFrame = (function (exports) {
213
239
  },
214
240
  },
215
241
  };
216
- const data = await this.postToVault(requestId, VAULT_API_URL, apiKey, pubKey, body, target, 'card');
242
+ const data = await this.postToVault(requestId, VAULT_API_URL, waxKey, pubKey, body, target, 'card', tokenizationSessionId);
217
243
  if (!data)
218
244
  return;
219
245
  const { token } = data;
@@ -230,7 +256,7 @@ var _OzTokenizerFrame = (function (exports) {
230
256
  window.parent.postMessage(Object.assign({ __oz: true, vaultId: this.vaultId, type: 'OZ_TOKEN_RESULT', requestId, token, cvcSession }, (hasFullCardMeta ? { card: cardMeta } : {})), target);
231
257
  }
232
258
  async tokenizeBank(session) {
233
- const { requestId, apiKey, pubKey, firstName, lastName, values, bankMeta, hostOrigin } = session;
259
+ const { requestId, waxKey, tokenizationSessionId, pubKey, firstName, lastName, values, bankMeta, hostOrigin } = session;
234
260
  const target = hostOrigin || window.location.origin;
235
261
  const body = {
236
262
  type: 'bank',
@@ -246,7 +272,7 @@ var _OzTokenizerFrame = (function (exports) {
246
272
  },
247
273
  },
248
274
  };
249
- const data = await this.postToVault(requestId, VAULT_API_URL, apiKey, pubKey, body, target, 'bank');
275
+ const data = await this.postToVault(requestId, VAULT_API_URL, waxKey, pubKey, body, target, 'bank', tokenizationSessionId);
250
276
  if (!data)
251
277
  return;
252
278
  const { token } = data;
@@ -1 +1 @@
1
- {"version":3,"file":"tokenizer-frame.js","sources":["../../src/frame/tokenizerFrame.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tokenizer-frame.js","sources":["../../src/frame/tokenizerFrame.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -729,8 +729,20 @@ const DEFAULT_FRAME_BASE_URL = "https://lively-hill-097170c0f.4.azurestaticapps.
729
729
  * The main entry point for OzElements. Creates and manages iframe-based
730
730
  * card input elements that keep raw card data isolated from the merchant page.
731
731
  *
732
+ * Use the static `OzVault.create()` factory — do not call `new OzVault()` directly.
733
+ *
732
734
  * @example
733
- * const vault = new OzVault('your_vault_api_key');
735
+ * const vault = await OzVault.create({
736
+ * pubKey: 'pk_live_...',
737
+ * fetchWaxKey: async (sessionId) => {
738
+ * // Call your backend — which calls ozura.mintWaxKey() from oz-elements/server
739
+ * const { waxKey } = await fetch('/api/mint-wax', {
740
+ * method: 'POST',
741
+ * body: JSON.stringify({ sessionId }),
742
+ * }).then(r => r.json());
743
+ * return waxKey;
744
+ * },
745
+ * });
734
746
  * const cardNum = vault.createElement('cardNumber');
735
747
  * cardNum.mount('#card-number');
736
748
  * const { token, cvcSession } = await vault.createToken({
@@ -738,7 +750,12 @@ const DEFAULT_FRAME_BASE_URL = "https://lively-hill-097170c0f.4.azurestaticapps.
738
750
  * });
739
751
  */
740
752
  class OzVault {
741
- constructor(apiKey, options) {
753
+ /**
754
+ * Internal constructor — use `OzVault.create()` instead.
755
+ * The constructor mounts the tokenizer iframe immediately so it can start
756
+ * loading in parallel while `fetchWaxKey` is being awaited.
757
+ */
758
+ constructor(options, waxKey, tokenizationSessionId) {
742
759
  var _a, _b;
743
760
  this.elements = new Map();
744
761
  this.elementsByType = new Map();
@@ -754,10 +771,8 @@ class OzVault {
754
771
  this._destroyed = false;
755
772
  this._pendingMount = null;
756
773
  this.loadErrorTimeoutId = null;
757
- if (!apiKey || !apiKey.trim()) {
758
- throw new OzError('A non-empty vault API key is required. Pass your key as the first argument to new OzVault().');
759
- }
760
- this.apiKey = apiKey;
774
+ this.waxKey = waxKey;
775
+ this.tokenizationSessionId = tokenizationSessionId;
761
776
  this.pubKey = options.pubKey;
762
777
  this.frameBaseUrl = options.frameBaseUrl || DEFAULT_FRAME_BASE_URL;
763
778
  this.frameOrigin = new URL(this.frameBaseUrl).origin;
@@ -778,6 +793,52 @@ class OzVault {
778
793
  }, timeout);
779
794
  }
780
795
  }
796
+ /**
797
+ * Creates and returns a ready `OzVault` instance.
798
+ *
799
+ * Internally this:
800
+ * 1. Generates a `tokenizationSessionId` (UUID).
801
+ * 2. Starts loading the hidden tokenizer iframe immediately.
802
+ * 3. Calls `options.fetchWaxKey(tokenizationSessionId)` concurrently — your
803
+ * backend mints a session-bound wax key from the vault and returns it.
804
+ * 4. Resolves with the vault instance once the wax key is stored. The iframe
805
+ * has been loading the whole time, so `isReady` may already be true or
806
+ * will fire shortly after.
807
+ *
808
+ * The returned vault is ready to create elements immediately. `createToken()`
809
+ * additionally requires `vault.isReady` (tokenizer iframe loaded).
810
+ *
811
+ * @throws {OzError} if `fetchWaxKey` throws or returns an empty string.
812
+ */
813
+ static async create(options) {
814
+ if (!options.pubKey || !options.pubKey.trim()) {
815
+ throw new OzError('pubKey is required in options. Obtain your public key from the Ozura admin.');
816
+ }
817
+ if (typeof options.fetchWaxKey !== 'function') {
818
+ throw new OzError('fetchWaxKey must be a function. See OzVault.create() docs for the expected signature.');
819
+ }
820
+ const tokenizationSessionId = crypto.randomUUID();
821
+ // Construct the vault immediately — this mounts the tokenizer iframe so it
822
+ // starts loading while fetchWaxKey is in flight. The waxKey field starts
823
+ // empty and is set below before create() returns.
824
+ const vault = new OzVault(options, '', tokenizationSessionId);
825
+ let waxKey;
826
+ try {
827
+ waxKey = await options.fetchWaxKey(tokenizationSessionId);
828
+ }
829
+ catch (err) {
830
+ vault.destroy();
831
+ const msg = err instanceof Error ? err.message : 'Unknown error';
832
+ throw new OzError(`fetchWaxKey threw an error: ${msg}`);
833
+ }
834
+ if (!waxKey || !waxKey.trim()) {
835
+ vault.destroy();
836
+ throw new OzError('fetchWaxKey must return a non-empty wax key string. Check your mint endpoint.');
837
+ }
838
+ // Static methods can access private fields of instances of the same class.
839
+ vault.waxKey = waxKey;
840
+ return vault;
841
+ }
781
842
  /**
782
843
  * True once the hidden tokenizer iframe has loaded and signalled ready.
783
844
  * Use this to gate the pay button when building custom UIs without React.
@@ -818,7 +879,7 @@ class OzVault {
818
879
  }
819
880
  createElementInto(typeMap, type, options) {
820
881
  if (this._destroyed) {
821
- throw new OzError('Cannot create elements on a destroyed vault. Create a new OzVault instance.');
882
+ throw new OzError('Cannot create elements on a destroyed vault. Call await OzVault.create() to get a new instance.');
822
883
  }
823
884
  const existing = typeMap.get(type);
824
885
  if (existing) {
@@ -850,7 +911,7 @@ class OzVault {
850
911
  async createBankToken(options) {
851
912
  var _a, _b;
852
913
  if (this._destroyed) {
853
- throw new OzError('Cannot tokenize on a destroyed vault. Create a new OzVault instance.');
914
+ throw new OzError('Cannot tokenize on a destroyed vault. Call await OzVault.create() to get a new instance.');
854
915
  }
855
916
  if (!this.tokenizerReady) {
856
917
  throw new OzError('Vault not ready. Ensure the page is fully loaded before calling createBankToken.');
@@ -897,7 +958,8 @@ class OzVault {
897
958
  this.sendToTokenizer({
898
959
  type: 'OZ_BANK_TOKENIZE',
899
960
  requestId,
900
- apiKey: this.apiKey,
961
+ waxKey: this.waxKey,
962
+ tokenizationSessionId: this.tokenizationSessionId,
901
963
  pubKey: this.pubKey,
902
964
  firstName: options.firstName.trim(),
903
965
  lastName: options.lastName.trim(),
@@ -922,7 +984,7 @@ class OzVault {
922
984
  async createToken(options = {}) {
923
985
  var _a, _b;
924
986
  if (this._destroyed) {
925
- throw new OzError('Cannot tokenize on a destroyed vault. Create a new OzVault instance.');
987
+ throw new OzError('Cannot tokenize on a destroyed vault. Call await OzVault.create() to get a new instance.');
926
988
  }
927
989
  if (!this.tokenizerReady) {
928
990
  throw new OzError('Vault not ready. Ensure the page is fully loaded before calling createToken.');
@@ -982,7 +1044,8 @@ class OzVault {
982
1044
  this.sendToTokenizer({
983
1045
  type: 'OZ_TOKENIZE',
984
1046
  requestId,
985
- apiKey: this.apiKey,
1047
+ waxKey: this.waxKey,
1048
+ tokenizationSessionId: this.tokenizationSessionId,
986
1049
  pubKey: this.pubKey,
987
1050
  firstName,
988
1051
  lastName,