@bemony/payment-form 0.1.10 → 0.1.12

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.
@@ -156,9 +156,15 @@ export type PaymentFormErrorPayment = Readonly<{
156
156
  attempts?: readonly PaymentFormErrorAttempt[];
157
157
  }>;
158
158
  }>;
159
+ /** Stable high-level class for browser-safe error handling and telemetry. */
160
+ export type PaymentFormErrorCategory = 'VALIDATION' | 'CONFIGURATION' | 'LIFECYCLE' | 'FRAME' | 'TOKENIZATION' | 'THREE_DS' | 'PAYMENT' | 'RUNTIME' | 'UNKNOWN';
161
+ /** Browser-safe operation boundary where a failure occurred. */
162
+ export type PaymentFormErrorStage = 'FORM_SDK' | 'FORM_IFRAME_NAVIGATION' | 'FORM_HANDSHAKE' | 'CARD_FRAME_DOCUMENT' | 'CARD_FRAME_HANDSHAKE' | 'CARD_FRAME_INITIALIZATION' | 'CARD_TOKENIZATION' | 'THREE_DS' | 'PAYMENT_SUBMISSION' | 'PAYMENT_RECONCILIATION' | 'RUNTIME';
159
163
  export type PaymentFormError = Readonly<{
160
164
  code: string;
161
165
  message: string;
166
+ category?: PaymentFormErrorCategory;
167
+ stage?: PaymentFormErrorStage;
162
168
  requestId?: string;
163
169
  paymentId?: string;
164
170
  retryable?: boolean;
@@ -168,6 +174,21 @@ export type PaymentFormError = Readonly<{
168
174
  frameStage?: 'FRAME_DOCUMENT' | 'CARD_FRAME';
169
175
  payment?: PaymentFormErrorPayment;
170
176
  }>;
177
+ /**
178
+ * Non-sensitive lifecycle signal emitted by the Web SDK.
179
+ *
180
+ * It is intended for merchant telemetry only. It deliberately never includes
181
+ * card data, client secrets, risk collector values or payment tokens.
182
+ */
183
+ export type PaymentFormEvent = Readonly<{
184
+ type: 'MOUNT_STARTED' | 'MOUNT_SLOW' | 'MOUNT_RETRY' | 'MOUNT_FAILED' | 'MOUNTED' | 'PAYMENT_STARTED' | 'PAYMENT_SUCCEEDED' | 'PAYMENT_FAILED' | 'DESTROYED';
185
+ attempt?: number;
186
+ /** Visible time spent in the current mount attempt, when applicable. */
187
+ durationMs?: number;
188
+ /** Last known non-sensitive mount boundary for mount events. */
189
+ stage?: PaymentFormErrorStage;
190
+ error?: PaymentFormError;
191
+ }>;
171
192
  export type PaymentFormState = Readonly<{
172
193
  status: PaymentFormStatus;
173
194
  ready: boolean;
@@ -180,6 +201,7 @@ export type PaymentFormCallbacks = Readonly<{
180
201
  onStatusChange?: (status: PaymentFormStatus) => void;
181
202
  onSuccess?: (payment: PayOutcome) => void;
182
203
  onError?: (error: PaymentFormError) => void;
204
+ onEvent?: (event: PaymentFormEvent) => void;
183
205
  }>;
184
206
  export type ThreeDSPresentation = 'modal' | 'inline';
185
207
  export type PaymentFormAppearance = Readonly<{
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/contracts/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/contracts/types.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  export { BemonyPaymentForm } from './mount';
2
- export type { Address, BrowserInfo, CardStorageConsent, CardState, CheckoutClient, Customer, PaymentFormAppearance, PayInput, PayOutcome, PaymentFormCallbacks, PaymentFormError, PaymentFormErrorAttempt, PaymentFormErrorPayment, PaymentFormInstance, PaymentFormMountOptions, PaymentFormState, PaymentFormStatus, PaymentAmounts, PaymentItem, PaymentStatus, RiskCollector, ShippingAddress, ThreeDSPresentation } from './contracts/types';
2
+ export type { Address, BrowserInfo, CardStorageConsent, CardState, CheckoutClient, Customer, PaymentFormAppearance, PayInput, PayOutcome, PaymentFormCallbacks, PaymentFormError, PaymentFormErrorAttempt, PaymentFormErrorCategory, PaymentFormEvent, PaymentFormErrorPayment, PaymentFormErrorStage, PaymentFormInstance, PaymentFormMountOptions, PaymentFormState, PaymentFormStatus, PaymentAmounts, PaymentItem, PaymentStatus, RiskCollector, ShippingAddress, ThreeDSPresentation } from './contracts/types';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,YAAY,EACV,OAAO,EACP,WAAW,EACX,kBAAkB,EAClB,SAAS,EACT,cAAc,EACd,QAAQ,EACR,qBAAqB,EACrB,QAAQ,EACR,UAAU,EACV,oBAAoB,EACpB,gBAAgB,EAChB,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,uBAAuB,EACvB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,aAAa,EACb,aAAa,EACb,eAAe,EACf,mBAAmB,EACpB,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,YAAY,EACV,OAAO,EACP,WAAW,EACX,kBAAkB,EAClB,SAAS,EACT,cAAc,EACd,QAAQ,EACR,qBAAqB,EACrB,QAAQ,EACR,UAAU,EACV,oBAAoB,EACpB,gBAAgB,EAChB,uBAAuB,EACvB,wBAAwB,EACxB,gBAAgB,EAChB,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,EACvB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,aAAa,EACb,aAAa,EACb,eAAe,EACf,mBAAmB,EACpB,MAAM,mBAAmB,CAAC"}
package/dist/index.js CHANGED
@@ -1,13 +1,76 @@
1
1
  // src/contracts/errors.ts
2
- function formError(code, message, requestId) {
3
- return requestId === void 0 ? { code, message } : { code, message, requestId };
2
+ function formError(code, message, requestId, details = {}) {
3
+ return {
4
+ code,
5
+ message,
6
+ ...classifyPaymentFormError(code),
7
+ ...details,
8
+ ...requestId === void 0 ? {} : { requestId }
9
+ };
10
+ }
11
+ function normalizePaymentFormError(error) {
12
+ const { category, stage, ...base } = error;
13
+ return {
14
+ ...base,
15
+ ...classifyPaymentFormError(error.code),
16
+ ...category === void 0 ? {} : { category },
17
+ ...stage === void 0 ? {} : { stage }
18
+ };
19
+ }
20
+ function classifyPaymentFormError(code) {
21
+ switch (code) {
22
+ case "PAY_INPUT_INVALID":
23
+ case "CARD_FIELDS_INCOMPLETE":
24
+ return { category: "VALIDATION", stage: "CARD_TOKENIZATION" };
25
+ case "PAYMENT_SESSION_INVALID":
26
+ case "CHECKOUT_SESSION_INVALID":
27
+ case "CHECKOUT_SESSION_EXPIRED":
28
+ case "ORIGIN_NOT_ALLOWED":
29
+ return { category: "CONFIGURATION", stage: "CARD_FRAME_DOCUMENT" };
30
+ case "FORM_NOT_READY":
31
+ case "FORM_DESTROYED":
32
+ case "FORM_MOUNT_CANCELLED":
33
+ case "INVALID_STATE":
34
+ return { category: "LIFECYCLE", stage: "FORM_SDK" };
35
+ case "FRAME_UNAVAILABLE":
36
+ case "MOUNT_FAILED":
37
+ case "FRAME_NETWORK_TIMEOUT":
38
+ case "FRAME_DOCUMENT_NOT_FOUND":
39
+ case "FRAME_RATE_LIMITED":
40
+ case "FRAME_POLICY_BLOCKED":
41
+ return {
42
+ category: "FRAME",
43
+ stage: code === "MOUNT_FAILED" ? "FORM_SDK" : "CARD_FRAME_HANDSHAKE"
44
+ };
45
+ case "TOKENIZATION_UNAVAILABLE":
46
+ case "TOKENIZATION_FAILED":
47
+ return { category: "TOKENIZATION", stage: "CARD_TOKENIZATION" };
48
+ case "THREE_DS_FAILED":
49
+ case "STRIPE_3DS_FAILED":
50
+ return { category: "THREE_DS", stage: "THREE_DS" };
51
+ case "PAYMENT_DECLINED":
52
+ case "PAYMENT_FAILED":
53
+ case "PAYMENT_STATUS_UNKNOWN":
54
+ case "PAYMENT_ALREADY_IN_PROGRESS":
55
+ return {
56
+ category: "PAYMENT",
57
+ stage: code === "PAYMENT_STATUS_UNKNOWN" || code === "PAYMENT_ALREADY_IN_PROGRESS" ? "PAYMENT_RECONCILIATION" : "PAYMENT_SUBMISSION"
58
+ };
59
+ case "ORCHESTRATOR_UNAVAILABLE":
60
+ case "ORCHESTRATOR_ERROR":
61
+ case "INVALID_UPSTREAM_RESPONSE":
62
+ case "PAYMENT_FORM_SERVER_ERROR":
63
+ return { category: "RUNTIME", stage: "RUNTIME" };
64
+ default:
65
+ return { category: "UNKNOWN", stage: "RUNTIME" };
66
+ }
4
67
  }
5
68
 
6
69
  // src/browser-context.ts
7
70
  function enrichPayInputFromBrowser(input) {
8
71
  const declared = input.client;
9
- const location = sanitizeUrl(window.location.href);
10
- const referrer = sanitizeUrl(document.referrer);
72
+ const location = sanitizeUrl(declared?.page) ?? sanitizeUrl(window.location.href);
73
+ const referrer = sanitizeUrl(declared?.referrer) ?? sanitizeUrl(document.referrer);
11
74
  const browserInfo = {
12
75
  colorDepth: window.screen?.colorDepth,
13
76
  javascriptEnabled: true,
@@ -23,9 +86,9 @@ function enrichPayInputFromBrowser(input) {
23
86
  });
24
87
  const client = {
25
88
  ...browserIdentity(),
89
+ ...declared,
26
90
  ...location === void 0 ? {} : { page: location },
27
91
  ...referrer === void 0 ? {} : { referrer },
28
- ...declared,
29
92
  ...Object.keys(utm).length === 0 ? {} : { utm },
30
93
  browserInfo: { ...browserInfo, ...declared?.browserInfo }
31
94
  };
@@ -77,7 +140,7 @@ function hasControlCharacter(value) {
77
140
  });
78
141
  }
79
142
  function sanitizeUrl(value) {
80
- if (value === "") return void 0;
143
+ if (value === void 0 || value === "") return void 0;
81
144
  try {
82
145
  const url = new URL(value);
83
146
  if (!["http:", "https:"].includes(url.protocol)) return void 0;
@@ -249,6 +312,8 @@ function isFrameToHostMessage(value) {
249
312
  return hasOnly(value, ["channel", "version", "instanceId", "type"]);
250
313
  case "THREE_DS_OPEN":
251
314
  return hasOnly(value, ["channel", "version", "instanceId", "type"]);
315
+ case "MOUNT_SLOW":
316
+ return hasOnly(value, ["channel", "version", "instanceId", "type", "stage", "durationMs"]) && isMountStage(value.stage) && typeof value.durationMs === "number" && Number.isInteger(value.durationMs) && value.durationMs >= 0 && value.durationMs <= 24 * 60 * 60 * 1e3;
252
317
  case "STRIPE_3DS":
253
318
  return hasOnly(value, ["channel", "version", "instanceId", "type", "action"]) && isStripeThreeDSAction(value.action);
254
319
  case "STATUS":
@@ -298,6 +363,15 @@ function isStatus(value) {
298
363
  "DESTROYED"
299
364
  ].includes(value);
300
365
  }
366
+ function isMountStage(value) {
367
+ return typeof value === "string" && [
368
+ "FORM_IFRAME_NAVIGATION",
369
+ "FORM_HANDSHAKE",
370
+ "CARD_FRAME_DOCUMENT",
371
+ "CARD_FRAME_HANDSHAKE",
372
+ "CARD_FRAME_INITIALIZATION"
373
+ ].includes(value);
374
+ }
301
375
  function isFrameHeight(value) {
302
376
  return typeof value === "number" && Number.isInteger(value) && value >= 80 && value <= 1200;
303
377
  }
@@ -311,6 +385,8 @@ function isError(value) {
311
385
  return isRecord2(value) && hasOnly(value, [
312
386
  "code",
313
387
  "message",
388
+ "category",
389
+ "stage",
314
390
  "requestId",
315
391
  "paymentId",
316
392
  "retryable",
@@ -318,7 +394,29 @@ function isError(value) {
318
394
  "upstreamRequestId",
319
395
  "frameStage",
320
396
  "payment"
321
- ]) && typeof value.code === "string" && /^[A-Z][A-Z0-9_]{1,63}$/.test(value.code) && typeof value.message === "string" && value.message.length <= 1e3 && (value.requestId === void 0 || isId(value.requestId)) && (value.paymentId === void 0 || typeof value.paymentId === "string" && /^pay_[A-Za-z0-9_-]{4,128}$/.test(value.paymentId)) && (value.retryable === void 0 || typeof value.retryable === "boolean") && (value.httpStatus === void 0 || typeof value.httpStatus === "number" && Number.isInteger(value.httpStatus) && value.httpStatus >= 400 && value.httpStatus <= 599) && (value.upstreamRequestId === void 0 || typeof value.upstreamRequestId === "string" && value.upstreamRequestId.length > 0 && value.upstreamRequestId.length <= 1e3) && (value.frameStage === void 0 || value.frameStage === "FRAME_DOCUMENT" || value.frameStage === "CARD_FRAME") && (value.payment === void 0 || isErrorPayment(value.payment));
397
+ ]) && typeof value.code === "string" && /^[A-Z][A-Z0-9_]{1,63}$/.test(value.code) && typeof value.message === "string" && value.message.length <= 1e3 && (value.category === void 0 || typeof value.category === "string" && [
398
+ "VALIDATION",
399
+ "CONFIGURATION",
400
+ "LIFECYCLE",
401
+ "FRAME",
402
+ "TOKENIZATION",
403
+ "THREE_DS",
404
+ "PAYMENT",
405
+ "RUNTIME",
406
+ "UNKNOWN"
407
+ ].includes(value.category)) && (value.stage === void 0 || typeof value.stage === "string" && [
408
+ "FORM_SDK",
409
+ "FORM_IFRAME_NAVIGATION",
410
+ "FORM_HANDSHAKE",
411
+ "CARD_FRAME_DOCUMENT",
412
+ "CARD_FRAME_HANDSHAKE",
413
+ "CARD_FRAME_INITIALIZATION",
414
+ "CARD_TOKENIZATION",
415
+ "THREE_DS",
416
+ "PAYMENT_SUBMISSION",
417
+ "PAYMENT_RECONCILIATION",
418
+ "RUNTIME"
419
+ ].includes(value.stage)) && (value.requestId === void 0 || isId(value.requestId)) && (value.paymentId === void 0 || typeof value.paymentId === "string" && /^pay_[A-Za-z0-9_-]{4,128}$/.test(value.paymentId)) && (value.retryable === void 0 || typeof value.retryable === "boolean") && (value.httpStatus === void 0 || typeof value.httpStatus === "number" && Number.isInteger(value.httpStatus) && value.httpStatus >= 400 && value.httpStatus <= 599) && (value.upstreamRequestId === void 0 || typeof value.upstreamRequestId === "string" && value.upstreamRequestId.length > 0 && value.upstreamRequestId.length <= 1e3) && (value.frameStage === void 0 || value.frameStage === "FRAME_DOCUMENT" || value.frameStage === "CARD_FRAME") && (value.payment === void 0 || isErrorPayment(value.payment));
322
420
  }
323
421
  function isErrorPayment(value) {
324
422
  return isRecord2(value) && hasOnly(value, ["id", "environment", "currency", "transaction"]) && typeof value.id === "string" && /^pay_[A-Za-z0-9_-]{4,128}$/.test(value.id) && (value.environment === "sandbox" || value.environment === "live") && typeof value.currency === "string" && /^[A-Z]{3}$/.test(value.currency) && isErrorTransaction(value.transaction);
@@ -375,7 +473,7 @@ function isRecord2(value) {
375
473
  var productionFrameOrigin = "https://payment-form.bemony.com";
376
474
  var threeDSModalWidth = 624;
377
475
  var threeDSModalRadius = 12;
378
- var FORM_MOUNT_TIMEOUT_MS = 25e3;
476
+ var FORM_MOUNT_SLOW_VISIBLE_MS = 1e4;
379
477
  var BemonyPaymentForm = {
380
478
  mount(options) {
381
479
  const target = resolveTarget(options.target);
@@ -385,7 +483,7 @@ var BemonyPaymentForm = {
385
483
  );
386
484
  }
387
485
  if (options.signal?.aborted) {
388
- return Promise.reject(formError("INVALID_STATE", "A montagem foi cancelada."));
486
+ return Promise.reject(formError("FORM_MOUNT_CANCELLED", "A montagem foi cancelada."));
389
487
  }
390
488
  const riskCollectorSessions = startRiskCollectorSessionCollection(
391
489
  options.riskCollectors,
@@ -393,11 +491,11 @@ var BemonyPaymentForm = {
393
491
  );
394
492
  const instanceId = crypto.randomUUID();
395
493
  const frameOrigin = resolveFrameOrigin();
494
+ ensureConnectionHints(frameOrigin);
396
495
  const slot = document.createElement("div");
397
496
  slot.dataset.bemonyPaymentForm = "";
398
497
  const iframe = document.createElement("iframe");
399
498
  iframe.title = "Pagamento seguro Bemony";
400
- iframe.src = `${frameOrigin}/frame?instance=${encodeURIComponent(instanceId)}`;
401
499
  iframe.setAttribute("allow", "payment *");
402
500
  iframe.setAttribute("referrerpolicy", "no-referrer");
403
501
  let contentHeight = 100;
@@ -407,7 +505,10 @@ var BemonyPaymentForm = {
407
505
  target.append(slot);
408
506
  let destroyed = false;
409
507
  let mounted = false;
410
- let timer;
508
+ let mountSlowTimer;
509
+ let mountAttempt = 0;
510
+ let mountAttemptStartedAt = 0;
511
+ let mountPhase = "FORM_IFRAME_NAVIGATION";
411
512
  let overlay;
412
513
  let applyOverlayLayout;
413
514
  let bodyOverflow = null;
@@ -423,6 +524,7 @@ var BemonyPaymentForm = {
423
524
  } catch {
424
525
  }
425
526
  };
527
+ const reportEvent = (event) => callback(options.onEvent, event);
426
528
  const post = (message) => {
427
529
  iframe.contentWindow?.postMessage(message, frameOrigin);
428
530
  };
@@ -502,8 +604,11 @@ var BemonyPaymentForm = {
502
604
  };
503
605
  callback(options.onStatusChange, status);
504
606
  };
505
- const reportError = (error, requestId) => {
607
+ const reportError = (received, requestId) => {
506
608
  if (requestId !== void 0 && active !== void 0 && active.requestId !== requestId) return;
609
+ const error = normalizePaymentFormError(
610
+ received.stage === void 0 && !mounted ? { ...received, category: "FRAME", stage: mountPhase } : received
611
+ );
507
612
  restoreInline();
508
613
  if (error.code === "PAYMENT_STATUS_UNKNOWN" || error.code === "PAYMENT_ALREADY_IN_PROGRESS" || requestId !== void 0 && error.retryable !== true) {
509
614
  blockedError = error;
@@ -515,8 +620,17 @@ var BemonyPaymentForm = {
515
620
  isSubmitting: false
516
621
  };
517
622
  callback(options.onError, error);
623
+ reportEvent({
624
+ type: !mounted ? "MOUNT_FAILED" : "PAYMENT_FAILED",
625
+ ...mounted ? {} : {
626
+ attempt: mountAttempt,
627
+ durationMs: Date.now() - mountAttemptStartedAt,
628
+ stage: error.stage ?? mountPhase
629
+ },
630
+ error
631
+ });
518
632
  if (!mounted && rejectMount !== void 0) {
519
- if (timer !== void 0) window.clearTimeout(timer);
633
+ mountSlowTimer?.cancel();
520
634
  const reject = rejectMount;
521
635
  rejectMount = void 0;
522
636
  destroy();
@@ -531,7 +645,7 @@ var BemonyPaymentForm = {
531
645
  const destroy = () => {
532
646
  if (destroyed) return;
533
647
  destroyed = true;
534
- if (timer !== void 0) window.clearTimeout(timer);
648
+ mountSlowTimer?.cancel();
535
649
  window.removeEventListener("message", onMessage);
536
650
  options.signal?.removeEventListener("abort", destroy);
537
651
  restoreInline();
@@ -543,13 +657,14 @@ var BemonyPaymentForm = {
543
657
  });
544
658
  iframe.remove();
545
659
  slot.remove();
546
- active?.reject(formError("FRAME_UNAVAILABLE", "O formul\xE1rio de pagamento foi desmontado."));
660
+ active?.reject(formError("FORM_DESTROYED", "O formul\xE1rio de pagamento foi desmontado."));
547
661
  active = void 0;
548
662
  state = { ...state, status: "DESTROYED", ready: false, isSubmitting: false };
663
+ reportEvent({ type: "DESTROYED" });
549
664
  if (!mounted && rejectMount !== void 0) {
550
665
  const reject = rejectMount;
551
666
  rejectMount = void 0;
552
- reject(formError("INVALID_STATE", "A montagem foi cancelada."));
667
+ reject(formError("FORM_MOUNT_CANCELLED", "A montagem foi cancelada."));
553
668
  }
554
669
  };
555
670
  const instance = {
@@ -572,6 +687,7 @@ var BemonyPaymentForm = {
572
687
  reject = nextReject;
573
688
  });
574
689
  active = { requestId, promise, resolve, reject };
690
+ reportEvent({ type: "PAYMENT_STARTED" });
575
691
  const enrichedInput = enrichPayInputFromBrowser(input);
576
692
  const sessions = riskCollectorSessions.snapshot();
577
693
  post({
@@ -590,22 +706,37 @@ var BemonyPaymentForm = {
590
706
  };
591
707
  const mountPromise = new Promise((resolve, reject) => {
592
708
  rejectMount = reject;
593
- timer = window.setTimeout(() => {
594
- if (mounted || destroyed) return;
595
- const error = formError(
596
- "FRAME_UNAVAILABLE",
597
- "N\xE3o foi poss\xEDvel carregar o formul\xE1rio de pagamento."
598
- );
599
- rejectMount = void 0;
600
- destroy();
601
- reject(error);
602
- }, FORM_MOUNT_TIMEOUT_MS);
709
+ const startMountAttempt = () => {
710
+ mountSlowTimer?.cancel();
711
+ mountAttempt += 1;
712
+ mountAttemptStartedAt = Date.now();
713
+ reportEvent({
714
+ type: mountAttempt === 1 ? "MOUNT_STARTED" : "MOUNT_RETRY",
715
+ attempt: mountAttempt
716
+ });
717
+ mountPhase = "FORM_IFRAME_NAVIGATION";
718
+ const source = new URL("/frame", frameOrigin);
719
+ source.searchParams.set("instance", instanceId);
720
+ source.searchParams.set("mountAttempt", String(mountAttempt));
721
+ iframe.src = source.toString();
722
+ mountSlowTimer = setVisibleTimeout(() => {
723
+ if (mounted || destroyed) return;
724
+ reportEvent({
725
+ type: "MOUNT_SLOW",
726
+ attempt: mountAttempt,
727
+ durationMs: Date.now() - mountAttemptStartedAt,
728
+ stage: mountPhase
729
+ });
730
+ }, FORM_MOUNT_SLOW_VISIBLE_MS);
731
+ };
603
732
  onMessage = (event) => {
604
733
  if (destroyed || event.origin !== frameOrigin || event.source !== iframe.contentWindow)
605
734
  return;
606
735
  if (!isFrameToHostMessage(event.data) || event.data.instanceId !== instanceId) return;
607
736
  const message = event.data;
608
737
  if (message.type === "READY") {
738
+ mountPhase = "CARD_FRAME_INITIALIZATION";
739
+ mountSlowTimer?.cancel();
609
740
  post({
610
741
  channel: "BEMONY_FORM_PAYMENT",
611
742
  version: FORM_PAYMENT_PROTOCOL_VERSION,
@@ -620,14 +751,29 @@ var BemonyPaymentForm = {
620
751
  if (message.type === "MOUNTED") {
621
752
  if (mounted) return;
622
753
  mounted = true;
623
- if (timer !== void 0) window.clearTimeout(timer);
754
+ mountSlowTimer?.cancel();
624
755
  rejectMount = void 0;
625
756
  state = { ...state, status: "READY", ready: true };
626
757
  callback(options.onReady, void 0);
627
758
  callback(options.onStatusChange, "READY");
759
+ reportEvent({
760
+ type: "MOUNTED",
761
+ attempt: mountAttempt,
762
+ durationMs: Date.now() - mountAttemptStartedAt,
763
+ stage: "CARD_FRAME_INITIALIZATION"
764
+ });
628
765
  resolve(instance);
629
766
  return;
630
767
  }
768
+ if (message.type === "MOUNT_SLOW") {
769
+ reportEvent({
770
+ type: "MOUNT_SLOW",
771
+ attempt: mountAttempt,
772
+ durationMs: message.durationMs,
773
+ stage: message.stage
774
+ });
775
+ return;
776
+ }
631
777
  if (message.type === "STATUS") return reportStatus(message.status);
632
778
  if (message.type === "CARD_STATE")
633
779
  return callback(options.onCardStateChange, message.state);
@@ -688,6 +834,7 @@ var BemonyPaymentForm = {
688
834
  };
689
835
  callback(options.onStatusChange, message.payment.status);
690
836
  callback(options.onSuccess, message.payment);
837
+ reportEvent({ type: "PAYMENT_SUCCEEDED" });
691
838
  active?.resolve(message.payment);
692
839
  active = void 0;
693
840
  return;
@@ -695,6 +842,12 @@ var BemonyPaymentForm = {
695
842
  if (message.type === "ERROR") reportError(message.error, message.requestId);
696
843
  };
697
844
  window.addEventListener("message", onMessage);
845
+ iframe.addEventListener("load", () => {
846
+ if (!mounted && !destroyed && mountPhase === "FORM_IFRAME_NAVIGATION") {
847
+ mountPhase = "FORM_HANDSHAKE";
848
+ }
849
+ });
850
+ startMountAttempt();
698
851
  });
699
852
  options.signal?.addEventListener("abort", destroy, { once: true });
700
853
  return mountPromise;
@@ -723,10 +876,73 @@ function resolveFrameOrigin() {
723
876
  return productionFrameOrigin;
724
877
  }
725
878
  }
879
+ function ensureConnectionHints(origin) {
880
+ for (const rel of ["dns-prefetch", "preconnect"]) {
881
+ const exists = Array.from(document.head.querySelectorAll("link")).some(
882
+ (link) => {
883
+ try {
884
+ return link.rel === rel && new URL(link.href).origin === origin;
885
+ } catch {
886
+ return false;
887
+ }
888
+ }
889
+ );
890
+ if (exists) continue;
891
+ const hint = document.createElement("link");
892
+ hint.rel = rel;
893
+ hint.href = origin;
894
+ if (rel === "preconnect") hint.crossOrigin = "anonymous";
895
+ document.head.append(hint);
896
+ }
897
+ }
726
898
  function setInlineStyle(iframe, height) {
727
899
  iframe.style.cssText = `display:block;width:100%;height:${height}px;min-height:${height}px;border:0;background:transparent;`;
728
900
  iframe.removeAttribute("tabindex");
729
901
  }
902
+ function setVisibleTimeout(callback, visibleBudgetMs) {
903
+ let remaining = visibleBudgetMs;
904
+ let startedAt;
905
+ let timer;
906
+ let cancelled = false;
907
+ const clear = () => {
908
+ if (timer !== void 0) window.clearTimeout(timer);
909
+ timer = void 0;
910
+ };
911
+ const pause = () => {
912
+ if (startedAt === void 0) return;
913
+ remaining = Math.max(0, remaining - (Date.now() - startedAt));
914
+ startedAt = void 0;
915
+ clear();
916
+ };
917
+ const expire = () => {
918
+ if (cancelled) return;
919
+ pause();
920
+ if (remaining === 0) {
921
+ cancelled = true;
922
+ document.removeEventListener("visibilitychange", onVisibilityChange);
923
+ callback();
924
+ }
925
+ };
926
+ const resume = () => {
927
+ if (cancelled || startedAt !== void 0) return;
928
+ startedAt = Date.now();
929
+ timer = window.setTimeout(expire, remaining);
930
+ };
931
+ const onVisibilityChange = () => {
932
+ if (document.visibilityState === "hidden") pause();
933
+ else resume();
934
+ };
935
+ document.addEventListener("visibilitychange", onVisibilityChange);
936
+ if (document.visibilityState !== "hidden") resume();
937
+ return {
938
+ cancel() {
939
+ if (cancelled) return;
940
+ cancelled = true;
941
+ clear();
942
+ document.removeEventListener("visibilitychange", onVisibilityChange);
943
+ }
944
+ };
945
+ }
730
946
  export {
731
947
  BemonyPaymentForm
732
948
  };