@starfish-codes/hellgate 3.10.0 → 3.12.0
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/dist/card/card-handler.d.ts +3 -1
- package/dist/card/typings.d.ts +6 -3
- package/dist/card/ui/iframe/elements/base-element.d.ts +1 -0
- package/dist/card/ui/iframe/elements/card-expiration-date.d.ts +1 -0
- package/dist/card/ui/iframe/elements/card-expiration-month.d.ts +1 -0
- package/dist/card/ui/iframe/elements/card-expiration-year.d.ts +1 -0
- package/dist/card/ui/iframe/elements/card-number.d.ts +1 -0
- package/dist/card/ui/iframe/elements/card-verification-code.d.ts +1 -0
- package/dist/coordinator/iframe/iframe-coordinator.d.ts +1 -1
- package/dist/coordinator/iframe/iframe.d.ts +1 -1
- package/dist/hellgate-sdk.mjs +126 -86
- package/dist/hellgate-sdk.umd.js +1 -1
- package/dist/session/api.d.ts +18 -1
- package/dist/session/api.spec.d.ts +1 -0
- package/package.json +9 -9
- package/dist/card/tokenization/basis_theory/constants.d.ts +0 -2
- package/dist/card/tokenization/basis_theory/index.d.ts +0 -2
- package/dist/card/tokenization/basis_theory/typings.d.ts +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { CompleteActionResult, HellgateSession } from '../session';
|
|
2
2
|
import { Coordinator } from '../coordinator';
|
|
3
|
-
import { CreateCardFieldsOptions, CreateCardFormOptions, PaymentAdditionalData, RefreshSecurityCodeSessionStateDTO, TokenizeCardSessionStateDTO, TokenizedData } from './typings';
|
|
3
|
+
import { CreateCardFieldsOptions, CreateCardFormOptions, PaymentAdditionalData, RefreshSecurityCodeSessionStateDTO, TokenLifecycleMode, TokenizeCardSessionStateDTO, TokenizedData } from './typings';
|
|
4
4
|
import { CardElement, CardExpirationDateElement, CardNumberElement, CardVerificationCodeElement, TextElement } from './ui/elements';
|
|
5
5
|
import { CardElementBase } from './ui/elements/base-element';
|
|
6
6
|
import { CardExpirationMonthElement } from './ui/elements/card-expiration-month';
|
|
@@ -56,6 +56,8 @@ export declare class HellgateCardHandler {
|
|
|
56
56
|
updateFormState(): void;
|
|
57
57
|
private createFieldDefaultState;
|
|
58
58
|
private serializeAdditionalData;
|
|
59
|
+
private resolveLifecycleFields;
|
|
60
|
+
getLifecycle(): TokenLifecycleMode;
|
|
59
61
|
private getSessionSchemes;
|
|
60
62
|
private getCardDataValidationError;
|
|
61
63
|
}
|
package/dist/card/typings.d.ts
CHANGED
|
@@ -35,9 +35,10 @@ export type PaymentAdditionalData<FieldValue = AdditionalDataValue> = {
|
|
|
35
35
|
country?: FieldValue;
|
|
36
36
|
};
|
|
37
37
|
/**
|
|
38
|
-
* Token lifecycle intent. When `true
|
|
39
|
-
*
|
|
40
|
-
*
|
|
38
|
+
* Token lifecycle intent. When `true`, the resulting PCI token is
|
|
39
|
+
* ephemeral and cleaned up after a short TTL. When `false`, the token is
|
|
40
|
+
* persistent; use `false` only on cardholder consent. When omitted the SDK
|
|
41
|
+
* sends no lifecycle intent and the server decides.
|
|
41
42
|
*/
|
|
42
43
|
ephemeral?: boolean;
|
|
43
44
|
/**
|
|
@@ -66,12 +67,14 @@ export type TokenizeCardActionDTO = {
|
|
|
66
67
|
result: TokenizedData;
|
|
67
68
|
};
|
|
68
69
|
export type HellgateCardScheme = 'visa' | 'mastercard' | 'americanexpress' | 'discover' | 'dinersclub' | 'jcb' | 'unionpay';
|
|
70
|
+
export type TokenLifecycleMode = 'user_choice' | 'ephemeral_only' | 'persistent_only';
|
|
69
71
|
export type TokenizeCardConfig = {
|
|
70
72
|
provider: 'guardian';
|
|
71
73
|
api_key: string;
|
|
72
74
|
base_url: string;
|
|
73
75
|
jwk: JWK;
|
|
74
76
|
allowed_schemes?: HellgateCardScheme[];
|
|
77
|
+
lifecycle?: TokenLifecycleMode;
|
|
75
78
|
};
|
|
76
79
|
export type TokenizeCardSessionStateDTO = {
|
|
77
80
|
next_action: 'tokenize_card';
|
|
@@ -14,6 +14,7 @@ export declare abstract class IframeCardElementBase implements BaseElement<Eleme
|
|
|
14
14
|
abstract readonly type: ElementType;
|
|
15
15
|
protected abstract options: ElementBaseOptions;
|
|
16
16
|
protected abstract inputMaskOptions: FactoryArg;
|
|
17
|
+
protected readonly inputMode?: 'numeric';
|
|
17
18
|
protected inputMask?: InputMask<FactoryArg>;
|
|
18
19
|
protected id: string;
|
|
19
20
|
cardType?: CreditCardType;
|
|
@@ -3,6 +3,7 @@ import { ElementBaseOptions, ElementMetadata, ElementType, ITextElement } from '
|
|
|
3
3
|
import { IframeCardElementBase } from './base-element';
|
|
4
4
|
export declare class IframeCardExpirationDate extends IframeCardElementBase implements ITextElement {
|
|
5
5
|
readonly type: ElementType;
|
|
6
|
+
protected readonly inputMode = "numeric";
|
|
6
7
|
protected options: ElementBaseOptions;
|
|
7
8
|
compiledMask?: Masked;
|
|
8
9
|
protected inputMaskOptions: FactoryArg;
|
|
@@ -3,6 +3,7 @@ import { ElementBaseOptions, ElementMetadata, ElementType, ITextElement } from '
|
|
|
3
3
|
import { IframeCardElementBase } from './base-element';
|
|
4
4
|
export declare class IframeCardExpirationMonth extends IframeCardElementBase implements ITextElement {
|
|
5
5
|
readonly type: ElementType;
|
|
6
|
+
protected readonly inputMode = "numeric";
|
|
6
7
|
protected options: ElementBaseOptions;
|
|
7
8
|
compiledMask?: Masked;
|
|
8
9
|
protected inputMaskOptions: FactoryArg;
|
|
@@ -3,6 +3,7 @@ import { ElementBaseOptions, ElementMetadata, ElementType, ITextElement } from '
|
|
|
3
3
|
import { IframeCardElementBase } from './base-element';
|
|
4
4
|
export declare class IframeCardExpirationYear extends IframeCardElementBase implements ITextElement {
|
|
5
5
|
readonly type: ElementType;
|
|
6
|
+
protected readonly inputMode = "numeric";
|
|
6
7
|
protected options: ElementBaseOptions;
|
|
7
8
|
protected inputMaskOptions: FactoryArg;
|
|
8
9
|
protected validate(masked: Masked): ElementMetadata;
|
|
@@ -4,6 +4,7 @@ import { IframeCardElementBase } from './base-element';
|
|
|
4
4
|
export type IconPosition = 'left' | 'right' | 'none';
|
|
5
5
|
export declare class IframeCardNumber extends IframeCardElementBase implements ITextElement {
|
|
6
6
|
readonly type: ElementType;
|
|
7
|
+
protected readonly inputMode = "numeric";
|
|
7
8
|
protected options: ElementBaseOptions;
|
|
8
9
|
protected inputMaskOptions: FactoryArg;
|
|
9
10
|
update(options: ElementBaseOptions): Promise<void>;
|
|
@@ -3,6 +3,7 @@ import { ElementBaseOptions, ElementType, ITextElement } from '../../typings';
|
|
|
3
3
|
import { IframeCardElementBase } from './base-element';
|
|
4
4
|
export declare class IframeCardVerificationCode extends IframeCardElementBase implements ITextElement {
|
|
5
5
|
readonly type: ElementType;
|
|
6
|
+
protected readonly inputMode = "numeric";
|
|
6
7
|
protected options: ElementBaseOptions;
|
|
7
8
|
protected inputMaskOptions: FactoryArg;
|
|
8
9
|
}
|
|
@@ -15,7 +15,7 @@ export declare class IframeCoordinator {
|
|
|
15
15
|
private cardHandlerCoordinator;
|
|
16
16
|
private session;
|
|
17
17
|
private channel;
|
|
18
|
-
constructor(sessionId: string, apiBaseUrl: string, parentOrigin: string);
|
|
18
|
+
constructor(sessionId: string, apiBaseUrl: string, parentOrigin: string, sdkVersion?: string);
|
|
19
19
|
init: () => Promise<void>;
|
|
20
20
|
private setupChannelListener;
|
|
21
21
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare function initCoordinatorIframe(sessionId: string, apiBaseUrl: string, origin: string): void;
|
|
1
|
+
export declare function initCoordinatorIframe(sessionId: string, apiBaseUrl: string, origin: string, sdkVersion?: string): void;
|
package/dist/hellgate-sdk.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
function
|
|
1
|
+
function S(i) {
|
|
2
2
|
return Array.isArray(i) ? i.filter(Boolean) : Object.fromEntries(Object.entries(i).map(([e, t]) => [
|
|
3
3
|
e,
|
|
4
|
-
typeof t == "object" && t && !Array.isArray(t) ?
|
|
4
|
+
typeof t == "object" && t && !Array.isArray(t) ? S(t) : t
|
|
5
5
|
]).filter(([e, t]) => typeof t == "object" && t && !Array.isArray(t) ? !!Object.keys(t).length : t != null && t != null));
|
|
6
6
|
}
|
|
7
7
|
function h(i, e) {
|
|
@@ -17,11 +17,11 @@ function E(i) {
|
|
|
17
17
|
throw i;
|
|
18
18
|
return i.json();
|
|
19
19
|
}
|
|
20
|
-
function
|
|
20
|
+
function j(i) {
|
|
21
21
|
return `https://${window.HG_IFRAME_HOST ?? "sdk.hellgate.io"}/web/${i}/iframe/`;
|
|
22
22
|
}
|
|
23
23
|
const F = 2e3;
|
|
24
|
-
class
|
|
24
|
+
class R {
|
|
25
25
|
constructor(e, t) {
|
|
26
26
|
Object.defineProperty(this, "session", {
|
|
27
27
|
enumerable: !0,
|
|
@@ -202,18 +202,18 @@ class k {
|
|
|
202
202
|
function p() {
|
|
203
203
|
return document.body;
|
|
204
204
|
}
|
|
205
|
-
const
|
|
205
|
+
const y = {
|
|
206
206
|
base: {
|
|
207
207
|
":disabled": {
|
|
208
208
|
backgroundColor: "transparent"
|
|
209
209
|
}
|
|
210
210
|
}
|
|
211
|
-
},
|
|
211
|
+
}, $ = "DOM Element was not found";
|
|
212
212
|
var O;
|
|
213
213
|
(function(i) {
|
|
214
214
|
i.NOT_COMPLETE = "NOT_COMPLETE", i.SCHEME_NOT_SUPPORTED = "SCHEME_NOT_SUPPORTED", i.LUHN_CHECK_FAILED = "LUHN_CHECK_FAILED", i.INVALID_EXPIRY_DATE = "INVALID_EXPIRY_DATE";
|
|
215
215
|
})(O || (O = {}));
|
|
216
|
-
const
|
|
216
|
+
const A = (i) => i != null, U = "v3.12.0";
|
|
217
217
|
class f {
|
|
218
218
|
constructor(e) {
|
|
219
219
|
if (Object.defineProperty(this, "options", {
|
|
@@ -246,7 +246,7 @@ class f {
|
|
|
246
246
|
configurable: !0,
|
|
247
247
|
writable: !0,
|
|
248
248
|
value: async ({ ...t }) => {
|
|
249
|
-
this.iframe &&
|
|
249
|
+
this.iframe && A(t.height) && (this.iframe.height = t.height), this.iframePostMessage({
|
|
250
250
|
type: "update",
|
|
251
251
|
data: {
|
|
252
252
|
...t,
|
|
@@ -283,13 +283,13 @@ class f {
|
|
|
283
283
|
var t;
|
|
284
284
|
(t = this.iframe) == null || t.remove(), this.iframe = null;
|
|
285
285
|
}
|
|
286
|
-
}), this.IFRAME_BASE_URL =
|
|
286
|
+
}), this.IFRAME_BASE_URL = j(U), !this.IFRAME_BASE_URL)
|
|
287
287
|
throw new Error("IFRAME_BASE_URL not found");
|
|
288
288
|
}
|
|
289
289
|
mount(e) {
|
|
290
290
|
const t = typeof e == "string" ? document.querySelector(e) : e;
|
|
291
291
|
if (!t)
|
|
292
|
-
throw new Error(`${
|
|
292
|
+
throw new Error(`${$}: ${e}`);
|
|
293
293
|
t.innerHTML = `<iframe width="100%" height="29" src="${this.IFRAME_BASE_URL}?field=${this.type}&origin=${location.origin}"></iframe>`, this.iframe = t.querySelector("iframe");
|
|
294
294
|
const r = (n) => {
|
|
295
295
|
var a;
|
|
@@ -315,7 +315,7 @@ class f {
|
|
|
315
315
|
(r = (t = this.iframe) == null ? void 0 : t.contentWindow) == null || r.postMessage(e, this.IFRAME_BASE_URL);
|
|
316
316
|
}
|
|
317
317
|
}
|
|
318
|
-
class
|
|
318
|
+
class V extends f {
|
|
319
319
|
constructor() {
|
|
320
320
|
super(...arguments), Object.defineProperty(this, "type", {
|
|
321
321
|
enumerable: !0,
|
|
@@ -326,22 +326,22 @@ class U extends f {
|
|
|
326
326
|
enumerable: !0,
|
|
327
327
|
configurable: !0,
|
|
328
328
|
writable: !0,
|
|
329
|
-
value:
|
|
329
|
+
value: H
|
|
330
330
|
}), Object.defineProperty(this, "putValue", {
|
|
331
331
|
enumerable: !0,
|
|
332
332
|
configurable: !0,
|
|
333
333
|
writable: !0,
|
|
334
|
-
value:
|
|
334
|
+
value: D
|
|
335
335
|
});
|
|
336
336
|
}
|
|
337
337
|
}
|
|
338
|
-
function
|
|
338
|
+
function H(i) {
|
|
339
339
|
return i ? Number(i) : null;
|
|
340
340
|
}
|
|
341
|
-
function
|
|
341
|
+
function D(i) {
|
|
342
342
|
return i ? i < 10 ? `0${i}` : String(i) : null;
|
|
343
343
|
}
|
|
344
|
-
class
|
|
344
|
+
class z extends f {
|
|
345
345
|
constructor() {
|
|
346
346
|
super(...arguments), Object.defineProperty(this, "type", {
|
|
347
347
|
enumerable: !0,
|
|
@@ -352,38 +352,38 @@ class V extends f {
|
|
|
352
352
|
enumerable: !0,
|
|
353
353
|
configurable: !0,
|
|
354
354
|
writable: !0,
|
|
355
|
-
value:
|
|
355
|
+
value: T
|
|
356
356
|
}), Object.defineProperty(this, "putValue", {
|
|
357
357
|
enumerable: !0,
|
|
358
358
|
configurable: !0,
|
|
359
359
|
writable: !0,
|
|
360
|
-
value:
|
|
360
|
+
value: M
|
|
361
361
|
});
|
|
362
362
|
}
|
|
363
363
|
}
|
|
364
|
-
function
|
|
364
|
+
function T(i) {
|
|
365
365
|
if (!i)
|
|
366
366
|
return null;
|
|
367
367
|
const e = Number(i);
|
|
368
368
|
return e > 10 ? +`20${e}` : null;
|
|
369
369
|
}
|
|
370
|
-
function
|
|
370
|
+
function M(i) {
|
|
371
371
|
return i ? i >= 100 ? String(i).slice(-2) : String(i) : null;
|
|
372
372
|
}
|
|
373
|
-
function
|
|
373
|
+
function I(i) {
|
|
374
374
|
const [e = null, t = null] = (i ?? "").split("/").map((r) => r.trim());
|
|
375
375
|
return {
|
|
376
|
-
month:
|
|
377
|
-
year:
|
|
376
|
+
month: H(e),
|
|
377
|
+
year: T(t)
|
|
378
378
|
};
|
|
379
379
|
}
|
|
380
|
-
function
|
|
380
|
+
function L(i) {
|
|
381
381
|
if (!i)
|
|
382
382
|
return null;
|
|
383
383
|
const { month: e, year: t } = i;
|
|
384
|
-
return [
|
|
384
|
+
return [D(e), M(t)].filter(A).join(" / ");
|
|
385
385
|
}
|
|
386
|
-
class
|
|
386
|
+
class B extends f {
|
|
387
387
|
constructor() {
|
|
388
388
|
super(...arguments), Object.defineProperty(this, "type", {
|
|
389
389
|
enumerable: !0,
|
|
@@ -394,22 +394,22 @@ class z extends f {
|
|
|
394
394
|
enumerable: !0,
|
|
395
395
|
configurable: !0,
|
|
396
396
|
writable: !0,
|
|
397
|
-
value:
|
|
397
|
+
value: I
|
|
398
398
|
}), Object.defineProperty(this, "putValue", {
|
|
399
399
|
enumerable: !0,
|
|
400
400
|
configurable: !0,
|
|
401
401
|
writable: !0,
|
|
402
|
-
value:
|
|
402
|
+
value: L
|
|
403
403
|
});
|
|
404
404
|
}
|
|
405
405
|
}
|
|
406
|
-
function
|
|
406
|
+
function N(i) {
|
|
407
407
|
return (i == null ? void 0 : i.replaceAll(" ", "")) ?? null;
|
|
408
408
|
}
|
|
409
|
-
function
|
|
409
|
+
function Y(i) {
|
|
410
410
|
return i;
|
|
411
411
|
}
|
|
412
|
-
class
|
|
412
|
+
class q extends f {
|
|
413
413
|
constructor() {
|
|
414
414
|
super(...arguments), Object.defineProperty(this, "type", {
|
|
415
415
|
enumerable: !0,
|
|
@@ -420,16 +420,16 @@ class Y extends f {
|
|
|
420
420
|
enumerable: !0,
|
|
421
421
|
configurable: !0,
|
|
422
422
|
writable: !0,
|
|
423
|
-
value:
|
|
423
|
+
value: N
|
|
424
424
|
}), Object.defineProperty(this, "putValue", {
|
|
425
425
|
enumerable: !0,
|
|
426
426
|
configurable: !0,
|
|
427
427
|
writable: !0,
|
|
428
|
-
value:
|
|
428
|
+
value: Y
|
|
429
429
|
});
|
|
430
430
|
}
|
|
431
431
|
}
|
|
432
|
-
class
|
|
432
|
+
class K extends f {
|
|
433
433
|
constructor() {
|
|
434
434
|
super(...arguments), Object.defineProperty(this, "type", {
|
|
435
435
|
enumerable: !0,
|
|
@@ -441,8 +441,8 @@ class q extends f {
|
|
|
441
441
|
configurable: !0,
|
|
442
442
|
writable: !0,
|
|
443
443
|
value: (e) => e ? {
|
|
444
|
-
number: e.cardNumber ?
|
|
445
|
-
expiry_date: e.cardExpirationDate ?
|
|
444
|
+
number: e.cardNumber ? N(e.cardNumber) : null,
|
|
445
|
+
expiry_date: e.cardExpirationDate ? I(e.cardExpirationDate) : null,
|
|
446
446
|
cvc: e.cardVerificationCode ?? null
|
|
447
447
|
} : null
|
|
448
448
|
}), Object.defineProperty(this, "putValue", {
|
|
@@ -451,7 +451,7 @@ class q extends f {
|
|
|
451
451
|
writable: !0,
|
|
452
452
|
value: (e) => e ? {
|
|
453
453
|
cardNumber: e.number ? e.number : null,
|
|
454
|
-
cardExpirationDate: e.expiry_date ?
|
|
454
|
+
cardExpirationDate: e.expiry_date ? L(e.expiry_date) : null,
|
|
455
455
|
cardVerificationCode: e.cvc ?? null
|
|
456
456
|
} : null
|
|
457
457
|
});
|
|
@@ -477,7 +477,7 @@ class G extends f {
|
|
|
477
477
|
});
|
|
478
478
|
}
|
|
479
479
|
}
|
|
480
|
-
class
|
|
480
|
+
class W extends f {
|
|
481
481
|
constructor() {
|
|
482
482
|
super(...arguments), Object.defineProperty(this, "type", {
|
|
483
483
|
enumerable: !0,
|
|
@@ -500,24 +500,24 @@ class K extends f {
|
|
|
500
500
|
function b(i, e) {
|
|
501
501
|
switch (i) {
|
|
502
502
|
case "card":
|
|
503
|
-
return new
|
|
503
|
+
return new K(e);
|
|
504
504
|
case "cardNumber":
|
|
505
|
-
return new
|
|
505
|
+
return new q(e);
|
|
506
506
|
case "cardExpirationDate":
|
|
507
|
-
return new
|
|
507
|
+
return new B(e);
|
|
508
508
|
case "cardExpirationMonth":
|
|
509
|
-
return new U(e);
|
|
510
|
-
case "cardExpirationYear":
|
|
511
509
|
return new V(e);
|
|
510
|
+
case "cardExpirationYear":
|
|
511
|
+
return new z(e);
|
|
512
512
|
case "cardVerificationCode":
|
|
513
513
|
return new G(e);
|
|
514
514
|
case "text":
|
|
515
|
-
return new
|
|
515
|
+
return new W(e);
|
|
516
516
|
default:
|
|
517
517
|
ASSERT_EXHAUSTIVE(i);
|
|
518
518
|
}
|
|
519
519
|
}
|
|
520
|
-
const
|
|
520
|
+
const X = {
|
|
521
521
|
visa: "visa",
|
|
522
522
|
mastercard: "mastercard",
|
|
523
523
|
americanexpress: "american-express",
|
|
@@ -526,8 +526,8 @@ const W = {
|
|
|
526
526
|
jcb: "jcb",
|
|
527
527
|
unionpay: "unionpay"
|
|
528
528
|
};
|
|
529
|
-
function
|
|
530
|
-
return i.map((e) =>
|
|
529
|
+
function J(i) {
|
|
530
|
+
return i.map((e) => X[e]).filter(Boolean);
|
|
531
531
|
}
|
|
532
532
|
function P(i) {
|
|
533
533
|
return [
|
|
@@ -587,7 +587,7 @@ class w {
|
|
|
587
587
|
const n = h({
|
|
588
588
|
disabled: !1,
|
|
589
589
|
autocomplete: "on",
|
|
590
|
-
style: { ...
|
|
590
|
+
style: { ...y }
|
|
591
591
|
}, r);
|
|
592
592
|
if (this.session.isNextAction("refresh_security_code") && ((s = this.session.state) != null && s.data)) {
|
|
593
593
|
const o = this.session.state.data;
|
|
@@ -615,7 +615,7 @@ class w {
|
|
|
615
615
|
const n = {
|
|
616
616
|
disabled: !1,
|
|
617
617
|
autocomplete: "on",
|
|
618
|
-
style: { ...
|
|
618
|
+
style: { ...y }
|
|
619
619
|
}, a = b("text", {
|
|
620
620
|
...h(n, { ...r })
|
|
621
621
|
});
|
|
@@ -704,7 +704,7 @@ class w {
|
|
|
704
704
|
const t = {
|
|
705
705
|
disabled: this.cvcOnlyEnabled,
|
|
706
706
|
autocomplete: "on",
|
|
707
|
-
style: { ...
|
|
707
|
+
style: { ...y }
|
|
708
708
|
}, { cardNumber: r = {}, securityCode: n = {}, ...a } = e, s = b("cardNumber", {
|
|
709
709
|
...h(t, {
|
|
710
710
|
...a,
|
|
@@ -810,7 +810,7 @@ class w {
|
|
|
810
810
|
};
|
|
811
811
|
}
|
|
812
812
|
serializeAdditionalData({ cardholder_name: e, billing_address: t = {}, ephemeral: r, expiration_date: n }) {
|
|
813
|
-
|
|
813
|
+
return S({
|
|
814
814
|
cardholder_name: m(e),
|
|
815
815
|
billing_address: {
|
|
816
816
|
line1: m(t.line1),
|
|
@@ -818,9 +818,26 @@ class w {
|
|
|
818
818
|
line3: m(t.line3),
|
|
819
819
|
city: m(t.city),
|
|
820
820
|
postal_code: m(t.postal_code)
|
|
821
|
-
}
|
|
821
|
+
},
|
|
822
|
+
...this.resolveLifecycleFields(r, n)
|
|
822
823
|
});
|
|
823
|
-
|
|
824
|
+
}
|
|
825
|
+
resolveLifecycleFields(e, t) {
|
|
826
|
+
switch (this.getLifecycle()) {
|
|
827
|
+
case "ephemeral_only":
|
|
828
|
+
return { ephemeral: !0 };
|
|
829
|
+
case "persistent_only":
|
|
830
|
+
return { ephemeral: !1 };
|
|
831
|
+
case "user_choice":
|
|
832
|
+
return {
|
|
833
|
+
ephemeral: typeof e == "boolean" ? e : void 0,
|
|
834
|
+
expiration_date: typeof t == "string" ? t : void 0
|
|
835
|
+
};
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
getLifecycle() {
|
|
839
|
+
var e, t;
|
|
840
|
+
return this.session.isNextAction("tokenize_card") ? ((t = (e = this.session.state) == null ? void 0 : e.data) == null ? void 0 : t.lifecycle) ?? "user_choice" : "user_choice";
|
|
824
841
|
}
|
|
825
842
|
getSessionSchemes() {
|
|
826
843
|
var t, r;
|
|
@@ -828,7 +845,7 @@ class w {
|
|
|
828
845
|
return;
|
|
829
846
|
const e = (t = this.session.state) == null ? void 0 : t.data;
|
|
830
847
|
if ((r = e == null ? void 0 : e.allowed_schemes) != null && r.length)
|
|
831
|
-
return
|
|
848
|
+
return J(e.allowed_schemes);
|
|
832
849
|
}
|
|
833
850
|
getCardDataValidationError() {
|
|
834
851
|
if (!this.state.complete)
|
|
@@ -846,7 +863,7 @@ function m(i) {
|
|
|
846
863
|
function x(i, e) {
|
|
847
864
|
return i === void 0 ? e : i.length === 0 ? [] : e != null && e.length ? e.filter((t) => i.includes(t)) : i;
|
|
848
865
|
}
|
|
849
|
-
const
|
|
866
|
+
const C = "v3.12.0";
|
|
850
867
|
class Q {
|
|
851
868
|
constructor() {
|
|
852
869
|
if (Object.defineProperty(this, "iframe", {
|
|
@@ -875,7 +892,7 @@ class Q {
|
|
|
875
892
|
});
|
|
876
893
|
const s = document.createElement("div");
|
|
877
894
|
s.setAttribute("style", "position:absolute;width:0;height:0;overflow:hidden;"), s.setAttribute("data-hg-coordinator", ""), document.body.appendChild(s);
|
|
878
|
-
const o = `${this.iframeBaseUrl}?type=coordinator&sessionId=${e}&apiBaseUrl=${t}&origin=${encodeURIComponent(location.origin)}`;
|
|
895
|
+
const o = `${this.iframeBaseUrl}?type=coordinator&sessionId=${e}&apiBaseUrl=${t}&origin=${encodeURIComponent(location.origin)}&sdkVersion=${encodeURIComponent(C)}`;
|
|
879
896
|
if (s.innerHTML = `<iframe src="${o}" width="0" height="0" style="border:none;" tabindex="-1" aria-hidden="true"></iframe>`, this.iframe = s.querySelector("iframe"), !this.iframe) {
|
|
880
897
|
a(new Error("Failed to create coordinator iframe"));
|
|
881
898
|
return;
|
|
@@ -896,7 +913,7 @@ class Q {
|
|
|
896
913
|
a(new Error("Coordinator iframe failed to load"));
|
|
897
914
|
});
|
|
898
915
|
}))
|
|
899
|
-
}), this.iframeBaseUrl =
|
|
916
|
+
}), this.iframeBaseUrl = j(C), !this.iframeBaseUrl)
|
|
900
917
|
throw new Error("IFRAME_BASE_URL not found");
|
|
901
918
|
}
|
|
902
919
|
/**
|
|
@@ -923,8 +940,9 @@ class Q {
|
|
|
923
940
|
this.iframe = null, e == null || e.remove();
|
|
924
941
|
}
|
|
925
942
|
}
|
|
926
|
-
|
|
927
|
-
|
|
943
|
+
const Z = "hellgate-web-sdk", ee = "v3.12.0";
|
|
944
|
+
class te {
|
|
945
|
+
constructor(e = "https://api.hellgate.io", t = new AbortController(), { context: r = "window", version: n = ee } = {}) {
|
|
928
946
|
Object.defineProperty(this, "abortCtrl", {
|
|
929
947
|
enumerable: !0,
|
|
930
948
|
configurable: !0,
|
|
@@ -935,10 +953,16 @@ class Z {
|
|
|
935
953
|
configurable: !0,
|
|
936
954
|
writable: !0,
|
|
937
955
|
value: void 0
|
|
938
|
-
}), this
|
|
956
|
+
}), Object.defineProperty(this, "clientId", {
|
|
957
|
+
enumerable: !0,
|
|
958
|
+
configurable: !0,
|
|
959
|
+
writable: !0,
|
|
960
|
+
value: void 0
|
|
961
|
+
}), this.baseUrl = e.endsWith("/") ? e.substring(0, e.length - 1) : e, this.clientId = `${Z}/${n || "unknown"} (${r})`;
|
|
939
962
|
}
|
|
940
963
|
getSession(e) {
|
|
941
964
|
return fetch(`${this.baseUrl}/sessions/${e}`, {
|
|
965
|
+
headers: this.traceHeaders(),
|
|
942
966
|
signal: this.abortCtrl.signal
|
|
943
967
|
}).then((t) => E(t));
|
|
944
968
|
}
|
|
@@ -946,7 +970,8 @@ class Z {
|
|
|
946
970
|
return fetch(`${this.baseUrl}/sessions/${e}/complete-action`, {
|
|
947
971
|
method: "POST",
|
|
948
972
|
headers: {
|
|
949
|
-
"Content-Type": "application/json"
|
|
973
|
+
"Content-Type": "application/json",
|
|
974
|
+
...this.traceHeaders()
|
|
950
975
|
},
|
|
951
976
|
mode: "cors",
|
|
952
977
|
body: JSON.stringify(t),
|
|
@@ -956,9 +981,24 @@ class Z {
|
|
|
956
981
|
cancelAll() {
|
|
957
982
|
this.abortCtrl.abort();
|
|
958
983
|
}
|
|
984
|
+
/**
|
|
985
|
+
* Traceability headers sent on every backend call: which SDK build and
|
|
986
|
+
* execution context made the request, plus a per-request id to correlate
|
|
987
|
+
* a single failing call with the backend logs.
|
|
988
|
+
*/
|
|
989
|
+
traceHeaders() {
|
|
990
|
+
return {
|
|
991
|
+
"x-hellgate-client": this.clientId,
|
|
992
|
+
"x-request-id": re()
|
|
993
|
+
};
|
|
994
|
+
}
|
|
959
995
|
}
|
|
960
|
-
|
|
961
|
-
|
|
996
|
+
function re() {
|
|
997
|
+
var i;
|
|
998
|
+
return ((i = crypto.randomUUID) == null ? void 0 : i.call(crypto)) ?? `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
|
|
999
|
+
}
|
|
1000
|
+
const ie = 2e3;
|
|
1001
|
+
class ne {
|
|
962
1002
|
constructor(e, t) {
|
|
963
1003
|
Object.defineProperty(this, "id", {
|
|
964
1004
|
enumerable: !0,
|
|
@@ -1013,7 +1053,7 @@ class te {
|
|
|
1013
1053
|
writable: !0,
|
|
1014
1054
|
value: (r) => {
|
|
1015
1055
|
var n;
|
|
1016
|
-
return ((n = this.state) == null ? void 0 : n.next_action) === null ? (r(
|
|
1056
|
+
return ((n = this.state) == null ? void 0 : n.next_action) === null ? (r(g(this.state)), () => {
|
|
1017
1057
|
}) : (this.onCloseHandlers.push(r), () => this.onCloseHandlers = this.onCloseHandlers.filter((a) => a !== r));
|
|
1018
1058
|
}
|
|
1019
1059
|
}), Object.defineProperty(this, "completeAction", {
|
|
@@ -1024,9 +1064,9 @@ class te {
|
|
|
1024
1064
|
const n = this.state;
|
|
1025
1065
|
return new Promise((a, s) => {
|
|
1026
1066
|
const o = this.onStateChange((l) => {
|
|
1027
|
-
l.next_action !== (n == null ? void 0 : n.next_action) && l.next_action === null && (a(
|
|
1067
|
+
l.next_action !== (n == null ? void 0 : n.next_action) && l.next_action === null && (a(g(l)), o());
|
|
1028
1068
|
});
|
|
1029
|
-
this.api.completeAction(this.id, r).then((l) => this.newStateHandle(l, s)).catch(async (l) => s(await
|
|
1069
|
+
this.api.completeAction(this.id, r).then((l) => this.newStateHandle(l, s)).catch(async (l) => s(await ae(l)));
|
|
1030
1070
|
});
|
|
1031
1071
|
}
|
|
1032
1072
|
}), Object.defineProperty(this, "completeSession", {
|
|
@@ -1062,24 +1102,24 @@ class te {
|
|
|
1062
1102
|
case "wait": {
|
|
1063
1103
|
window.clearTimeout(this.pollingTimer), this.pollingTimer = window.setTimeout(() => this.updateSessionState(t).catch((n) => {
|
|
1064
1104
|
n instanceof Response && n.status === 404 && (t == null || t(new Error(`Session ${this.id} has expired`)));
|
|
1065
|
-
}),
|
|
1105
|
+
}), ie);
|
|
1066
1106
|
break;
|
|
1067
1107
|
}
|
|
1068
1108
|
}
|
|
1069
|
-
e.next_action !== ((r = this.state) == null ? void 0 : r.next_action) && this.stateChangeHandlers.forEach((n) => n(e)), e.next_action === null && this.completeSession(
|
|
1109
|
+
e.next_action !== ((r = this.state) == null ? void 0 : r.next_action) && this.stateChangeHandlers.forEach((n) => n(e)), e.next_action === null && this.completeSession(g(e)), this.state = e;
|
|
1070
1110
|
}
|
|
1071
1111
|
}
|
|
1072
|
-
async function
|
|
1112
|
+
async function ae(i) {
|
|
1073
1113
|
return !i.ok && i.status >= 400 && i.status <= 500 ? i.json() : i;
|
|
1074
1114
|
}
|
|
1075
|
-
function
|
|
1115
|
+
function g(i) {
|
|
1076
1116
|
const e = { ...i };
|
|
1077
1117
|
return delete e.next_action, e;
|
|
1078
1118
|
}
|
|
1079
|
-
const
|
|
1119
|
+
const se = {
|
|
1080
1120
|
base_url: "https://api.hellgate.io"
|
|
1081
1121
|
};
|
|
1082
|
-
class
|
|
1122
|
+
class k {
|
|
1083
1123
|
constructor(e, t, r) {
|
|
1084
1124
|
Object.defineProperty(this, "session", {
|
|
1085
1125
|
enumerable: !0,
|
|
@@ -1117,16 +1157,16 @@ class N {
|
|
|
1117
1157
|
}
|
|
1118
1158
|
static async init(e, t = {}) {
|
|
1119
1159
|
const { session: r, coordinator: n, cardHandler: a, handler3DS: s } = await this.initHandlers(e, t);
|
|
1120
|
-
return new
|
|
1160
|
+
return new k(r, n, {
|
|
1121
1161
|
CARD: a,
|
|
1122
1162
|
"3DS": s
|
|
1123
1163
|
});
|
|
1124
1164
|
}
|
|
1125
1165
|
static async initHandlers(e, t) {
|
|
1126
1166
|
const r = {
|
|
1127
|
-
...
|
|
1167
|
+
...se,
|
|
1128
1168
|
...t
|
|
1129
|
-
}, n = new
|
|
1169
|
+
}, n = new te(r.base_url, r.abortCtrl), a = new ne(e, n), s = new Q();
|
|
1130
1170
|
s.onMessage("coordinator:session_state_change", (c) => {
|
|
1131
1171
|
c.state.next_action !== "wait" && a.newStateHandle(c.state);
|
|
1132
1172
|
}), await s.init(e, r.base_url, r.abortCtrl);
|
|
@@ -1137,7 +1177,7 @@ class N {
|
|
|
1137
1177
|
return w.init(e, t);
|
|
1138
1178
|
}
|
|
1139
1179
|
static create3DSHandler(e, t) {
|
|
1140
|
-
return new
|
|
1180
|
+
return new R(e, {
|
|
1141
1181
|
domContainer: t.challenge_3ds_container,
|
|
1142
1182
|
labelText: t.challenge_3ds_label_text
|
|
1143
1183
|
});
|
|
@@ -1145,17 +1185,17 @@ class N {
|
|
|
1145
1185
|
}
|
|
1146
1186
|
globalThis.HellgateSDK && (globalThis.Hellgate = globalThis.HellgateSDK.Hellgate, delete globalThis.HellgateSDK);
|
|
1147
1187
|
export {
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1188
|
+
K as CardElement,
|
|
1189
|
+
B as CardExpirationDateElement,
|
|
1190
|
+
q as CardNumberElement,
|
|
1151
1191
|
G as CardVerificationCodeElement,
|
|
1152
|
-
|
|
1153
|
-
|
|
1192
|
+
k as Hellgate,
|
|
1193
|
+
R as Hellgate3DSHandler,
|
|
1154
1194
|
w as HellgateCardHandler,
|
|
1155
|
-
|
|
1195
|
+
W as TextElement,
|
|
1156
1196
|
b as createElement,
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1197
|
+
N as extractCardNumberValue,
|
|
1198
|
+
I as extractExpiryDateValue,
|
|
1199
|
+
Y as putCardNumberValue,
|
|
1200
|
+
L as putExpiryDateValue
|
|
1161
1201
|
};
|
package/dist/hellgate-sdk.umd.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(c,p){typeof exports=="object"&&typeof module<"u"?p(exports):typeof define=="function"&&define.amd?define(["exports"],p):(c=typeof globalThis<"u"?globalThis:c||self,p(c.HellgateSDK={}))})(this,function(c){"use strict";function p(i){return Array.isArray(i)?i.filter(Boolean):Object.fromEntries(Object.entries(i).map(([e,t])=>[e,typeof t=="object"&&t&&!Array.isArray(t)?p(t):t]).filter(([e,t])=>typeof t=="object"&&t&&!Array.isArray(t)?!!Object.keys(t).length:t!=null&&t!=null))}function b(i,e){const t={...i,...e},r=Object.keys(t);for(const n of r){const a=i[n],s=e[n];typeof a=="object"&&!Array.isArray(a)&&a&&typeof s=="object"&&!Array.isArray(s)&&s&&(t[n]=b(a,s))}return t}function E(i){if(!i.ok)throw i;return i.json()}function S(i){return`https://${window.HG_IFRAME_HOST??"sdk.hellgate.io"}/web/${i}/iframe/`}const Y=2e3;class j{constructor(e,t){Object.defineProperty(this,"session",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"iframeId",{enumerable:!0,configurable:!0,writable:!0,value:String(Math.floor(1e5+Math.random()*9e5))}),Object.defineProperty(this,"resultPollingTimer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"transactionId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"decoupledAuthHandlers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"disposers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"check3dsIframeDisposers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"domContainer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"labelText",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"onStartHandler",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"onFinishHandler",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"onDecoupledAuth",{enumerable:!0,configurable:!0,writable:!0,value:r=>{this.decoupledAuthHandlers.push(r)}}),Object.defineProperty(this,"onStartChallenge",{enumerable:!0,configurable:!0,writable:!0,value:r=>{this.onStartHandler=r}}),Object.defineProperty(this,"onChallengeFinished",{enumerable:!0,configurable:!0,writable:!0,value:r=>{this.onFinishHandler=r}}),Object.defineProperty(this,"sessionStateHandle",{enumerable:!0,configurable:!0,writable:!0,value:r=>{var n,a;switch(r.next_action){case"3ds_check":{this.initCheck3DSIframes(r.data.threeds_server_callback_url,r.data.mon_url);break}case"3ds_challenge":{(n=this.onStartHandler)==null||n.call(this),this.disposeCheck3DSIframe(),this.startChallenge(r.data.challenge_url,r.data.result_mon_url);break}case"3ds_challenge_decoupled":{this.startDecoupledAuth(r.data.cardholder_info,r.data.result_mon_url,r.data.transaction_id);break}case null:{this.dispose(),(a=this.onFinishHandler)==null||a.call(this);break}}}}),this.domContainer=t.domContainer??w(),this.disposers.push(this.session.onStateChange(this.sessionStateHandle)),this.labelText=t.labelText}dispose(){this.disposers.forEach(e=>e()),this.check3dsIframeDisposers.forEach(e=>e())}initCheck3DSIframes(e,t){const r=w();r.insertAdjacentHTML("beforeend",`<iframe id="check_3ds_${this.iframeId}" width="0" height="0" style="border:0;visibility: hidden;" src="${e}"></iframe>`);const n=r.querySelector(`#check_3ds_${this.iframeId}`);if(n){const a=s=>{s.source===n.contentWindow&&this.session.completeAction({action:"3ds_check",result:s.data})};window.addEventListener("message",a),this.check3dsIframeDisposers.push(()=>window.removeEventListener("message",a),()=>n.remove())}if(t){r.insertAdjacentHTML("beforeend",`<iframe id="mon_${this.iframeId}" width="0" height="0" style="border:0;visibility: hidden;" src="${t}"></iframe>`);const a=r.querySelector(`#mon_${this.iframeId}`);a&&this.disposers.push(()=>a.remove())}}disposeCheck3DSIframe(){this.check3dsIframeDisposers.forEach(e=>e()),this.check3dsIframeDisposers=[]}startChallenge(e,t){const r=w(),n=`<div style="display: flex; flex-direction: column; gap: 10px; align-items: center; ${this.domContainer===r?'border:0; max-width: 800px; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); width:100% " ':'border:0;" width="100%" height="100%"'}><iframe id="cha_${this.iframeId}" src="${e}" width="100%" height="500"></iframe>${this.labelText?'<span id="tds_label_text" style="font-size: large;">'+this.labelText+"</span>":""}<div>`;this.domContainer.insertAdjacentHTML("beforeend",this.domContainer===r?`<div id="cha_${this.iframeId}_wrap" style="background: #fff; position: fixed; left: 0; top: 0; width: 100%; height: 100%; z-index: 10000;">${n}</div>`:n);const a=this.domContainer.querySelector(`#cha_${this.iframeId}`),s=this.domContainer.querySelector(`#cha_${this.iframeId}_wrap`);if(!a)throw new Error("3DS Challenge Iframe initialization failed");this.disposers.push(()=>{a.remove(),s==null||s.remove()});const o=new Promise(d=>{const h=u=>{u.source!==a.contentWindow||u.data.event!=="AuthResultReady"||d({...u.data,requestor_trans_id:u.data.requestor_trans_id??u.data.requestorTransId,requestorTransId:void 0,param:u.data.param||void 0})};window.addEventListener("message",h),this.disposers.push(()=>window.removeEventListener("message",h))}),l=new Promise(d=>{const h=this.startAuthResultPolling(t,u=>{u.event==="AuthResultReady"&&(h(),d({requestor_trans_id:u.threeDSRequestorTransID,event:u.event}))})});Promise.any([o,l]).then(d=>{this.session.completeAction({action:"3ds_challenge",result:d})})}startDecoupledAuth(e,t,r){this.transactionId||(this.transactionId=r),this.decoupledAuthHandlers.forEach(a=>a(e));const n=this.startAuthResultPolling(t,a=>{a.event==="AuthResultReady"&&(this.session.completeAction({action:"3ds_challenge_decoupled",result:{...a,event:a.event}}),n())})}startAuthResultPolling(e,t){return window.clearTimeout(this.resultPollingTimer),this.resultPollingTimer=window.setTimeout(()=>fetch(e).then(r=>E(r)).then(r=>{this.startAuthResultPolling(e,t),t(r)}).catch(()=>{}),Y),()=>window.clearTimeout(this.resultPollingTimer)}}function w(){return document.body}const _={base:{":disabled":{backgroundColor:"transparent"}}},q="DOM Element was not found";var A;(function(i){i.NOT_COMPLETE="NOT_COMPLETE",i.SCHEME_NOT_SUPPORTED="SCHEME_NOT_SUPPORTED",i.LUHN_CHECK_FAILED="LUHN_CHECK_FAILED",i.INVALID_EXPIRY_DATE="INVALID_EXPIRY_DATE"})(A||(A={}));const H=i=>i!=null,K="v3.10.0";class m{constructor(e){if(Object.defineProperty(this,"options",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"IFRAME_BASE_URL",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"iframe",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"subscriptions",{enumerable:!0,configurable:!0,writable:!0,value:{ready:[],blur:[],focus:[],keydown:[],change:[]}}),Object.defineProperty(this,"key",{enumerable:!0,configurable:!0,writable:!0,value:""}),Object.defineProperty(this,"update",{enumerable:!0,configurable:!0,writable:!0,value:async({...t})=>{this.iframe&&H(t.height)&&(this.iframe.height=t.height),this.iframePostMessage({type:"update",data:{...t,value:t.value?this.putValue(t.value)??void 0:void 0}})}}),Object.defineProperty(this,"clear",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.iframePostMessage({type:"clear"})}}),Object.defineProperty(this,"focus",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.iframePostMessage({type:"focus"})}}),Object.defineProperty(this,"blur",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.iframePostMessage({type:"blur"})}}),Object.defineProperty(this,"unmount",{enumerable:!0,configurable:!0,writable:!0,value:()=>{var t;(t=this.iframe)==null||t.remove(),this.iframe=null}}),this.IFRAME_BASE_URL=S(K),!this.IFRAME_BASE_URL)throw new Error("IFRAME_BASE_URL not found")}mount(e){const t=typeof e=="string"?document.querySelector(e):e;if(!t)throw new Error(`${q}: ${e}`);t.innerHTML=`<iframe width="100%" height="29" src="${this.IFRAME_BASE_URL}?field=${this.type}&origin=${location.origin}"></iframe>`,this.iframe=t.querySelector("iframe");const r=n=>{var a;n.source!==((a=this.iframe)==null?void 0:a.contentWindow)||n.data.element!==this.type||this.emitEvent(n.data)};return window.addEventListener("message",r),new Promise(n=>{this.on("ready",a=>{this.key=a.key,this.update(this.options),n()})})}on(e,t){return this.subscriptions[e].push(t),{unsubscribe:()=>this.subscriptions[e].splice(this.subscriptions[e].indexOf(t),1)}}emitEvent(e){var t;(t=this.subscriptions[e.type])==null||t.forEach(r=>r(e.data))}iframePostMessage(e){var t,r;(r=(t=this.iframe)==null?void 0:t.contentWindow)==null||r.postMessage(e,this.IFRAME_BASE_URL)}}class G extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"cardExpirationMonth"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:D}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:T})}}function D(i){return i?Number(i):null}function T(i){return i?i<10?`0${i}`:String(i):null}class W extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"cardExpirationYear"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:M}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:I})}}function M(i){if(!i)return null;const e=Number(i);return e>10?+`20${e}`:null}function I(i){return i?i>=100?String(i).slice(-2):String(i):null}function v(i){const[e=null,t=null]=(i??"").split("/").map(r=>r.trim());return{month:D(e),year:M(t)}}function O(i){if(!i)return null;const{month:e,year:t}=i;return[T(e),I(t)].filter(H).join(" / ")}class L extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"cardExpirationDate"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:v}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:O})}}function P(i){return(i==null?void 0:i.replaceAll(" ",""))??null}function N(i){return i}class F extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"cardNumber"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:P}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:N})}}class k extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"card"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e?{number:e.cardNumber?P(e.cardNumber):null,expiry_date:e.cardExpirationDate?v(e.cardExpirationDate):null,cvc:e.cardVerificationCode??null}:null}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e?{cardNumber:e.number?e.number:null,cardExpirationDate:e.expiry_date?O(e.expiry_date):null,cardVerificationCode:e.cvc??null}:null})}}class R extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"cardVerificationCode"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e})}}class $ extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"text"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e})}}function f(i,e){switch(i){case"card":return new k(e);case"cardNumber":return new F(e);case"cardExpirationDate":return new L(e);case"cardExpirationMonth":return new G(e);case"cardExpirationYear":return new W(e);case"cardVerificationCode":return new R(e);case"text":return new $(e);default:ASSERT_EXHAUSTIVE(i)}}const X={visa:"visa",mastercard:"mastercard",americanexpress:"american-express",discover:"discover",dinersclub:"diners-club",jcb:"jcb",unionpay:"unionpay"};function J(i){return i.map(e=>X[e]).filter(Boolean)}function U(i){return[i.issuer_identification_number,"".padEnd(i.account_number_length-i.issuer_identification_number.length-i.account_number_last_four.length,"*"),i.account_number_last_four].join(" ")}class y{static async init(e,t){return new y(e,t)}constructor(e,t){Object.defineProperty(this,"session",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"coordinator",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,"state",{enumerable:!0,configurable:!0,writable:!0,value:this.createFieldDefaultState()}),Object.defineProperty(this,"cardElements",{enumerable:!0,configurable:!0,writable:!0,value:{}}),Object.defineProperty(this,"textElements",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"stateChangeHandlers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"cvcOnlyEnabled",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"createForm",{enumerable:!0,configurable:!0,writable:!0,value:(r={})=>{var s;if(this.hasFormElements())throw new Error("Form elements can't be initialized twice. You can call `reset()` method or create new Hellgate client.");const n=b({disabled:!1,autocomplete:"on",style:{..._}},r);if(this.session.isNextAction("refresh_security_code")&&((s=this.session.state)!=null&&s.data)){const o=this.session.state.data;n.cvcOnly=!0,n.value={number:U(o),expiry_date:{month:(o==null?void 0:o.expiry_month)??null,year:(o==null?void 0:o.expiry_year)??null},cvc:null}}n.schemes=V(this.getSessionSchemes(),n.schemes);const a=f("card",n);return this.cardElements.card={element:a,state:this.createFieldDefaultState()},this.addElementStateListener("card"),a}}),Object.defineProperty(this,"createTextField",{enumerable:!0,configurable:!0,writable:!0,value:(r={})=>{const n={disabled:!1,autocomplete:"on",style:{..._}},a=f("text",{...b(n,{...r})});return this.textElements.push(a),a}}),Object.defineProperty(this,"tokenize",{enumerable:!0,configurable:!0,writable:!0,value:async r=>{var a,s;if(((a=this.session.state)==null?void 0:a.next_action)!=="tokenize_card")throw new Error(`The session's next_action='${(s=this.session.state)==null?void 0:s.next_action}'. tokenize() is available only if next_action='tokenize_card'`);const n=this.getCardDataValidationError();if(n)throw n;return this.coordinator.postMessage({type:"card:tokenize",additionalData:this.serializeAdditionalData(r)}),new Promise(o=>{this.coordinator.onMessage("card:tokenize:response",l=>{o(l.success?l.result:null)})})}}),Object.defineProperty(this,"onStateChange",{enumerable:!0,configurable:!0,writable:!0,value:r=>{this.stateChangeHandlers.push(r),r(this.state)}}),Object.defineProperty(this,"clear",{enumerable:!0,configurable:!0,writable:!0,value:()=>{Object.values(this.cardElements).forEach(r=>r==null?void 0:r.element.clear()),this.textElements.forEach(r=>r==null?void 0:r.clear())}}),Object.defineProperty(this,"reset",{enumerable:!0,configurable:!0,writable:!0,value:()=>{Object.values(this.cardElements).forEach(r=>r==null?void 0:r.element.unmount()),this.textElements.forEach(r=>r==null?void 0:r.unmount()),this.cardElements={},this.textElements=[],this.state=this.createFieldDefaultState()}}),Object.defineProperty(this,"dispose",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.reset()}}),Object.defineProperty(this,"process",{enumerable:!0,configurable:!0,writable:!0,value:async(r={})=>{if(!this.hasFormElements())throw new Error("Card form must be initialized and completed before processing");const n=this.getCardDataValidationError();if(n)throw n;if(this.session.isNextAction("refresh_security_code"))return this.refreshSecurityCode();this.disableFormElements(!0);try{return this.coordinator.postMessage({type:"card:process",additionalData:this.serializeAdditionalData(r)}),new Promise((a,s)=>{this.coordinator.onMessage("card:process:response",o=>{o.result&&o.success?a(o.result):s(new Error(o.error))})})}catch(a){throw this.disableFormElements(!1),a}}}),this.cvcOnlyEnabled=this.session.isNextAction("refresh_security_code")}createFormFields(e={}){var l,d;if(this.hasFormElements())throw new Error("Form elements can't be initialized twice. You can call `reset()` method or create new Hellgate client.");const t={disabled:this.cvcOnlyEnabled,autocomplete:"on",style:{..._}},{cardNumber:r={},securityCode:n={},...a}=e,s=f("cardNumber",{...b(t,{...a,...r,cvcOnly:this.cvcOnlyEnabled,schemes:V(this.getSessionSchemes(),r.schemes??a.schemes),value:this.session.isNextAction("refresh_security_code")&&((l=this.session.state)!=null&&l.data)?U(this.session.state.data):null})}),o=f("cardVerificationCode",{...b({...t,disabled:!1,autofocus:this.cvcOnlyEnabled},{...a,...n})});if(s.on("change",h=>{const u=h.cardBrand;o.update({cardType:u})}),this.cardElements={cardNumber:{element:s,state:this.createFieldDefaultState()},cardVerificationCode:{element:o,state:this.createFieldDefaultState()}},this.addElementStateListener("cardNumber"),this.addElementStateListener("cardVerificationCode"),e.expiryDateElement==="separate"){const{expiryMonth:h={},expiryYear:u={}}=e,z=f("cardExpirationMonth",{...b(t,{...a,...h})}),B=f("cardExpirationYear",{...b(t,{...a,...u})});return this.cardElements.cardExpirationMonth={element:z,state:this.createFieldDefaultState()},this.cardElements.cardExpirationYear={element:B,state:this.createFieldDefaultState()},this.addElementStateListener("cardExpirationMonth"),this.addElementStateListener("cardExpirationYear"),{cardNumber:s,expiryMonth:z,expiryYear:B,securityCode:o}}else{const{expiryDate:h={}}=e,u=f("cardExpirationDate",{...b(t,{...a,...h,value:this.session.isNextAction("refresh_security_code")&&((d=this.session.state)!=null&&d.data)?{month:this.session.state.data.expiry_month,year:this.session.state.data.expiry_year}:null})});return this.cardElements.cardExpirationDate={element:u,state:this.createFieldDefaultState()},this.addElementStateListener("cardExpirationDate"),{cardNumber:s,expiryDate:u,securityCode:o}}}async refreshSecurityCode(){return this.coordinator.postMessage({type:"card:refresh_security_code"}),new Promise((e,t)=>{this.coordinator.onMessage("card:refresh_security_code:response",r=>{r.result?e(r.result):t(new Error(r.error))})})}hasFormElements(){return!!Object.keys(this.cardElements).length}disableFormElements(e){Object.values(this.cardElements).forEach(({element:t})=>{t.update({disabled:e})})}addElementStateListener(e){const t=this.cardElements[e];t&&t.element.on("change",r=>{t.state=r,this.updateFormState()})}updateFormState(){const e=this.cvcOnlyEnabled&&this.cardElements.cardVerificationCode?[this.cardElements.cardVerificationCode]:Object.values(this.cardElements);e.length?this.state=e.reduce((t,{state:r})=>(t.valid=!!t.valid&&!!r.valid,t.complete=!!t.complete&&!!r.complete,t.empty=!!t.empty&&!!r.empty,t.error=t.error||r.error,t.errorCode=t.errorCode||r.errorCode,t),{valid:!0,complete:!0,empty:!0}):this.state=this.createFieldDefaultState(),this.stateChangeHandlers.forEach(t=>t(this.state))}createFieldDefaultState(){return{empty:!0,complete:!1,valid:!1}}serializeAdditionalData({cardholder_name:e,billing_address:t={},ephemeral:r,expiration_date:n}){const a=p({cardholder_name:g(e),billing_address:{line1:g(t.line1),line2:g(t.line2),line3:g(t.line3),city:g(t.city),postal_code:g(t.postal_code)}});return typeof r=="boolean"&&(a.ephemeral=r),typeof n=="string"&&(a.expiration_date=n),a}getSessionSchemes(){var t,r;if(!this.session.isNextAction("tokenize_card"))return;const e=(t=this.session.state)==null?void 0:t.data;if((r=e==null?void 0:e.allowed_schemes)!=null&&r.length)return J(e.allowed_schemes)}getCardDataValidationError(){if(!this.state.complete)return new Error(this.state.error??"Card data is not complete");if(!this.state.valid)return new Error(`Card data is not valid. ${this.state.error}`)}}function g(i){if(typeof i=="string")return i;if(i!=null&&i.key)return{key:i.key}}function V(i,e){return i===void 0?e:i.length===0?[]:e!=null&&e.length?e.filter(t=>i.includes(t)):i}const Q="v3.10.0";class Z{constructor(){if(Object.defineProperty(this,"iframe",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"iframeBaseUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"messageHandler",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"init",{enumerable:!0,configurable:!0,writable:!0,value:async(e,t,r)=>(window.fetchMocker={a:1},new Promise((n,a)=>{r==null||r.signal.addEventListener("abort",()=>{const l=new Error("Coordinator init aborted");l.name="AbortError",a(l),this.dispose()});const s=document.createElement("div");s.setAttribute("style","position:absolute;width:0;height:0;overflow:hidden;"),s.setAttribute("data-hg-coordinator",""),document.body.appendChild(s);const o=`${this.iframeBaseUrl}?type=coordinator&sessionId=${e}&apiBaseUrl=${t}&origin=${encodeURIComponent(location.origin)}`;if(s.innerHTML=`<iframe src="${o}" width="0" height="0" style="border:none;" tabindex="-1" aria-hidden="true"></iframe>`,this.iframe=s.querySelector("iframe"),!this.iframe){a(new Error("Failed to create coordinator iframe"));return}this.messageHandler=l=>{var d,h,u;if(l.source===((d=this.iframe)==null?void 0:d.contentWindow)){if(((h=l.data)==null?void 0:h.type)==="coordinator:ready"){n();return}if(((u=l.data)==null?void 0:u.type)==="coordinator:error"){a(l.data.error);return}}},window.addEventListener("message",this.messageHandler),this.iframe.addEventListener("error",()=>{a(new Error("Coordinator iframe failed to load"))})}))}),this.iframeBaseUrl=S(Q),!this.iframeBaseUrl)throw new Error("IFRAME_BASE_URL not found")}postMessage(e){var t,r;(r=(t=this.iframe)==null?void 0:t.contentWindow)==null||r.postMessage(e,this.iframeBaseUrl)}onMessage(e,t){window.addEventListener("message",r=>{var n,a;r.source===((n=this.iframe)==null?void 0:n.contentWindow)&&((a=r.data)==null?void 0:a.type)===e&&t(r.data)})}dispose(){var t;this.postMessage({type:"coordinator:dispose"}),this.messageHandler&&(window.removeEventListener("message",this.messageHandler),this.messageHandler=null);const e=(t=this.iframe)==null?void 0:t.parentElement;this.iframe=null,e==null||e.remove()}}class ee{constructor(e="https://api.hellgate.io",t=new AbortController){Object.defineProperty(this,"abortCtrl",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,"baseUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.baseUrl=e.endsWith("/")?e.substring(0,e.length-1):e}getSession(e){return fetch(`${this.baseUrl}/sessions/${e}`,{signal:this.abortCtrl.signal}).then(t=>E(t))}completeAction(e,t){return fetch(`${this.baseUrl}/sessions/${e}/complete-action`,{method:"POST",headers:{"Content-Type":"application/json"},mode:"cors",body:JSON.stringify(t),signal:this.abortCtrl.signal}).then(r=>E(r))}cancelAll(){this.abortCtrl.abort()}}const te=2e3;class re{constructor(e,t){Object.defineProperty(this,"id",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"api",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,"state",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"stateChangeHandlers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"onCloseHandlers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"pollingTimer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"init",{enumerable:!0,configurable:!0,writable:!0,value:async()=>new Promise((r,n)=>{const a=this.onStateChange(s=>{s.next_action!=="wait"&&(r(s),a())});this.updateSessionState().catch(s=>{s instanceof Response&&s.status===404&&n(new Error(`Session ${this.id} doesn't exist or has expired`)),n(s)})})}),Object.defineProperty(this,"onStateChange",{enumerable:!0,configurable:!0,writable:!0,value:r=>(this.stateChangeHandlers.push(r),this.state&&r(this.state),()=>this.stateChangeHandlers=this.stateChangeHandlers.filter(n=>n!==r))}),Object.defineProperty(this,"onClose",{enumerable:!0,configurable:!0,writable:!0,value:r=>{var n;return((n=this.state)==null?void 0:n.next_action)===null?(r(x(this.state)),()=>{}):(this.onCloseHandlers.push(r),()=>this.onCloseHandlers=this.onCloseHandlers.filter(a=>a!==r))}}),Object.defineProperty(this,"completeAction",{enumerable:!0,configurable:!0,writable:!0,value:async r=>{const n=this.state;return new Promise((a,s)=>{const o=this.onStateChange(l=>{l.next_action!==(n==null?void 0:n.next_action)&&l.next_action===null&&(a(x(l)),o())});this.api.completeAction(this.id,r).then(l=>this.newStateHandle(l,s)).catch(async l=>s(await ie(l)))})}}),Object.defineProperty(this,"completeSession",{enumerable:!0,configurable:!0,writable:!0,value:r=>{this.onCloseHandlers.forEach(n=>n(r)),this.stop()}}),Object.defineProperty(this,"dispose",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.stop(),this.api.cancelAll()}})}isNextAction(e){var t;return((t=this.state)==null?void 0:t.next_action)===e}stop(){window.clearTimeout(this.pollingTimer),this.stateChangeHandlers=[],this.onCloseHandlers=[]}async updateSessionState(e){const t=await this.api.getSession(this.id);this.newStateHandle(t,e)}newStateHandle(e,t){var r;switch(!e.next_action&&e.status&&(e.next_action=null),e.next_action){case"wait":{window.clearTimeout(this.pollingTimer),this.pollingTimer=window.setTimeout(()=>this.updateSessionState(t).catch(n=>{n instanceof Response&&n.status===404&&(t==null||t(new Error(`Session ${this.id} has expired`)))}),te);break}}e.next_action!==((r=this.state)==null?void 0:r.next_action)&&this.stateChangeHandlers.forEach(n=>n(e)),e.next_action===null&&this.completeSession(x(e)),this.state=e}}async function ie(i){return!i.ok&&i.status>=400&&i.status<=500?i.json():i}function x(i){const e={...i};return delete e.next_action,e}const ae={base_url:"https://api.hellgate.io"};class C{constructor(e,t,r){Object.defineProperty(this,"session",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"coordinator",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,"paymentFlowHandlers",{enumerable:!0,configurable:!0,writable:!0,value:r}),Object.defineProperty(this,"dispose",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.session.dispose(),this.coordinator.dispose(),Object.values(this.paymentFlowHandlers).forEach(n=>n==null?void 0:n.dispose())}}),Object.defineProperty(this,"onSessionComplete",{enumerable:!0,configurable:!0,writable:!0,value:n=>{this.session.onClose(n)}})}use(e){return this.paymentFlowHandlers[e]}static async init(e,t={}){const{session:r,coordinator:n,cardHandler:a,handler3DS:s}=await this.initHandlers(e,t);return new C(r,n,{CARD:a,"3DS":s})}static async initHandlers(e,t){const r={...ae,...t},n=new ee(r.base_url,r.abortCtrl),a=new re(e,n),s=new Z;s.onMessage("coordinator:session_state_change",d=>{d.state.next_action!=="wait"&&a.newStateHandle(d.state)}),await s.init(e,r.base_url,r.abortCtrl);const o=a.isNextAction("tokenize_card")||a.isNextAction("refresh_security_code")?await this.createCardHandler(a,s):void 0,l=this.create3DSHandler(a,t);return{session:a,coordinator:s,cardHandler:o,handler3DS:l}}static createCardHandler(e,t){return y.init(e,t)}static create3DSHandler(e,t){return new j(e,{domContainer:t.challenge_3ds_container,labelText:t.challenge_3ds_label_text})}}c.CardElement=k,c.CardExpirationDateElement=L,c.CardNumberElement=F,c.CardVerificationCodeElement=R,c.Hellgate=C,c.Hellgate3DSHandler=j,c.HellgateCardHandler=y,c.TextElement=$,c.createElement=f,c.extractCardNumberValue=P,c.extractExpiryDateValue=v,c.putCardNumberValue=N,c.putExpiryDateValue=O,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})});globalThis.HellgateSDK&&(globalThis.Hellgate=globalThis.HellgateSDK.Hellgate,delete globalThis.HellgateSDK);
|
|
1
|
+
(function(c,p){typeof exports=="object"&&typeof module<"u"?p(exports):typeof define=="function"&&define.amd?define(["exports"],p):(c=typeof globalThis<"u"?globalThis:c||self,p(c.HellgateSDK={}))})(this,function(c){"use strict";function p(i){return Array.isArray(i)?i.filter(Boolean):Object.fromEntries(Object.entries(i).map(([e,t])=>[e,typeof t=="object"&&t&&!Array.isArray(t)?p(t):t]).filter(([e,t])=>typeof t=="object"&&t&&!Array.isArray(t)?!!Object.keys(t).length:t!=null&&t!=null))}function b(i,e){const t={...i,...e},r=Object.keys(t);for(const n of r){const a=i[n],s=e[n];typeof a=="object"&&!Array.isArray(a)&&a&&typeof s=="object"&&!Array.isArray(s)&&s&&(t[n]=b(a,s))}return t}function E(i){if(!i.ok)throw i;return i.json()}function S(i){return`https://${window.HG_IFRAME_HOST??"sdk.hellgate.io"}/web/${i}/iframe/`}const q=2e3;class j{constructor(e,t){Object.defineProperty(this,"session",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"iframeId",{enumerable:!0,configurable:!0,writable:!0,value:String(Math.floor(1e5+Math.random()*9e5))}),Object.defineProperty(this,"resultPollingTimer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"transactionId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"decoupledAuthHandlers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"disposers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"check3dsIframeDisposers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"domContainer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"labelText",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"onStartHandler",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"onFinishHandler",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"onDecoupledAuth",{enumerable:!0,configurable:!0,writable:!0,value:r=>{this.decoupledAuthHandlers.push(r)}}),Object.defineProperty(this,"onStartChallenge",{enumerable:!0,configurable:!0,writable:!0,value:r=>{this.onStartHandler=r}}),Object.defineProperty(this,"onChallengeFinished",{enumerable:!0,configurable:!0,writable:!0,value:r=>{this.onFinishHandler=r}}),Object.defineProperty(this,"sessionStateHandle",{enumerable:!0,configurable:!0,writable:!0,value:r=>{var n,a;switch(r.next_action){case"3ds_check":{this.initCheck3DSIframes(r.data.threeds_server_callback_url,r.data.mon_url);break}case"3ds_challenge":{(n=this.onStartHandler)==null||n.call(this),this.disposeCheck3DSIframe(),this.startChallenge(r.data.challenge_url,r.data.result_mon_url);break}case"3ds_challenge_decoupled":{this.startDecoupledAuth(r.data.cardholder_info,r.data.result_mon_url,r.data.transaction_id);break}case null:{this.dispose(),(a=this.onFinishHandler)==null||a.call(this);break}}}}),this.domContainer=t.domContainer??w(),this.disposers.push(this.session.onStateChange(this.sessionStateHandle)),this.labelText=t.labelText}dispose(){this.disposers.forEach(e=>e()),this.check3dsIframeDisposers.forEach(e=>e())}initCheck3DSIframes(e,t){const r=w();r.insertAdjacentHTML("beforeend",`<iframe id="check_3ds_${this.iframeId}" width="0" height="0" style="border:0;visibility: hidden;" src="${e}"></iframe>`);const n=r.querySelector(`#check_3ds_${this.iframeId}`);if(n){const a=s=>{s.source===n.contentWindow&&this.session.completeAction({action:"3ds_check",result:s.data})};window.addEventListener("message",a),this.check3dsIframeDisposers.push(()=>window.removeEventListener("message",a),()=>n.remove())}if(t){r.insertAdjacentHTML("beforeend",`<iframe id="mon_${this.iframeId}" width="0" height="0" style="border:0;visibility: hidden;" src="${t}"></iframe>`);const a=r.querySelector(`#mon_${this.iframeId}`);a&&this.disposers.push(()=>a.remove())}}disposeCheck3DSIframe(){this.check3dsIframeDisposers.forEach(e=>e()),this.check3dsIframeDisposers=[]}startChallenge(e,t){const r=w(),n=`<div style="display: flex; flex-direction: column; gap: 10px; align-items: center; ${this.domContainer===r?'border:0; max-width: 800px; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); width:100% " ':'border:0;" width="100%" height="100%"'}><iframe id="cha_${this.iframeId}" src="${e}" width="100%" height="500"></iframe>${this.labelText?'<span id="tds_label_text" style="font-size: large;">'+this.labelText+"</span>":""}<div>`;this.domContainer.insertAdjacentHTML("beforeend",this.domContainer===r?`<div id="cha_${this.iframeId}_wrap" style="background: #fff; position: fixed; left: 0; top: 0; width: 100%; height: 100%; z-index: 10000;">${n}</div>`:n);const a=this.domContainer.querySelector(`#cha_${this.iframeId}`),s=this.domContainer.querySelector(`#cha_${this.iframeId}_wrap`);if(!a)throw new Error("3DS Challenge Iframe initialization failed");this.disposers.push(()=>{a.remove(),s==null||s.remove()});const o=new Promise(d=>{const h=u=>{u.source!==a.contentWindow||u.data.event!=="AuthResultReady"||d({...u.data,requestor_trans_id:u.data.requestor_trans_id??u.data.requestorTransId,requestorTransId:void 0,param:u.data.param||void 0})};window.addEventListener("message",h),this.disposers.push(()=>window.removeEventListener("message",h))}),l=new Promise(d=>{const h=this.startAuthResultPolling(t,u=>{u.event==="AuthResultReady"&&(h(),d({requestor_trans_id:u.threeDSRequestorTransID,event:u.event}))})});Promise.any([o,l]).then(d=>{this.session.completeAction({action:"3ds_challenge",result:d})})}startDecoupledAuth(e,t,r){this.transactionId||(this.transactionId=r),this.decoupledAuthHandlers.forEach(a=>a(e));const n=this.startAuthResultPolling(t,a=>{a.event==="AuthResultReady"&&(this.session.completeAction({action:"3ds_challenge_decoupled",result:{...a,event:a.event}}),n())})}startAuthResultPolling(e,t){return window.clearTimeout(this.resultPollingTimer),this.resultPollingTimer=window.setTimeout(()=>fetch(e).then(r=>E(r)).then(r=>{this.startAuthResultPolling(e,t),t(r)}).catch(()=>{}),q),()=>window.clearTimeout(this.resultPollingTimer)}}function w(){return document.body}const _={base:{":disabled":{backgroundColor:"transparent"}}},K="DOM Element was not found";var A;(function(i){i.NOT_COMPLETE="NOT_COMPLETE",i.SCHEME_NOT_SUPPORTED="SCHEME_NOT_SUPPORTED",i.LUHN_CHECK_FAILED="LUHN_CHECK_FAILED",i.INVALID_EXPIRY_DATE="INVALID_EXPIRY_DATE"})(A||(A={}));const H=i=>i!=null,G="v3.12.0";class m{constructor(e){if(Object.defineProperty(this,"options",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"IFRAME_BASE_URL",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"iframe",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"subscriptions",{enumerable:!0,configurable:!0,writable:!0,value:{ready:[],blur:[],focus:[],keydown:[],change:[]}}),Object.defineProperty(this,"key",{enumerable:!0,configurable:!0,writable:!0,value:""}),Object.defineProperty(this,"update",{enumerable:!0,configurable:!0,writable:!0,value:async({...t})=>{this.iframe&&H(t.height)&&(this.iframe.height=t.height),this.iframePostMessage({type:"update",data:{...t,value:t.value?this.putValue(t.value)??void 0:void 0}})}}),Object.defineProperty(this,"clear",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.iframePostMessage({type:"clear"})}}),Object.defineProperty(this,"focus",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.iframePostMessage({type:"focus"})}}),Object.defineProperty(this,"blur",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.iframePostMessage({type:"blur"})}}),Object.defineProperty(this,"unmount",{enumerable:!0,configurable:!0,writable:!0,value:()=>{var t;(t=this.iframe)==null||t.remove(),this.iframe=null}}),this.IFRAME_BASE_URL=S(G),!this.IFRAME_BASE_URL)throw new Error("IFRAME_BASE_URL not found")}mount(e){const t=typeof e=="string"?document.querySelector(e):e;if(!t)throw new Error(`${K}: ${e}`);t.innerHTML=`<iframe width="100%" height="29" src="${this.IFRAME_BASE_URL}?field=${this.type}&origin=${location.origin}"></iframe>`,this.iframe=t.querySelector("iframe");const r=n=>{var a;n.source!==((a=this.iframe)==null?void 0:a.contentWindow)||n.data.element!==this.type||this.emitEvent(n.data)};return window.addEventListener("message",r),new Promise(n=>{this.on("ready",a=>{this.key=a.key,this.update(this.options),n()})})}on(e,t){return this.subscriptions[e].push(t),{unsubscribe:()=>this.subscriptions[e].splice(this.subscriptions[e].indexOf(t),1)}}emitEvent(e){var t;(t=this.subscriptions[e.type])==null||t.forEach(r=>r(e.data))}iframePostMessage(e){var t,r;(r=(t=this.iframe)==null?void 0:t.contentWindow)==null||r.postMessage(e,this.IFRAME_BASE_URL)}}class W extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"cardExpirationMonth"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:D}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:T})}}function D(i){return i?Number(i):null}function T(i){return i?i<10?`0${i}`:String(i):null}class X extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"cardExpirationYear"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:M}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:I})}}function M(i){if(!i)return null;const e=Number(i);return e>10?+`20${e}`:null}function I(i){return i?i>=100?String(i).slice(-2):String(i):null}function v(i){const[e=null,t=null]=(i??"").split("/").map(r=>r.trim());return{month:D(e),year:M(t)}}function O(i){if(!i)return null;const{month:e,year:t}=i;return[T(e),I(t)].filter(H).join(" / ")}class L extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"cardExpirationDate"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:v}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:O})}}function P(i){return(i==null?void 0:i.replaceAll(" ",""))??null}function N(i){return i}class k extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"cardNumber"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:P}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:N})}}class F extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"card"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e?{number:e.cardNumber?P(e.cardNumber):null,expiry_date:e.cardExpirationDate?v(e.cardExpirationDate):null,cvc:e.cardVerificationCode??null}:null}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e?{cardNumber:e.number?e.number:null,cardExpirationDate:e.expiry_date?O(e.expiry_date):null,cardVerificationCode:e.cvc??null}:null})}}class R extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"cardVerificationCode"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e})}}class $ extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"text"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e})}}function f(i,e){switch(i){case"card":return new F(e);case"cardNumber":return new k(e);case"cardExpirationDate":return new L(e);case"cardExpirationMonth":return new W(e);case"cardExpirationYear":return new X(e);case"cardVerificationCode":return new R(e);case"text":return new $(e);default:ASSERT_EXHAUSTIVE(i)}}const J={visa:"visa",mastercard:"mastercard",americanexpress:"american-express",discover:"discover",dinersclub:"diners-club",jcb:"jcb",unionpay:"unionpay"};function Q(i){return i.map(e=>J[e]).filter(Boolean)}function U(i){return[i.issuer_identification_number,"".padEnd(i.account_number_length-i.issuer_identification_number.length-i.account_number_last_four.length,"*"),i.account_number_last_four].join(" ")}class g{static async init(e,t){return new g(e,t)}constructor(e,t){Object.defineProperty(this,"session",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"coordinator",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,"state",{enumerable:!0,configurable:!0,writable:!0,value:this.createFieldDefaultState()}),Object.defineProperty(this,"cardElements",{enumerable:!0,configurable:!0,writable:!0,value:{}}),Object.defineProperty(this,"textElements",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"stateChangeHandlers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"cvcOnlyEnabled",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"createForm",{enumerable:!0,configurable:!0,writable:!0,value:(r={})=>{var s;if(this.hasFormElements())throw new Error("Form elements can't be initialized twice. You can call `reset()` method or create new Hellgate client.");const n=b({disabled:!1,autocomplete:"on",style:{..._}},r);if(this.session.isNextAction("refresh_security_code")&&((s=this.session.state)!=null&&s.data)){const o=this.session.state.data;n.cvcOnly=!0,n.value={number:U(o),expiry_date:{month:(o==null?void 0:o.expiry_month)??null,year:(o==null?void 0:o.expiry_year)??null},cvc:null}}n.schemes=V(this.getSessionSchemes(),n.schemes);const a=f("card",n);return this.cardElements.card={element:a,state:this.createFieldDefaultState()},this.addElementStateListener("card"),a}}),Object.defineProperty(this,"createTextField",{enumerable:!0,configurable:!0,writable:!0,value:(r={})=>{const n={disabled:!1,autocomplete:"on",style:{..._}},a=f("text",{...b(n,{...r})});return this.textElements.push(a),a}}),Object.defineProperty(this,"tokenize",{enumerable:!0,configurable:!0,writable:!0,value:async r=>{var a,s;if(((a=this.session.state)==null?void 0:a.next_action)!=="tokenize_card")throw new Error(`The session's next_action='${(s=this.session.state)==null?void 0:s.next_action}'. tokenize() is available only if next_action='tokenize_card'`);const n=this.getCardDataValidationError();if(n)throw n;return this.coordinator.postMessage({type:"card:tokenize",additionalData:this.serializeAdditionalData(r)}),new Promise(o=>{this.coordinator.onMessage("card:tokenize:response",l=>{o(l.success?l.result:null)})})}}),Object.defineProperty(this,"onStateChange",{enumerable:!0,configurable:!0,writable:!0,value:r=>{this.stateChangeHandlers.push(r),r(this.state)}}),Object.defineProperty(this,"clear",{enumerable:!0,configurable:!0,writable:!0,value:()=>{Object.values(this.cardElements).forEach(r=>r==null?void 0:r.element.clear()),this.textElements.forEach(r=>r==null?void 0:r.clear())}}),Object.defineProperty(this,"reset",{enumerable:!0,configurable:!0,writable:!0,value:()=>{Object.values(this.cardElements).forEach(r=>r==null?void 0:r.element.unmount()),this.textElements.forEach(r=>r==null?void 0:r.unmount()),this.cardElements={},this.textElements=[],this.state=this.createFieldDefaultState()}}),Object.defineProperty(this,"dispose",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.reset()}}),Object.defineProperty(this,"process",{enumerable:!0,configurable:!0,writable:!0,value:async(r={})=>{if(!this.hasFormElements())throw new Error("Card form must be initialized and completed before processing");const n=this.getCardDataValidationError();if(n)throw n;if(this.session.isNextAction("refresh_security_code"))return this.refreshSecurityCode();this.disableFormElements(!0);try{return this.coordinator.postMessage({type:"card:process",additionalData:this.serializeAdditionalData(r)}),new Promise((a,s)=>{this.coordinator.onMessage("card:process:response",o=>{o.result&&o.success?a(o.result):s(new Error(o.error))})})}catch(a){throw this.disableFormElements(!1),a}}}),this.cvcOnlyEnabled=this.session.isNextAction("refresh_security_code")}createFormFields(e={}){var l,d;if(this.hasFormElements())throw new Error("Form elements can't be initialized twice. You can call `reset()` method or create new Hellgate client.");const t={disabled:this.cvcOnlyEnabled,autocomplete:"on",style:{..._}},{cardNumber:r={},securityCode:n={},...a}=e,s=f("cardNumber",{...b(t,{...a,...r,cvcOnly:this.cvcOnlyEnabled,schemes:V(this.getSessionSchemes(),r.schemes??a.schemes),value:this.session.isNextAction("refresh_security_code")&&((l=this.session.state)!=null&&l.data)?U(this.session.state.data):null})}),o=f("cardVerificationCode",{...b({...t,disabled:!1,autofocus:this.cvcOnlyEnabled},{...a,...n})});if(s.on("change",h=>{const u=h.cardBrand;o.update({cardType:u})}),this.cardElements={cardNumber:{element:s,state:this.createFieldDefaultState()},cardVerificationCode:{element:o,state:this.createFieldDefaultState()}},this.addElementStateListener("cardNumber"),this.addElementStateListener("cardVerificationCode"),e.expiryDateElement==="separate"){const{expiryMonth:h={},expiryYear:u={}}=e,B=f("cardExpirationMonth",{...b(t,{...a,...h})}),Y=f("cardExpirationYear",{...b(t,{...a,...u})});return this.cardElements.cardExpirationMonth={element:B,state:this.createFieldDefaultState()},this.cardElements.cardExpirationYear={element:Y,state:this.createFieldDefaultState()},this.addElementStateListener("cardExpirationMonth"),this.addElementStateListener("cardExpirationYear"),{cardNumber:s,expiryMonth:B,expiryYear:Y,securityCode:o}}else{const{expiryDate:h={}}=e,u=f("cardExpirationDate",{...b(t,{...a,...h,value:this.session.isNextAction("refresh_security_code")&&((d=this.session.state)!=null&&d.data)?{month:this.session.state.data.expiry_month,year:this.session.state.data.expiry_year}:null})});return this.cardElements.cardExpirationDate={element:u,state:this.createFieldDefaultState()},this.addElementStateListener("cardExpirationDate"),{cardNumber:s,expiryDate:u,securityCode:o}}}async refreshSecurityCode(){return this.coordinator.postMessage({type:"card:refresh_security_code"}),new Promise((e,t)=>{this.coordinator.onMessage("card:refresh_security_code:response",r=>{r.result?e(r.result):t(new Error(r.error))})})}hasFormElements(){return!!Object.keys(this.cardElements).length}disableFormElements(e){Object.values(this.cardElements).forEach(({element:t})=>{t.update({disabled:e})})}addElementStateListener(e){const t=this.cardElements[e];t&&t.element.on("change",r=>{t.state=r,this.updateFormState()})}updateFormState(){const e=this.cvcOnlyEnabled&&this.cardElements.cardVerificationCode?[this.cardElements.cardVerificationCode]:Object.values(this.cardElements);e.length?this.state=e.reduce((t,{state:r})=>(t.valid=!!t.valid&&!!r.valid,t.complete=!!t.complete&&!!r.complete,t.empty=!!t.empty&&!!r.empty,t.error=t.error||r.error,t.errorCode=t.errorCode||r.errorCode,t),{valid:!0,complete:!0,empty:!0}):this.state=this.createFieldDefaultState(),this.stateChangeHandlers.forEach(t=>t(this.state))}createFieldDefaultState(){return{empty:!0,complete:!1,valid:!1}}serializeAdditionalData({cardholder_name:e,billing_address:t={},ephemeral:r,expiration_date:n}){return p({cardholder_name:y(e),billing_address:{line1:y(t.line1),line2:y(t.line2),line3:y(t.line3),city:y(t.city),postal_code:y(t.postal_code)},...this.resolveLifecycleFields(r,n)})}resolveLifecycleFields(e,t){switch(this.getLifecycle()){case"ephemeral_only":return{ephemeral:!0};case"persistent_only":return{ephemeral:!1};case"user_choice":return{ephemeral:typeof e=="boolean"?e:void 0,expiration_date:typeof t=="string"?t:void 0}}}getLifecycle(){var e,t;return this.session.isNextAction("tokenize_card")?((t=(e=this.session.state)==null?void 0:e.data)==null?void 0:t.lifecycle)??"user_choice":"user_choice"}getSessionSchemes(){var t,r;if(!this.session.isNextAction("tokenize_card"))return;const e=(t=this.session.state)==null?void 0:t.data;if((r=e==null?void 0:e.allowed_schemes)!=null&&r.length)return Q(e.allowed_schemes)}getCardDataValidationError(){if(!this.state.complete)return new Error(this.state.error??"Card data is not complete");if(!this.state.valid)return new Error(`Card data is not valid. ${this.state.error}`)}}function y(i){if(typeof i=="string")return i;if(i!=null&&i.key)return{key:i.key}}function V(i,e){return i===void 0?e:i.length===0?[]:e!=null&&e.length?e.filter(t=>i.includes(t)):i}const z="v3.12.0";class Z{constructor(){if(Object.defineProperty(this,"iframe",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"iframeBaseUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"messageHandler",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"init",{enumerable:!0,configurable:!0,writable:!0,value:async(e,t,r)=>(window.fetchMocker={a:1},new Promise((n,a)=>{r==null||r.signal.addEventListener("abort",()=>{const l=new Error("Coordinator init aborted");l.name="AbortError",a(l),this.dispose()});const s=document.createElement("div");s.setAttribute("style","position:absolute;width:0;height:0;overflow:hidden;"),s.setAttribute("data-hg-coordinator",""),document.body.appendChild(s);const o=`${this.iframeBaseUrl}?type=coordinator&sessionId=${e}&apiBaseUrl=${t}&origin=${encodeURIComponent(location.origin)}&sdkVersion=${encodeURIComponent(z)}`;if(s.innerHTML=`<iframe src="${o}" width="0" height="0" style="border:none;" tabindex="-1" aria-hidden="true"></iframe>`,this.iframe=s.querySelector("iframe"),!this.iframe){a(new Error("Failed to create coordinator iframe"));return}this.messageHandler=l=>{var d,h,u;if(l.source===((d=this.iframe)==null?void 0:d.contentWindow)){if(((h=l.data)==null?void 0:h.type)==="coordinator:ready"){n();return}if(((u=l.data)==null?void 0:u.type)==="coordinator:error"){a(l.data.error);return}}},window.addEventListener("message",this.messageHandler),this.iframe.addEventListener("error",()=>{a(new Error("Coordinator iframe failed to load"))})}))}),this.iframeBaseUrl=S(z),!this.iframeBaseUrl)throw new Error("IFRAME_BASE_URL not found")}postMessage(e){var t,r;(r=(t=this.iframe)==null?void 0:t.contentWindow)==null||r.postMessage(e,this.iframeBaseUrl)}onMessage(e,t){window.addEventListener("message",r=>{var n,a;r.source===((n=this.iframe)==null?void 0:n.contentWindow)&&((a=r.data)==null?void 0:a.type)===e&&t(r.data)})}dispose(){var t;this.postMessage({type:"coordinator:dispose"}),this.messageHandler&&(window.removeEventListener("message",this.messageHandler),this.messageHandler=null);const e=(t=this.iframe)==null?void 0:t.parentElement;this.iframe=null,e==null||e.remove()}}const ee="hellgate-web-sdk",te="v3.12.0";class re{constructor(e="https://api.hellgate.io",t=new AbortController,{context:r="window",version:n=te}={}){Object.defineProperty(this,"abortCtrl",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,"baseUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"clientId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.baseUrl=e.endsWith("/")?e.substring(0,e.length-1):e,this.clientId=`${ee}/${n||"unknown"} (${r})`}getSession(e){return fetch(`${this.baseUrl}/sessions/${e}`,{headers:this.traceHeaders(),signal:this.abortCtrl.signal}).then(t=>E(t))}completeAction(e,t){return fetch(`${this.baseUrl}/sessions/${e}/complete-action`,{method:"POST",headers:{"Content-Type":"application/json",...this.traceHeaders()},mode:"cors",body:JSON.stringify(t),signal:this.abortCtrl.signal}).then(r=>E(r))}cancelAll(){this.abortCtrl.abort()}traceHeaders(){return{"x-hellgate-client":this.clientId,"x-request-id":ie()}}}function ie(){var i;return((i=crypto.randomUUID)==null?void 0:i.call(crypto))??`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`}const ne=2e3;class ae{constructor(e,t){Object.defineProperty(this,"id",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"api",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,"state",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"stateChangeHandlers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"onCloseHandlers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"pollingTimer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"init",{enumerable:!0,configurable:!0,writable:!0,value:async()=>new Promise((r,n)=>{const a=this.onStateChange(s=>{s.next_action!=="wait"&&(r(s),a())});this.updateSessionState().catch(s=>{s instanceof Response&&s.status===404&&n(new Error(`Session ${this.id} doesn't exist or has expired`)),n(s)})})}),Object.defineProperty(this,"onStateChange",{enumerable:!0,configurable:!0,writable:!0,value:r=>(this.stateChangeHandlers.push(r),this.state&&r(this.state),()=>this.stateChangeHandlers=this.stateChangeHandlers.filter(n=>n!==r))}),Object.defineProperty(this,"onClose",{enumerable:!0,configurable:!0,writable:!0,value:r=>{var n;return((n=this.state)==null?void 0:n.next_action)===null?(r(x(this.state)),()=>{}):(this.onCloseHandlers.push(r),()=>this.onCloseHandlers=this.onCloseHandlers.filter(a=>a!==r))}}),Object.defineProperty(this,"completeAction",{enumerable:!0,configurable:!0,writable:!0,value:async r=>{const n=this.state;return new Promise((a,s)=>{const o=this.onStateChange(l=>{l.next_action!==(n==null?void 0:n.next_action)&&l.next_action===null&&(a(x(l)),o())});this.api.completeAction(this.id,r).then(l=>this.newStateHandle(l,s)).catch(async l=>s(await se(l)))})}}),Object.defineProperty(this,"completeSession",{enumerable:!0,configurable:!0,writable:!0,value:r=>{this.onCloseHandlers.forEach(n=>n(r)),this.stop()}}),Object.defineProperty(this,"dispose",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.stop(),this.api.cancelAll()}})}isNextAction(e){var t;return((t=this.state)==null?void 0:t.next_action)===e}stop(){window.clearTimeout(this.pollingTimer),this.stateChangeHandlers=[],this.onCloseHandlers=[]}async updateSessionState(e){const t=await this.api.getSession(this.id);this.newStateHandle(t,e)}newStateHandle(e,t){var r;switch(!e.next_action&&e.status&&(e.next_action=null),e.next_action){case"wait":{window.clearTimeout(this.pollingTimer),this.pollingTimer=window.setTimeout(()=>this.updateSessionState(t).catch(n=>{n instanceof Response&&n.status===404&&(t==null||t(new Error(`Session ${this.id} has expired`)))}),ne);break}}e.next_action!==((r=this.state)==null?void 0:r.next_action)&&this.stateChangeHandlers.forEach(n=>n(e)),e.next_action===null&&this.completeSession(x(e)),this.state=e}}async function se(i){return!i.ok&&i.status>=400&&i.status<=500?i.json():i}function x(i){const e={...i};return delete e.next_action,e}const oe={base_url:"https://api.hellgate.io"};class C{constructor(e,t,r){Object.defineProperty(this,"session",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"coordinator",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,"paymentFlowHandlers",{enumerable:!0,configurable:!0,writable:!0,value:r}),Object.defineProperty(this,"dispose",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.session.dispose(),this.coordinator.dispose(),Object.values(this.paymentFlowHandlers).forEach(n=>n==null?void 0:n.dispose())}}),Object.defineProperty(this,"onSessionComplete",{enumerable:!0,configurable:!0,writable:!0,value:n=>{this.session.onClose(n)}})}use(e){return this.paymentFlowHandlers[e]}static async init(e,t={}){const{session:r,coordinator:n,cardHandler:a,handler3DS:s}=await this.initHandlers(e,t);return new C(r,n,{CARD:a,"3DS":s})}static async initHandlers(e,t){const r={...oe,...t},n=new re(r.base_url,r.abortCtrl),a=new ae(e,n),s=new Z;s.onMessage("coordinator:session_state_change",d=>{d.state.next_action!=="wait"&&a.newStateHandle(d.state)}),await s.init(e,r.base_url,r.abortCtrl);const o=a.isNextAction("tokenize_card")||a.isNextAction("refresh_security_code")?await this.createCardHandler(a,s):void 0,l=this.create3DSHandler(a,t);return{session:a,coordinator:s,cardHandler:o,handler3DS:l}}static createCardHandler(e,t){return g.init(e,t)}static create3DSHandler(e,t){return new j(e,{domContainer:t.challenge_3ds_container,labelText:t.challenge_3ds_label_text})}}c.CardElement=F,c.CardExpirationDateElement=L,c.CardNumberElement=k,c.CardVerificationCodeElement=R,c.Hellgate=C,c.Hellgate3DSHandler=j,c.HellgateCardHandler=g,c.TextElement=$,c.createElement=f,c.extractCardNumberValue=P,c.extractExpiryDateValue=v,c.putCardNumberValue=N,c.putExpiryDateValue=O,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})});globalThis.HellgateSDK&&(globalThis.Hellgate=globalThis.HellgateSDK.Hellgate,delete globalThis.HellgateSDK);
|
package/dist/session/api.d.ts
CHANGED
|
@@ -1,9 +1,26 @@
|
|
|
1
1
|
import { CompleteActionDTO, SessionStateDTO } from './typings';
|
|
2
|
+
/**
|
|
3
|
+
* Where the API call originates from. Both the merchant page and the
|
|
4
|
+
* coordinator iframe talk to the backend, so the context tells them apart
|
|
5
|
+
* in the backend logs.
|
|
6
|
+
*/
|
|
7
|
+
export type ClientContext = 'window' | 'coordinator-iframe';
|
|
8
|
+
export type ClientInfo = {
|
|
9
|
+
context?: ClientContext;
|
|
10
|
+
version?: string;
|
|
11
|
+
};
|
|
2
12
|
export declare class HellgateAPIClient {
|
|
3
13
|
private abortCtrl;
|
|
4
14
|
private baseUrl;
|
|
5
|
-
|
|
15
|
+
private clientId;
|
|
16
|
+
constructor(baseUrl?: string, abortCtrl?: AbortController, { context, version }?: ClientInfo);
|
|
6
17
|
getSession(id: string): Promise<SessionStateDTO>;
|
|
7
18
|
completeAction(id: string, data: CompleteActionDTO): Promise<SessionStateDTO>;
|
|
8
19
|
cancelAll(): void;
|
|
20
|
+
/**
|
|
21
|
+
* Traceability headers sent on every backend call: which SDK build and
|
|
22
|
+
* execution context made the request, plus a per-request id to correlate
|
|
23
|
+
* a single failing call with the backend logs.
|
|
24
|
+
*/
|
|
25
|
+
private traceHeaders;
|
|
9
26
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@starfish-codes/hellgate",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.12.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Starfish GmbH & Co. KG",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"@headlessui/react": "^1.7.18",
|
|
38
38
|
"@rollup/plugin-typescript": "^11.1.6",
|
|
39
39
|
"@semantic-release/changelog": "^6.0.3",
|
|
40
|
-
"@semantic-release/
|
|
40
|
+
"@semantic-release/exec": "^7.1.0",
|
|
41
41
|
"@tailwindcss/forms": "^0.5.7",
|
|
42
42
|
"@types/inputmask": "^5.0.7",
|
|
43
43
|
"@types/lodash": "^4.17.0",
|
|
@@ -45,9 +45,9 @@
|
|
|
45
45
|
"@types/react-dom": "^18.2.22",
|
|
46
46
|
"@typescript-eslint/eslint-plugin": "^7.2.0",
|
|
47
47
|
"@typescript-eslint/parser": "^7.2.0",
|
|
48
|
-
"@vitest/browser": "^
|
|
49
|
-
"@vitest/coverage-istanbul": "^
|
|
50
|
-
"@vitest/ui": "^
|
|
48
|
+
"@vitest/browser-playwright": "^4.1.11",
|
|
49
|
+
"@vitest/coverage-istanbul": "^4.1.11",
|
|
50
|
+
"@vitest/ui": "^4.1.11",
|
|
51
51
|
"autoprefixer": "^10.4.18",
|
|
52
52
|
"clsx": "^2.1.0",
|
|
53
53
|
"commitizen": "^4.3.0",
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
"mobx-react": "^9.1.0",
|
|
62
62
|
"mobx-react-viewmodel": "^0.2.0",
|
|
63
63
|
"playwright": "^1.55.1",
|
|
64
|
-
"postcss": "^8.5.
|
|
64
|
+
"postcss": "^8.5.23",
|
|
65
65
|
"postcss-nesting": "^13.0.1",
|
|
66
66
|
"prettier": "^3.2.5",
|
|
67
67
|
"react": "^18.2.0",
|
|
@@ -73,12 +73,12 @@
|
|
|
73
73
|
"tailwindcss": "^3.4.1",
|
|
74
74
|
"tailwindcss-animate": "^1.0.7",
|
|
75
75
|
"typescript": "^5.4.2",
|
|
76
|
-
"vite": "^6.4.
|
|
76
|
+
"vite": "^6.4.3",
|
|
77
77
|
"vite-plugin-checker": "^0.9.3",
|
|
78
78
|
"vite-plugin-sri3": "^1.3.0",
|
|
79
79
|
"vite-plugin-svg-icons-ng": "^1.4.0",
|
|
80
80
|
"vite-plugin-top-level-await": "^1.5.0",
|
|
81
|
-
"vitest": "^
|
|
81
|
+
"vitest": "^4.1.11",
|
|
82
82
|
"vitest-fetch-mock": "^0.2.2",
|
|
83
83
|
"webdriverio": "^9.12.7"
|
|
84
84
|
},
|
|
@@ -109,4 +109,4 @@
|
|
|
109
109
|
"path": "./node_modules/cz-conventional-changelog"
|
|
110
110
|
}
|
|
111
111
|
}
|
|
112
|
-
}
|
|
112
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export type BTTokenizeData = Record<string, unknown>;
|