@apolopay-sdk/ui 1.1.0 → 1.2.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/apolopay-sdk.es.js +4577 -0
- package/dist/apolopay-sdk.umd.js +857 -0
- package/dist/components/payment-modal.d.ts +3 -1
- package/dist/payment-button.d.ts +3 -1
- package/dist/types/status.type.d.ts +1 -0
- package/package.json +15 -9
- package/dist/assets/icon_error.js +0 -1
- package/dist/assets/logo_apolo.js +0 -1
- package/dist/components/payment-modal.js +0 -668
- package/dist/components/payment-timer.js +0 -84
- package/dist/components/trigger-button.js +0 -151
- package/dist/index.js +0 -2
- package/dist/payment-button.js +0 -371
- package/dist/styles/modal-base.js +0 -75
- package/dist/styles/qr-base.js +0 -48
- package/dist/styles/shared-styles.js +0 -28
- package/dist/styles/spinner-styles.js +0 -29
- package/dist/styles/text-field-base.js +0 -44
- package/dist/utils/image_error.js +0 -5
|
@@ -0,0 +1,4577 @@
|
|
|
1
|
+
const oe = globalThis, Ie = oe.ShadowRoot && (oe.ShadyCSS === void 0 || oe.ShadyCSS.nativeShadow) && "adoptedStyleSheets" in Document.prototype && "replace" in CSSStyleSheet.prototype, Qe = /* @__PURE__ */ Symbol(), je = /* @__PURE__ */ new WeakMap();
|
|
2
|
+
let ht = class {
|
|
3
|
+
constructor(e, t, r) {
|
|
4
|
+
if (this._$cssResult$ = !0, r !== Qe) throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");
|
|
5
|
+
this.cssText = e, this.t = t;
|
|
6
|
+
}
|
|
7
|
+
get styleSheet() {
|
|
8
|
+
let e = this.o;
|
|
9
|
+
const t = this.t;
|
|
10
|
+
if (Ie && e === void 0) {
|
|
11
|
+
const r = t !== void 0 && t.length === 1;
|
|
12
|
+
r && (e = je.get(t)), e === void 0 && ((this.o = e = new CSSStyleSheet()).replaceSync(this.cssText), r && je.set(t, e));
|
|
13
|
+
}
|
|
14
|
+
return e;
|
|
15
|
+
}
|
|
16
|
+
toString() {
|
|
17
|
+
return this.cssText;
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
const Nt = (s) => new ht(typeof s == "string" ? s : s + "", void 0, Qe), B = (s, ...e) => {
|
|
21
|
+
const t = s.length === 1 ? s[0] : e.reduce((r, i, n) => r + ((o) => {
|
|
22
|
+
if (o._$cssResult$ === !0) return o.cssText;
|
|
23
|
+
if (typeof o == "number") return o;
|
|
24
|
+
throw Error("Value passed to 'css' function must be a 'css' function result: " + o + ". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.");
|
|
25
|
+
})(i) + s[n + 1], s[0]);
|
|
26
|
+
return new ht(t, s, Qe);
|
|
27
|
+
}, It = (s, e) => {
|
|
28
|
+
if (Ie) s.adoptedStyleSheets = e.map((t) => t instanceof CSSStyleSheet ? t : t.styleSheet);
|
|
29
|
+
else for (const t of e) {
|
|
30
|
+
const r = document.createElement("style"), i = oe.litNonce;
|
|
31
|
+
i !== void 0 && r.setAttribute("nonce", i), r.textContent = t.cssText, s.appendChild(r);
|
|
32
|
+
}
|
|
33
|
+
}, qe = Ie ? (s) => s : (s) => s instanceof CSSStyleSheet ? ((e) => {
|
|
34
|
+
let t = "";
|
|
35
|
+
for (const r of e.cssRules) t += r.cssText;
|
|
36
|
+
return Nt(t);
|
|
37
|
+
})(s) : s;
|
|
38
|
+
const { is: Qt, defineProperty: Lt, getOwnPropertyDescriptor: Pt, getOwnPropertyNames: Zt, getOwnPropertySymbols: Rt, getPrototypeOf: zt } = Object, Ae = globalThis, Ge = Ae.trustedTypes, Mt = Ge ? Ge.emptyScript : "", Dt = Ae.reactiveElementPolyfillSupport, H = (s, e) => s, pe = { toAttribute(s, e) {
|
|
39
|
+
switch (e) {
|
|
40
|
+
case Boolean:
|
|
41
|
+
s = s ? Mt : null;
|
|
42
|
+
break;
|
|
43
|
+
case Object:
|
|
44
|
+
case Array:
|
|
45
|
+
s = s == null ? s : JSON.stringify(s);
|
|
46
|
+
}
|
|
47
|
+
return s;
|
|
48
|
+
}, fromAttribute(s, e) {
|
|
49
|
+
let t = s;
|
|
50
|
+
switch (e) {
|
|
51
|
+
case Boolean:
|
|
52
|
+
t = s !== null;
|
|
53
|
+
break;
|
|
54
|
+
case Number:
|
|
55
|
+
t = s === null ? null : Number(s);
|
|
56
|
+
break;
|
|
57
|
+
case Object:
|
|
58
|
+
case Array:
|
|
59
|
+
try {
|
|
60
|
+
t = JSON.parse(s);
|
|
61
|
+
} catch {
|
|
62
|
+
t = null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return t;
|
|
66
|
+
} }, Le = (s, e) => !Qt(s, e), Ye = { attribute: !0, type: String, converter: pe, reflect: !1, useDefault: !1, hasChanged: Le };
|
|
67
|
+
Symbol.metadata ??= /* @__PURE__ */ Symbol("metadata"), Ae.litPropertyMetadata ??= /* @__PURE__ */ new WeakMap();
|
|
68
|
+
let D = class extends HTMLElement {
|
|
69
|
+
static addInitializer(e) {
|
|
70
|
+
this._$Ei(), (this.l ??= []).push(e);
|
|
71
|
+
}
|
|
72
|
+
static get observedAttributes() {
|
|
73
|
+
return this.finalize(), this._$Eh && [...this._$Eh.keys()];
|
|
74
|
+
}
|
|
75
|
+
static createProperty(e, t = Ye) {
|
|
76
|
+
if (t.state && (t.attribute = !1), this._$Ei(), this.prototype.hasOwnProperty(e) && ((t = Object.create(t)).wrapped = !0), this.elementProperties.set(e, t), !t.noAccessor) {
|
|
77
|
+
const r = /* @__PURE__ */ Symbol(), i = this.getPropertyDescriptor(e, r, t);
|
|
78
|
+
i !== void 0 && Lt(this.prototype, e, i);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
static getPropertyDescriptor(e, t, r) {
|
|
82
|
+
const { get: i, set: n } = Pt(this.prototype, e) ?? { get() {
|
|
83
|
+
return this[t];
|
|
84
|
+
}, set(o) {
|
|
85
|
+
this[t] = o;
|
|
86
|
+
} };
|
|
87
|
+
return { get: i, set(o) {
|
|
88
|
+
const l = i?.call(this);
|
|
89
|
+
n?.call(this, o), this.requestUpdate(e, l, r);
|
|
90
|
+
}, configurable: !0, enumerable: !0 };
|
|
91
|
+
}
|
|
92
|
+
static getPropertyOptions(e) {
|
|
93
|
+
return this.elementProperties.get(e) ?? Ye;
|
|
94
|
+
}
|
|
95
|
+
static _$Ei() {
|
|
96
|
+
if (this.hasOwnProperty(H("elementProperties"))) return;
|
|
97
|
+
const e = zt(this);
|
|
98
|
+
e.finalize(), e.l !== void 0 && (this.l = [...e.l]), this.elementProperties = new Map(e.elementProperties);
|
|
99
|
+
}
|
|
100
|
+
static finalize() {
|
|
101
|
+
if (this.hasOwnProperty(H("finalized"))) return;
|
|
102
|
+
if (this.finalized = !0, this._$Ei(), this.hasOwnProperty(H("properties"))) {
|
|
103
|
+
const t = this.properties, r = [...Zt(t), ...Rt(t)];
|
|
104
|
+
for (const i of r) this.createProperty(i, t[i]);
|
|
105
|
+
}
|
|
106
|
+
const e = this[Symbol.metadata];
|
|
107
|
+
if (e !== null) {
|
|
108
|
+
const t = litPropertyMetadata.get(e);
|
|
109
|
+
if (t !== void 0) for (const [r, i] of t) this.elementProperties.set(r, i);
|
|
110
|
+
}
|
|
111
|
+
this._$Eh = /* @__PURE__ */ new Map();
|
|
112
|
+
for (const [t, r] of this.elementProperties) {
|
|
113
|
+
const i = this._$Eu(t, r);
|
|
114
|
+
i !== void 0 && this._$Eh.set(i, t);
|
|
115
|
+
}
|
|
116
|
+
this.elementStyles = this.finalizeStyles(this.styles);
|
|
117
|
+
}
|
|
118
|
+
static finalizeStyles(e) {
|
|
119
|
+
const t = [];
|
|
120
|
+
if (Array.isArray(e)) {
|
|
121
|
+
const r = new Set(e.flat(1 / 0).reverse());
|
|
122
|
+
for (const i of r) t.unshift(qe(i));
|
|
123
|
+
} else e !== void 0 && t.push(qe(e));
|
|
124
|
+
return t;
|
|
125
|
+
}
|
|
126
|
+
static _$Eu(e, t) {
|
|
127
|
+
const r = t.attribute;
|
|
128
|
+
return r === !1 ? void 0 : typeof r == "string" ? r : typeof e == "string" ? e.toLowerCase() : void 0;
|
|
129
|
+
}
|
|
130
|
+
constructor() {
|
|
131
|
+
super(), this._$Ep = void 0, this.isUpdatePending = !1, this.hasUpdated = !1, this._$Em = null, this._$Ev();
|
|
132
|
+
}
|
|
133
|
+
_$Ev() {
|
|
134
|
+
this._$ES = new Promise((e) => this.enableUpdating = e), this._$AL = /* @__PURE__ */ new Map(), this._$E_(), this.requestUpdate(), this.constructor.l?.forEach((e) => e(this));
|
|
135
|
+
}
|
|
136
|
+
addController(e) {
|
|
137
|
+
(this._$EO ??= /* @__PURE__ */ new Set()).add(e), this.renderRoot !== void 0 && this.isConnected && e.hostConnected?.();
|
|
138
|
+
}
|
|
139
|
+
removeController(e) {
|
|
140
|
+
this._$EO?.delete(e);
|
|
141
|
+
}
|
|
142
|
+
_$E_() {
|
|
143
|
+
const e = /* @__PURE__ */ new Map(), t = this.constructor.elementProperties;
|
|
144
|
+
for (const r of t.keys()) this.hasOwnProperty(r) && (e.set(r, this[r]), delete this[r]);
|
|
145
|
+
e.size > 0 && (this._$Ep = e);
|
|
146
|
+
}
|
|
147
|
+
createRenderRoot() {
|
|
148
|
+
const e = this.shadowRoot ?? this.attachShadow(this.constructor.shadowRootOptions);
|
|
149
|
+
return It(e, this.constructor.elementStyles), e;
|
|
150
|
+
}
|
|
151
|
+
connectedCallback() {
|
|
152
|
+
this.renderRoot ??= this.createRenderRoot(), this.enableUpdating(!0), this._$EO?.forEach((e) => e.hostConnected?.());
|
|
153
|
+
}
|
|
154
|
+
enableUpdating(e) {
|
|
155
|
+
}
|
|
156
|
+
disconnectedCallback() {
|
|
157
|
+
this._$EO?.forEach((e) => e.hostDisconnected?.());
|
|
158
|
+
}
|
|
159
|
+
attributeChangedCallback(e, t, r) {
|
|
160
|
+
this._$AK(e, r);
|
|
161
|
+
}
|
|
162
|
+
_$ET(e, t) {
|
|
163
|
+
const r = this.constructor.elementProperties.get(e), i = this.constructor._$Eu(e, r);
|
|
164
|
+
if (i !== void 0 && r.reflect === !0) {
|
|
165
|
+
const n = (r.converter?.toAttribute !== void 0 ? r.converter : pe).toAttribute(t, r.type);
|
|
166
|
+
this._$Em = e, n == null ? this.removeAttribute(i) : this.setAttribute(i, n), this._$Em = null;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
_$AK(e, t) {
|
|
170
|
+
const r = this.constructor, i = r._$Eh.get(e);
|
|
171
|
+
if (i !== void 0 && this._$Em !== i) {
|
|
172
|
+
const n = r.getPropertyOptions(i), o = typeof n.converter == "function" ? { fromAttribute: n.converter } : n.converter?.fromAttribute !== void 0 ? n.converter : pe;
|
|
173
|
+
this._$Em = i;
|
|
174
|
+
const l = o.fromAttribute(t, n.type);
|
|
175
|
+
this[i] = l ?? this._$Ej?.get(i) ?? l, this._$Em = null;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
requestUpdate(e, t, r, i = !1, n) {
|
|
179
|
+
if (e !== void 0) {
|
|
180
|
+
const o = this.constructor;
|
|
181
|
+
if (i === !1 && (n = this[e]), r ??= o.getPropertyOptions(e), !((r.hasChanged ?? Le)(n, t) || r.useDefault && r.reflect && n === this._$Ej?.get(e) && !this.hasAttribute(o._$Eu(e, r)))) return;
|
|
182
|
+
this.C(e, t, r);
|
|
183
|
+
}
|
|
184
|
+
this.isUpdatePending === !1 && (this._$ES = this._$EP());
|
|
185
|
+
}
|
|
186
|
+
C(e, t, { useDefault: r, reflect: i, wrapped: n }, o) {
|
|
187
|
+
r && !(this._$Ej ??= /* @__PURE__ */ new Map()).has(e) && (this._$Ej.set(e, o ?? t ?? this[e]), n !== !0 || o !== void 0) || (this._$AL.has(e) || (this.hasUpdated || r || (t = void 0), this._$AL.set(e, t)), i === !0 && this._$Em !== e && (this._$Eq ??= /* @__PURE__ */ new Set()).add(e));
|
|
188
|
+
}
|
|
189
|
+
async _$EP() {
|
|
190
|
+
this.isUpdatePending = !0;
|
|
191
|
+
try {
|
|
192
|
+
await this._$ES;
|
|
193
|
+
} catch (t) {
|
|
194
|
+
Promise.reject(t);
|
|
195
|
+
}
|
|
196
|
+
const e = this.scheduleUpdate();
|
|
197
|
+
return e != null && await e, !this.isUpdatePending;
|
|
198
|
+
}
|
|
199
|
+
scheduleUpdate() {
|
|
200
|
+
return this.performUpdate();
|
|
201
|
+
}
|
|
202
|
+
performUpdate() {
|
|
203
|
+
if (!this.isUpdatePending) return;
|
|
204
|
+
if (!this.hasUpdated) {
|
|
205
|
+
if (this.renderRoot ??= this.createRenderRoot(), this._$Ep) {
|
|
206
|
+
for (const [i, n] of this._$Ep) this[i] = n;
|
|
207
|
+
this._$Ep = void 0;
|
|
208
|
+
}
|
|
209
|
+
const r = this.constructor.elementProperties;
|
|
210
|
+
if (r.size > 0) for (const [i, n] of r) {
|
|
211
|
+
const { wrapped: o } = n, l = this[i];
|
|
212
|
+
o !== !0 || this._$AL.has(i) || l === void 0 || this.C(i, void 0, n, l);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
let e = !1;
|
|
216
|
+
const t = this._$AL;
|
|
217
|
+
try {
|
|
218
|
+
e = this.shouldUpdate(t), e ? (this.willUpdate(t), this._$EO?.forEach((r) => r.hostUpdate?.()), this.update(t)) : this._$EM();
|
|
219
|
+
} catch (r) {
|
|
220
|
+
throw e = !1, this._$EM(), r;
|
|
221
|
+
}
|
|
222
|
+
e && this._$AE(t);
|
|
223
|
+
}
|
|
224
|
+
willUpdate(e) {
|
|
225
|
+
}
|
|
226
|
+
_$AE(e) {
|
|
227
|
+
this._$EO?.forEach((t) => t.hostUpdated?.()), this.hasUpdated || (this.hasUpdated = !0, this.firstUpdated(e)), this.updated(e);
|
|
228
|
+
}
|
|
229
|
+
_$EM() {
|
|
230
|
+
this._$AL = /* @__PURE__ */ new Map(), this.isUpdatePending = !1;
|
|
231
|
+
}
|
|
232
|
+
get updateComplete() {
|
|
233
|
+
return this.getUpdateComplete();
|
|
234
|
+
}
|
|
235
|
+
getUpdateComplete() {
|
|
236
|
+
return this._$ES;
|
|
237
|
+
}
|
|
238
|
+
shouldUpdate(e) {
|
|
239
|
+
return !0;
|
|
240
|
+
}
|
|
241
|
+
update(e) {
|
|
242
|
+
this._$Eq &&= this._$Eq.forEach((t) => this._$ET(t, this[t])), this._$EM();
|
|
243
|
+
}
|
|
244
|
+
updated(e) {
|
|
245
|
+
}
|
|
246
|
+
firstUpdated(e) {
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
D.elementStyles = [], D.shadowRootOptions = { mode: "open" }, D[H("elementProperties")] = /* @__PURE__ */ new Map(), D[H("finalized")] = /* @__PURE__ */ new Map(), Dt?.({ ReactiveElement: D }), (Ae.reactiveElementVersions ??= []).push("2.1.2");
|
|
250
|
+
const Pe = globalThis, He = (s) => s, de = Pe.trustedTypes, _e = de ? de.createPolicy("lit-html", { createHTML: (s) => s }) : void 0, pt = "$lit$", N = `lit$${Math.random().toFixed(9).slice(2)}$`, dt = "?" + N, Xt = `<${dt}>`, R = document, _ = () => R.createComment(""), $ = (s) => s === null || typeof s != "object" && typeof s != "function", Ze = Array.isArray, Vt = (s) => Ze(s) || typeof s?.[Symbol.iterator] == "function", ke = `[
|
|
251
|
+
\f\r]`, q = /<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g, $e = /-->/g, et = />/g, P = RegExp(`>|${ke}(?:([^\\s"'>=/]+)(${ke}*=${ke}*(?:[^
|
|
252
|
+
\f\r"'\`<>=]|("|')|))|$)`, "g"), tt = /'/g, st = /"/g, ut = /^(?:script|style|textarea|title)$/i, Ft = (s) => (e, ...t) => ({ _$litType$: s, strings: e, values: t }), f = Ft(1), z = /* @__PURE__ */ Symbol.for("lit-noChange"), b = /* @__PURE__ */ Symbol.for("lit-nothing"), rt = /* @__PURE__ */ new WeakMap(), Z = R.createTreeWalker(R, 129);
|
|
253
|
+
function At(s, e) {
|
|
254
|
+
if (!Ze(s) || !s.hasOwnProperty("raw")) throw Error("invalid template strings array");
|
|
255
|
+
return _e !== void 0 ? _e.createHTML(e) : e;
|
|
256
|
+
}
|
|
257
|
+
const Wt = (s, e) => {
|
|
258
|
+
const t = s.length - 1, r = [];
|
|
259
|
+
let i, n = e === 2 ? "<svg>" : e === 3 ? "<math>" : "", o = q;
|
|
260
|
+
for (let l = 0; l < t; l++) {
|
|
261
|
+
const a = s[l];
|
|
262
|
+
let p, u, h = -1, E = 0;
|
|
263
|
+
for (; E < a.length && (o.lastIndex = E, u = o.exec(a), u !== null); ) E = o.lastIndex, o === q ? u[1] === "!--" ? o = $e : u[1] !== void 0 ? o = et : u[2] !== void 0 ? (ut.test(u[2]) && (i = RegExp("</" + u[2], "g")), o = P) : u[3] !== void 0 && (o = P) : o === P ? u[0] === ">" ? (o = i ?? q, h = -1) : u[1] === void 0 ? h = -2 : (h = o.lastIndex - u[2].length, p = u[1], o = u[3] === void 0 ? P : u[3] === '"' ? st : tt) : o === st || o === tt ? o = P : o === $e || o === et ? o = q : (o = P, i = void 0);
|
|
264
|
+
const U = o === P && s[l + 1].startsWith("/>") ? " " : "";
|
|
265
|
+
n += o === q ? a + Xt : h >= 0 ? (r.push(p), a.slice(0, h) + pt + a.slice(h) + N + U) : a + N + (h === -2 ? l : U);
|
|
266
|
+
}
|
|
267
|
+
return [At(s, n + (s[t] || "<?>") + (e === 2 ? "</svg>" : e === 3 ? "</math>" : "")), r];
|
|
268
|
+
};
|
|
269
|
+
class ee {
|
|
270
|
+
constructor({ strings: e, _$litType$: t }, r) {
|
|
271
|
+
let i;
|
|
272
|
+
this.parts = [];
|
|
273
|
+
let n = 0, o = 0;
|
|
274
|
+
const l = e.length - 1, a = this.parts, [p, u] = Wt(e, t);
|
|
275
|
+
if (this.el = ee.createElement(p, r), Z.currentNode = this.el.content, t === 2 || t === 3) {
|
|
276
|
+
const h = this.el.content.firstChild;
|
|
277
|
+
h.replaceWith(...h.childNodes);
|
|
278
|
+
}
|
|
279
|
+
for (; (i = Z.nextNode()) !== null && a.length < l; ) {
|
|
280
|
+
if (i.nodeType === 1) {
|
|
281
|
+
if (i.hasAttributes()) for (const h of i.getAttributeNames()) if (h.endsWith(pt)) {
|
|
282
|
+
const E = u[o++], U = i.getAttribute(h).split(N), M = /([.?@])?(.*)/.exec(E);
|
|
283
|
+
a.push({ type: 1, index: n, name: M[2], strings: U, ctor: M[1] === "." ? qt : M[1] === "?" ? Gt : M[1] === "@" ? Yt : fe }), i.removeAttribute(h);
|
|
284
|
+
} else h.startsWith(N) && (a.push({ type: 6, index: n }), i.removeAttribute(h));
|
|
285
|
+
if (ut.test(i.tagName)) {
|
|
286
|
+
const h = i.textContent.split(N), E = h.length - 1;
|
|
287
|
+
if (E > 0) {
|
|
288
|
+
i.textContent = de ? de.emptyScript : "";
|
|
289
|
+
for (let U = 0; U < E; U++) i.append(h[U], _()), Z.nextNode(), a.push({ type: 2, index: ++n });
|
|
290
|
+
i.append(h[E], _());
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
} else if (i.nodeType === 8) if (i.data === dt) a.push({ type: 2, index: n });
|
|
294
|
+
else {
|
|
295
|
+
let h = -1;
|
|
296
|
+
for (; (h = i.data.indexOf(N, h + 1)) !== -1; ) a.push({ type: 7, index: n }), h += N.length - 1;
|
|
297
|
+
}
|
|
298
|
+
n++;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
static createElement(e, t) {
|
|
302
|
+
const r = R.createElement("template");
|
|
303
|
+
return r.innerHTML = e, r;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
function V(s, e, t = s, r) {
|
|
307
|
+
if (e === z) return e;
|
|
308
|
+
let i = r !== void 0 ? t._$Co?.[r] : t._$Cl;
|
|
309
|
+
const n = $(e) ? void 0 : e._$litDirective$;
|
|
310
|
+
return i?.constructor !== n && (i?._$AO?.(!1), n === void 0 ? i = void 0 : (i = new n(s), i._$AT(s, t, r)), r !== void 0 ? (t._$Co ??= [])[r] = i : t._$Cl = i), i !== void 0 && (e = V(s, i._$AS(s, e.values), i, r)), e;
|
|
311
|
+
}
|
|
312
|
+
class jt {
|
|
313
|
+
constructor(e, t) {
|
|
314
|
+
this._$AV = [], this._$AN = void 0, this._$AD = e, this._$AM = t;
|
|
315
|
+
}
|
|
316
|
+
get parentNode() {
|
|
317
|
+
return this._$AM.parentNode;
|
|
318
|
+
}
|
|
319
|
+
get _$AU() {
|
|
320
|
+
return this._$AM._$AU;
|
|
321
|
+
}
|
|
322
|
+
u(e) {
|
|
323
|
+
const { el: { content: t }, parts: r } = this._$AD, i = (e?.creationScope ?? R).importNode(t, !0);
|
|
324
|
+
Z.currentNode = i;
|
|
325
|
+
let n = Z.nextNode(), o = 0, l = 0, a = r[0];
|
|
326
|
+
for (; a !== void 0; ) {
|
|
327
|
+
if (o === a.index) {
|
|
328
|
+
let p;
|
|
329
|
+
a.type === 2 ? p = new se(n, n.nextSibling, this, e) : a.type === 1 ? p = new a.ctor(n, a.name, a.strings, this, e) : a.type === 6 && (p = new Ht(n, this, e)), this._$AV.push(p), a = r[++l];
|
|
330
|
+
}
|
|
331
|
+
o !== a?.index && (n = Z.nextNode(), o++);
|
|
332
|
+
}
|
|
333
|
+
return Z.currentNode = R, i;
|
|
334
|
+
}
|
|
335
|
+
p(e) {
|
|
336
|
+
let t = 0;
|
|
337
|
+
for (const r of this._$AV) r !== void 0 && (r.strings !== void 0 ? (r._$AI(e, r, t), t += r.strings.length - 2) : r._$AI(e[t])), t++;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
class se {
|
|
341
|
+
get _$AU() {
|
|
342
|
+
return this._$AM?._$AU ?? this._$Cv;
|
|
343
|
+
}
|
|
344
|
+
constructor(e, t, r, i) {
|
|
345
|
+
this.type = 2, this._$AH = b, this._$AN = void 0, this._$AA = e, this._$AB = t, this._$AM = r, this.options = i, this._$Cv = i?.isConnected ?? !0;
|
|
346
|
+
}
|
|
347
|
+
get parentNode() {
|
|
348
|
+
let e = this._$AA.parentNode;
|
|
349
|
+
const t = this._$AM;
|
|
350
|
+
return t !== void 0 && e?.nodeType === 11 && (e = t.parentNode), e;
|
|
351
|
+
}
|
|
352
|
+
get startNode() {
|
|
353
|
+
return this._$AA;
|
|
354
|
+
}
|
|
355
|
+
get endNode() {
|
|
356
|
+
return this._$AB;
|
|
357
|
+
}
|
|
358
|
+
_$AI(e, t = this) {
|
|
359
|
+
e = V(this, e, t), $(e) ? e === b || e == null || e === "" ? (this._$AH !== b && this._$AR(), this._$AH = b) : e !== this._$AH && e !== z && this._(e) : e._$litType$ !== void 0 ? this.$(e) : e.nodeType !== void 0 ? this.T(e) : Vt(e) ? this.k(e) : this._(e);
|
|
360
|
+
}
|
|
361
|
+
O(e) {
|
|
362
|
+
return this._$AA.parentNode.insertBefore(e, this._$AB);
|
|
363
|
+
}
|
|
364
|
+
T(e) {
|
|
365
|
+
this._$AH !== e && (this._$AR(), this._$AH = this.O(e));
|
|
366
|
+
}
|
|
367
|
+
_(e) {
|
|
368
|
+
this._$AH !== b && $(this._$AH) ? this._$AA.nextSibling.data = e : this.T(R.createTextNode(e)), this._$AH = e;
|
|
369
|
+
}
|
|
370
|
+
$(e) {
|
|
371
|
+
const { values: t, _$litType$: r } = e, i = typeof r == "number" ? this._$AC(e) : (r.el === void 0 && (r.el = ee.createElement(At(r.h, r.h[0]), this.options)), r);
|
|
372
|
+
if (this._$AH?._$AD === i) this._$AH.p(t);
|
|
373
|
+
else {
|
|
374
|
+
const n = new jt(i, this), o = n.u(this.options);
|
|
375
|
+
n.p(t), this.T(o), this._$AH = n;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
_$AC(e) {
|
|
379
|
+
let t = rt.get(e.strings);
|
|
380
|
+
return t === void 0 && rt.set(e.strings, t = new ee(e)), t;
|
|
381
|
+
}
|
|
382
|
+
k(e) {
|
|
383
|
+
Ze(this._$AH) || (this._$AH = [], this._$AR());
|
|
384
|
+
const t = this._$AH;
|
|
385
|
+
let r, i = 0;
|
|
386
|
+
for (const n of e) i === t.length ? t.push(r = new se(this.O(_()), this.O(_()), this, this.options)) : r = t[i], r._$AI(n), i++;
|
|
387
|
+
i < t.length && (this._$AR(r && r._$AB.nextSibling, i), t.length = i);
|
|
388
|
+
}
|
|
389
|
+
_$AR(e = this._$AA.nextSibling, t) {
|
|
390
|
+
for (this._$AP?.(!1, !0, t); e !== this._$AB; ) {
|
|
391
|
+
const r = He(e).nextSibling;
|
|
392
|
+
He(e).remove(), e = r;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
setConnected(e) {
|
|
396
|
+
this._$AM === void 0 && (this._$Cv = e, this._$AP?.(e));
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
class fe {
|
|
400
|
+
get tagName() {
|
|
401
|
+
return this.element.tagName;
|
|
402
|
+
}
|
|
403
|
+
get _$AU() {
|
|
404
|
+
return this._$AM._$AU;
|
|
405
|
+
}
|
|
406
|
+
constructor(e, t, r, i, n) {
|
|
407
|
+
this.type = 1, this._$AH = b, this._$AN = void 0, this.element = e, this.name = t, this._$AM = i, this.options = n, r.length > 2 || r[0] !== "" || r[1] !== "" ? (this._$AH = Array(r.length - 1).fill(new String()), this.strings = r) : this._$AH = b;
|
|
408
|
+
}
|
|
409
|
+
_$AI(e, t = this, r, i) {
|
|
410
|
+
const n = this.strings;
|
|
411
|
+
let o = !1;
|
|
412
|
+
if (n === void 0) e = V(this, e, t, 0), o = !$(e) || e !== this._$AH && e !== z, o && (this._$AH = e);
|
|
413
|
+
else {
|
|
414
|
+
const l = e;
|
|
415
|
+
let a, p;
|
|
416
|
+
for (e = n[0], a = 0; a < n.length - 1; a++) p = V(this, l[r + a], t, a), p === z && (p = this._$AH[a]), o ||= !$(p) || p !== this._$AH[a], p === b ? e = b : e !== b && (e += (p ?? "") + n[a + 1]), this._$AH[a] = p;
|
|
417
|
+
}
|
|
418
|
+
o && !i && this.j(e);
|
|
419
|
+
}
|
|
420
|
+
j(e) {
|
|
421
|
+
e === b ? this.element.removeAttribute(this.name) : this.element.setAttribute(this.name, e ?? "");
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
class qt extends fe {
|
|
425
|
+
constructor() {
|
|
426
|
+
super(...arguments), this.type = 3;
|
|
427
|
+
}
|
|
428
|
+
j(e) {
|
|
429
|
+
this.element[this.name] = e === b ? void 0 : e;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
class Gt extends fe {
|
|
433
|
+
constructor() {
|
|
434
|
+
super(...arguments), this.type = 4;
|
|
435
|
+
}
|
|
436
|
+
j(e) {
|
|
437
|
+
this.element.toggleAttribute(this.name, !!e && e !== b);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
class Yt extends fe {
|
|
441
|
+
constructor(e, t, r, i, n) {
|
|
442
|
+
super(e, t, r, i, n), this.type = 5;
|
|
443
|
+
}
|
|
444
|
+
_$AI(e, t = this) {
|
|
445
|
+
if ((e = V(this, e, t, 0) ?? b) === z) return;
|
|
446
|
+
const r = this._$AH, i = e === b && r !== b || e.capture !== r.capture || e.once !== r.once || e.passive !== r.passive, n = e !== b && (r === b || i);
|
|
447
|
+
i && this.element.removeEventListener(this.name, this, r), n && this.element.addEventListener(this.name, this, e), this._$AH = e;
|
|
448
|
+
}
|
|
449
|
+
handleEvent(e) {
|
|
450
|
+
typeof this._$AH == "function" ? this._$AH.call(this.options?.host ?? this.element, e) : this._$AH.handleEvent(e);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
class Ht {
|
|
454
|
+
constructor(e, t, r) {
|
|
455
|
+
this.element = e, this.type = 6, this._$AN = void 0, this._$AM = t, this.options = r;
|
|
456
|
+
}
|
|
457
|
+
get _$AU() {
|
|
458
|
+
return this._$AM._$AU;
|
|
459
|
+
}
|
|
460
|
+
_$AI(e) {
|
|
461
|
+
V(this, e);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
const _t = Pe.litHtmlPolyfillSupport;
|
|
465
|
+
_t?.(ee, se), (Pe.litHtmlVersions ??= []).push("3.3.2");
|
|
466
|
+
const $t = (s, e, t) => {
|
|
467
|
+
const r = t?.renderBefore ?? e;
|
|
468
|
+
let i = r._$litPart$;
|
|
469
|
+
if (i === void 0) {
|
|
470
|
+
const n = t?.renderBefore ?? null;
|
|
471
|
+
r._$litPart$ = i = new se(e.insertBefore(_(), n), n, void 0, t ?? {});
|
|
472
|
+
}
|
|
473
|
+
return i._$AI(s), i;
|
|
474
|
+
};
|
|
475
|
+
const Re = globalThis;
|
|
476
|
+
let I = class extends D {
|
|
477
|
+
constructor() {
|
|
478
|
+
super(...arguments), this.renderOptions = { host: this }, this._$Do = void 0;
|
|
479
|
+
}
|
|
480
|
+
createRenderRoot() {
|
|
481
|
+
const e = super.createRenderRoot();
|
|
482
|
+
return this.renderOptions.renderBefore ??= e.firstChild, e;
|
|
483
|
+
}
|
|
484
|
+
update(e) {
|
|
485
|
+
const t = this.render();
|
|
486
|
+
this.hasUpdated || (this.renderOptions.isConnected = this.isConnected), super.update(e), this._$Do = $t(t, this.renderRoot, this.renderOptions);
|
|
487
|
+
}
|
|
488
|
+
connectedCallback() {
|
|
489
|
+
super.connectedCallback(), this._$Do?.setConnected(!0);
|
|
490
|
+
}
|
|
491
|
+
disconnectedCallback() {
|
|
492
|
+
super.disconnectedCallback(), this._$Do?.setConnected(!1);
|
|
493
|
+
}
|
|
494
|
+
render() {
|
|
495
|
+
return z;
|
|
496
|
+
}
|
|
497
|
+
};
|
|
498
|
+
I._$litElement$ = !0, I.finalized = !0, Re.litElementHydrateSupport?.({ LitElement: I });
|
|
499
|
+
const es = Re.litElementPolyfillSupport;
|
|
500
|
+
es?.({ LitElement: I });
|
|
501
|
+
(Re.litElementVersions ??= []).push("4.2.2");
|
|
502
|
+
const me = (s) => (e, t) => {
|
|
503
|
+
t !== void 0 ? t.addInitializer(() => {
|
|
504
|
+
customElements.define(s, e);
|
|
505
|
+
}) : customElements.define(s, e);
|
|
506
|
+
};
|
|
507
|
+
const ts = { attribute: !0, type: String, converter: pe, reflect: !1, hasChanged: Le }, ss = (s = ts, e, t) => {
|
|
508
|
+
const { kind: r, metadata: i } = t;
|
|
509
|
+
let n = globalThis.litPropertyMetadata.get(i);
|
|
510
|
+
if (n === void 0 && globalThis.litPropertyMetadata.set(i, n = /* @__PURE__ */ new Map()), r === "setter" && ((s = Object.create(s)).wrapped = !0), n.set(t.name, s), r === "accessor") {
|
|
511
|
+
const { name: o } = t;
|
|
512
|
+
return { set(l) {
|
|
513
|
+
const a = e.get.call(this);
|
|
514
|
+
e.set.call(this, l), this.requestUpdate(o, a, s, !0, l);
|
|
515
|
+
}, init(l) {
|
|
516
|
+
return l !== void 0 && this.C(o, void 0, s, l), l;
|
|
517
|
+
} };
|
|
518
|
+
}
|
|
519
|
+
if (r === "setter") {
|
|
520
|
+
const { name: o } = t;
|
|
521
|
+
return function(l) {
|
|
522
|
+
const a = this[o];
|
|
523
|
+
e.call(this, l), this.requestUpdate(o, a, s, !0, l);
|
|
524
|
+
};
|
|
525
|
+
}
|
|
526
|
+
throw Error("Unsupported decorator location: " + r);
|
|
527
|
+
};
|
|
528
|
+
function d(s) {
|
|
529
|
+
return (e, t) => typeof t == "object" ? ss(s, e, t) : ((r, i, n) => {
|
|
530
|
+
const o = i.hasOwnProperty(n);
|
|
531
|
+
return i.constructor.createProperty(n, r), o ? Object.getOwnPropertyDescriptor(i, n) : void 0;
|
|
532
|
+
})(s, e, t);
|
|
533
|
+
}
|
|
534
|
+
function C(s) {
|
|
535
|
+
return d({ ...s, state: !0, attribute: !1 });
|
|
536
|
+
}
|
|
537
|
+
const rs = (s, e, t) => (t.configurable = !0, t.enumerable = !0, Reflect.decorate && typeof e != "object" && Object.defineProperty(s, e, t), t);
|
|
538
|
+
function is(s, e) {
|
|
539
|
+
return (t, r, i) => {
|
|
540
|
+
const n = (o) => o.renderRoot?.querySelector(s) ?? null;
|
|
541
|
+
return rs(t, r, { get() {
|
|
542
|
+
return n(this);
|
|
543
|
+
} });
|
|
544
|
+
};
|
|
545
|
+
}
|
|
546
|
+
const x = /* @__PURE__ */ Object.create(null);
|
|
547
|
+
x.open = "0";
|
|
548
|
+
x.close = "1";
|
|
549
|
+
x.ping = "2";
|
|
550
|
+
x.pong = "3";
|
|
551
|
+
x.message = "4";
|
|
552
|
+
x.upgrade = "5";
|
|
553
|
+
x.noop = "6";
|
|
554
|
+
const ae = /* @__PURE__ */ Object.create(null);
|
|
555
|
+
Object.keys(x).forEach((s) => {
|
|
556
|
+
ae[x[s]] = s;
|
|
557
|
+
});
|
|
558
|
+
const Ee = { type: "error", data: "parser error" }, ft = typeof Blob == "function" || typeof Blob < "u" && Object.prototype.toString.call(Blob) === "[object BlobConstructor]", mt = typeof ArrayBuffer == "function", yt = (s) => typeof ArrayBuffer.isView == "function" ? ArrayBuffer.isView(s) : s && s.buffer instanceof ArrayBuffer, ze = ({ type: s, data: e }, t, r) => ft && e instanceof Blob ? t ? r(e) : it(e, r) : mt && (e instanceof ArrayBuffer || yt(e)) ? t ? r(e) : it(new Blob([e]), r) : r(x[s] + (e || "")), it = (s, e) => {
|
|
559
|
+
const t = new FileReader();
|
|
560
|
+
return t.onload = function() {
|
|
561
|
+
const r = t.result.split(",")[1];
|
|
562
|
+
e("b" + (r || ""));
|
|
563
|
+
}, t.readAsDataURL(s);
|
|
564
|
+
};
|
|
565
|
+
function nt(s) {
|
|
566
|
+
return s instanceof Uint8Array ? s : s instanceof ArrayBuffer ? new Uint8Array(s) : new Uint8Array(s.buffer, s.byteOffset, s.byteLength);
|
|
567
|
+
}
|
|
568
|
+
let ve;
|
|
569
|
+
function ns(s, e) {
|
|
570
|
+
if (ft && s.data instanceof Blob)
|
|
571
|
+
return s.data.arrayBuffer().then(nt).then(e);
|
|
572
|
+
if (mt && (s.data instanceof ArrayBuffer || yt(s.data)))
|
|
573
|
+
return e(nt(s.data));
|
|
574
|
+
ze(s, !1, (t) => {
|
|
575
|
+
ve || (ve = new TextEncoder()), e(ve.encode(t));
|
|
576
|
+
});
|
|
577
|
+
}
|
|
578
|
+
const ot = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", Y = typeof Uint8Array > "u" ? [] : new Uint8Array(256);
|
|
579
|
+
for (let s = 0; s < ot.length; s++)
|
|
580
|
+
Y[ot.charCodeAt(s)] = s;
|
|
581
|
+
const os = (s) => {
|
|
582
|
+
let e = s.length * 0.75, t = s.length, r, i = 0, n, o, l, a;
|
|
583
|
+
s[s.length - 1] === "=" && (e--, s[s.length - 2] === "=" && e--);
|
|
584
|
+
const p = new ArrayBuffer(e), u = new Uint8Array(p);
|
|
585
|
+
for (r = 0; r < t; r += 4)
|
|
586
|
+
n = Y[s.charCodeAt(r)], o = Y[s.charCodeAt(r + 1)], l = Y[s.charCodeAt(r + 2)], a = Y[s.charCodeAt(r + 3)], u[i++] = n << 2 | o >> 4, u[i++] = (o & 15) << 4 | l >> 2, u[i++] = (l & 3) << 6 | a & 63;
|
|
587
|
+
return p;
|
|
588
|
+
}, as = typeof ArrayBuffer == "function", Me = (s, e) => {
|
|
589
|
+
if (typeof s != "string")
|
|
590
|
+
return {
|
|
591
|
+
type: "message",
|
|
592
|
+
data: gt(s, e)
|
|
593
|
+
};
|
|
594
|
+
const t = s.charAt(0);
|
|
595
|
+
return t === "b" ? {
|
|
596
|
+
type: "message",
|
|
597
|
+
data: ls(s.substring(1), e)
|
|
598
|
+
} : ae[t] ? s.length > 1 ? {
|
|
599
|
+
type: ae[t],
|
|
600
|
+
data: s.substring(1)
|
|
601
|
+
} : {
|
|
602
|
+
type: ae[t]
|
|
603
|
+
} : Ee;
|
|
604
|
+
}, ls = (s, e) => {
|
|
605
|
+
if (as) {
|
|
606
|
+
const t = os(s);
|
|
607
|
+
return gt(t, e);
|
|
608
|
+
} else
|
|
609
|
+
return { base64: !0, data: s };
|
|
610
|
+
}, gt = (s, e) => e === "blob" ? s instanceof Blob ? s : new Blob([s]) : s instanceof ArrayBuffer ? s : s.buffer, kt = "", cs = (s, e) => {
|
|
611
|
+
const t = s.length, r = new Array(t);
|
|
612
|
+
let i = 0;
|
|
613
|
+
s.forEach((n, o) => {
|
|
614
|
+
ze(n, !1, (l) => {
|
|
615
|
+
r[o] = l, ++i === t && e(r.join(kt));
|
|
616
|
+
});
|
|
617
|
+
});
|
|
618
|
+
}, hs = (s, e) => {
|
|
619
|
+
const t = s.split(kt), r = [];
|
|
620
|
+
for (let i = 0; i < t.length; i++) {
|
|
621
|
+
const n = Me(t[i], e);
|
|
622
|
+
if (r.push(n), n.type === "error")
|
|
623
|
+
break;
|
|
624
|
+
}
|
|
625
|
+
return r;
|
|
626
|
+
};
|
|
627
|
+
function ps() {
|
|
628
|
+
return new TransformStream({
|
|
629
|
+
transform(s, e) {
|
|
630
|
+
ns(s, (t) => {
|
|
631
|
+
const r = t.length;
|
|
632
|
+
let i;
|
|
633
|
+
if (r < 126)
|
|
634
|
+
i = new Uint8Array(1), new DataView(i.buffer).setUint8(0, r);
|
|
635
|
+
else if (r < 65536) {
|
|
636
|
+
i = new Uint8Array(3);
|
|
637
|
+
const n = new DataView(i.buffer);
|
|
638
|
+
n.setUint8(0, 126), n.setUint16(1, r);
|
|
639
|
+
} else {
|
|
640
|
+
i = new Uint8Array(9);
|
|
641
|
+
const n = new DataView(i.buffer);
|
|
642
|
+
n.setUint8(0, 127), n.setBigUint64(1, BigInt(r));
|
|
643
|
+
}
|
|
644
|
+
s.data && typeof s.data != "string" && (i[0] |= 128), e.enqueue(i), e.enqueue(t);
|
|
645
|
+
});
|
|
646
|
+
}
|
|
647
|
+
});
|
|
648
|
+
}
|
|
649
|
+
let be;
|
|
650
|
+
function re(s) {
|
|
651
|
+
return s.reduce((e, t) => e + t.length, 0);
|
|
652
|
+
}
|
|
653
|
+
function ie(s, e) {
|
|
654
|
+
if (s[0].length === e)
|
|
655
|
+
return s.shift();
|
|
656
|
+
const t = new Uint8Array(e);
|
|
657
|
+
let r = 0;
|
|
658
|
+
for (let i = 0; i < e; i++)
|
|
659
|
+
t[i] = s[0][r++], r === s[0].length && (s.shift(), r = 0);
|
|
660
|
+
return s.length && r < s[0].length && (s[0] = s[0].slice(r)), t;
|
|
661
|
+
}
|
|
662
|
+
function ds(s, e) {
|
|
663
|
+
be || (be = new TextDecoder());
|
|
664
|
+
const t = [];
|
|
665
|
+
let r = 0, i = -1, n = !1;
|
|
666
|
+
return new TransformStream({
|
|
667
|
+
transform(o, l) {
|
|
668
|
+
for (t.push(o); ; ) {
|
|
669
|
+
if (r === 0) {
|
|
670
|
+
if (re(t) < 1)
|
|
671
|
+
break;
|
|
672
|
+
const a = ie(t, 1);
|
|
673
|
+
n = (a[0] & 128) === 128, i = a[0] & 127, i < 126 ? r = 3 : i === 126 ? r = 1 : r = 2;
|
|
674
|
+
} else if (r === 1) {
|
|
675
|
+
if (re(t) < 2)
|
|
676
|
+
break;
|
|
677
|
+
const a = ie(t, 2);
|
|
678
|
+
i = new DataView(a.buffer, a.byteOffset, a.length).getUint16(0), r = 3;
|
|
679
|
+
} else if (r === 2) {
|
|
680
|
+
if (re(t) < 8)
|
|
681
|
+
break;
|
|
682
|
+
const a = ie(t, 8), p = new DataView(a.buffer, a.byteOffset, a.length), u = p.getUint32(0);
|
|
683
|
+
if (u > Math.pow(2, 21) - 1) {
|
|
684
|
+
l.enqueue(Ee);
|
|
685
|
+
break;
|
|
686
|
+
}
|
|
687
|
+
i = u * Math.pow(2, 32) + p.getUint32(4), r = 3;
|
|
688
|
+
} else {
|
|
689
|
+
if (re(t) < i)
|
|
690
|
+
break;
|
|
691
|
+
const a = ie(t, i);
|
|
692
|
+
l.enqueue(Me(n ? a : be.decode(a), e)), r = 0;
|
|
693
|
+
}
|
|
694
|
+
if (i === 0 || i > s) {
|
|
695
|
+
l.enqueue(Ee);
|
|
696
|
+
break;
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
});
|
|
701
|
+
}
|
|
702
|
+
const vt = 4;
|
|
703
|
+
function S(s) {
|
|
704
|
+
if (s) return us(s);
|
|
705
|
+
}
|
|
706
|
+
function us(s) {
|
|
707
|
+
for (var e in S.prototype)
|
|
708
|
+
s[e] = S.prototype[e];
|
|
709
|
+
return s;
|
|
710
|
+
}
|
|
711
|
+
S.prototype.on = S.prototype.addEventListener = function(s, e) {
|
|
712
|
+
return this._callbacks = this._callbacks || {}, (this._callbacks["$" + s] = this._callbacks["$" + s] || []).push(e), this;
|
|
713
|
+
};
|
|
714
|
+
S.prototype.once = function(s, e) {
|
|
715
|
+
function t() {
|
|
716
|
+
this.off(s, t), e.apply(this, arguments);
|
|
717
|
+
}
|
|
718
|
+
return t.fn = e, this.on(s, t), this;
|
|
719
|
+
};
|
|
720
|
+
S.prototype.off = S.prototype.removeListener = S.prototype.removeAllListeners = S.prototype.removeEventListener = function(s, e) {
|
|
721
|
+
if (this._callbacks = this._callbacks || {}, arguments.length == 0)
|
|
722
|
+
return this._callbacks = {}, this;
|
|
723
|
+
var t = this._callbacks["$" + s];
|
|
724
|
+
if (!t) return this;
|
|
725
|
+
if (arguments.length == 1)
|
|
726
|
+
return delete this._callbacks["$" + s], this;
|
|
727
|
+
for (var r, i = 0; i < t.length; i++)
|
|
728
|
+
if (r = t[i], r === e || r.fn === e) {
|
|
729
|
+
t.splice(i, 1);
|
|
730
|
+
break;
|
|
731
|
+
}
|
|
732
|
+
return t.length === 0 && delete this._callbacks["$" + s], this;
|
|
733
|
+
};
|
|
734
|
+
S.prototype.emit = function(s) {
|
|
735
|
+
this._callbacks = this._callbacks || {};
|
|
736
|
+
for (var e = new Array(arguments.length - 1), t = this._callbacks["$" + s], r = 1; r < arguments.length; r++)
|
|
737
|
+
e[r - 1] = arguments[r];
|
|
738
|
+
if (t) {
|
|
739
|
+
t = t.slice(0);
|
|
740
|
+
for (var r = 0, i = t.length; r < i; ++r)
|
|
741
|
+
t[r].apply(this, e);
|
|
742
|
+
}
|
|
743
|
+
return this;
|
|
744
|
+
};
|
|
745
|
+
S.prototype.emitReserved = S.prototype.emit;
|
|
746
|
+
S.prototype.listeners = function(s) {
|
|
747
|
+
return this._callbacks = this._callbacks || {}, this._callbacks["$" + s] || [];
|
|
748
|
+
};
|
|
749
|
+
S.prototype.hasListeners = function(s) {
|
|
750
|
+
return !!this.listeners(s).length;
|
|
751
|
+
};
|
|
752
|
+
const ye = typeof Promise == "function" && typeof Promise.resolve == "function" ? (e) => Promise.resolve().then(e) : (e, t) => t(e, 0), w = typeof self < "u" ? self : typeof window < "u" ? window : Function("return this")(), As = "arraybuffer";
|
|
753
|
+
function bt(s, ...e) {
|
|
754
|
+
return e.reduce((t, r) => (s.hasOwnProperty(r) && (t[r] = s[r]), t), {});
|
|
755
|
+
}
|
|
756
|
+
const fs = w.setTimeout, ms = w.clearTimeout;
|
|
757
|
+
function ge(s, e) {
|
|
758
|
+
e.useNativeTimers ? (s.setTimeoutFn = fs.bind(w), s.clearTimeoutFn = ms.bind(w)) : (s.setTimeoutFn = w.setTimeout.bind(w), s.clearTimeoutFn = w.clearTimeout.bind(w));
|
|
759
|
+
}
|
|
760
|
+
const ys = 1.33;
|
|
761
|
+
function gs(s) {
|
|
762
|
+
return typeof s == "string" ? ks(s) : Math.ceil((s.byteLength || s.size) * ys);
|
|
763
|
+
}
|
|
764
|
+
function ks(s) {
|
|
765
|
+
let e = 0, t = 0;
|
|
766
|
+
for (let r = 0, i = s.length; r < i; r++)
|
|
767
|
+
e = s.charCodeAt(r), e < 128 ? t += 1 : e < 2048 ? t += 2 : e < 55296 || e >= 57344 ? t += 3 : (r++, t += 4);
|
|
768
|
+
return t;
|
|
769
|
+
}
|
|
770
|
+
function St() {
|
|
771
|
+
return Date.now().toString(36).substring(3) + Math.random().toString(36).substring(2, 5);
|
|
772
|
+
}
|
|
773
|
+
function vs(s) {
|
|
774
|
+
let e = "";
|
|
775
|
+
for (let t in s)
|
|
776
|
+
s.hasOwnProperty(t) && (e.length && (e += "&"), e += encodeURIComponent(t) + "=" + encodeURIComponent(s[t]));
|
|
777
|
+
return e;
|
|
778
|
+
}
|
|
779
|
+
function bs(s) {
|
|
780
|
+
let e = {}, t = s.split("&");
|
|
781
|
+
for (let r = 0, i = t.length; r < i; r++) {
|
|
782
|
+
let n = t[r].split("=");
|
|
783
|
+
e[decodeURIComponent(n[0])] = decodeURIComponent(n[1]);
|
|
784
|
+
}
|
|
785
|
+
return e;
|
|
786
|
+
}
|
|
787
|
+
class Ss extends Error {
|
|
788
|
+
constructor(e, t, r) {
|
|
789
|
+
super(e), this.description = t, this.context = r, this.type = "TransportError";
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
class De extends S {
|
|
793
|
+
/**
|
|
794
|
+
* Transport abstract constructor.
|
|
795
|
+
*
|
|
796
|
+
* @param {Object} opts - options
|
|
797
|
+
* @protected
|
|
798
|
+
*/
|
|
799
|
+
constructor(e) {
|
|
800
|
+
super(), this.writable = !1, ge(this, e), this.opts = e, this.query = e.query, this.socket = e.socket, this.supportsBinary = !e.forceBase64;
|
|
801
|
+
}
|
|
802
|
+
/**
|
|
803
|
+
* Emits an error.
|
|
804
|
+
*
|
|
805
|
+
* @param {String} reason
|
|
806
|
+
* @param description
|
|
807
|
+
* @param context - the error context
|
|
808
|
+
* @return {Transport} for chaining
|
|
809
|
+
* @protected
|
|
810
|
+
*/
|
|
811
|
+
onError(e, t, r) {
|
|
812
|
+
return super.emitReserved("error", new Ss(e, t, r)), this;
|
|
813
|
+
}
|
|
814
|
+
/**
|
|
815
|
+
* Opens the transport.
|
|
816
|
+
*/
|
|
817
|
+
open() {
|
|
818
|
+
return this.readyState = "opening", this.doOpen(), this;
|
|
819
|
+
}
|
|
820
|
+
/**
|
|
821
|
+
* Closes the transport.
|
|
822
|
+
*/
|
|
823
|
+
close() {
|
|
824
|
+
return (this.readyState === "opening" || this.readyState === "open") && (this.doClose(), this.onClose()), this;
|
|
825
|
+
}
|
|
826
|
+
/**
|
|
827
|
+
* Sends multiple packets.
|
|
828
|
+
*
|
|
829
|
+
* @param {Array} packets
|
|
830
|
+
*/
|
|
831
|
+
send(e) {
|
|
832
|
+
this.readyState === "open" && this.write(e);
|
|
833
|
+
}
|
|
834
|
+
/**
|
|
835
|
+
* Called upon open
|
|
836
|
+
*
|
|
837
|
+
* @protected
|
|
838
|
+
*/
|
|
839
|
+
onOpen() {
|
|
840
|
+
this.readyState = "open", this.writable = !0, super.emitReserved("open");
|
|
841
|
+
}
|
|
842
|
+
/**
|
|
843
|
+
* Called with data.
|
|
844
|
+
*
|
|
845
|
+
* @param {String} data
|
|
846
|
+
* @protected
|
|
847
|
+
*/
|
|
848
|
+
onData(e) {
|
|
849
|
+
const t = Me(e, this.socket.binaryType);
|
|
850
|
+
this.onPacket(t);
|
|
851
|
+
}
|
|
852
|
+
/**
|
|
853
|
+
* Called with a decoded packet.
|
|
854
|
+
*
|
|
855
|
+
* @protected
|
|
856
|
+
*/
|
|
857
|
+
onPacket(e) {
|
|
858
|
+
super.emitReserved("packet", e);
|
|
859
|
+
}
|
|
860
|
+
/**
|
|
861
|
+
* Called upon close.
|
|
862
|
+
*
|
|
863
|
+
* @protected
|
|
864
|
+
*/
|
|
865
|
+
onClose(e) {
|
|
866
|
+
this.readyState = "closed", super.emitReserved("close", e);
|
|
867
|
+
}
|
|
868
|
+
/**
|
|
869
|
+
* Pauses the transport, in order not to lose packets during an upgrade.
|
|
870
|
+
*
|
|
871
|
+
* @param onPause
|
|
872
|
+
*/
|
|
873
|
+
pause(e) {
|
|
874
|
+
}
|
|
875
|
+
createUri(e, t = {}) {
|
|
876
|
+
return e + "://" + this._hostname() + this._port() + this.opts.path + this._query(t);
|
|
877
|
+
}
|
|
878
|
+
_hostname() {
|
|
879
|
+
const e = this.opts.hostname;
|
|
880
|
+
return e.indexOf(":") === -1 ? e : "[" + e + "]";
|
|
881
|
+
}
|
|
882
|
+
_port() {
|
|
883
|
+
return this.opts.port && (this.opts.secure && Number(this.opts.port) !== 443 || !this.opts.secure && Number(this.opts.port) !== 80) ? ":" + this.opts.port : "";
|
|
884
|
+
}
|
|
885
|
+
_query(e) {
|
|
886
|
+
const t = vs(e);
|
|
887
|
+
return t.length ? "?" + t : "";
|
|
888
|
+
}
|
|
889
|
+
}
|
|
890
|
+
class Cs extends De {
|
|
891
|
+
constructor() {
|
|
892
|
+
super(...arguments), this._polling = !1;
|
|
893
|
+
}
|
|
894
|
+
get name() {
|
|
895
|
+
return "polling";
|
|
896
|
+
}
|
|
897
|
+
/**
|
|
898
|
+
* Opens the socket (triggers polling). We write a PING message to determine
|
|
899
|
+
* when the transport is open.
|
|
900
|
+
*
|
|
901
|
+
* @protected
|
|
902
|
+
*/
|
|
903
|
+
doOpen() {
|
|
904
|
+
this._poll();
|
|
905
|
+
}
|
|
906
|
+
/**
|
|
907
|
+
* Pauses polling.
|
|
908
|
+
*
|
|
909
|
+
* @param {Function} onPause - callback upon buffers are flushed and transport is paused
|
|
910
|
+
* @package
|
|
911
|
+
*/
|
|
912
|
+
pause(e) {
|
|
913
|
+
this.readyState = "pausing";
|
|
914
|
+
const t = () => {
|
|
915
|
+
this.readyState = "paused", e();
|
|
916
|
+
};
|
|
917
|
+
if (this._polling || !this.writable) {
|
|
918
|
+
let r = 0;
|
|
919
|
+
this._polling && (r++, this.once("pollComplete", function() {
|
|
920
|
+
--r || t();
|
|
921
|
+
})), this.writable || (r++, this.once("drain", function() {
|
|
922
|
+
--r || t();
|
|
923
|
+
}));
|
|
924
|
+
} else
|
|
925
|
+
t();
|
|
926
|
+
}
|
|
927
|
+
/**
|
|
928
|
+
* Starts polling cycle.
|
|
929
|
+
*
|
|
930
|
+
* @private
|
|
931
|
+
*/
|
|
932
|
+
_poll() {
|
|
933
|
+
this._polling = !0, this.doPoll(), this.emitReserved("poll");
|
|
934
|
+
}
|
|
935
|
+
/**
|
|
936
|
+
* Overloads onData to detect payloads.
|
|
937
|
+
*
|
|
938
|
+
* @protected
|
|
939
|
+
*/
|
|
940
|
+
onData(e) {
|
|
941
|
+
const t = (r) => {
|
|
942
|
+
if (this.readyState === "opening" && r.type === "open" && this.onOpen(), r.type === "close")
|
|
943
|
+
return this.onClose({ description: "transport closed by the server" }), !1;
|
|
944
|
+
this.onPacket(r);
|
|
945
|
+
};
|
|
946
|
+
hs(e, this.socket.binaryType).forEach(t), this.readyState !== "closed" && (this._polling = !1, this.emitReserved("pollComplete"), this.readyState === "open" && this._poll());
|
|
947
|
+
}
|
|
948
|
+
/**
|
|
949
|
+
* For polling, send a close packet.
|
|
950
|
+
*
|
|
951
|
+
* @protected
|
|
952
|
+
*/
|
|
953
|
+
doClose() {
|
|
954
|
+
const e = () => {
|
|
955
|
+
this.write([{ type: "close" }]);
|
|
956
|
+
};
|
|
957
|
+
this.readyState === "open" ? e() : this.once("open", e);
|
|
958
|
+
}
|
|
959
|
+
/**
|
|
960
|
+
* Writes a packets payload.
|
|
961
|
+
*
|
|
962
|
+
* @param {Array} packets - data packets
|
|
963
|
+
* @protected
|
|
964
|
+
*/
|
|
965
|
+
write(e) {
|
|
966
|
+
this.writable = !1, cs(e, (t) => {
|
|
967
|
+
this.doWrite(t, () => {
|
|
968
|
+
this.writable = !0, this.emitReserved("drain");
|
|
969
|
+
});
|
|
970
|
+
});
|
|
971
|
+
}
|
|
972
|
+
/**
|
|
973
|
+
* Generates uri for connection.
|
|
974
|
+
*
|
|
975
|
+
* @private
|
|
976
|
+
*/
|
|
977
|
+
uri() {
|
|
978
|
+
const e = this.opts.secure ? "https" : "http", t = this.query || {};
|
|
979
|
+
return this.opts.timestampRequests !== !1 && (t[this.opts.timestampParam] = St()), !this.supportsBinary && !t.sid && (t.b64 = 1), this.createUri(e, t);
|
|
980
|
+
}
|
|
981
|
+
}
|
|
982
|
+
let Ct = !1;
|
|
983
|
+
try {
|
|
984
|
+
Ct = typeof XMLHttpRequest < "u" && "withCredentials" in new XMLHttpRequest();
|
|
985
|
+
} catch {
|
|
986
|
+
}
|
|
987
|
+
const Es = Ct;
|
|
988
|
+
function Js() {
|
|
989
|
+
}
|
|
990
|
+
class ws extends Cs {
|
|
991
|
+
/**
|
|
992
|
+
* XHR Polling constructor.
|
|
993
|
+
*
|
|
994
|
+
* @param {Object} opts
|
|
995
|
+
* @package
|
|
996
|
+
*/
|
|
997
|
+
constructor(e) {
|
|
998
|
+
if (super(e), typeof location < "u") {
|
|
999
|
+
const t = location.protocol === "https:";
|
|
1000
|
+
let r = location.port;
|
|
1001
|
+
r || (r = t ? "443" : "80"), this.xd = typeof location < "u" && e.hostname !== location.hostname || r !== e.port;
|
|
1002
|
+
}
|
|
1003
|
+
}
|
|
1004
|
+
/**
|
|
1005
|
+
* Sends data.
|
|
1006
|
+
*
|
|
1007
|
+
* @param {String} data to send.
|
|
1008
|
+
* @param {Function} called upon flush.
|
|
1009
|
+
* @private
|
|
1010
|
+
*/
|
|
1011
|
+
doWrite(e, t) {
|
|
1012
|
+
const r = this.request({
|
|
1013
|
+
method: "POST",
|
|
1014
|
+
data: e
|
|
1015
|
+
});
|
|
1016
|
+
r.on("success", t), r.on("error", (i, n) => {
|
|
1017
|
+
this.onError("xhr post error", i, n);
|
|
1018
|
+
});
|
|
1019
|
+
}
|
|
1020
|
+
/**
|
|
1021
|
+
* Starts a poll cycle.
|
|
1022
|
+
*
|
|
1023
|
+
* @private
|
|
1024
|
+
*/
|
|
1025
|
+
doPoll() {
|
|
1026
|
+
const e = this.request();
|
|
1027
|
+
e.on("data", this.onData.bind(this)), e.on("error", (t, r) => {
|
|
1028
|
+
this.onError("xhr poll error", t, r);
|
|
1029
|
+
}), this.pollXhr = e;
|
|
1030
|
+
}
|
|
1031
|
+
}
|
|
1032
|
+
class O extends S {
|
|
1033
|
+
/**
|
|
1034
|
+
* Request constructor
|
|
1035
|
+
*
|
|
1036
|
+
* @param {Object} options
|
|
1037
|
+
* @package
|
|
1038
|
+
*/
|
|
1039
|
+
constructor(e, t, r) {
|
|
1040
|
+
super(), this.createRequest = e, ge(this, r), this._opts = r, this._method = r.method || "GET", this._uri = t, this._data = r.data !== void 0 ? r.data : null, this._create();
|
|
1041
|
+
}
|
|
1042
|
+
/**
|
|
1043
|
+
* Creates the XHR object and sends the request.
|
|
1044
|
+
*
|
|
1045
|
+
* @private
|
|
1046
|
+
*/
|
|
1047
|
+
_create() {
|
|
1048
|
+
var e;
|
|
1049
|
+
const t = bt(this._opts, "agent", "pfx", "key", "passphrase", "cert", "ca", "ciphers", "rejectUnauthorized", "autoUnref");
|
|
1050
|
+
t.xdomain = !!this._opts.xd;
|
|
1051
|
+
const r = this._xhr = this.createRequest(t);
|
|
1052
|
+
try {
|
|
1053
|
+
r.open(this._method, this._uri, !0);
|
|
1054
|
+
try {
|
|
1055
|
+
if (this._opts.extraHeaders) {
|
|
1056
|
+
r.setDisableHeaderCheck && r.setDisableHeaderCheck(!0);
|
|
1057
|
+
for (let i in this._opts.extraHeaders)
|
|
1058
|
+
this._opts.extraHeaders.hasOwnProperty(i) && r.setRequestHeader(i, this._opts.extraHeaders[i]);
|
|
1059
|
+
}
|
|
1060
|
+
} catch {
|
|
1061
|
+
}
|
|
1062
|
+
if (this._method === "POST")
|
|
1063
|
+
try {
|
|
1064
|
+
r.setRequestHeader("Content-type", "text/plain;charset=UTF-8");
|
|
1065
|
+
} catch {
|
|
1066
|
+
}
|
|
1067
|
+
try {
|
|
1068
|
+
r.setRequestHeader("Accept", "*/*");
|
|
1069
|
+
} catch {
|
|
1070
|
+
}
|
|
1071
|
+
(e = this._opts.cookieJar) === null || e === void 0 || e.addCookies(r), "withCredentials" in r && (r.withCredentials = this._opts.withCredentials), this._opts.requestTimeout && (r.timeout = this._opts.requestTimeout), r.onreadystatechange = () => {
|
|
1072
|
+
var i;
|
|
1073
|
+
r.readyState === 3 && ((i = this._opts.cookieJar) === null || i === void 0 || i.parseCookies(
|
|
1074
|
+
// @ts-ignore
|
|
1075
|
+
r.getResponseHeader("set-cookie")
|
|
1076
|
+
)), r.readyState === 4 && (r.status === 200 || r.status === 1223 ? this._onLoad() : this.setTimeoutFn(() => {
|
|
1077
|
+
this._onError(typeof r.status == "number" ? r.status : 0);
|
|
1078
|
+
}, 0));
|
|
1079
|
+
}, r.send(this._data);
|
|
1080
|
+
} catch (i) {
|
|
1081
|
+
this.setTimeoutFn(() => {
|
|
1082
|
+
this._onError(i);
|
|
1083
|
+
}, 0);
|
|
1084
|
+
return;
|
|
1085
|
+
}
|
|
1086
|
+
typeof document < "u" && (this._index = O.requestsCount++, O.requests[this._index] = this);
|
|
1087
|
+
}
|
|
1088
|
+
/**
|
|
1089
|
+
* Called upon error.
|
|
1090
|
+
*
|
|
1091
|
+
* @private
|
|
1092
|
+
*/
|
|
1093
|
+
_onError(e) {
|
|
1094
|
+
this.emitReserved("error", e, this._xhr), this._cleanup(!0);
|
|
1095
|
+
}
|
|
1096
|
+
/**
|
|
1097
|
+
* Cleans up house.
|
|
1098
|
+
*
|
|
1099
|
+
* @private
|
|
1100
|
+
*/
|
|
1101
|
+
_cleanup(e) {
|
|
1102
|
+
if (!(typeof this._xhr > "u" || this._xhr === null)) {
|
|
1103
|
+
if (this._xhr.onreadystatechange = Js, e)
|
|
1104
|
+
try {
|
|
1105
|
+
this._xhr.abort();
|
|
1106
|
+
} catch {
|
|
1107
|
+
}
|
|
1108
|
+
typeof document < "u" && delete O.requests[this._index], this._xhr = null;
|
|
1109
|
+
}
|
|
1110
|
+
}
|
|
1111
|
+
/**
|
|
1112
|
+
* Called upon load.
|
|
1113
|
+
*
|
|
1114
|
+
* @private
|
|
1115
|
+
*/
|
|
1116
|
+
_onLoad() {
|
|
1117
|
+
const e = this._xhr.responseText;
|
|
1118
|
+
e !== null && (this.emitReserved("data", e), this.emitReserved("success"), this._cleanup());
|
|
1119
|
+
}
|
|
1120
|
+
/**
|
|
1121
|
+
* Aborts the request.
|
|
1122
|
+
*
|
|
1123
|
+
* @package
|
|
1124
|
+
*/
|
|
1125
|
+
abort() {
|
|
1126
|
+
this._cleanup();
|
|
1127
|
+
}
|
|
1128
|
+
}
|
|
1129
|
+
O.requestsCount = 0;
|
|
1130
|
+
O.requests = {};
|
|
1131
|
+
if (typeof document < "u") {
|
|
1132
|
+
if (typeof attachEvent == "function")
|
|
1133
|
+
attachEvent("onunload", at);
|
|
1134
|
+
else if (typeof addEventListener == "function") {
|
|
1135
|
+
const s = "onpagehide" in w ? "pagehide" : "unload";
|
|
1136
|
+
addEventListener(s, at, !1);
|
|
1137
|
+
}
|
|
1138
|
+
}
|
|
1139
|
+
function at() {
|
|
1140
|
+
for (let s in O.requests)
|
|
1141
|
+
O.requests.hasOwnProperty(s) && O.requests[s].abort();
|
|
1142
|
+
}
|
|
1143
|
+
const Ks = (function() {
|
|
1144
|
+
const s = Et({
|
|
1145
|
+
xdomain: !1
|
|
1146
|
+
});
|
|
1147
|
+
return s && s.responseType !== null;
|
|
1148
|
+
})();
|
|
1149
|
+
class Ts extends ws {
|
|
1150
|
+
constructor(e) {
|
|
1151
|
+
super(e);
|
|
1152
|
+
const t = e && e.forceBase64;
|
|
1153
|
+
this.supportsBinary = Ks && !t;
|
|
1154
|
+
}
|
|
1155
|
+
request(e = {}) {
|
|
1156
|
+
return Object.assign(e, { xd: this.xd }, this.opts), new O(Et, this.uri(), e);
|
|
1157
|
+
}
|
|
1158
|
+
}
|
|
1159
|
+
function Et(s) {
|
|
1160
|
+
const e = s.xdomain;
|
|
1161
|
+
try {
|
|
1162
|
+
if (typeof XMLHttpRequest < "u" && (!e || Es))
|
|
1163
|
+
return new XMLHttpRequest();
|
|
1164
|
+
} catch {
|
|
1165
|
+
}
|
|
1166
|
+
if (!e)
|
|
1167
|
+
try {
|
|
1168
|
+
return new w[["Active"].concat("Object").join("X")]("Microsoft.XMLHTTP");
|
|
1169
|
+
} catch {
|
|
1170
|
+
}
|
|
1171
|
+
}
|
|
1172
|
+
const Jt = typeof navigator < "u" && typeof navigator.product == "string" && navigator.product.toLowerCase() === "reactnative";
|
|
1173
|
+
class Os extends De {
|
|
1174
|
+
get name() {
|
|
1175
|
+
return "websocket";
|
|
1176
|
+
}
|
|
1177
|
+
doOpen() {
|
|
1178
|
+
const e = this.uri(), t = this.opts.protocols, r = Jt ? {} : bt(this.opts, "agent", "perMessageDeflate", "pfx", "key", "passphrase", "cert", "ca", "ciphers", "rejectUnauthorized", "localAddress", "protocolVersion", "origin", "maxPayload", "family", "checkServerIdentity");
|
|
1179
|
+
this.opts.extraHeaders && (r.headers = this.opts.extraHeaders);
|
|
1180
|
+
try {
|
|
1181
|
+
this.ws = this.createSocket(e, t, r);
|
|
1182
|
+
} catch (i) {
|
|
1183
|
+
return this.emitReserved("error", i);
|
|
1184
|
+
}
|
|
1185
|
+
this.ws.binaryType = this.socket.binaryType, this.addEventListeners();
|
|
1186
|
+
}
|
|
1187
|
+
/**
|
|
1188
|
+
* Adds event listeners to the socket
|
|
1189
|
+
*
|
|
1190
|
+
* @private
|
|
1191
|
+
*/
|
|
1192
|
+
addEventListeners() {
|
|
1193
|
+
this.ws.onopen = () => {
|
|
1194
|
+
this.opts.autoUnref && this.ws._socket.unref(), this.onOpen();
|
|
1195
|
+
}, this.ws.onclose = (e) => this.onClose({
|
|
1196
|
+
description: "websocket connection closed",
|
|
1197
|
+
context: e
|
|
1198
|
+
}), this.ws.onmessage = (e) => this.onData(e.data), this.ws.onerror = (e) => this.onError("websocket error", e);
|
|
1199
|
+
}
|
|
1200
|
+
write(e) {
|
|
1201
|
+
this.writable = !1;
|
|
1202
|
+
for (let t = 0; t < e.length; t++) {
|
|
1203
|
+
const r = e[t], i = t === e.length - 1;
|
|
1204
|
+
ze(r, this.supportsBinary, (n) => {
|
|
1205
|
+
try {
|
|
1206
|
+
this.doWrite(r, n);
|
|
1207
|
+
} catch {
|
|
1208
|
+
}
|
|
1209
|
+
i && ye(() => {
|
|
1210
|
+
this.writable = !0, this.emitReserved("drain");
|
|
1211
|
+
}, this.setTimeoutFn);
|
|
1212
|
+
});
|
|
1213
|
+
}
|
|
1214
|
+
}
|
|
1215
|
+
doClose() {
|
|
1216
|
+
typeof this.ws < "u" && (this.ws.onerror = () => {
|
|
1217
|
+
}, this.ws.close(), this.ws = null);
|
|
1218
|
+
}
|
|
1219
|
+
/**
|
|
1220
|
+
* Generates uri for connection.
|
|
1221
|
+
*
|
|
1222
|
+
* @private
|
|
1223
|
+
*/
|
|
1224
|
+
uri() {
|
|
1225
|
+
const e = this.opts.secure ? "wss" : "ws", t = this.query || {};
|
|
1226
|
+
return this.opts.timestampRequests && (t[this.opts.timestampParam] = St()), this.supportsBinary || (t.b64 = 1), this.createUri(e, t);
|
|
1227
|
+
}
|
|
1228
|
+
}
|
|
1229
|
+
const Se = w.WebSocket || w.MozWebSocket;
|
|
1230
|
+
class xs extends Os {
|
|
1231
|
+
createSocket(e, t, r) {
|
|
1232
|
+
return Jt ? new Se(e, t, r) : t ? new Se(e, t) : new Se(e);
|
|
1233
|
+
}
|
|
1234
|
+
doWrite(e, t) {
|
|
1235
|
+
this.ws.send(t);
|
|
1236
|
+
}
|
|
1237
|
+
}
|
|
1238
|
+
class Us extends De {
|
|
1239
|
+
get name() {
|
|
1240
|
+
return "webtransport";
|
|
1241
|
+
}
|
|
1242
|
+
doOpen() {
|
|
1243
|
+
try {
|
|
1244
|
+
this._transport = new WebTransport(this.createUri("https"), this.opts.transportOptions[this.name]);
|
|
1245
|
+
} catch (e) {
|
|
1246
|
+
return this.emitReserved("error", e);
|
|
1247
|
+
}
|
|
1248
|
+
this._transport.closed.then(() => {
|
|
1249
|
+
this.onClose();
|
|
1250
|
+
}).catch((e) => {
|
|
1251
|
+
this.onError("webtransport error", e);
|
|
1252
|
+
}), this._transport.ready.then(() => {
|
|
1253
|
+
this._transport.createBidirectionalStream().then((e) => {
|
|
1254
|
+
const t = ds(Number.MAX_SAFE_INTEGER, this.socket.binaryType), r = e.readable.pipeThrough(t).getReader(), i = ps();
|
|
1255
|
+
i.readable.pipeTo(e.writable), this._writer = i.writable.getWriter();
|
|
1256
|
+
const n = () => {
|
|
1257
|
+
r.read().then(({ done: l, value: a }) => {
|
|
1258
|
+
l || (this.onPacket(a), n());
|
|
1259
|
+
}).catch((l) => {
|
|
1260
|
+
});
|
|
1261
|
+
};
|
|
1262
|
+
n();
|
|
1263
|
+
const o = { type: "open" };
|
|
1264
|
+
this.query.sid && (o.data = `{"sid":"${this.query.sid}"}`), this._writer.write(o).then(() => this.onOpen());
|
|
1265
|
+
});
|
|
1266
|
+
});
|
|
1267
|
+
}
|
|
1268
|
+
write(e) {
|
|
1269
|
+
this.writable = !1;
|
|
1270
|
+
for (let t = 0; t < e.length; t++) {
|
|
1271
|
+
const r = e[t], i = t === e.length - 1;
|
|
1272
|
+
this._writer.write(r).then(() => {
|
|
1273
|
+
i && ye(() => {
|
|
1274
|
+
this.writable = !0, this.emitReserved("drain");
|
|
1275
|
+
}, this.setTimeoutFn);
|
|
1276
|
+
});
|
|
1277
|
+
}
|
|
1278
|
+
}
|
|
1279
|
+
doClose() {
|
|
1280
|
+
var e;
|
|
1281
|
+
(e = this._transport) === null || e === void 0 || e.close();
|
|
1282
|
+
}
|
|
1283
|
+
}
|
|
1284
|
+
const Bs = {
|
|
1285
|
+
websocket: xs,
|
|
1286
|
+
webtransport: Us,
|
|
1287
|
+
polling: Ts
|
|
1288
|
+
}, Ns = /^(?:(?![^:@\/?#]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/, Is = [
|
|
1289
|
+
"source",
|
|
1290
|
+
"protocol",
|
|
1291
|
+
"authority",
|
|
1292
|
+
"userInfo",
|
|
1293
|
+
"user",
|
|
1294
|
+
"password",
|
|
1295
|
+
"host",
|
|
1296
|
+
"port",
|
|
1297
|
+
"relative",
|
|
1298
|
+
"path",
|
|
1299
|
+
"directory",
|
|
1300
|
+
"file",
|
|
1301
|
+
"query",
|
|
1302
|
+
"anchor"
|
|
1303
|
+
];
|
|
1304
|
+
function Je(s) {
|
|
1305
|
+
if (s.length > 8e3)
|
|
1306
|
+
throw "URI too long";
|
|
1307
|
+
const e = s, t = s.indexOf("["), r = s.indexOf("]");
|
|
1308
|
+
t != -1 && r != -1 && (s = s.substring(0, t) + s.substring(t, r).replace(/:/g, ";") + s.substring(r, s.length));
|
|
1309
|
+
let i = Ns.exec(s || ""), n = {}, o = 14;
|
|
1310
|
+
for (; o--; )
|
|
1311
|
+
n[Is[o]] = i[o] || "";
|
|
1312
|
+
return t != -1 && r != -1 && (n.source = e, n.host = n.host.substring(1, n.host.length - 1).replace(/;/g, ":"), n.authority = n.authority.replace("[", "").replace("]", "").replace(/;/g, ":"), n.ipv6uri = !0), n.pathNames = Qs(n, n.path), n.queryKey = Ls(n, n.query), n;
|
|
1313
|
+
}
|
|
1314
|
+
function Qs(s, e) {
|
|
1315
|
+
const t = /\/{2,9}/g, r = e.replace(t, "/").split("/");
|
|
1316
|
+
return (e.slice(0, 1) == "/" || e.length === 0) && r.splice(0, 1), e.slice(-1) == "/" && r.splice(r.length - 1, 1), r;
|
|
1317
|
+
}
|
|
1318
|
+
function Ls(s, e) {
|
|
1319
|
+
const t = {};
|
|
1320
|
+
return e.replace(/(?:^|&)([^&=]*)=?([^&]*)/g, function(r, i, n) {
|
|
1321
|
+
i && (t[i] = n);
|
|
1322
|
+
}), t;
|
|
1323
|
+
}
|
|
1324
|
+
const we = typeof addEventListener == "function" && typeof removeEventListener == "function", le = [];
|
|
1325
|
+
we && addEventListener("offline", () => {
|
|
1326
|
+
le.forEach((s) => s());
|
|
1327
|
+
}, !1);
|
|
1328
|
+
class Q extends S {
|
|
1329
|
+
/**
|
|
1330
|
+
* Socket constructor.
|
|
1331
|
+
*
|
|
1332
|
+
* @param {String|Object} uri - uri or options
|
|
1333
|
+
* @param {Object} opts - options
|
|
1334
|
+
*/
|
|
1335
|
+
constructor(e, t) {
|
|
1336
|
+
if (super(), this.binaryType = As, this.writeBuffer = [], this._prevBufferLen = 0, this._pingInterval = -1, this._pingTimeout = -1, this._maxPayload = -1, this._pingTimeoutTime = 1 / 0, e && typeof e == "object" && (t = e, e = null), e) {
|
|
1337
|
+
const r = Je(e);
|
|
1338
|
+
t.hostname = r.host, t.secure = r.protocol === "https" || r.protocol === "wss", t.port = r.port, r.query && (t.query = r.query);
|
|
1339
|
+
} else t.host && (t.hostname = Je(t.host).host);
|
|
1340
|
+
ge(this, t), this.secure = t.secure != null ? t.secure : typeof location < "u" && location.protocol === "https:", t.hostname && !t.port && (t.port = this.secure ? "443" : "80"), this.hostname = t.hostname || (typeof location < "u" ? location.hostname : "localhost"), this.port = t.port || (typeof location < "u" && location.port ? location.port : this.secure ? "443" : "80"), this.transports = [], this._transportsByName = {}, t.transports.forEach((r) => {
|
|
1341
|
+
const i = r.prototype.name;
|
|
1342
|
+
this.transports.push(i), this._transportsByName[i] = r;
|
|
1343
|
+
}), this.opts = Object.assign({
|
|
1344
|
+
path: "/engine.io",
|
|
1345
|
+
agent: !1,
|
|
1346
|
+
withCredentials: !1,
|
|
1347
|
+
upgrade: !0,
|
|
1348
|
+
timestampParam: "t",
|
|
1349
|
+
rememberUpgrade: !1,
|
|
1350
|
+
addTrailingSlash: !0,
|
|
1351
|
+
rejectUnauthorized: !0,
|
|
1352
|
+
perMessageDeflate: {
|
|
1353
|
+
threshold: 1024
|
|
1354
|
+
},
|
|
1355
|
+
transportOptions: {},
|
|
1356
|
+
closeOnBeforeunload: !1
|
|
1357
|
+
}, t), this.opts.path = this.opts.path.replace(/\/$/, "") + (this.opts.addTrailingSlash ? "/" : ""), typeof this.opts.query == "string" && (this.opts.query = bs(this.opts.query)), we && (this.opts.closeOnBeforeunload && (this._beforeunloadEventListener = () => {
|
|
1358
|
+
this.transport && (this.transport.removeAllListeners(), this.transport.close());
|
|
1359
|
+
}, addEventListener("beforeunload", this._beforeunloadEventListener, !1)), this.hostname !== "localhost" && (this._offlineEventListener = () => {
|
|
1360
|
+
this._onClose("transport close", {
|
|
1361
|
+
description: "network connection lost"
|
|
1362
|
+
});
|
|
1363
|
+
}, le.push(this._offlineEventListener))), this.opts.withCredentials && (this._cookieJar = void 0), this._open();
|
|
1364
|
+
}
|
|
1365
|
+
/**
|
|
1366
|
+
* Creates transport of the given type.
|
|
1367
|
+
*
|
|
1368
|
+
* @param {String} name - transport name
|
|
1369
|
+
* @return {Transport}
|
|
1370
|
+
* @private
|
|
1371
|
+
*/
|
|
1372
|
+
createTransport(e) {
|
|
1373
|
+
const t = Object.assign({}, this.opts.query);
|
|
1374
|
+
t.EIO = vt, t.transport = e, this.id && (t.sid = this.id);
|
|
1375
|
+
const r = Object.assign({}, this.opts, {
|
|
1376
|
+
query: t,
|
|
1377
|
+
socket: this,
|
|
1378
|
+
hostname: this.hostname,
|
|
1379
|
+
secure: this.secure,
|
|
1380
|
+
port: this.port
|
|
1381
|
+
}, this.opts.transportOptions[e]);
|
|
1382
|
+
return new this._transportsByName[e](r);
|
|
1383
|
+
}
|
|
1384
|
+
/**
|
|
1385
|
+
* Initializes transport to use and starts probe.
|
|
1386
|
+
*
|
|
1387
|
+
* @private
|
|
1388
|
+
*/
|
|
1389
|
+
_open() {
|
|
1390
|
+
if (this.transports.length === 0) {
|
|
1391
|
+
this.setTimeoutFn(() => {
|
|
1392
|
+
this.emitReserved("error", "No transports available");
|
|
1393
|
+
}, 0);
|
|
1394
|
+
return;
|
|
1395
|
+
}
|
|
1396
|
+
const e = this.opts.rememberUpgrade && Q.priorWebsocketSuccess && this.transports.indexOf("websocket") !== -1 ? "websocket" : this.transports[0];
|
|
1397
|
+
this.readyState = "opening";
|
|
1398
|
+
const t = this.createTransport(e);
|
|
1399
|
+
t.open(), this.setTransport(t);
|
|
1400
|
+
}
|
|
1401
|
+
/**
|
|
1402
|
+
* Sets the current transport. Disables the existing one (if any).
|
|
1403
|
+
*
|
|
1404
|
+
* @private
|
|
1405
|
+
*/
|
|
1406
|
+
setTransport(e) {
|
|
1407
|
+
this.transport && this.transport.removeAllListeners(), this.transport = e, e.on("drain", this._onDrain.bind(this)).on("packet", this._onPacket.bind(this)).on("error", this._onError.bind(this)).on("close", (t) => this._onClose("transport close", t));
|
|
1408
|
+
}
|
|
1409
|
+
/**
|
|
1410
|
+
* Called when connection is deemed open.
|
|
1411
|
+
*
|
|
1412
|
+
* @private
|
|
1413
|
+
*/
|
|
1414
|
+
onOpen() {
|
|
1415
|
+
this.readyState = "open", Q.priorWebsocketSuccess = this.transport.name === "websocket", this.emitReserved("open"), this.flush();
|
|
1416
|
+
}
|
|
1417
|
+
/**
|
|
1418
|
+
* Handles a packet.
|
|
1419
|
+
*
|
|
1420
|
+
* @private
|
|
1421
|
+
*/
|
|
1422
|
+
_onPacket(e) {
|
|
1423
|
+
if (this.readyState === "opening" || this.readyState === "open" || this.readyState === "closing")
|
|
1424
|
+
switch (this.emitReserved("packet", e), this.emitReserved("heartbeat"), e.type) {
|
|
1425
|
+
case "open":
|
|
1426
|
+
this.onHandshake(JSON.parse(e.data));
|
|
1427
|
+
break;
|
|
1428
|
+
case "ping":
|
|
1429
|
+
this._sendPacket("pong"), this.emitReserved("ping"), this.emitReserved("pong"), this._resetPingTimeout();
|
|
1430
|
+
break;
|
|
1431
|
+
case "error":
|
|
1432
|
+
const t = new Error("server error");
|
|
1433
|
+
t.code = e.data, this._onError(t);
|
|
1434
|
+
break;
|
|
1435
|
+
case "message":
|
|
1436
|
+
this.emitReserved("data", e.data), this.emitReserved("message", e.data);
|
|
1437
|
+
break;
|
|
1438
|
+
}
|
|
1439
|
+
}
|
|
1440
|
+
/**
|
|
1441
|
+
* Called upon handshake completion.
|
|
1442
|
+
*
|
|
1443
|
+
* @param {Object} data - handshake obj
|
|
1444
|
+
* @private
|
|
1445
|
+
*/
|
|
1446
|
+
onHandshake(e) {
|
|
1447
|
+
this.emitReserved("handshake", e), this.id = e.sid, this.transport.query.sid = e.sid, this._pingInterval = e.pingInterval, this._pingTimeout = e.pingTimeout, this._maxPayload = e.maxPayload, this.onOpen(), this.readyState !== "closed" && this._resetPingTimeout();
|
|
1448
|
+
}
|
|
1449
|
+
/**
|
|
1450
|
+
* Sets and resets ping timeout timer based on server pings.
|
|
1451
|
+
*
|
|
1452
|
+
* @private
|
|
1453
|
+
*/
|
|
1454
|
+
_resetPingTimeout() {
|
|
1455
|
+
this.clearTimeoutFn(this._pingTimeoutTimer);
|
|
1456
|
+
const e = this._pingInterval + this._pingTimeout;
|
|
1457
|
+
this._pingTimeoutTime = Date.now() + e, this._pingTimeoutTimer = this.setTimeoutFn(() => {
|
|
1458
|
+
this._onClose("ping timeout");
|
|
1459
|
+
}, e), this.opts.autoUnref && this._pingTimeoutTimer.unref();
|
|
1460
|
+
}
|
|
1461
|
+
/**
|
|
1462
|
+
* Called on `drain` event
|
|
1463
|
+
*
|
|
1464
|
+
* @private
|
|
1465
|
+
*/
|
|
1466
|
+
_onDrain() {
|
|
1467
|
+
this.writeBuffer.splice(0, this._prevBufferLen), this._prevBufferLen = 0, this.writeBuffer.length === 0 ? this.emitReserved("drain") : this.flush();
|
|
1468
|
+
}
|
|
1469
|
+
/**
|
|
1470
|
+
* Flush write buffers.
|
|
1471
|
+
*
|
|
1472
|
+
* @private
|
|
1473
|
+
*/
|
|
1474
|
+
flush() {
|
|
1475
|
+
if (this.readyState !== "closed" && this.transport.writable && !this.upgrading && this.writeBuffer.length) {
|
|
1476
|
+
const e = this._getWritablePackets();
|
|
1477
|
+
this.transport.send(e), this._prevBufferLen = e.length, this.emitReserved("flush");
|
|
1478
|
+
}
|
|
1479
|
+
}
|
|
1480
|
+
/**
|
|
1481
|
+
* Ensure the encoded size of the writeBuffer is below the maxPayload value sent by the server (only for HTTP
|
|
1482
|
+
* long-polling)
|
|
1483
|
+
*
|
|
1484
|
+
* @private
|
|
1485
|
+
*/
|
|
1486
|
+
_getWritablePackets() {
|
|
1487
|
+
if (!(this._maxPayload && this.transport.name === "polling" && this.writeBuffer.length > 1))
|
|
1488
|
+
return this.writeBuffer;
|
|
1489
|
+
let t = 1;
|
|
1490
|
+
for (let r = 0; r < this.writeBuffer.length; r++) {
|
|
1491
|
+
const i = this.writeBuffer[r].data;
|
|
1492
|
+
if (i && (t += gs(i)), r > 0 && t > this._maxPayload)
|
|
1493
|
+
return this.writeBuffer.slice(0, r);
|
|
1494
|
+
t += 2;
|
|
1495
|
+
}
|
|
1496
|
+
return this.writeBuffer;
|
|
1497
|
+
}
|
|
1498
|
+
/**
|
|
1499
|
+
* Checks whether the heartbeat timer has expired but the socket has not yet been notified.
|
|
1500
|
+
*
|
|
1501
|
+
* Note: this method is private for now because it does not really fit the WebSocket API, but if we put it in the
|
|
1502
|
+
* `write()` method then the message would not be buffered by the Socket.IO client.
|
|
1503
|
+
*
|
|
1504
|
+
* @return {boolean}
|
|
1505
|
+
* @private
|
|
1506
|
+
*/
|
|
1507
|
+
/* private */
|
|
1508
|
+
_hasPingExpired() {
|
|
1509
|
+
if (!this._pingTimeoutTime)
|
|
1510
|
+
return !0;
|
|
1511
|
+
const e = Date.now() > this._pingTimeoutTime;
|
|
1512
|
+
return e && (this._pingTimeoutTime = 0, ye(() => {
|
|
1513
|
+
this._onClose("ping timeout");
|
|
1514
|
+
}, this.setTimeoutFn)), e;
|
|
1515
|
+
}
|
|
1516
|
+
/**
|
|
1517
|
+
* Sends a message.
|
|
1518
|
+
*
|
|
1519
|
+
* @param {String} msg - message.
|
|
1520
|
+
* @param {Object} options.
|
|
1521
|
+
* @param {Function} fn - callback function.
|
|
1522
|
+
* @return {Socket} for chaining.
|
|
1523
|
+
*/
|
|
1524
|
+
write(e, t, r) {
|
|
1525
|
+
return this._sendPacket("message", e, t, r), this;
|
|
1526
|
+
}
|
|
1527
|
+
/**
|
|
1528
|
+
* Sends a message. Alias of {@link Socket#write}.
|
|
1529
|
+
*
|
|
1530
|
+
* @param {String} msg - message.
|
|
1531
|
+
* @param {Object} options.
|
|
1532
|
+
* @param {Function} fn - callback function.
|
|
1533
|
+
* @return {Socket} for chaining.
|
|
1534
|
+
*/
|
|
1535
|
+
send(e, t, r) {
|
|
1536
|
+
return this._sendPacket("message", e, t, r), this;
|
|
1537
|
+
}
|
|
1538
|
+
/**
|
|
1539
|
+
* Sends a packet.
|
|
1540
|
+
*
|
|
1541
|
+
* @param {String} type: packet type.
|
|
1542
|
+
* @param {String} data.
|
|
1543
|
+
* @param {Object} options.
|
|
1544
|
+
* @param {Function} fn - callback function.
|
|
1545
|
+
* @private
|
|
1546
|
+
*/
|
|
1547
|
+
_sendPacket(e, t, r, i) {
|
|
1548
|
+
if (typeof t == "function" && (i = t, t = void 0), typeof r == "function" && (i = r, r = null), this.readyState === "closing" || this.readyState === "closed")
|
|
1549
|
+
return;
|
|
1550
|
+
r = r || {}, r.compress = r.compress !== !1;
|
|
1551
|
+
const n = {
|
|
1552
|
+
type: e,
|
|
1553
|
+
data: t,
|
|
1554
|
+
options: r
|
|
1555
|
+
};
|
|
1556
|
+
this.emitReserved("packetCreate", n), this.writeBuffer.push(n), i && this.once("flush", i), this.flush();
|
|
1557
|
+
}
|
|
1558
|
+
/**
|
|
1559
|
+
* Closes the connection.
|
|
1560
|
+
*/
|
|
1561
|
+
close() {
|
|
1562
|
+
const e = () => {
|
|
1563
|
+
this._onClose("forced close"), this.transport.close();
|
|
1564
|
+
}, t = () => {
|
|
1565
|
+
this.off("upgrade", t), this.off("upgradeError", t), e();
|
|
1566
|
+
}, r = () => {
|
|
1567
|
+
this.once("upgrade", t), this.once("upgradeError", t);
|
|
1568
|
+
};
|
|
1569
|
+
return (this.readyState === "opening" || this.readyState === "open") && (this.readyState = "closing", this.writeBuffer.length ? this.once("drain", () => {
|
|
1570
|
+
this.upgrading ? r() : e();
|
|
1571
|
+
}) : this.upgrading ? r() : e()), this;
|
|
1572
|
+
}
|
|
1573
|
+
/**
|
|
1574
|
+
* Called upon transport error
|
|
1575
|
+
*
|
|
1576
|
+
* @private
|
|
1577
|
+
*/
|
|
1578
|
+
_onError(e) {
|
|
1579
|
+
if (Q.priorWebsocketSuccess = !1, this.opts.tryAllTransports && this.transports.length > 1 && this.readyState === "opening")
|
|
1580
|
+
return this.transports.shift(), this._open();
|
|
1581
|
+
this.emitReserved("error", e), this._onClose("transport error", e);
|
|
1582
|
+
}
|
|
1583
|
+
/**
|
|
1584
|
+
* Called upon transport close.
|
|
1585
|
+
*
|
|
1586
|
+
* @private
|
|
1587
|
+
*/
|
|
1588
|
+
_onClose(e, t) {
|
|
1589
|
+
if (this.readyState === "opening" || this.readyState === "open" || this.readyState === "closing") {
|
|
1590
|
+
if (this.clearTimeoutFn(this._pingTimeoutTimer), this.transport.removeAllListeners("close"), this.transport.close(), this.transport.removeAllListeners(), we && (this._beforeunloadEventListener && removeEventListener("beforeunload", this._beforeunloadEventListener, !1), this._offlineEventListener)) {
|
|
1591
|
+
const r = le.indexOf(this._offlineEventListener);
|
|
1592
|
+
r !== -1 && le.splice(r, 1);
|
|
1593
|
+
}
|
|
1594
|
+
this.readyState = "closed", this.id = null, this.emitReserved("close", e, t), this.writeBuffer = [], this._prevBufferLen = 0;
|
|
1595
|
+
}
|
|
1596
|
+
}
|
|
1597
|
+
}
|
|
1598
|
+
Q.protocol = vt;
|
|
1599
|
+
class Ps extends Q {
|
|
1600
|
+
constructor() {
|
|
1601
|
+
super(...arguments), this._upgrades = [];
|
|
1602
|
+
}
|
|
1603
|
+
onOpen() {
|
|
1604
|
+
if (super.onOpen(), this.readyState === "open" && this.opts.upgrade)
|
|
1605
|
+
for (let e = 0; e < this._upgrades.length; e++)
|
|
1606
|
+
this._probe(this._upgrades[e]);
|
|
1607
|
+
}
|
|
1608
|
+
/**
|
|
1609
|
+
* Probes a transport.
|
|
1610
|
+
*
|
|
1611
|
+
* @param {String} name - transport name
|
|
1612
|
+
* @private
|
|
1613
|
+
*/
|
|
1614
|
+
_probe(e) {
|
|
1615
|
+
let t = this.createTransport(e), r = !1;
|
|
1616
|
+
Q.priorWebsocketSuccess = !1;
|
|
1617
|
+
const i = () => {
|
|
1618
|
+
r || (t.send([{ type: "ping", data: "probe" }]), t.once("packet", (h) => {
|
|
1619
|
+
if (!r)
|
|
1620
|
+
if (h.type === "pong" && h.data === "probe") {
|
|
1621
|
+
if (this.upgrading = !0, this.emitReserved("upgrading", t), !t)
|
|
1622
|
+
return;
|
|
1623
|
+
Q.priorWebsocketSuccess = t.name === "websocket", this.transport.pause(() => {
|
|
1624
|
+
r || this.readyState !== "closed" && (u(), this.setTransport(t), t.send([{ type: "upgrade" }]), this.emitReserved("upgrade", t), t = null, this.upgrading = !1, this.flush());
|
|
1625
|
+
});
|
|
1626
|
+
} else {
|
|
1627
|
+
const E = new Error("probe error");
|
|
1628
|
+
E.transport = t.name, this.emitReserved("upgradeError", E);
|
|
1629
|
+
}
|
|
1630
|
+
}));
|
|
1631
|
+
};
|
|
1632
|
+
function n() {
|
|
1633
|
+
r || (r = !0, u(), t.close(), t = null);
|
|
1634
|
+
}
|
|
1635
|
+
const o = (h) => {
|
|
1636
|
+
const E = new Error("probe error: " + h);
|
|
1637
|
+
E.transport = t.name, n(), this.emitReserved("upgradeError", E);
|
|
1638
|
+
};
|
|
1639
|
+
function l() {
|
|
1640
|
+
o("transport closed");
|
|
1641
|
+
}
|
|
1642
|
+
function a() {
|
|
1643
|
+
o("socket closed");
|
|
1644
|
+
}
|
|
1645
|
+
function p(h) {
|
|
1646
|
+
t && h.name !== t.name && n();
|
|
1647
|
+
}
|
|
1648
|
+
const u = () => {
|
|
1649
|
+
t.removeListener("open", i), t.removeListener("error", o), t.removeListener("close", l), this.off("close", a), this.off("upgrading", p);
|
|
1650
|
+
};
|
|
1651
|
+
t.once("open", i), t.once("error", o), t.once("close", l), this.once("close", a), this.once("upgrading", p), this._upgrades.indexOf("webtransport") !== -1 && e !== "webtransport" ? this.setTimeoutFn(() => {
|
|
1652
|
+
r || t.open();
|
|
1653
|
+
}, 200) : t.open();
|
|
1654
|
+
}
|
|
1655
|
+
onHandshake(e) {
|
|
1656
|
+
this._upgrades = this._filterUpgrades(e.upgrades), super.onHandshake(e);
|
|
1657
|
+
}
|
|
1658
|
+
/**
|
|
1659
|
+
* Filters upgrades, returning only those matching client transports.
|
|
1660
|
+
*
|
|
1661
|
+
* @param {Array} upgrades - server upgrades
|
|
1662
|
+
* @private
|
|
1663
|
+
*/
|
|
1664
|
+
_filterUpgrades(e) {
|
|
1665
|
+
const t = [];
|
|
1666
|
+
for (let r = 0; r < e.length; r++)
|
|
1667
|
+
~this.transports.indexOf(e[r]) && t.push(e[r]);
|
|
1668
|
+
return t;
|
|
1669
|
+
}
|
|
1670
|
+
}
|
|
1671
|
+
let Zs = class extends Ps {
|
|
1672
|
+
constructor(e, t = {}) {
|
|
1673
|
+
const r = typeof e == "object" ? e : t;
|
|
1674
|
+
(!r.transports || r.transports && typeof r.transports[0] == "string") && (r.transports = (r.transports || ["polling", "websocket", "webtransport"]).map((i) => Bs[i]).filter((i) => !!i)), super(e, r);
|
|
1675
|
+
}
|
|
1676
|
+
};
|
|
1677
|
+
function Rs(s, e = "", t) {
|
|
1678
|
+
let r = s;
|
|
1679
|
+
t = t || typeof location < "u" && location, s == null && (s = t.protocol + "//" + t.host), typeof s == "string" && (s.charAt(0) === "/" && (s.charAt(1) === "/" ? s = t.protocol + s : s = t.host + s), /^(https?|wss?):\/\//.test(s) || (typeof t < "u" ? s = t.protocol + "//" + s : s = "https://" + s), r = Je(s)), r.port || (/^(http|ws)$/.test(r.protocol) ? r.port = "80" : /^(http|ws)s$/.test(r.protocol) && (r.port = "443")), r.path = r.path || "/";
|
|
1680
|
+
const n = r.host.indexOf(":") !== -1 ? "[" + r.host + "]" : r.host;
|
|
1681
|
+
return r.id = r.protocol + "://" + n + ":" + r.port + e, r.href = r.protocol + "://" + n + (t && t.port === r.port ? "" : ":" + r.port), r;
|
|
1682
|
+
}
|
|
1683
|
+
const zs = typeof ArrayBuffer == "function", Ms = (s) => typeof ArrayBuffer.isView == "function" ? ArrayBuffer.isView(s) : s.buffer instanceof ArrayBuffer, wt = Object.prototype.toString, Ds = typeof Blob == "function" || typeof Blob < "u" && wt.call(Blob) === "[object BlobConstructor]", Xs = typeof File == "function" || typeof File < "u" && wt.call(File) === "[object FileConstructor]";
|
|
1684
|
+
function Xe(s) {
|
|
1685
|
+
return zs && (s instanceof ArrayBuffer || Ms(s)) || Ds && s instanceof Blob || Xs && s instanceof File;
|
|
1686
|
+
}
|
|
1687
|
+
function ce(s, e) {
|
|
1688
|
+
if (!s || typeof s != "object")
|
|
1689
|
+
return !1;
|
|
1690
|
+
if (Array.isArray(s)) {
|
|
1691
|
+
for (let t = 0, r = s.length; t < r; t++)
|
|
1692
|
+
if (ce(s[t]))
|
|
1693
|
+
return !0;
|
|
1694
|
+
return !1;
|
|
1695
|
+
}
|
|
1696
|
+
if (Xe(s))
|
|
1697
|
+
return !0;
|
|
1698
|
+
if (s.toJSON && typeof s.toJSON == "function" && arguments.length === 1)
|
|
1699
|
+
return ce(s.toJSON(), !0);
|
|
1700
|
+
for (const t in s)
|
|
1701
|
+
if (Object.prototype.hasOwnProperty.call(s, t) && ce(s[t]))
|
|
1702
|
+
return !0;
|
|
1703
|
+
return !1;
|
|
1704
|
+
}
|
|
1705
|
+
function Vs(s) {
|
|
1706
|
+
const e = [], t = s.data, r = s;
|
|
1707
|
+
return r.data = Ke(t, e), r.attachments = e.length, { packet: r, buffers: e };
|
|
1708
|
+
}
|
|
1709
|
+
function Ke(s, e) {
|
|
1710
|
+
if (!s)
|
|
1711
|
+
return s;
|
|
1712
|
+
if (Xe(s)) {
|
|
1713
|
+
const t = { _placeholder: !0, num: e.length };
|
|
1714
|
+
return e.push(s), t;
|
|
1715
|
+
} else if (Array.isArray(s)) {
|
|
1716
|
+
const t = new Array(s.length);
|
|
1717
|
+
for (let r = 0; r < s.length; r++)
|
|
1718
|
+
t[r] = Ke(s[r], e);
|
|
1719
|
+
return t;
|
|
1720
|
+
} else if (typeof s == "object" && !(s instanceof Date)) {
|
|
1721
|
+
const t = {};
|
|
1722
|
+
for (const r in s)
|
|
1723
|
+
Object.prototype.hasOwnProperty.call(s, r) && (t[r] = Ke(s[r], e));
|
|
1724
|
+
return t;
|
|
1725
|
+
}
|
|
1726
|
+
return s;
|
|
1727
|
+
}
|
|
1728
|
+
function Fs(s, e) {
|
|
1729
|
+
return s.data = Te(s.data, e), delete s.attachments, s;
|
|
1730
|
+
}
|
|
1731
|
+
function Te(s, e) {
|
|
1732
|
+
if (!s)
|
|
1733
|
+
return s;
|
|
1734
|
+
if (s && s._placeholder === !0) {
|
|
1735
|
+
if (typeof s.num == "number" && s.num >= 0 && s.num < e.length)
|
|
1736
|
+
return e[s.num];
|
|
1737
|
+
throw new Error("illegal attachments");
|
|
1738
|
+
} else if (Array.isArray(s))
|
|
1739
|
+
for (let t = 0; t < s.length; t++)
|
|
1740
|
+
s[t] = Te(s[t], e);
|
|
1741
|
+
else if (typeof s == "object")
|
|
1742
|
+
for (const t in s)
|
|
1743
|
+
Object.prototype.hasOwnProperty.call(s, t) && (s[t] = Te(s[t], e));
|
|
1744
|
+
return s;
|
|
1745
|
+
}
|
|
1746
|
+
const Kt = [
|
|
1747
|
+
"connect",
|
|
1748
|
+
// used on the client side
|
|
1749
|
+
"connect_error",
|
|
1750
|
+
// used on the client side
|
|
1751
|
+
"disconnect",
|
|
1752
|
+
// used on both sides
|
|
1753
|
+
"disconnecting",
|
|
1754
|
+
// used on the server side
|
|
1755
|
+
"newListener",
|
|
1756
|
+
// used by the Node.js EventEmitter
|
|
1757
|
+
"removeListener"
|
|
1758
|
+
// used by the Node.js EventEmitter
|
|
1759
|
+
], Ws = 5;
|
|
1760
|
+
var c;
|
|
1761
|
+
(function(s) {
|
|
1762
|
+
s[s.CONNECT = 0] = "CONNECT", s[s.DISCONNECT = 1] = "DISCONNECT", s[s.EVENT = 2] = "EVENT", s[s.ACK = 3] = "ACK", s[s.CONNECT_ERROR = 4] = "CONNECT_ERROR", s[s.BINARY_EVENT = 5] = "BINARY_EVENT", s[s.BINARY_ACK = 6] = "BINARY_ACK";
|
|
1763
|
+
})(c || (c = {}));
|
|
1764
|
+
class js {
|
|
1765
|
+
/**
|
|
1766
|
+
* Encoder constructor
|
|
1767
|
+
*
|
|
1768
|
+
* @param {function} replacer - custom replacer to pass down to JSON.parse
|
|
1769
|
+
*/
|
|
1770
|
+
constructor(e) {
|
|
1771
|
+
this.replacer = e;
|
|
1772
|
+
}
|
|
1773
|
+
/**
|
|
1774
|
+
* Encode a packet as a single string if non-binary, or as a
|
|
1775
|
+
* buffer sequence, depending on packet type.
|
|
1776
|
+
*
|
|
1777
|
+
* @param {Object} obj - packet object
|
|
1778
|
+
*/
|
|
1779
|
+
encode(e) {
|
|
1780
|
+
return (e.type === c.EVENT || e.type === c.ACK) && ce(e) ? this.encodeAsBinary({
|
|
1781
|
+
type: e.type === c.EVENT ? c.BINARY_EVENT : c.BINARY_ACK,
|
|
1782
|
+
nsp: e.nsp,
|
|
1783
|
+
data: e.data,
|
|
1784
|
+
id: e.id
|
|
1785
|
+
}) : [this.encodeAsString(e)];
|
|
1786
|
+
}
|
|
1787
|
+
/**
|
|
1788
|
+
* Encode packet as string.
|
|
1789
|
+
*/
|
|
1790
|
+
encodeAsString(e) {
|
|
1791
|
+
let t = "" + e.type;
|
|
1792
|
+
return (e.type === c.BINARY_EVENT || e.type === c.BINARY_ACK) && (t += e.attachments + "-"), e.nsp && e.nsp !== "/" && (t += e.nsp + ","), e.id != null && (t += e.id), e.data != null && (t += JSON.stringify(e.data, this.replacer)), t;
|
|
1793
|
+
}
|
|
1794
|
+
/**
|
|
1795
|
+
* Encode packet as 'buffer sequence' by removing blobs, and
|
|
1796
|
+
* deconstructing packet into object with placeholders and
|
|
1797
|
+
* a list of buffers.
|
|
1798
|
+
*/
|
|
1799
|
+
encodeAsBinary(e) {
|
|
1800
|
+
const t = Vs(e), r = this.encodeAsString(t.packet), i = t.buffers;
|
|
1801
|
+
return i.unshift(r), i;
|
|
1802
|
+
}
|
|
1803
|
+
}
|
|
1804
|
+
class Ve extends S {
|
|
1805
|
+
/**
|
|
1806
|
+
* Decoder constructor
|
|
1807
|
+
*
|
|
1808
|
+
* @param {function} reviver - custom reviver to pass down to JSON.stringify
|
|
1809
|
+
*/
|
|
1810
|
+
constructor(e) {
|
|
1811
|
+
super(), this.reviver = e;
|
|
1812
|
+
}
|
|
1813
|
+
/**
|
|
1814
|
+
* Decodes an encoded packet string into packet JSON.
|
|
1815
|
+
*
|
|
1816
|
+
* @param {String} obj - encoded packet
|
|
1817
|
+
*/
|
|
1818
|
+
add(e) {
|
|
1819
|
+
let t;
|
|
1820
|
+
if (typeof e == "string") {
|
|
1821
|
+
if (this.reconstructor)
|
|
1822
|
+
throw new Error("got plaintext data when reconstructing a packet");
|
|
1823
|
+
t = this.decodeString(e);
|
|
1824
|
+
const r = t.type === c.BINARY_EVENT;
|
|
1825
|
+
r || t.type === c.BINARY_ACK ? (t.type = r ? c.EVENT : c.ACK, this.reconstructor = new qs(t), t.attachments === 0 && super.emitReserved("decoded", t)) : super.emitReserved("decoded", t);
|
|
1826
|
+
} else if (Xe(e) || e.base64)
|
|
1827
|
+
if (this.reconstructor)
|
|
1828
|
+
t = this.reconstructor.takeBinaryData(e), t && (this.reconstructor = null, super.emitReserved("decoded", t));
|
|
1829
|
+
else
|
|
1830
|
+
throw new Error("got binary data when not reconstructing a packet");
|
|
1831
|
+
else
|
|
1832
|
+
throw new Error("Unknown type: " + e);
|
|
1833
|
+
}
|
|
1834
|
+
/**
|
|
1835
|
+
* Decode a packet String (JSON data)
|
|
1836
|
+
*
|
|
1837
|
+
* @param {String} str
|
|
1838
|
+
* @return {Object} packet
|
|
1839
|
+
*/
|
|
1840
|
+
decodeString(e) {
|
|
1841
|
+
let t = 0;
|
|
1842
|
+
const r = {
|
|
1843
|
+
type: Number(e.charAt(0))
|
|
1844
|
+
};
|
|
1845
|
+
if (c[r.type] === void 0)
|
|
1846
|
+
throw new Error("unknown packet type " + r.type);
|
|
1847
|
+
if (r.type === c.BINARY_EVENT || r.type === c.BINARY_ACK) {
|
|
1848
|
+
const n = t + 1;
|
|
1849
|
+
for (; e.charAt(++t) !== "-" && t != e.length; )
|
|
1850
|
+
;
|
|
1851
|
+
const o = e.substring(n, t);
|
|
1852
|
+
if (o != Number(o) || e.charAt(t) !== "-")
|
|
1853
|
+
throw new Error("Illegal attachments");
|
|
1854
|
+
r.attachments = Number(o);
|
|
1855
|
+
}
|
|
1856
|
+
if (e.charAt(t + 1) === "/") {
|
|
1857
|
+
const n = t + 1;
|
|
1858
|
+
for (; ++t && !(e.charAt(t) === "," || t === e.length); )
|
|
1859
|
+
;
|
|
1860
|
+
r.nsp = e.substring(n, t);
|
|
1861
|
+
} else
|
|
1862
|
+
r.nsp = "/";
|
|
1863
|
+
const i = e.charAt(t + 1);
|
|
1864
|
+
if (i !== "" && Number(i) == i) {
|
|
1865
|
+
const n = t + 1;
|
|
1866
|
+
for (; ++t; ) {
|
|
1867
|
+
const o = e.charAt(t);
|
|
1868
|
+
if (o == null || Number(o) != o) {
|
|
1869
|
+
--t;
|
|
1870
|
+
break;
|
|
1871
|
+
}
|
|
1872
|
+
if (t === e.length)
|
|
1873
|
+
break;
|
|
1874
|
+
}
|
|
1875
|
+
r.id = Number(e.substring(n, t + 1));
|
|
1876
|
+
}
|
|
1877
|
+
if (e.charAt(++t)) {
|
|
1878
|
+
const n = this.tryParse(e.substr(t));
|
|
1879
|
+
if (Ve.isPayloadValid(r.type, n))
|
|
1880
|
+
r.data = n;
|
|
1881
|
+
else
|
|
1882
|
+
throw new Error("invalid payload");
|
|
1883
|
+
}
|
|
1884
|
+
return r;
|
|
1885
|
+
}
|
|
1886
|
+
tryParse(e) {
|
|
1887
|
+
try {
|
|
1888
|
+
return JSON.parse(e, this.reviver);
|
|
1889
|
+
} catch {
|
|
1890
|
+
return !1;
|
|
1891
|
+
}
|
|
1892
|
+
}
|
|
1893
|
+
static isPayloadValid(e, t) {
|
|
1894
|
+
switch (e) {
|
|
1895
|
+
case c.CONNECT:
|
|
1896
|
+
return ue(t);
|
|
1897
|
+
case c.DISCONNECT:
|
|
1898
|
+
return t === void 0;
|
|
1899
|
+
case c.CONNECT_ERROR:
|
|
1900
|
+
return typeof t == "string" || ue(t);
|
|
1901
|
+
case c.EVENT:
|
|
1902
|
+
case c.BINARY_EVENT:
|
|
1903
|
+
return Array.isArray(t) && (typeof t[0] == "number" || typeof t[0] == "string" && Kt.indexOf(t[0]) === -1);
|
|
1904
|
+
case c.ACK:
|
|
1905
|
+
case c.BINARY_ACK:
|
|
1906
|
+
return Array.isArray(t);
|
|
1907
|
+
}
|
|
1908
|
+
}
|
|
1909
|
+
/**
|
|
1910
|
+
* Deallocates a parser's resources
|
|
1911
|
+
*/
|
|
1912
|
+
destroy() {
|
|
1913
|
+
this.reconstructor && (this.reconstructor.finishedReconstruction(), this.reconstructor = null);
|
|
1914
|
+
}
|
|
1915
|
+
}
|
|
1916
|
+
class qs {
|
|
1917
|
+
constructor(e) {
|
|
1918
|
+
this.packet = e, this.buffers = [], this.reconPack = e;
|
|
1919
|
+
}
|
|
1920
|
+
/**
|
|
1921
|
+
* Method to be called when binary data received from connection
|
|
1922
|
+
* after a BINARY_EVENT packet.
|
|
1923
|
+
*
|
|
1924
|
+
* @param {Buffer | ArrayBuffer} binData - the raw binary data received
|
|
1925
|
+
* @return {null | Object} returns null if more binary data is expected or
|
|
1926
|
+
* a reconstructed packet object if all buffers have been received.
|
|
1927
|
+
*/
|
|
1928
|
+
takeBinaryData(e) {
|
|
1929
|
+
if (this.buffers.push(e), this.buffers.length === this.reconPack.attachments) {
|
|
1930
|
+
const t = Fs(this.reconPack, this.buffers);
|
|
1931
|
+
return this.finishedReconstruction(), t;
|
|
1932
|
+
}
|
|
1933
|
+
return null;
|
|
1934
|
+
}
|
|
1935
|
+
/**
|
|
1936
|
+
* Cleans up binary packet reconstruction variables.
|
|
1937
|
+
*/
|
|
1938
|
+
finishedReconstruction() {
|
|
1939
|
+
this.reconPack = null, this.buffers = [];
|
|
1940
|
+
}
|
|
1941
|
+
}
|
|
1942
|
+
function Gs(s) {
|
|
1943
|
+
return typeof s == "string";
|
|
1944
|
+
}
|
|
1945
|
+
const Ys = Number.isInteger || function(s) {
|
|
1946
|
+
return typeof s == "number" && isFinite(s) && Math.floor(s) === s;
|
|
1947
|
+
};
|
|
1948
|
+
function Hs(s) {
|
|
1949
|
+
return s === void 0 || Ys(s);
|
|
1950
|
+
}
|
|
1951
|
+
function ue(s) {
|
|
1952
|
+
return Object.prototype.toString.call(s) === "[object Object]";
|
|
1953
|
+
}
|
|
1954
|
+
function _s(s, e) {
|
|
1955
|
+
switch (s) {
|
|
1956
|
+
case c.CONNECT:
|
|
1957
|
+
return e === void 0 || ue(e);
|
|
1958
|
+
case c.DISCONNECT:
|
|
1959
|
+
return e === void 0;
|
|
1960
|
+
case c.EVENT:
|
|
1961
|
+
return Array.isArray(e) && (typeof e[0] == "number" || typeof e[0] == "string" && Kt.indexOf(e[0]) === -1);
|
|
1962
|
+
case c.ACK:
|
|
1963
|
+
return Array.isArray(e);
|
|
1964
|
+
case c.CONNECT_ERROR:
|
|
1965
|
+
return typeof e == "string" || ue(e);
|
|
1966
|
+
default:
|
|
1967
|
+
return !1;
|
|
1968
|
+
}
|
|
1969
|
+
}
|
|
1970
|
+
function $s(s) {
|
|
1971
|
+
return Gs(s.nsp) && Hs(s.id) && _s(s.type, s.data);
|
|
1972
|
+
}
|
|
1973
|
+
const er = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
1974
|
+
__proto__: null,
|
|
1975
|
+
Decoder: Ve,
|
|
1976
|
+
Encoder: js,
|
|
1977
|
+
get PacketType() {
|
|
1978
|
+
return c;
|
|
1979
|
+
},
|
|
1980
|
+
isPacketValid: $s,
|
|
1981
|
+
protocol: Ws
|
|
1982
|
+
}, Symbol.toStringTag, { value: "Module" }));
|
|
1983
|
+
function K(s, e, t) {
|
|
1984
|
+
return s.on(e, t), function() {
|
|
1985
|
+
s.off(e, t);
|
|
1986
|
+
};
|
|
1987
|
+
}
|
|
1988
|
+
const tr = Object.freeze({
|
|
1989
|
+
connect: 1,
|
|
1990
|
+
connect_error: 1,
|
|
1991
|
+
disconnect: 1,
|
|
1992
|
+
disconnecting: 1,
|
|
1993
|
+
// EventEmitter reserved events: https://nodejs.org/api/events.html#events_event_newlistener
|
|
1994
|
+
newListener: 1,
|
|
1995
|
+
removeListener: 1
|
|
1996
|
+
});
|
|
1997
|
+
class Tt extends S {
|
|
1998
|
+
/**
|
|
1999
|
+
* `Socket` constructor.
|
|
2000
|
+
*/
|
|
2001
|
+
constructor(e, t, r) {
|
|
2002
|
+
super(), this.connected = !1, this.recovered = !1, this.receiveBuffer = [], this.sendBuffer = [], this._queue = [], this._queueSeq = 0, this.ids = 0, this.acks = {}, this.flags = {}, this.io = e, this.nsp = t, r && r.auth && (this.auth = r.auth), this._opts = Object.assign({}, r), this.io._autoConnect && this.open();
|
|
2003
|
+
}
|
|
2004
|
+
/**
|
|
2005
|
+
* Whether the socket is currently disconnected
|
|
2006
|
+
*
|
|
2007
|
+
* @example
|
|
2008
|
+
* const socket = io();
|
|
2009
|
+
*
|
|
2010
|
+
* socket.on("connect", () => {
|
|
2011
|
+
* console.log(socket.disconnected); // false
|
|
2012
|
+
* });
|
|
2013
|
+
*
|
|
2014
|
+
* socket.on("disconnect", () => {
|
|
2015
|
+
* console.log(socket.disconnected); // true
|
|
2016
|
+
* });
|
|
2017
|
+
*/
|
|
2018
|
+
get disconnected() {
|
|
2019
|
+
return !this.connected;
|
|
2020
|
+
}
|
|
2021
|
+
/**
|
|
2022
|
+
* Subscribe to open, close and packet events
|
|
2023
|
+
*
|
|
2024
|
+
* @private
|
|
2025
|
+
*/
|
|
2026
|
+
subEvents() {
|
|
2027
|
+
if (this.subs)
|
|
2028
|
+
return;
|
|
2029
|
+
const e = this.io;
|
|
2030
|
+
this.subs = [
|
|
2031
|
+
K(e, "open", this.onopen.bind(this)),
|
|
2032
|
+
K(e, "packet", this.onpacket.bind(this)),
|
|
2033
|
+
K(e, "error", this.onerror.bind(this)),
|
|
2034
|
+
K(e, "close", this.onclose.bind(this))
|
|
2035
|
+
];
|
|
2036
|
+
}
|
|
2037
|
+
/**
|
|
2038
|
+
* Whether the Socket will try to reconnect when its Manager connects or reconnects.
|
|
2039
|
+
*
|
|
2040
|
+
* @example
|
|
2041
|
+
* const socket = io();
|
|
2042
|
+
*
|
|
2043
|
+
* console.log(socket.active); // true
|
|
2044
|
+
*
|
|
2045
|
+
* socket.on("disconnect", (reason) => {
|
|
2046
|
+
* if (reason === "io server disconnect") {
|
|
2047
|
+
* // the disconnection was initiated by the server, you need to manually reconnect
|
|
2048
|
+
* console.log(socket.active); // false
|
|
2049
|
+
* }
|
|
2050
|
+
* // else the socket will automatically try to reconnect
|
|
2051
|
+
* console.log(socket.active); // true
|
|
2052
|
+
* });
|
|
2053
|
+
*/
|
|
2054
|
+
get active() {
|
|
2055
|
+
return !!this.subs;
|
|
2056
|
+
}
|
|
2057
|
+
/**
|
|
2058
|
+
* "Opens" the socket.
|
|
2059
|
+
*
|
|
2060
|
+
* @example
|
|
2061
|
+
* const socket = io({
|
|
2062
|
+
* autoConnect: false
|
|
2063
|
+
* });
|
|
2064
|
+
*
|
|
2065
|
+
* socket.connect();
|
|
2066
|
+
*/
|
|
2067
|
+
connect() {
|
|
2068
|
+
return this.connected ? this : (this.subEvents(), this.io._reconnecting || this.io.open(), this.io._readyState === "open" && this.onopen(), this);
|
|
2069
|
+
}
|
|
2070
|
+
/**
|
|
2071
|
+
* Alias for {@link connect()}.
|
|
2072
|
+
*/
|
|
2073
|
+
open() {
|
|
2074
|
+
return this.connect();
|
|
2075
|
+
}
|
|
2076
|
+
/**
|
|
2077
|
+
* Sends a `message` event.
|
|
2078
|
+
*
|
|
2079
|
+
* This method mimics the WebSocket.send() method.
|
|
2080
|
+
*
|
|
2081
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/send
|
|
2082
|
+
*
|
|
2083
|
+
* @example
|
|
2084
|
+
* socket.send("hello");
|
|
2085
|
+
*
|
|
2086
|
+
* // this is equivalent to
|
|
2087
|
+
* socket.emit("message", "hello");
|
|
2088
|
+
*
|
|
2089
|
+
* @return self
|
|
2090
|
+
*/
|
|
2091
|
+
send(...e) {
|
|
2092
|
+
return e.unshift("message"), this.emit.apply(this, e), this;
|
|
2093
|
+
}
|
|
2094
|
+
/**
|
|
2095
|
+
* Override `emit`.
|
|
2096
|
+
* If the event is in `events`, it's emitted normally.
|
|
2097
|
+
*
|
|
2098
|
+
* @example
|
|
2099
|
+
* socket.emit("hello", "world");
|
|
2100
|
+
*
|
|
2101
|
+
* // all serializable datastructures are supported (no need to call JSON.stringify)
|
|
2102
|
+
* socket.emit("hello", 1, "2", { 3: ["4"], 5: Uint8Array.from([6]) });
|
|
2103
|
+
*
|
|
2104
|
+
* // with an acknowledgement from the server
|
|
2105
|
+
* socket.emit("hello", "world", (val) => {
|
|
2106
|
+
* // ...
|
|
2107
|
+
* });
|
|
2108
|
+
*
|
|
2109
|
+
* @return self
|
|
2110
|
+
*/
|
|
2111
|
+
emit(e, ...t) {
|
|
2112
|
+
var r, i, n;
|
|
2113
|
+
if (tr.hasOwnProperty(e))
|
|
2114
|
+
throw new Error('"' + e.toString() + '" is a reserved event name');
|
|
2115
|
+
if (t.unshift(e), this._opts.retries && !this.flags.fromQueue && !this.flags.volatile)
|
|
2116
|
+
return this._addToQueue(t), this;
|
|
2117
|
+
const o = {
|
|
2118
|
+
type: c.EVENT,
|
|
2119
|
+
data: t
|
|
2120
|
+
};
|
|
2121
|
+
if (o.options = {}, o.options.compress = this.flags.compress !== !1, typeof t[t.length - 1] == "function") {
|
|
2122
|
+
const u = this.ids++, h = t.pop();
|
|
2123
|
+
this._registerAckCallback(u, h), o.id = u;
|
|
2124
|
+
}
|
|
2125
|
+
const l = (i = (r = this.io.engine) === null || r === void 0 ? void 0 : r.transport) === null || i === void 0 ? void 0 : i.writable, a = this.connected && !(!((n = this.io.engine) === null || n === void 0) && n._hasPingExpired());
|
|
2126
|
+
return this.flags.volatile && !l || (a ? (this.notifyOutgoingListeners(o), this.packet(o)) : this.sendBuffer.push(o)), this.flags = {}, this;
|
|
2127
|
+
}
|
|
2128
|
+
/**
|
|
2129
|
+
* @private
|
|
2130
|
+
*/
|
|
2131
|
+
_registerAckCallback(e, t) {
|
|
2132
|
+
var r;
|
|
2133
|
+
const i = (r = this.flags.timeout) !== null && r !== void 0 ? r : this._opts.ackTimeout;
|
|
2134
|
+
if (i === void 0) {
|
|
2135
|
+
this.acks[e] = t;
|
|
2136
|
+
return;
|
|
2137
|
+
}
|
|
2138
|
+
const n = this.io.setTimeoutFn(() => {
|
|
2139
|
+
delete this.acks[e];
|
|
2140
|
+
for (let l = 0; l < this.sendBuffer.length; l++)
|
|
2141
|
+
this.sendBuffer[l].id === e && this.sendBuffer.splice(l, 1);
|
|
2142
|
+
t.call(this, new Error("operation has timed out"));
|
|
2143
|
+
}, i), o = (...l) => {
|
|
2144
|
+
this.io.clearTimeoutFn(n), t.apply(this, l);
|
|
2145
|
+
};
|
|
2146
|
+
o.withError = !0, this.acks[e] = o;
|
|
2147
|
+
}
|
|
2148
|
+
/**
|
|
2149
|
+
* Emits an event and waits for an acknowledgement
|
|
2150
|
+
*
|
|
2151
|
+
* @example
|
|
2152
|
+
* // without timeout
|
|
2153
|
+
* const response = await socket.emitWithAck("hello", "world");
|
|
2154
|
+
*
|
|
2155
|
+
* // with a specific timeout
|
|
2156
|
+
* try {
|
|
2157
|
+
* const response = await socket.timeout(1000).emitWithAck("hello", "world");
|
|
2158
|
+
* } catch (err) {
|
|
2159
|
+
* // the server did not acknowledge the event in the given delay
|
|
2160
|
+
* }
|
|
2161
|
+
*
|
|
2162
|
+
* @return a Promise that will be fulfilled when the server acknowledges the event
|
|
2163
|
+
*/
|
|
2164
|
+
emitWithAck(e, ...t) {
|
|
2165
|
+
return new Promise((r, i) => {
|
|
2166
|
+
const n = (o, l) => o ? i(o) : r(l);
|
|
2167
|
+
n.withError = !0, t.push(n), this.emit(e, ...t);
|
|
2168
|
+
});
|
|
2169
|
+
}
|
|
2170
|
+
/**
|
|
2171
|
+
* Add the packet to the queue.
|
|
2172
|
+
* @param args
|
|
2173
|
+
* @private
|
|
2174
|
+
*/
|
|
2175
|
+
_addToQueue(e) {
|
|
2176
|
+
let t;
|
|
2177
|
+
typeof e[e.length - 1] == "function" && (t = e.pop());
|
|
2178
|
+
const r = {
|
|
2179
|
+
id: this._queueSeq++,
|
|
2180
|
+
tryCount: 0,
|
|
2181
|
+
pending: !1,
|
|
2182
|
+
args: e,
|
|
2183
|
+
flags: Object.assign({ fromQueue: !0 }, this.flags)
|
|
2184
|
+
};
|
|
2185
|
+
e.push((i, ...n) => (this._queue[0], i !== null ? r.tryCount > this._opts.retries && (this._queue.shift(), t && t(i)) : (this._queue.shift(), t && t(null, ...n)), r.pending = !1, this._drainQueue())), this._queue.push(r), this._drainQueue();
|
|
2186
|
+
}
|
|
2187
|
+
/**
|
|
2188
|
+
* Send the first packet of the queue, and wait for an acknowledgement from the server.
|
|
2189
|
+
* @param force - whether to resend a packet that has not been acknowledged yet
|
|
2190
|
+
*
|
|
2191
|
+
* @private
|
|
2192
|
+
*/
|
|
2193
|
+
_drainQueue(e = !1) {
|
|
2194
|
+
if (!this.connected || this._queue.length === 0)
|
|
2195
|
+
return;
|
|
2196
|
+
const t = this._queue[0];
|
|
2197
|
+
t.pending && !e || (t.pending = !0, t.tryCount++, this.flags = t.flags, this.emit.apply(this, t.args));
|
|
2198
|
+
}
|
|
2199
|
+
/**
|
|
2200
|
+
* Sends a packet.
|
|
2201
|
+
*
|
|
2202
|
+
* @param packet
|
|
2203
|
+
* @private
|
|
2204
|
+
*/
|
|
2205
|
+
packet(e) {
|
|
2206
|
+
e.nsp = this.nsp, this.io._packet(e);
|
|
2207
|
+
}
|
|
2208
|
+
/**
|
|
2209
|
+
* Called upon engine `open`.
|
|
2210
|
+
*
|
|
2211
|
+
* @private
|
|
2212
|
+
*/
|
|
2213
|
+
onopen() {
|
|
2214
|
+
typeof this.auth == "function" ? this.auth((e) => {
|
|
2215
|
+
this._sendConnectPacket(e);
|
|
2216
|
+
}) : this._sendConnectPacket(this.auth);
|
|
2217
|
+
}
|
|
2218
|
+
/**
|
|
2219
|
+
* Sends a CONNECT packet to initiate the Socket.IO session.
|
|
2220
|
+
*
|
|
2221
|
+
* @param data
|
|
2222
|
+
* @private
|
|
2223
|
+
*/
|
|
2224
|
+
_sendConnectPacket(e) {
|
|
2225
|
+
this.packet({
|
|
2226
|
+
type: c.CONNECT,
|
|
2227
|
+
data: this._pid ? Object.assign({ pid: this._pid, offset: this._lastOffset }, e) : e
|
|
2228
|
+
});
|
|
2229
|
+
}
|
|
2230
|
+
/**
|
|
2231
|
+
* Called upon engine or manager `error`.
|
|
2232
|
+
*
|
|
2233
|
+
* @param err
|
|
2234
|
+
* @private
|
|
2235
|
+
*/
|
|
2236
|
+
onerror(e) {
|
|
2237
|
+
this.connected || this.emitReserved("connect_error", e);
|
|
2238
|
+
}
|
|
2239
|
+
/**
|
|
2240
|
+
* Called upon engine `close`.
|
|
2241
|
+
*
|
|
2242
|
+
* @param reason
|
|
2243
|
+
* @param description
|
|
2244
|
+
* @private
|
|
2245
|
+
*/
|
|
2246
|
+
onclose(e, t) {
|
|
2247
|
+
this.connected = !1, delete this.id, this.emitReserved("disconnect", e, t), this._clearAcks();
|
|
2248
|
+
}
|
|
2249
|
+
/**
|
|
2250
|
+
* Clears the acknowledgement handlers upon disconnection, since the client will never receive an acknowledgement from
|
|
2251
|
+
* the server.
|
|
2252
|
+
*
|
|
2253
|
+
* @private
|
|
2254
|
+
*/
|
|
2255
|
+
_clearAcks() {
|
|
2256
|
+
Object.keys(this.acks).forEach((e) => {
|
|
2257
|
+
if (!this.sendBuffer.some((r) => String(r.id) === e)) {
|
|
2258
|
+
const r = this.acks[e];
|
|
2259
|
+
delete this.acks[e], r.withError && r.call(this, new Error("socket has been disconnected"));
|
|
2260
|
+
}
|
|
2261
|
+
});
|
|
2262
|
+
}
|
|
2263
|
+
/**
|
|
2264
|
+
* Called with socket packet.
|
|
2265
|
+
*
|
|
2266
|
+
* @param packet
|
|
2267
|
+
* @private
|
|
2268
|
+
*/
|
|
2269
|
+
onpacket(e) {
|
|
2270
|
+
if (e.nsp === this.nsp)
|
|
2271
|
+
switch (e.type) {
|
|
2272
|
+
case c.CONNECT:
|
|
2273
|
+
e.data && e.data.sid ? this.onconnect(e.data.sid, e.data.pid) : this.emitReserved("connect_error", new Error("It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)"));
|
|
2274
|
+
break;
|
|
2275
|
+
case c.EVENT:
|
|
2276
|
+
case c.BINARY_EVENT:
|
|
2277
|
+
this.onevent(e);
|
|
2278
|
+
break;
|
|
2279
|
+
case c.ACK:
|
|
2280
|
+
case c.BINARY_ACK:
|
|
2281
|
+
this.onack(e);
|
|
2282
|
+
break;
|
|
2283
|
+
case c.DISCONNECT:
|
|
2284
|
+
this.ondisconnect();
|
|
2285
|
+
break;
|
|
2286
|
+
case c.CONNECT_ERROR:
|
|
2287
|
+
this.destroy();
|
|
2288
|
+
const r = new Error(e.data.message);
|
|
2289
|
+
r.data = e.data.data, this.emitReserved("connect_error", r);
|
|
2290
|
+
break;
|
|
2291
|
+
}
|
|
2292
|
+
}
|
|
2293
|
+
/**
|
|
2294
|
+
* Called upon a server event.
|
|
2295
|
+
*
|
|
2296
|
+
* @param packet
|
|
2297
|
+
* @private
|
|
2298
|
+
*/
|
|
2299
|
+
onevent(e) {
|
|
2300
|
+
const t = e.data || [];
|
|
2301
|
+
e.id != null && t.push(this.ack(e.id)), this.connected ? this.emitEvent(t) : this.receiveBuffer.push(Object.freeze(t));
|
|
2302
|
+
}
|
|
2303
|
+
emitEvent(e) {
|
|
2304
|
+
if (this._anyListeners && this._anyListeners.length) {
|
|
2305
|
+
const t = this._anyListeners.slice();
|
|
2306
|
+
for (const r of t)
|
|
2307
|
+
r.apply(this, e);
|
|
2308
|
+
}
|
|
2309
|
+
super.emit.apply(this, e), this._pid && e.length && typeof e[e.length - 1] == "string" && (this._lastOffset = e[e.length - 1]);
|
|
2310
|
+
}
|
|
2311
|
+
/**
|
|
2312
|
+
* Produces an ack callback to emit with an event.
|
|
2313
|
+
*
|
|
2314
|
+
* @private
|
|
2315
|
+
*/
|
|
2316
|
+
ack(e) {
|
|
2317
|
+
const t = this;
|
|
2318
|
+
let r = !1;
|
|
2319
|
+
return function(...i) {
|
|
2320
|
+
r || (r = !0, t.packet({
|
|
2321
|
+
type: c.ACK,
|
|
2322
|
+
id: e,
|
|
2323
|
+
data: i
|
|
2324
|
+
}));
|
|
2325
|
+
};
|
|
2326
|
+
}
|
|
2327
|
+
/**
|
|
2328
|
+
* Called upon a server acknowledgement.
|
|
2329
|
+
*
|
|
2330
|
+
* @param packet
|
|
2331
|
+
* @private
|
|
2332
|
+
*/
|
|
2333
|
+
onack(e) {
|
|
2334
|
+
const t = this.acks[e.id];
|
|
2335
|
+
typeof t == "function" && (delete this.acks[e.id], t.withError && e.data.unshift(null), t.apply(this, e.data));
|
|
2336
|
+
}
|
|
2337
|
+
/**
|
|
2338
|
+
* Called upon server connect.
|
|
2339
|
+
*
|
|
2340
|
+
* @private
|
|
2341
|
+
*/
|
|
2342
|
+
onconnect(e, t) {
|
|
2343
|
+
this.id = e, this.recovered = t && this._pid === t, this._pid = t, this.connected = !0, this.emitBuffered(), this._drainQueue(!0), this.emitReserved("connect");
|
|
2344
|
+
}
|
|
2345
|
+
/**
|
|
2346
|
+
* Emit buffered events (received and emitted).
|
|
2347
|
+
*
|
|
2348
|
+
* @private
|
|
2349
|
+
*/
|
|
2350
|
+
emitBuffered() {
|
|
2351
|
+
this.receiveBuffer.forEach((e) => this.emitEvent(e)), this.receiveBuffer = [], this.sendBuffer.forEach((e) => {
|
|
2352
|
+
this.notifyOutgoingListeners(e), this.packet(e);
|
|
2353
|
+
}), this.sendBuffer = [];
|
|
2354
|
+
}
|
|
2355
|
+
/**
|
|
2356
|
+
* Called upon server disconnect.
|
|
2357
|
+
*
|
|
2358
|
+
* @private
|
|
2359
|
+
*/
|
|
2360
|
+
ondisconnect() {
|
|
2361
|
+
this.destroy(), this.onclose("io server disconnect");
|
|
2362
|
+
}
|
|
2363
|
+
/**
|
|
2364
|
+
* Called upon forced client/server side disconnections,
|
|
2365
|
+
* this method ensures the manager stops tracking us and
|
|
2366
|
+
* that reconnections don't get triggered for this.
|
|
2367
|
+
*
|
|
2368
|
+
* @private
|
|
2369
|
+
*/
|
|
2370
|
+
destroy() {
|
|
2371
|
+
this.subs && (this.subs.forEach((e) => e()), this.subs = void 0), this.io._destroy(this);
|
|
2372
|
+
}
|
|
2373
|
+
/**
|
|
2374
|
+
* Disconnects the socket manually. In that case, the socket will not try to reconnect.
|
|
2375
|
+
*
|
|
2376
|
+
* If this is the last active Socket instance of the {@link Manager}, the low-level connection will be closed.
|
|
2377
|
+
*
|
|
2378
|
+
* @example
|
|
2379
|
+
* const socket = io();
|
|
2380
|
+
*
|
|
2381
|
+
* socket.on("disconnect", (reason) => {
|
|
2382
|
+
* // console.log(reason); prints "io client disconnect"
|
|
2383
|
+
* });
|
|
2384
|
+
*
|
|
2385
|
+
* socket.disconnect();
|
|
2386
|
+
*
|
|
2387
|
+
* @return self
|
|
2388
|
+
*/
|
|
2389
|
+
disconnect() {
|
|
2390
|
+
return this.connected && this.packet({ type: c.DISCONNECT }), this.destroy(), this.connected && this.onclose("io client disconnect"), this;
|
|
2391
|
+
}
|
|
2392
|
+
/**
|
|
2393
|
+
* Alias for {@link disconnect()}.
|
|
2394
|
+
*
|
|
2395
|
+
* @return self
|
|
2396
|
+
*/
|
|
2397
|
+
close() {
|
|
2398
|
+
return this.disconnect();
|
|
2399
|
+
}
|
|
2400
|
+
/**
|
|
2401
|
+
* Sets the compress flag.
|
|
2402
|
+
*
|
|
2403
|
+
* @example
|
|
2404
|
+
* socket.compress(false).emit("hello");
|
|
2405
|
+
*
|
|
2406
|
+
* @param compress - if `true`, compresses the sending data
|
|
2407
|
+
* @return self
|
|
2408
|
+
*/
|
|
2409
|
+
compress(e) {
|
|
2410
|
+
return this.flags.compress = e, this;
|
|
2411
|
+
}
|
|
2412
|
+
/**
|
|
2413
|
+
* Sets a modifier for a subsequent event emission that the event message will be dropped when this socket is not
|
|
2414
|
+
* ready to send messages.
|
|
2415
|
+
*
|
|
2416
|
+
* @example
|
|
2417
|
+
* socket.volatile.emit("hello"); // the server may or may not receive it
|
|
2418
|
+
*
|
|
2419
|
+
* @returns self
|
|
2420
|
+
*/
|
|
2421
|
+
get volatile() {
|
|
2422
|
+
return this.flags.volatile = !0, this;
|
|
2423
|
+
}
|
|
2424
|
+
/**
|
|
2425
|
+
* Sets a modifier for a subsequent event emission that the callback will be called with an error when the
|
|
2426
|
+
* given number of milliseconds have elapsed without an acknowledgement from the server:
|
|
2427
|
+
*
|
|
2428
|
+
* @example
|
|
2429
|
+
* socket.timeout(5000).emit("my-event", (err) => {
|
|
2430
|
+
* if (err) {
|
|
2431
|
+
* // the server did not acknowledge the event in the given delay
|
|
2432
|
+
* }
|
|
2433
|
+
* });
|
|
2434
|
+
*
|
|
2435
|
+
* @returns self
|
|
2436
|
+
*/
|
|
2437
|
+
timeout(e) {
|
|
2438
|
+
return this.flags.timeout = e, this;
|
|
2439
|
+
}
|
|
2440
|
+
/**
|
|
2441
|
+
* Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the
|
|
2442
|
+
* callback.
|
|
2443
|
+
*
|
|
2444
|
+
* @example
|
|
2445
|
+
* socket.onAny((event, ...args) => {
|
|
2446
|
+
* console.log(`got ${event}`);
|
|
2447
|
+
* });
|
|
2448
|
+
*
|
|
2449
|
+
* @param listener
|
|
2450
|
+
*/
|
|
2451
|
+
onAny(e) {
|
|
2452
|
+
return this._anyListeners = this._anyListeners || [], this._anyListeners.push(e), this;
|
|
2453
|
+
}
|
|
2454
|
+
/**
|
|
2455
|
+
* Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the
|
|
2456
|
+
* callback. The listener is added to the beginning of the listeners array.
|
|
2457
|
+
*
|
|
2458
|
+
* @example
|
|
2459
|
+
* socket.prependAny((event, ...args) => {
|
|
2460
|
+
* console.log(`got event ${event}`);
|
|
2461
|
+
* });
|
|
2462
|
+
*
|
|
2463
|
+
* @param listener
|
|
2464
|
+
*/
|
|
2465
|
+
prependAny(e) {
|
|
2466
|
+
return this._anyListeners = this._anyListeners || [], this._anyListeners.unshift(e), this;
|
|
2467
|
+
}
|
|
2468
|
+
/**
|
|
2469
|
+
* Removes the listener that will be fired when any event is emitted.
|
|
2470
|
+
*
|
|
2471
|
+
* @example
|
|
2472
|
+
* const catchAllListener = (event, ...args) => {
|
|
2473
|
+
* console.log(`got event ${event}`);
|
|
2474
|
+
* }
|
|
2475
|
+
*
|
|
2476
|
+
* socket.onAny(catchAllListener);
|
|
2477
|
+
*
|
|
2478
|
+
* // remove a specific listener
|
|
2479
|
+
* socket.offAny(catchAllListener);
|
|
2480
|
+
*
|
|
2481
|
+
* // or remove all listeners
|
|
2482
|
+
* socket.offAny();
|
|
2483
|
+
*
|
|
2484
|
+
* @param listener
|
|
2485
|
+
*/
|
|
2486
|
+
offAny(e) {
|
|
2487
|
+
if (!this._anyListeners)
|
|
2488
|
+
return this;
|
|
2489
|
+
if (e) {
|
|
2490
|
+
const t = this._anyListeners;
|
|
2491
|
+
for (let r = 0; r < t.length; r++)
|
|
2492
|
+
if (e === t[r])
|
|
2493
|
+
return t.splice(r, 1), this;
|
|
2494
|
+
} else
|
|
2495
|
+
this._anyListeners = [];
|
|
2496
|
+
return this;
|
|
2497
|
+
}
|
|
2498
|
+
/**
|
|
2499
|
+
* Returns an array of listeners that are listening for any event that is specified. This array can be manipulated,
|
|
2500
|
+
* e.g. to remove listeners.
|
|
2501
|
+
*/
|
|
2502
|
+
listenersAny() {
|
|
2503
|
+
return this._anyListeners || [];
|
|
2504
|
+
}
|
|
2505
|
+
/**
|
|
2506
|
+
* Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the
|
|
2507
|
+
* callback.
|
|
2508
|
+
*
|
|
2509
|
+
* Note: acknowledgements sent to the server are not included.
|
|
2510
|
+
*
|
|
2511
|
+
* @example
|
|
2512
|
+
* socket.onAnyOutgoing((event, ...args) => {
|
|
2513
|
+
* console.log(`sent event ${event}`);
|
|
2514
|
+
* });
|
|
2515
|
+
*
|
|
2516
|
+
* @param listener
|
|
2517
|
+
*/
|
|
2518
|
+
onAnyOutgoing(e) {
|
|
2519
|
+
return this._anyOutgoingListeners = this._anyOutgoingListeners || [], this._anyOutgoingListeners.push(e), this;
|
|
2520
|
+
}
|
|
2521
|
+
/**
|
|
2522
|
+
* Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the
|
|
2523
|
+
* callback. The listener is added to the beginning of the listeners array.
|
|
2524
|
+
*
|
|
2525
|
+
* Note: acknowledgements sent to the server are not included.
|
|
2526
|
+
*
|
|
2527
|
+
* @example
|
|
2528
|
+
* socket.prependAnyOutgoing((event, ...args) => {
|
|
2529
|
+
* console.log(`sent event ${event}`);
|
|
2530
|
+
* });
|
|
2531
|
+
*
|
|
2532
|
+
* @param listener
|
|
2533
|
+
*/
|
|
2534
|
+
prependAnyOutgoing(e) {
|
|
2535
|
+
return this._anyOutgoingListeners = this._anyOutgoingListeners || [], this._anyOutgoingListeners.unshift(e), this;
|
|
2536
|
+
}
|
|
2537
|
+
/**
|
|
2538
|
+
* Removes the listener that will be fired when any event is emitted.
|
|
2539
|
+
*
|
|
2540
|
+
* @example
|
|
2541
|
+
* const catchAllListener = (event, ...args) => {
|
|
2542
|
+
* console.log(`sent event ${event}`);
|
|
2543
|
+
* }
|
|
2544
|
+
*
|
|
2545
|
+
* socket.onAnyOutgoing(catchAllListener);
|
|
2546
|
+
*
|
|
2547
|
+
* // remove a specific listener
|
|
2548
|
+
* socket.offAnyOutgoing(catchAllListener);
|
|
2549
|
+
*
|
|
2550
|
+
* // or remove all listeners
|
|
2551
|
+
* socket.offAnyOutgoing();
|
|
2552
|
+
*
|
|
2553
|
+
* @param [listener] - the catch-all listener (optional)
|
|
2554
|
+
*/
|
|
2555
|
+
offAnyOutgoing(e) {
|
|
2556
|
+
if (!this._anyOutgoingListeners)
|
|
2557
|
+
return this;
|
|
2558
|
+
if (e) {
|
|
2559
|
+
const t = this._anyOutgoingListeners;
|
|
2560
|
+
for (let r = 0; r < t.length; r++)
|
|
2561
|
+
if (e === t[r])
|
|
2562
|
+
return t.splice(r, 1), this;
|
|
2563
|
+
} else
|
|
2564
|
+
this._anyOutgoingListeners = [];
|
|
2565
|
+
return this;
|
|
2566
|
+
}
|
|
2567
|
+
/**
|
|
2568
|
+
* Returns an array of listeners that are listening for any event that is specified. This array can be manipulated,
|
|
2569
|
+
* e.g. to remove listeners.
|
|
2570
|
+
*/
|
|
2571
|
+
listenersAnyOutgoing() {
|
|
2572
|
+
return this._anyOutgoingListeners || [];
|
|
2573
|
+
}
|
|
2574
|
+
/**
|
|
2575
|
+
* Notify the listeners for each packet sent
|
|
2576
|
+
*
|
|
2577
|
+
* @param packet
|
|
2578
|
+
*
|
|
2579
|
+
* @private
|
|
2580
|
+
*/
|
|
2581
|
+
notifyOutgoingListeners(e) {
|
|
2582
|
+
if (this._anyOutgoingListeners && this._anyOutgoingListeners.length) {
|
|
2583
|
+
const t = this._anyOutgoingListeners.slice();
|
|
2584
|
+
for (const r of t)
|
|
2585
|
+
r.apply(this, e.data);
|
|
2586
|
+
}
|
|
2587
|
+
}
|
|
2588
|
+
}
|
|
2589
|
+
function F(s) {
|
|
2590
|
+
s = s || {}, this.ms = s.min || 100, this.max = s.max || 1e4, this.factor = s.factor || 2, this.jitter = s.jitter > 0 && s.jitter <= 1 ? s.jitter : 0, this.attempts = 0;
|
|
2591
|
+
}
|
|
2592
|
+
F.prototype.duration = function() {
|
|
2593
|
+
var s = this.ms * Math.pow(this.factor, this.attempts++);
|
|
2594
|
+
if (this.jitter) {
|
|
2595
|
+
var e = Math.random(), t = Math.floor(e * this.jitter * s);
|
|
2596
|
+
s = (Math.floor(e * 10) & 1) == 0 ? s - t : s + t;
|
|
2597
|
+
}
|
|
2598
|
+
return Math.min(s, this.max) | 0;
|
|
2599
|
+
};
|
|
2600
|
+
F.prototype.reset = function() {
|
|
2601
|
+
this.attempts = 0;
|
|
2602
|
+
};
|
|
2603
|
+
F.prototype.setMin = function(s) {
|
|
2604
|
+
this.ms = s;
|
|
2605
|
+
};
|
|
2606
|
+
F.prototype.setMax = function(s) {
|
|
2607
|
+
this.max = s;
|
|
2608
|
+
};
|
|
2609
|
+
F.prototype.setJitter = function(s) {
|
|
2610
|
+
this.jitter = s;
|
|
2611
|
+
};
|
|
2612
|
+
class Oe extends S {
|
|
2613
|
+
constructor(e, t) {
|
|
2614
|
+
var r;
|
|
2615
|
+
super(), this.nsps = {}, this.subs = [], e && typeof e == "object" && (t = e, e = void 0), t = t || {}, t.path = t.path || "/socket.io", this.opts = t, ge(this, t), this.reconnection(t.reconnection !== !1), this.reconnectionAttempts(t.reconnectionAttempts || 1 / 0), this.reconnectionDelay(t.reconnectionDelay || 1e3), this.reconnectionDelayMax(t.reconnectionDelayMax || 5e3), this.randomizationFactor((r = t.randomizationFactor) !== null && r !== void 0 ? r : 0.5), this.backoff = new F({
|
|
2616
|
+
min: this.reconnectionDelay(),
|
|
2617
|
+
max: this.reconnectionDelayMax(),
|
|
2618
|
+
jitter: this.randomizationFactor()
|
|
2619
|
+
}), this.timeout(t.timeout == null ? 2e4 : t.timeout), this._readyState = "closed", this.uri = e;
|
|
2620
|
+
const i = t.parser || er;
|
|
2621
|
+
this.encoder = new i.Encoder(), this.decoder = new i.Decoder(), this._autoConnect = t.autoConnect !== !1, this._autoConnect && this.open();
|
|
2622
|
+
}
|
|
2623
|
+
reconnection(e) {
|
|
2624
|
+
return arguments.length ? (this._reconnection = !!e, e || (this.skipReconnect = !0), this) : this._reconnection;
|
|
2625
|
+
}
|
|
2626
|
+
reconnectionAttempts(e) {
|
|
2627
|
+
return e === void 0 ? this._reconnectionAttempts : (this._reconnectionAttempts = e, this);
|
|
2628
|
+
}
|
|
2629
|
+
reconnectionDelay(e) {
|
|
2630
|
+
var t;
|
|
2631
|
+
return e === void 0 ? this._reconnectionDelay : (this._reconnectionDelay = e, (t = this.backoff) === null || t === void 0 || t.setMin(e), this);
|
|
2632
|
+
}
|
|
2633
|
+
randomizationFactor(e) {
|
|
2634
|
+
var t;
|
|
2635
|
+
return e === void 0 ? this._randomizationFactor : (this._randomizationFactor = e, (t = this.backoff) === null || t === void 0 || t.setJitter(e), this);
|
|
2636
|
+
}
|
|
2637
|
+
reconnectionDelayMax(e) {
|
|
2638
|
+
var t;
|
|
2639
|
+
return e === void 0 ? this._reconnectionDelayMax : (this._reconnectionDelayMax = e, (t = this.backoff) === null || t === void 0 || t.setMax(e), this);
|
|
2640
|
+
}
|
|
2641
|
+
timeout(e) {
|
|
2642
|
+
return arguments.length ? (this._timeout = e, this) : this._timeout;
|
|
2643
|
+
}
|
|
2644
|
+
/**
|
|
2645
|
+
* Starts trying to reconnect if reconnection is enabled and we have not
|
|
2646
|
+
* started reconnecting yet
|
|
2647
|
+
*
|
|
2648
|
+
* @private
|
|
2649
|
+
*/
|
|
2650
|
+
maybeReconnectOnOpen() {
|
|
2651
|
+
!this._reconnecting && this._reconnection && this.backoff.attempts === 0 && this.reconnect();
|
|
2652
|
+
}
|
|
2653
|
+
/**
|
|
2654
|
+
* Sets the current transport `socket`.
|
|
2655
|
+
*
|
|
2656
|
+
* @param {Function} fn - optional, callback
|
|
2657
|
+
* @return self
|
|
2658
|
+
* @public
|
|
2659
|
+
*/
|
|
2660
|
+
open(e) {
|
|
2661
|
+
if (~this._readyState.indexOf("open"))
|
|
2662
|
+
return this;
|
|
2663
|
+
this.engine = new Zs(this.uri, this.opts);
|
|
2664
|
+
const t = this.engine, r = this;
|
|
2665
|
+
this._readyState = "opening", this.skipReconnect = !1;
|
|
2666
|
+
const i = K(t, "open", function() {
|
|
2667
|
+
r.onopen(), e && e();
|
|
2668
|
+
}), n = (l) => {
|
|
2669
|
+
this.cleanup(), this._readyState = "closed", this.emitReserved("error", l), e ? e(l) : this.maybeReconnectOnOpen();
|
|
2670
|
+
}, o = K(t, "error", n);
|
|
2671
|
+
if (this._timeout !== !1) {
|
|
2672
|
+
const l = this._timeout, a = this.setTimeoutFn(() => {
|
|
2673
|
+
i(), n(new Error("timeout")), t.close();
|
|
2674
|
+
}, l);
|
|
2675
|
+
this.opts.autoUnref && a.unref(), this.subs.push(() => {
|
|
2676
|
+
this.clearTimeoutFn(a);
|
|
2677
|
+
});
|
|
2678
|
+
}
|
|
2679
|
+
return this.subs.push(i), this.subs.push(o), this;
|
|
2680
|
+
}
|
|
2681
|
+
/**
|
|
2682
|
+
* Alias for open()
|
|
2683
|
+
*
|
|
2684
|
+
* @return self
|
|
2685
|
+
* @public
|
|
2686
|
+
*/
|
|
2687
|
+
connect(e) {
|
|
2688
|
+
return this.open(e);
|
|
2689
|
+
}
|
|
2690
|
+
/**
|
|
2691
|
+
* Called upon transport open.
|
|
2692
|
+
*
|
|
2693
|
+
* @private
|
|
2694
|
+
*/
|
|
2695
|
+
onopen() {
|
|
2696
|
+
this.cleanup(), this._readyState = "open", this.emitReserved("open");
|
|
2697
|
+
const e = this.engine;
|
|
2698
|
+
this.subs.push(
|
|
2699
|
+
K(e, "ping", this.onping.bind(this)),
|
|
2700
|
+
K(e, "data", this.ondata.bind(this)),
|
|
2701
|
+
K(e, "error", this.onerror.bind(this)),
|
|
2702
|
+
K(e, "close", this.onclose.bind(this)),
|
|
2703
|
+
// @ts-ignore
|
|
2704
|
+
K(this.decoder, "decoded", this.ondecoded.bind(this))
|
|
2705
|
+
);
|
|
2706
|
+
}
|
|
2707
|
+
/**
|
|
2708
|
+
* Called upon a ping.
|
|
2709
|
+
*
|
|
2710
|
+
* @private
|
|
2711
|
+
*/
|
|
2712
|
+
onping() {
|
|
2713
|
+
this.emitReserved("ping");
|
|
2714
|
+
}
|
|
2715
|
+
/**
|
|
2716
|
+
* Called with data.
|
|
2717
|
+
*
|
|
2718
|
+
* @private
|
|
2719
|
+
*/
|
|
2720
|
+
ondata(e) {
|
|
2721
|
+
try {
|
|
2722
|
+
this.decoder.add(e);
|
|
2723
|
+
} catch (t) {
|
|
2724
|
+
this.onclose("parse error", t);
|
|
2725
|
+
}
|
|
2726
|
+
}
|
|
2727
|
+
/**
|
|
2728
|
+
* Called when parser fully decodes a packet.
|
|
2729
|
+
*
|
|
2730
|
+
* @private
|
|
2731
|
+
*/
|
|
2732
|
+
ondecoded(e) {
|
|
2733
|
+
ye(() => {
|
|
2734
|
+
this.emitReserved("packet", e);
|
|
2735
|
+
}, this.setTimeoutFn);
|
|
2736
|
+
}
|
|
2737
|
+
/**
|
|
2738
|
+
* Called upon socket error.
|
|
2739
|
+
*
|
|
2740
|
+
* @private
|
|
2741
|
+
*/
|
|
2742
|
+
onerror(e) {
|
|
2743
|
+
this.emitReserved("error", e);
|
|
2744
|
+
}
|
|
2745
|
+
/**
|
|
2746
|
+
* Creates a new socket for the given `nsp`.
|
|
2747
|
+
*
|
|
2748
|
+
* @return {Socket}
|
|
2749
|
+
* @public
|
|
2750
|
+
*/
|
|
2751
|
+
socket(e, t) {
|
|
2752
|
+
let r = this.nsps[e];
|
|
2753
|
+
return r ? this._autoConnect && !r.active && r.connect() : (r = new Tt(this, e, t), this.nsps[e] = r), r;
|
|
2754
|
+
}
|
|
2755
|
+
/**
|
|
2756
|
+
* Called upon a socket close.
|
|
2757
|
+
*
|
|
2758
|
+
* @param socket
|
|
2759
|
+
* @private
|
|
2760
|
+
*/
|
|
2761
|
+
_destroy(e) {
|
|
2762
|
+
const t = Object.keys(this.nsps);
|
|
2763
|
+
for (const r of t)
|
|
2764
|
+
if (this.nsps[r].active)
|
|
2765
|
+
return;
|
|
2766
|
+
this._close();
|
|
2767
|
+
}
|
|
2768
|
+
/**
|
|
2769
|
+
* Writes a packet.
|
|
2770
|
+
*
|
|
2771
|
+
* @param packet
|
|
2772
|
+
* @private
|
|
2773
|
+
*/
|
|
2774
|
+
_packet(e) {
|
|
2775
|
+
const t = this.encoder.encode(e);
|
|
2776
|
+
for (let r = 0; r < t.length; r++)
|
|
2777
|
+
this.engine.write(t[r], e.options);
|
|
2778
|
+
}
|
|
2779
|
+
/**
|
|
2780
|
+
* Clean up transport subscriptions and packet buffer.
|
|
2781
|
+
*
|
|
2782
|
+
* @private
|
|
2783
|
+
*/
|
|
2784
|
+
cleanup() {
|
|
2785
|
+
this.subs.forEach((e) => e()), this.subs.length = 0, this.decoder.destroy();
|
|
2786
|
+
}
|
|
2787
|
+
/**
|
|
2788
|
+
* Close the current socket.
|
|
2789
|
+
*
|
|
2790
|
+
* @private
|
|
2791
|
+
*/
|
|
2792
|
+
_close() {
|
|
2793
|
+
this.skipReconnect = !0, this._reconnecting = !1, this.onclose("forced close");
|
|
2794
|
+
}
|
|
2795
|
+
/**
|
|
2796
|
+
* Alias for close()
|
|
2797
|
+
*
|
|
2798
|
+
* @private
|
|
2799
|
+
*/
|
|
2800
|
+
disconnect() {
|
|
2801
|
+
return this._close();
|
|
2802
|
+
}
|
|
2803
|
+
/**
|
|
2804
|
+
* Called when:
|
|
2805
|
+
*
|
|
2806
|
+
* - the low-level engine is closed
|
|
2807
|
+
* - the parser encountered a badly formatted packet
|
|
2808
|
+
* - all sockets are disconnected
|
|
2809
|
+
*
|
|
2810
|
+
* @private
|
|
2811
|
+
*/
|
|
2812
|
+
onclose(e, t) {
|
|
2813
|
+
var r;
|
|
2814
|
+
this.cleanup(), (r = this.engine) === null || r === void 0 || r.close(), this.backoff.reset(), this._readyState = "closed", this.emitReserved("close", e, t), this._reconnection && !this.skipReconnect && this.reconnect();
|
|
2815
|
+
}
|
|
2816
|
+
/**
|
|
2817
|
+
* Attempt a reconnection.
|
|
2818
|
+
*
|
|
2819
|
+
* @private
|
|
2820
|
+
*/
|
|
2821
|
+
reconnect() {
|
|
2822
|
+
if (this._reconnecting || this.skipReconnect)
|
|
2823
|
+
return this;
|
|
2824
|
+
const e = this;
|
|
2825
|
+
if (this.backoff.attempts >= this._reconnectionAttempts)
|
|
2826
|
+
this.backoff.reset(), this.emitReserved("reconnect_failed"), this._reconnecting = !1;
|
|
2827
|
+
else {
|
|
2828
|
+
const t = this.backoff.duration();
|
|
2829
|
+
this._reconnecting = !0;
|
|
2830
|
+
const r = this.setTimeoutFn(() => {
|
|
2831
|
+
e.skipReconnect || (this.emitReserved("reconnect_attempt", e.backoff.attempts), !e.skipReconnect && e.open((i) => {
|
|
2832
|
+
i ? (e._reconnecting = !1, e.reconnect(), this.emitReserved("reconnect_error", i)) : e.onreconnect();
|
|
2833
|
+
}));
|
|
2834
|
+
}, t);
|
|
2835
|
+
this.opts.autoUnref && r.unref(), this.subs.push(() => {
|
|
2836
|
+
this.clearTimeoutFn(r);
|
|
2837
|
+
});
|
|
2838
|
+
}
|
|
2839
|
+
}
|
|
2840
|
+
/**
|
|
2841
|
+
* Called upon successful reconnect.
|
|
2842
|
+
*
|
|
2843
|
+
* @private
|
|
2844
|
+
*/
|
|
2845
|
+
onreconnect() {
|
|
2846
|
+
const e = this.backoff.attempts;
|
|
2847
|
+
this._reconnecting = !1, this.backoff.reset(), this.emitReserved("reconnect", e);
|
|
2848
|
+
}
|
|
2849
|
+
}
|
|
2850
|
+
const G = {};
|
|
2851
|
+
function he(s, e) {
|
|
2852
|
+
typeof s == "object" && (e = s, s = void 0), e = e || {};
|
|
2853
|
+
const t = Rs(s, e.path || "/socket.io"), r = t.source, i = t.id, n = t.path, o = G[i] && n in G[i].nsps, l = e.forceNew || e["force new connection"] || e.multiplex === !1 || o;
|
|
2854
|
+
let a;
|
|
2855
|
+
return l ? a = new Oe(r, e) : (G[i] || (G[i] = new Oe(r, e)), a = G[i]), t.query && !e.query && (e.query = t.queryKey), a.socket(t.path, e);
|
|
2856
|
+
}
|
|
2857
|
+
Object.assign(he, {
|
|
2858
|
+
Manager: Oe,
|
|
2859
|
+
Socket: Tt,
|
|
2860
|
+
io: he,
|
|
2861
|
+
connect: he
|
|
2862
|
+
});
|
|
2863
|
+
var Kr = class {
|
|
2864
|
+
constructor(s) {
|
|
2865
|
+
this.publicKey = s.publicKey;
|
|
2866
|
+
}
|
|
2867
|
+
getPublicKey() {
|
|
2868
|
+
return this.publicKey;
|
|
2869
|
+
}
|
|
2870
|
+
}, Ot = {
|
|
2871
|
+
trigger: {
|
|
2872
|
+
loading: "Cargando..."
|
|
2873
|
+
},
|
|
2874
|
+
modal: {
|
|
2875
|
+
titles: {
|
|
2876
|
+
selectAsset: 'Selecciona el <span class="highlight">stablecoin</span>',
|
|
2877
|
+
selectNetwork: 'Selecciona la <span class="highlight">red</span>',
|
|
2878
|
+
scanQr: 'Depósito <span class="highlight">{symbol}</span>',
|
|
2879
|
+
success: '¡Gracias por <span class="highlight">tu compra!</span>',
|
|
2880
|
+
error: "Error en el Pago",
|
|
2881
|
+
idle: "Estado inesperado",
|
|
2882
|
+
processing: '¡Procesando <span class="highlight">tu pago!</span>'
|
|
2883
|
+
},
|
|
2884
|
+
subtitles: {
|
|
2885
|
+
selectAsset: "Selecciona la stablecoin con la que deseas pagar",
|
|
2886
|
+
selectNetwork: "Selecciona la red de tu preferencia",
|
|
2887
|
+
idle: "Ocurrio un error inesperado"
|
|
2888
|
+
},
|
|
2889
|
+
actions: {
|
|
2890
|
+
back: "Volver",
|
|
2891
|
+
close: "Cerrar",
|
|
2892
|
+
support: "Soporte",
|
|
2893
|
+
scanApp: 'Escanea con tu celular y continua desde la app de <span style="color: var(--apolo-accent)">Apolo Pay</span>',
|
|
2894
|
+
copy: "Copiar",
|
|
2895
|
+
copied: "¡Copiado!",
|
|
2896
|
+
payFromDevice: "Pagar desde este dispositivo"
|
|
2897
|
+
},
|
|
2898
|
+
labels: {
|
|
2899
|
+
network: "Red",
|
|
2900
|
+
address: "Dirección de depósito",
|
|
2901
|
+
amount: "Monto",
|
|
2902
|
+
product: "Producto o Servicio",
|
|
2903
|
+
minutes: "min",
|
|
2904
|
+
seconds: "seg",
|
|
2905
|
+
amountSent: "Monto Enviado",
|
|
2906
|
+
paid: "Pagado",
|
|
2907
|
+
remainingToPay: "Restante por pagar"
|
|
2908
|
+
},
|
|
2909
|
+
info: {
|
|
2910
|
+
noReloadPageTitle: '¡Por favor no <span style="color: var(--apolo-accent)">recargues la página!</span>',
|
|
2911
|
+
noReloadPageSubTitle: "La pantalla se actualizara cuando confirmes tu pago",
|
|
2912
|
+
selectNetworkLater: "Luego podrás seleccionar la red de tu preferencia"
|
|
2913
|
+
},
|
|
2914
|
+
warnings: {
|
|
2915
|
+
networkMatch: "Asegúrate de que la <strong>red de tu wallet coincida</strong> con la red de destino.",
|
|
2916
|
+
noNFT: "No envíes NFTs a esta wallet.",
|
|
2917
|
+
onlyToken: "Solo se aceptan <strong>depósitos en {symbol}</strong>. El envío de otro tipo de token podría resultar en su pérdida.",
|
|
2918
|
+
timer: "Realiza el pago dentro del tiempo indicado. <strong>{time}</strong> De lo contrario, el código QR se vencerá."
|
|
2919
|
+
},
|
|
2920
|
+
success: {
|
|
2921
|
+
message: "Tu pago fue exitoso y en breve recibirás un correo",
|
|
2922
|
+
message2: "con los detalles.",
|
|
2923
|
+
details: "Detalles de la compra",
|
|
2924
|
+
support: "Cualquier duda o inquietud puedes comunicarte con soporte"
|
|
2925
|
+
}
|
|
2926
|
+
},
|
|
2927
|
+
successes: {
|
|
2928
|
+
success: "Éxito"
|
|
2929
|
+
},
|
|
2930
|
+
errors: {
|
|
2931
|
+
generic: "Ocurrió un error inesperado.",
|
|
2932
|
+
publicKeyMissing: "Falta la Public Key",
|
|
2933
|
+
config: "Error de Configuración",
|
|
2934
|
+
timeout: "El tiempo para realizar el pago ha expirado. Por favor genera una nueva orden.",
|
|
2935
|
+
paymentFailed: "El pago ha fallado. Por favor genera una nueva orden.",
|
|
2936
|
+
connectError: "Error de conexión.",
|
|
2937
|
+
socketConnectionError: "Error de conexión en el socket.",
|
|
2938
|
+
dataLoadError: "No se pudo cargar los datos de pago.",
|
|
2939
|
+
qrFetchError: "Fallo al obtener los detalles del código QR.",
|
|
2940
|
+
paymentProcessNotAvailable: "El proceso de pago no está disponible.",
|
|
2941
|
+
getAssetsError: "Error al obtener los activos.",
|
|
2942
|
+
unknownError: "Ocurrió un error inesperado."
|
|
2943
|
+
}
|
|
2944
|
+
}, sr = {
|
|
2945
|
+
trigger: {
|
|
2946
|
+
loading: "Loading..."
|
|
2947
|
+
},
|
|
2948
|
+
modal: {
|
|
2949
|
+
titles: {
|
|
2950
|
+
selectAsset: 'Select <span class="highlight">stablecoin</span>',
|
|
2951
|
+
selectNetwork: 'Select <span class="highlight">network</span>',
|
|
2952
|
+
scanQr: 'Deposit <span class="highlight">{symbol}</span>',
|
|
2953
|
+
success: 'Thanks for <span class="highlight">your purchase!</span>',
|
|
2954
|
+
error: "Payment Error",
|
|
2955
|
+
idle: "Unexpected state",
|
|
2956
|
+
processing: 'Processing <span class="highlight">your payment!</span>'
|
|
2957
|
+
},
|
|
2958
|
+
subtitles: {
|
|
2959
|
+
selectAsset: "Select the stablecoin you want to pay with",
|
|
2960
|
+
selectNetwork: "Select your preferred network",
|
|
2961
|
+
idle: "An Unexpected error occurred"
|
|
2962
|
+
},
|
|
2963
|
+
actions: {
|
|
2964
|
+
back: "Back",
|
|
2965
|
+
close: "Close",
|
|
2966
|
+
support: "Support",
|
|
2967
|
+
scanApp: 'Scan with your phone and continue from <br><span style="color: var(--apolo-accent)">Apolo Pay</span> app',
|
|
2968
|
+
copy: "Copy",
|
|
2969
|
+
copied: "Copied!",
|
|
2970
|
+
payFromDevice: "Pay from this device"
|
|
2971
|
+
},
|
|
2972
|
+
labels: {
|
|
2973
|
+
network: "Network",
|
|
2974
|
+
address: "Deposit Address",
|
|
2975
|
+
amount: "Amount",
|
|
2976
|
+
product: "Product or Service",
|
|
2977
|
+
minutes: "min",
|
|
2978
|
+
seconds: "sec",
|
|
2979
|
+
amountSent: "Amount sent",
|
|
2980
|
+
paid: "Paid",
|
|
2981
|
+
remainingToPay: "Remaining balance to pay"
|
|
2982
|
+
},
|
|
2983
|
+
info: {
|
|
2984
|
+
noReloadPageTitle: 'Please do not <span style="color: var(--apolo-accent)">reload the page!</span>',
|
|
2985
|
+
noReloadPageSubTitle: "The screen will update when you confirm your payment",
|
|
2986
|
+
selectNetworkLater: "You will be able to select your preferred network later"
|
|
2987
|
+
},
|
|
2988
|
+
warnings: {
|
|
2989
|
+
networkMatch: "Ensure your <strong>wallet network matches</strong> the destination network.",
|
|
2990
|
+
noNFT: "Do not send NFTs to this wallet.",
|
|
2991
|
+
onlyToken: "Only <strong>{symbol} deposits</strong> are accepted. Sending other tokens may result in loss.",
|
|
2992
|
+
timer: "Complete payment within <strong>{time}</strong>. Otherwise, the QR code will expire."
|
|
2993
|
+
},
|
|
2994
|
+
success: {
|
|
2995
|
+
message: "Your payment was successful. You will receive an email",
|
|
2996
|
+
message2: "shortly.",
|
|
2997
|
+
details: "Purchase Details",
|
|
2998
|
+
support: "Any doubt or inquiry you can contact support"
|
|
2999
|
+
}
|
|
3000
|
+
},
|
|
3001
|
+
successes: {
|
|
3002
|
+
success: "Success"
|
|
3003
|
+
},
|
|
3004
|
+
errors: {
|
|
3005
|
+
generic: "An unexpected error occurred.",
|
|
3006
|
+
publicKeyMissing: "Public Key is missing",
|
|
3007
|
+
config: "Config Error",
|
|
3008
|
+
timeout: "The payment time has expired. Please generate a new order.",
|
|
3009
|
+
paymentFailed: "The payment has failed. Please generate a new order.",
|
|
3010
|
+
connectError: "Connection error in real time.",
|
|
3011
|
+
socketConnectionError: "Connection error in socket.",
|
|
3012
|
+
dataLoadError: "Could not load payment options.",
|
|
3013
|
+
qrFetchError: "Failed to get payment details.",
|
|
3014
|
+
paymentProcessNotAvailable: "The payment process is not available.",
|
|
3015
|
+
getAssetsError: "Failed to get assets.",
|
|
3016
|
+
unknownError: "An unexpected error occurred."
|
|
3017
|
+
}
|
|
3018
|
+
}, y = class {
|
|
3019
|
+
// Cambiar idioma
|
|
3020
|
+
static setLocale(s) {
|
|
3021
|
+
this._currentLocale = s, this._dictionary = s === "en" ? sr : Ot;
|
|
3022
|
+
}
|
|
3023
|
+
static get current() {
|
|
3024
|
+
return this._currentLocale;
|
|
3025
|
+
}
|
|
3026
|
+
// Función para obtener texto (Tipado seguro para claves anidadas sería complejo,
|
|
3027
|
+
// así que usaremos acceso directo o un getter helper si lo prefieres)
|
|
3028
|
+
static get t() {
|
|
3029
|
+
return this._dictionary;
|
|
3030
|
+
}
|
|
3031
|
+
// Helper para interpolar variables: "Hola {name}" -> "Hola Mundo"
|
|
3032
|
+
static interpolate(s, e) {
|
|
3033
|
+
return s.replace(/{(\w+)}/g, (t, r) => typeof e[r] < "u" ? String(e[r]) : t);
|
|
3034
|
+
}
|
|
3035
|
+
};
|
|
3036
|
+
y._currentLocale = "es";
|
|
3037
|
+
y._dictionary = Ot;
|
|
3038
|
+
var X = /* @__PURE__ */ ((s) => (s.success = "success", s.payment_success = "payment_success", s.payment_failed = "payment_failed", s.payment_partial = "payment_partial", s.payment_timeout = "payment_timeout", s.connect_error = "connect_error", s.socket_connection_error = "socket_connection_error", s.data_load_error = "data_load_error", s.qr_fetch_error = "qr_fetch_error", s.paymentProcessNotAvailable = "payment_process_not_available", s.get_assets_error = "get_assets_error", s.unknown_error = "unknown_error", s))(X || {}), xt = class {
|
|
3039
|
+
constructor({ code: s, message: e }) {
|
|
3040
|
+
this.code = s, this.message = e;
|
|
3041
|
+
}
|
|
3042
|
+
}, lt = class Ut extends xt {
|
|
3043
|
+
constructor({ code: e, message: t, result: r }) {
|
|
3044
|
+
super({ code: e, message: t }), this.result = r;
|
|
3045
|
+
}
|
|
3046
|
+
static fromJson(e, { code: t, message: r, result: i } = {}) {
|
|
3047
|
+
const n = e.status || t || "success", o = e.message || r || y.t.successes.success, l = i?.(e.result) || e.result || e;
|
|
3048
|
+
return new Ut({ code: n, message: o, result: l });
|
|
3049
|
+
}
|
|
3050
|
+
}, Ce = class xe extends xt {
|
|
3051
|
+
constructor({ code: e, message: t, error: r }) {
|
|
3052
|
+
super({ code: e, message: t }), this.error = r;
|
|
3053
|
+
}
|
|
3054
|
+
static fromError(e, { code: t, message: r } = {}) {
|
|
3055
|
+
if (e instanceof xe) return e;
|
|
3056
|
+
const i = t || e.statusCode || "unknown_error", n = r || e.message || y.t.errors.unknownError, o = e.error || e;
|
|
3057
|
+
return new xe({ code: i, message: n, error: o });
|
|
3058
|
+
}
|
|
3059
|
+
}, rr = "https://p2p.apolopay.app", ct = "https://pb-api.apolopay.app", ir = "https://pb-ws.apolopay.app", Ue = class {
|
|
3060
|
+
static async getAssets() {
|
|
3061
|
+
try {
|
|
3062
|
+
const e = await (await fetch(`${ct}/payment-button/assets`, {
|
|
3063
|
+
method: "GET",
|
|
3064
|
+
headers: this.headers()
|
|
3065
|
+
})).json();
|
|
3066
|
+
return lt.fromJson(e);
|
|
3067
|
+
} catch (s) {
|
|
3068
|
+
throw Ce.fromError(s, {
|
|
3069
|
+
code: "get_assets_error",
|
|
3070
|
+
message: y.t.errors.getAssetsError
|
|
3071
|
+
});
|
|
3072
|
+
}
|
|
3073
|
+
}
|
|
3074
|
+
static async fetchQrCodeDetails({
|
|
3075
|
+
processId: s,
|
|
3076
|
+
assetId: e,
|
|
3077
|
+
networkId: t,
|
|
3078
|
+
publicKey: r
|
|
3079
|
+
}) {
|
|
3080
|
+
try {
|
|
3081
|
+
const i = await fetch(`${ct}/payment-button/process/confirm`, {
|
|
3082
|
+
method: "POST",
|
|
3083
|
+
headers: this.headers(r),
|
|
3084
|
+
body: JSON.stringify({
|
|
3085
|
+
processId: s,
|
|
3086
|
+
assetId: e,
|
|
3087
|
+
networkId: t
|
|
3088
|
+
})
|
|
3089
|
+
}), n = await i.json();
|
|
3090
|
+
if (!n.result)
|
|
3091
|
+
throw new Ce({
|
|
3092
|
+
code: "payment_process_not_available",
|
|
3093
|
+
message: y.t.errors.paymentProcessNotAvailable
|
|
3094
|
+
});
|
|
3095
|
+
const o = n.result.wallet, a = n.result.network === "apolopay" ? `${rr}/payment-process/${s}` : o;
|
|
3096
|
+
return lt.fromJson(n, {
|
|
3097
|
+
result: (p) => {
|
|
3098
|
+
const h = Date.now() + 600 * 1e3;
|
|
3099
|
+
let E = p.expiresAtMs ?? p.expiresAt;
|
|
3100
|
+
const M = ((j) => {
|
|
3101
|
+
if (!j) return h;
|
|
3102
|
+
let T = 0;
|
|
3103
|
+
if (!isNaN(Number(j)))
|
|
3104
|
+
T = Number(j);
|
|
3105
|
+
else if (typeof j == "string") {
|
|
3106
|
+
const We = new Date(j).getTime();
|
|
3107
|
+
isNaN(We) || (T = We);
|
|
3108
|
+
}
|
|
3109
|
+
if (T === 0) return h;
|
|
3110
|
+
if (T < 1e10)
|
|
3111
|
+
T *= 1e3;
|
|
3112
|
+
else if (T > 1e13)
|
|
3113
|
+
for (; T > 2e13; )
|
|
3114
|
+
T = Math.floor(T / 1e3);
|
|
3115
|
+
return T;
|
|
3116
|
+
})(E);
|
|
3117
|
+
return {
|
|
3118
|
+
...p,
|
|
3119
|
+
address: a,
|
|
3120
|
+
qrCodeUrl: `https://api.qrserver.com/v1/create-qr-code/?size=150x150&data=${a}&ecc=H`,
|
|
3121
|
+
paymentUrl: a.startsWith("http") ? a : void 0,
|
|
3122
|
+
expiresAtMs: M
|
|
3123
|
+
};
|
|
3124
|
+
}
|
|
3125
|
+
});
|
|
3126
|
+
} catch (i) {
|
|
3127
|
+
throw Ce.fromError(i, {
|
|
3128
|
+
code: "qr_fetch_error",
|
|
3129
|
+
message: y.t.errors.qrFetchError
|
|
3130
|
+
});
|
|
3131
|
+
}
|
|
3132
|
+
}
|
|
3133
|
+
};
|
|
3134
|
+
Ue.headers = (s) => {
|
|
3135
|
+
const e = {
|
|
3136
|
+
"Content-Type": "application/json"
|
|
3137
|
+
};
|
|
3138
|
+
return s && (e["x-public-key"] = s), e;
|
|
3139
|
+
};
|
|
3140
|
+
var nr = class {
|
|
3141
|
+
constructor(s) {
|
|
3142
|
+
this.sessionOptions = null, this.socket = null, this.client = s;
|
|
3143
|
+
}
|
|
3144
|
+
connect(s) {
|
|
3145
|
+
if (typeof window > "u") return;
|
|
3146
|
+
if (this.sessionOptions = s, this.socket && this.socket.connected) return this.disconnect();
|
|
3147
|
+
this.socket = he(ir, {
|
|
3148
|
+
extraHeaders: {
|
|
3149
|
+
"x-public-key": this.client.getPublicKey()
|
|
3150
|
+
},
|
|
3151
|
+
transports: ["websocket", "polling"]
|
|
3152
|
+
});
|
|
3153
|
+
const { processId: e } = s;
|
|
3154
|
+
this.socket.on("connect", () => this.socket?.emit("process:connect", { processId: e })), console.log(`Conectado a Socket.io para processId: ${e}`), this.socket.on("process:message", (t) => this.handleWebSocketMessage(t)), this.socket.on("connect_error", (t) => {
|
|
3155
|
+
console.error("Error en conexión Socket.io:", t), this.sessionOptions?.onError?.({ code: "connect_error", message: y.t.errors.connectError, error: t }), this.disconnect();
|
|
3156
|
+
}), this.socket.on("disconnect", (t) => {
|
|
3157
|
+
console.info(`Socket.io Desconectado: ${t}`), this.socket = null;
|
|
3158
|
+
});
|
|
3159
|
+
}
|
|
3160
|
+
handleWebSocketMessage(s) {
|
|
3161
|
+
if (!s.success)
|
|
3162
|
+
return this.sessionOptions?.onError?.({
|
|
3163
|
+
code: "payment_failed",
|
|
3164
|
+
message: s.message,
|
|
3165
|
+
error: s.result
|
|
3166
|
+
});
|
|
3167
|
+
if (s.event === "partial_payment")
|
|
3168
|
+
return this.sessionOptions?.onPartialPayment?.({
|
|
3169
|
+
code: "payment_partial",
|
|
3170
|
+
message: s.message,
|
|
3171
|
+
result: s.result
|
|
3172
|
+
});
|
|
3173
|
+
if (s.event === "funds_received")
|
|
3174
|
+
return this.sessionOptions?.onSuccess?.({
|
|
3175
|
+
code: "payment_success",
|
|
3176
|
+
message: s.message,
|
|
3177
|
+
result: s.result
|
|
3178
|
+
});
|
|
3179
|
+
}
|
|
3180
|
+
disconnect() {
|
|
3181
|
+
this.socket && (this.socket.disconnect(), this.socket = null);
|
|
3182
|
+
}
|
|
3183
|
+
}, or = class {
|
|
3184
|
+
constructor(s) {
|
|
3185
|
+
this.client = s, this.socket = new nr(this.client);
|
|
3186
|
+
}
|
|
3187
|
+
getPublicKey() {
|
|
3188
|
+
return this.client.getPublicKey();
|
|
3189
|
+
}
|
|
3190
|
+
// --- Métodos para obtener datos ---
|
|
3191
|
+
async getAssets() {
|
|
3192
|
+
return (await Ue.getAssets()).result;
|
|
3193
|
+
}
|
|
3194
|
+
// --- Método para obtener datos del QR ---
|
|
3195
|
+
async fetchQrCodeDetails(s, e) {
|
|
3196
|
+
const t = await Ue.fetchQrCodeDetails({
|
|
3197
|
+
...s,
|
|
3198
|
+
processId: e.processId,
|
|
3199
|
+
publicKey: this.client.getPublicKey()
|
|
3200
|
+
});
|
|
3201
|
+
return this.socket.connect(e), t.result;
|
|
3202
|
+
}
|
|
3203
|
+
disconnectWebSocket() {
|
|
3204
|
+
this.socket.disconnect();
|
|
3205
|
+
}
|
|
3206
|
+
}, g = /* @__PURE__ */ ((s) => (s[s.SELECT_ASSET = 0] = "SELECT_ASSET", s[s.SELECT_NETWORK = 1] = "SELECT_NETWORK", s[s.SHOW_QR = 2] = "SHOW_QR", s[s.RESULT = 3] = "RESULT", s))(g || {});
|
|
3207
|
+
const Bt = B`
|
|
3208
|
+
:host {
|
|
3209
|
+
/* --- API PÚBLICA DE COLORES (THEMING) --- */
|
|
3210
|
+
--apolo-primary: var(--payment-button-primary, #0388c0);
|
|
3211
|
+
--apolo-primary-darkest: var(--payment-button-primary-darkest, #041c4c);
|
|
3212
|
+
--apolo-on-primary: var(--payment-button-on-primary, #ffffff);
|
|
3213
|
+
|
|
3214
|
+
--apolo-bg: var(--payment-button-bg, #f6f2ec);
|
|
3215
|
+
--apolo-text: var(--payment-button-text, #1c315c);
|
|
3216
|
+
--apolo-text-muted: var(--payment-button-text-muted, #6b7280);
|
|
3217
|
+
--apolo-accent: var(--payment-button-accent, #ea580c);
|
|
3218
|
+
--apolo-border: var(--payment-button-border, #e5e7eb);
|
|
3219
|
+
|
|
3220
|
+
/* --- API PÚBLICA DE FORMA Y TIPOGRAFÍA --- */
|
|
3221
|
+
--apolo-radius: var(--payment-button-radius, 12px);
|
|
3222
|
+
--apolo-radius-lg: var(--payment-button-radius-lg, 30px);
|
|
3223
|
+
--apolo-font: var(--payment-button-font, 'Inter', system-ui, -apple-system, sans-serif);
|
|
3224
|
+
--apolo-shadow: var(--payment-button-shadow, 0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1));
|
|
3225
|
+
--apolo-z-index: var(--payment-button-z-index, 9999);
|
|
3226
|
+
}
|
|
3227
|
+
|
|
3228
|
+
/* Reset global para componentes internos */
|
|
3229
|
+
* {
|
|
3230
|
+
box-sizing: border-box;
|
|
3231
|
+
font-family: var(--apolo-font);
|
|
3232
|
+
}
|
|
3233
|
+
`, Be = "data:image/png;base64,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";
|
|
3234
|
+
var ar = Object.defineProperty, lr = Object.getOwnPropertyDescriptor, W = (s, e, t, r) => {
|
|
3235
|
+
for (var i = r > 1 ? void 0 : r ? lr(e, t) : e, n = s.length - 1, o; n >= 0; n--)
|
|
3236
|
+
(o = s[n]) && (i = (r ? o(e, t, i) : o(i)) || i);
|
|
3237
|
+
return r && i && ar(e, t, i), i;
|
|
3238
|
+
};
|
|
3239
|
+
let L = class extends I {
|
|
3240
|
+
constructor() {
|
|
3241
|
+
super(...arguments), this.lang = "es", this.loading = !1, this.disabled = !1, this.label = void 0, this.hasError = !1;
|
|
3242
|
+
}
|
|
3243
|
+
render() {
|
|
3244
|
+
const s = y.t, e = this.hasError ? s.errors.config || "Config Error" : this.loading ? s.trigger.loading : this.label || "Apolo Pay";
|
|
3245
|
+
return f`
|
|
3246
|
+
<div class="button-wrapper">
|
|
3247
|
+
${this.hasError ? "" : f`
|
|
3248
|
+
<img class="logo-apolo" src="${Be}" alt="Icon" />
|
|
3249
|
+
`}
|
|
3250
|
+
<button
|
|
3251
|
+
?disabled=${this.disabled || this.loading || this.hasError}
|
|
3252
|
+
class="${this.hasError ? "error" : ""}"
|
|
3253
|
+
type="button"
|
|
3254
|
+
>
|
|
3255
|
+
${e}
|
|
3256
|
+
</button>
|
|
3257
|
+
</div>
|
|
3258
|
+
`;
|
|
3259
|
+
}
|
|
3260
|
+
};
|
|
3261
|
+
L.styles = [
|
|
3262
|
+
Bt,
|
|
3263
|
+
B`
|
|
3264
|
+
:host { display: inline-block; }
|
|
3265
|
+
|
|
3266
|
+
.button-wrapper {
|
|
3267
|
+
--img-size: 24px;
|
|
3268
|
+
--gap: 8px;
|
|
3269
|
+
}
|
|
3270
|
+
|
|
3271
|
+
button {
|
|
3272
|
+
position: relative;
|
|
3273
|
+
display: inline-flex;
|
|
3274
|
+
align-items: center;
|
|
3275
|
+
justify-content: center;
|
|
3276
|
+
width: 100%;
|
|
3277
|
+
height: 100%;
|
|
3278
|
+
padding: 12px 32px;
|
|
3279
|
+
|
|
3280
|
+
font-size: 0.9rem;
|
|
3281
|
+
letter-spacing: 0.5px;
|
|
3282
|
+
color: var(--apolo-on-primary);
|
|
3283
|
+
|
|
3284
|
+
background: #74727225;
|
|
3285
|
+
border: none;
|
|
3286
|
+
border-radius: 9999px;
|
|
3287
|
+
cursor: pointer;
|
|
3288
|
+
transition: transform 0.2s, background-color 0.2s;
|
|
3289
|
+
|
|
3290
|
+
text-indent: var(--img-size);
|
|
3291
|
+
mix-blend-mode: difference;
|
|
3292
|
+
z-index: 1;
|
|
3293
|
+
}
|
|
3294
|
+
|
|
3295
|
+
button::before {
|
|
3296
|
+
content: "";
|
|
3297
|
+
position: absolute;
|
|
3298
|
+
inset: 0;
|
|
3299
|
+
border-radius: 9999px;
|
|
3300
|
+
padding: 2px;
|
|
3301
|
+
background: linear-gradient(90deg, var(--apolo-primary), #ffffff);
|
|
3302
|
+
-webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
|
|
3303
|
+
mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
|
|
3304
|
+
-webkit-mask-composite: xor;
|
|
3305
|
+
mask-composite: exclude;
|
|
3306
|
+
z-index: -1;
|
|
3307
|
+
}
|
|
3308
|
+
|
|
3309
|
+
button:hover {
|
|
3310
|
+
transform: translateY(-1px);
|
|
3311
|
+
background-color: rgba(255, 255, 255, 0.1);
|
|
3312
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
|
|
3313
|
+
}
|
|
3314
|
+
|
|
3315
|
+
.button-wrapper:hover img {
|
|
3316
|
+
transform: translateY(calc(-50% - 1px));
|
|
3317
|
+
}
|
|
3318
|
+
|
|
3319
|
+
button:active {
|
|
3320
|
+
transform: translateY(0);
|
|
3321
|
+
}
|
|
3322
|
+
|
|
3323
|
+
button:disabled {
|
|
3324
|
+
opacity: 0.6;
|
|
3325
|
+
cursor: not-allowed;
|
|
3326
|
+
filter: grayscale(1);
|
|
3327
|
+
transform: none;
|
|
3328
|
+
}
|
|
3329
|
+
|
|
3330
|
+
button.error {
|
|
3331
|
+
background-color: rgba(239, 68, 68, 0.1);
|
|
3332
|
+
color: #ef4444;
|
|
3333
|
+
text-indent: 0;
|
|
3334
|
+
}
|
|
3335
|
+
|
|
3336
|
+
button.error::before {
|
|
3337
|
+
background: linear-gradient(90deg, #ef4444, #fca5a5);
|
|
3338
|
+
}
|
|
3339
|
+
|
|
3340
|
+
.logo-apolo {
|
|
3341
|
+
position: absolute;
|
|
3342
|
+
top: 50%;
|
|
3343
|
+
left: calc((var(--img-size) / 2) + var(--gap));
|
|
3344
|
+
transform: translateY(-50%);
|
|
3345
|
+
width: var(--img-size);
|
|
3346
|
+
height: var(--img-size);
|
|
3347
|
+
margin-right: var(--gap);
|
|
3348
|
+
transition: transform 0.2s;
|
|
3349
|
+
}
|
|
3350
|
+
`
|
|
3351
|
+
];
|
|
3352
|
+
W([
|
|
3353
|
+
d({ type: String })
|
|
3354
|
+
], L.prototype, "lang", 2);
|
|
3355
|
+
W([
|
|
3356
|
+
d({ type: Boolean })
|
|
3357
|
+
], L.prototype, "loading", 2);
|
|
3358
|
+
W([
|
|
3359
|
+
d({ type: Boolean })
|
|
3360
|
+
], L.prototype, "disabled", 2);
|
|
3361
|
+
W([
|
|
3362
|
+
d({ type: String })
|
|
3363
|
+
], L.prototype, "label", 2);
|
|
3364
|
+
W([
|
|
3365
|
+
d({ type: Boolean })
|
|
3366
|
+
], L.prototype, "hasError", 2);
|
|
3367
|
+
L = W([
|
|
3368
|
+
me("trigger-button")
|
|
3369
|
+
], L);
|
|
3370
|
+
const cr = B`
|
|
3371
|
+
/* 1. Definimos las Animaciones */
|
|
3372
|
+
@keyframes modal-enter {
|
|
3373
|
+
from { opacity: 0; transform: scale(0.95) translateY(10px); }
|
|
3374
|
+
to { opacity: 1; transform: scale(1) translateY(0); }
|
|
3375
|
+
}
|
|
3376
|
+
|
|
3377
|
+
@keyframes modal-exit {
|
|
3378
|
+
from { opacity: 1; transform: scale(1) translateY(0); }
|
|
3379
|
+
to { opacity: 0; transform: scale(0.95) translateY(10px); }
|
|
3380
|
+
}
|
|
3381
|
+
|
|
3382
|
+
@keyframes backdrop-enter {
|
|
3383
|
+
from { background-color: rgba(0, 0, 0, 0); backdrop-filter: blur(0px); }
|
|
3384
|
+
to { background-color: rgba(0, 0, 0, 0.6); backdrop-filter: blur(4px); }
|
|
3385
|
+
}
|
|
3386
|
+
|
|
3387
|
+
@keyframes backdrop-exit {
|
|
3388
|
+
from { background-color: rgba(0, 0, 0, 0.6); backdrop-filter: blur(4px); }
|
|
3389
|
+
to { background-color: rgba(0, 0, 0, 0); backdrop-filter: blur(0px); }
|
|
3390
|
+
}
|
|
3391
|
+
|
|
3392
|
+
/* 2. Estilos Base */
|
|
3393
|
+
dialog {
|
|
3394
|
+
border: none;
|
|
3395
|
+
padding: 0;
|
|
3396
|
+
margin: auto;
|
|
3397
|
+
|
|
3398
|
+
/* Geometría */
|
|
3399
|
+
min-width: 320px;
|
|
3400
|
+
max-width: 420px;
|
|
3401
|
+
width: 90vw;
|
|
3402
|
+
border-radius: var(--apolo-radius);
|
|
3403
|
+
|
|
3404
|
+
background-color: var(--apolo-bg);
|
|
3405
|
+
color: var(--apolo-text);
|
|
3406
|
+
box-shadow: var(--apolo-shadow);
|
|
3407
|
+
font-family: var(--apolo-font);
|
|
3408
|
+
|
|
3409
|
+
opacity: 0;
|
|
3410
|
+
pointer-events: none;
|
|
3411
|
+
}
|
|
3412
|
+
|
|
3413
|
+
/* 3. Estado: ABIERTO (Animación de Entrada) */
|
|
3414
|
+
dialog[open] {
|
|
3415
|
+
opacity: 1;
|
|
3416
|
+
animation: modal-enter 0.2s cubic-bezier(0.16, 1, 0.3, 1) forwards;
|
|
3417
|
+
pointer-events: auto;
|
|
3418
|
+
}
|
|
3419
|
+
|
|
3420
|
+
/* 4. Estado: CERRANDO (Animación de Salida) */
|
|
3421
|
+
dialog.closing {
|
|
3422
|
+
/* Sobrescribimos la animación de entrada */
|
|
3423
|
+
animation: modal-exit 0.15s ease-in forwards;
|
|
3424
|
+
}
|
|
3425
|
+
|
|
3426
|
+
/* 5. Backdrop (Fondo Oscuro) */
|
|
3427
|
+
dialog::backdrop {
|
|
3428
|
+
background-color: rgba(0,0,0,0); /* Invisible por defecto */
|
|
3429
|
+
}
|
|
3430
|
+
|
|
3431
|
+
dialog[open]::backdrop {
|
|
3432
|
+
animation: backdrop-enter 0.2s ease-out forwards;
|
|
3433
|
+
}
|
|
3434
|
+
|
|
3435
|
+
dialog.closing::backdrop {
|
|
3436
|
+
animation: backdrop-exit 0.15s ease-in forwards;
|
|
3437
|
+
}
|
|
3438
|
+
|
|
3439
|
+
dialog:not([open])::backdrop {
|
|
3440
|
+
display: none;
|
|
3441
|
+
pointer-events: none;
|
|
3442
|
+
}
|
|
3443
|
+
`, hr = B`
|
|
3444
|
+
/* Inputs de solo lectura (Diseño Apolo) */
|
|
3445
|
+
.text-field {
|
|
3446
|
+
display: flex;
|
|
3447
|
+
gap: 0.5rem;
|
|
3448
|
+
margin-top: 1rem;
|
|
3449
|
+
text-align: left;
|
|
3450
|
+
position: relative;
|
|
3451
|
+
}
|
|
3452
|
+
.text-field-label {
|
|
3453
|
+
--padding-left: 0.25rem;
|
|
3454
|
+
--padding-top: 0.15rem;
|
|
3455
|
+
font-size: 0.75rem;
|
|
3456
|
+
color: #9ca3af;
|
|
3457
|
+
border-radius: calc(var(--apolo-radius) - 1px);
|
|
3458
|
+
background: #ffffff;
|
|
3459
|
+
padding: var(--padding-top) var(--padding-left);
|
|
3460
|
+
position: absolute;
|
|
3461
|
+
top: calc(-0.5rem - var(--padding-top));
|
|
3462
|
+
left: calc(1rem - var(--padding-left));
|
|
3463
|
+
display: block;
|
|
3464
|
+
z-index: 2;
|
|
3465
|
+
}
|
|
3466
|
+
.text-field-input {
|
|
3467
|
+
width: 100%;
|
|
3468
|
+
padding: 0.75rem 1rem;
|
|
3469
|
+
border: 1px solid #526282;
|
|
3470
|
+
border-radius: var(--apolo-radius);
|
|
3471
|
+
background: #ffffff;
|
|
3472
|
+
color: #4b5563;
|
|
3473
|
+
font-size: 0.9rem;
|
|
3474
|
+
z-index: 1;
|
|
3475
|
+
}
|
|
3476
|
+
.btn-secondary {
|
|
3477
|
+
background-color: #526282;
|
|
3478
|
+
color: #ffffff;
|
|
3479
|
+
border: none;
|
|
3480
|
+
border-radius: var(--apolo-radius);
|
|
3481
|
+
padding: 0.5rem 1rem;
|
|
3482
|
+
cursor: pointer;
|
|
3483
|
+
transition: background-color 0.2s ease;
|
|
3484
|
+
}
|
|
3485
|
+
`;
|
|
3486
|
+
const pr = { CHILD: 2 }, dr = (s) => (...e) => ({ _$litDirective$: s, values: e });
|
|
3487
|
+
class ur {
|
|
3488
|
+
constructor(e) {
|
|
3489
|
+
}
|
|
3490
|
+
get _$AU() {
|
|
3491
|
+
return this._$AM._$AU;
|
|
3492
|
+
}
|
|
3493
|
+
_$AT(e, t, r) {
|
|
3494
|
+
this._$Ct = e, this._$AM = t, this._$Ci = r;
|
|
3495
|
+
}
|
|
3496
|
+
_$AS(e, t) {
|
|
3497
|
+
return this.update(e, t);
|
|
3498
|
+
}
|
|
3499
|
+
update(e, t) {
|
|
3500
|
+
return this.render(...t);
|
|
3501
|
+
}
|
|
3502
|
+
}
|
|
3503
|
+
class Ne extends ur {
|
|
3504
|
+
constructor(e) {
|
|
3505
|
+
if (super(e), this.it = b, e.type !== pr.CHILD) throw Error(this.constructor.directiveName + "() can only be used in child bindings");
|
|
3506
|
+
}
|
|
3507
|
+
render(e) {
|
|
3508
|
+
if (e === b || e == null) return this._t = void 0, this.it = e;
|
|
3509
|
+
if (e === z) return e;
|
|
3510
|
+
if (typeof e != "string") throw Error(this.constructor.directiveName + "() called with a non-string value");
|
|
3511
|
+
if (e === this.it) return this._t;
|
|
3512
|
+
this.it = e;
|
|
3513
|
+
const t = [e];
|
|
3514
|
+
return t.raw = t, this._t = { _$litType$: this.constructor.resultType, strings: t, values: [] };
|
|
3515
|
+
}
|
|
3516
|
+
}
|
|
3517
|
+
Ne.directiveName = "unsafeHTML", Ne.resultType = 1;
|
|
3518
|
+
const J = dr(Ne), Ar = B`
|
|
3519
|
+
.qr-frame {
|
|
3520
|
+
background: white;
|
|
3521
|
+
padding: 10px;
|
|
3522
|
+
padding-bottom: 14px;
|
|
3523
|
+
border-radius: var(--apolo-radius);
|
|
3524
|
+
box-shadow: 0 4px 15px rgba(0,0,0,0.08);
|
|
3525
|
+
display: inline-block;
|
|
3526
|
+
margin-bottom: 1rem;
|
|
3527
|
+
}
|
|
3528
|
+
|
|
3529
|
+
.qr-badge {
|
|
3530
|
+
color: var(--apolo-accent);
|
|
3531
|
+
font-weight: 700;
|
|
3532
|
+
font-size: 1.2rem;
|
|
3533
|
+
display: inline-block;
|
|
3534
|
+
margin-top: 10px;
|
|
3535
|
+
}
|
|
3536
|
+
|
|
3537
|
+
.qr-wrapper {
|
|
3538
|
+
position: relative;
|
|
3539
|
+
display: block;
|
|
3540
|
+
width: 150px;
|
|
3541
|
+
height: 150px;
|
|
3542
|
+
}
|
|
3543
|
+
|
|
3544
|
+
.qr-code-img {
|
|
3545
|
+
width: 100%;
|
|
3546
|
+
height: 100%;
|
|
3547
|
+
}
|
|
3548
|
+
|
|
3549
|
+
.qr-overlay-icon {
|
|
3550
|
+
position: absolute;
|
|
3551
|
+
top: 50%;
|
|
3552
|
+
left: 50%;
|
|
3553
|
+
transform: translate(-50%, -50%);
|
|
3554
|
+
|
|
3555
|
+
width: 36px;
|
|
3556
|
+
height: 36px;
|
|
3557
|
+
|
|
3558
|
+
object-fit: contain;
|
|
3559
|
+
background-color: white;
|
|
3560
|
+
border-radius: 50%;
|
|
3561
|
+
padding: 2px;
|
|
3562
|
+
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
|
3563
|
+
}
|
|
3564
|
+
`, fr = "data:image/png;base64,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";
|
|
3565
|
+
function ne(s) {
|
|
3566
|
+
const e = s.target;
|
|
3567
|
+
e.src = fr;
|
|
3568
|
+
}
|
|
3569
|
+
const mr = B`
|
|
3570
|
+
.spinner-overlay {
|
|
3571
|
+
position: absolute;
|
|
3572
|
+
inset: 0;
|
|
3573
|
+
background-color: rgba(255, 255, 255, 0.3);
|
|
3574
|
+
z-index: 50;
|
|
3575
|
+
display: flex;
|
|
3576
|
+
align-items: center;
|
|
3577
|
+
justify-content: center;
|
|
3578
|
+
border-radius: var(--apolo-radius, 12px);
|
|
3579
|
+
cursor: wait;
|
|
3580
|
+
backdrop-filter: blur(2px);
|
|
3581
|
+
}
|
|
3582
|
+
|
|
3583
|
+
.spinner {
|
|
3584
|
+
border: 4px solid #e5e7eb;
|
|
3585
|
+
border-top: 4px solid var(--apolo-primary, #6366f1);
|
|
3586
|
+
border-radius: 50%;
|
|
3587
|
+
width: 40px;
|
|
3588
|
+
height: 40px;
|
|
3589
|
+
animation: spin 1s linear infinite;
|
|
3590
|
+
}
|
|
3591
|
+
|
|
3592
|
+
@keyframes spin {
|
|
3593
|
+
0% { transform: rotate(0deg); }
|
|
3594
|
+
100% { transform: rotate(360deg); }
|
|
3595
|
+
}
|
|
3596
|
+
`;
|
|
3597
|
+
var yr = Object.defineProperty, gr = Object.getOwnPropertyDescriptor, Fe = (s, e, t, r) => {
|
|
3598
|
+
for (var i = r > 1 ? void 0 : r ? gr(e, t) : e, n = s.length - 1, o; n >= 0; n--)
|
|
3599
|
+
(o = s[n]) && (i = (r ? o(e, t, i) : o(i)) || i);
|
|
3600
|
+
return r && i && yr(e, t, i), i;
|
|
3601
|
+
};
|
|
3602
|
+
let te = class extends I {
|
|
3603
|
+
constructor() {
|
|
3604
|
+
super(...arguments), this.expiresAt = 0, this.timerString = "-- : --", this._interval = null;
|
|
3605
|
+
}
|
|
3606
|
+
connectedCallback() {
|
|
3607
|
+
super.connectedCallback(), this.startTimer();
|
|
3608
|
+
}
|
|
3609
|
+
disconnectedCallback() {
|
|
3610
|
+
this.stopTimer(), super.disconnectedCallback();
|
|
3611
|
+
}
|
|
3612
|
+
updated(s) {
|
|
3613
|
+
s.has("expiresAt") && this.startTimer();
|
|
3614
|
+
}
|
|
3615
|
+
startTimer() {
|
|
3616
|
+
if (this.stopTimer(), !this.expiresAt || isNaN(this.expiresAt)) return;
|
|
3617
|
+
const s = () => {
|
|
3618
|
+
const e = Date.now(), t = this.expiresAt - e;
|
|
3619
|
+
if (t <= 0) {
|
|
3620
|
+
this.stopTimer();
|
|
3621
|
+
const p = y.t.modal.labels.minutes, u = y.t.modal.labels.seconds;
|
|
3622
|
+
this.timerString = `00 ${p} : 00 ${u}`, this.dispatchEvent(new CustomEvent("expired"));
|
|
3623
|
+
return;
|
|
3624
|
+
}
|
|
3625
|
+
const r = Math.floor(t % (1e3 * 60 * 60) / (1e3 * 60)), i = Math.floor(t % (1e3 * 60) / 1e3), n = r.toString().padStart(2, "0"), o = i.toString().padStart(2, "0"), l = y.t.modal.labels.minutes, a = y.t.modal.labels.seconds;
|
|
3626
|
+
this.timerString = `${n} ${l} : ${o} ${a}`;
|
|
3627
|
+
};
|
|
3628
|
+
s(), this._interval = window.setInterval(s, 1e3);
|
|
3629
|
+
}
|
|
3630
|
+
stopTimer() {
|
|
3631
|
+
this._interval && (clearInterval(this._interval), this._interval = null);
|
|
3632
|
+
}
|
|
3633
|
+
render() {
|
|
3634
|
+
return f`${this.timerString}`;
|
|
3635
|
+
}
|
|
3636
|
+
};
|
|
3637
|
+
te.styles = B`
|
|
3638
|
+
:host {
|
|
3639
|
+
display: block;
|
|
3640
|
+
color: var(--apolo-accent, #ea580c);
|
|
3641
|
+
font-weight: 600;
|
|
3642
|
+
font-size: 0.9rem;
|
|
3643
|
+
margin-bottom: 1rem;
|
|
3644
|
+
}
|
|
3645
|
+
`;
|
|
3646
|
+
Fe([
|
|
3647
|
+
d({ type: Number })
|
|
3648
|
+
], te.prototype, "expiresAt", 2);
|
|
3649
|
+
Fe([
|
|
3650
|
+
C()
|
|
3651
|
+
], te.prototype, "timerString", 2);
|
|
3652
|
+
te = Fe([
|
|
3653
|
+
me("payment-timer")
|
|
3654
|
+
], te);
|
|
3655
|
+
var kr = Object.defineProperty, vr = Object.getOwnPropertyDescriptor, v = (s, e, t, r) => {
|
|
3656
|
+
for (var i = r > 1 ? void 0 : r ? vr(e, t) : e, n = s.length - 1, o; n >= 0; n--)
|
|
3657
|
+
(o = s[n]) && (i = (r ? o(e, t, i) : o(i)) || i);
|
|
3658
|
+
return r && i && kr(e, t, i), i;
|
|
3659
|
+
};
|
|
3660
|
+
let k = class extends I {
|
|
3661
|
+
constructor() {
|
|
3662
|
+
super(...arguments), this.isOpen = !1, this.barrierDismissible = !1, this.lang = "es", this.productTitle = "", this.currentStep = g.SELECT_ASSET, this.status = "idle", this.error = null, this.isLoadingData = !0, this.assets = [], this.selectedAsset = null, this.selectedNetwork = null, this.qrCodeUrl = null, this.paymentAddress = null, this.amount = 0, this.amountPaid = void 0, this.email = "", this.qrCodeExpiresAt = null, this.paymentUrl = null, this.isAddressCopied = !1, this.handleBackdropClick = (s) => {
|
|
3663
|
+
if (s.target !== this.dialogElement || this.dialogElement.classList.contains("closing") || !this.barrierDismissible) return;
|
|
3664
|
+
const e = this.dialogElement.getBoundingClientRect();
|
|
3665
|
+
(s.clientY < e.top || s.clientY > e.bottom || s.clientX < e.left || s.clientX > e.right) && this.requestClose();
|
|
3666
|
+
};
|
|
3667
|
+
}
|
|
3668
|
+
disconnectedCallback() {
|
|
3669
|
+
super.disconnectedCallback();
|
|
3670
|
+
const s = this.dialogElement;
|
|
3671
|
+
s && s.open && s.close();
|
|
3672
|
+
}
|
|
3673
|
+
// --- Lifecycle: Manage Dialog State ---
|
|
3674
|
+
async updated(s) {
|
|
3675
|
+
if (super.updated(s), await this.updateComplete, s.has("isOpen")) {
|
|
3676
|
+
const e = this.dialogElement;
|
|
3677
|
+
if (!e) return;
|
|
3678
|
+
if (this.isOpen)
|
|
3679
|
+
e.classList.remove("closing"), e.open || e.showModal(), e.addEventListener("click", this.handleBackdropClick);
|
|
3680
|
+
else {
|
|
3681
|
+
if (e.removeEventListener("click", this.handleBackdropClick), !e.open) return;
|
|
3682
|
+
e.classList.add("closing");
|
|
3683
|
+
const t = (r) => {
|
|
3684
|
+
r.target === e && this.closeDialogFinal(e, t);
|
|
3685
|
+
};
|
|
3686
|
+
e.addEventListener("animationend", t), setTimeout(() => {
|
|
3687
|
+
e.open && this.closeDialogFinal(e, t);
|
|
3688
|
+
}, 200);
|
|
3689
|
+
}
|
|
3690
|
+
}
|
|
3691
|
+
}
|
|
3692
|
+
// Helper actualizado
|
|
3693
|
+
closeDialogFinal(s, e) {
|
|
3694
|
+
s.removeEventListener("animationend", e), s.classList.remove("closing"), s.open && s.close();
|
|
3695
|
+
}
|
|
3696
|
+
// --- Event Dispatchers (Emit events to parent) ---
|
|
3697
|
+
// Request to close the modal (triggered by X, backdrop, Escape)
|
|
3698
|
+
requestClose() {
|
|
3699
|
+
this.dispatchEvent(new CustomEvent("closeRequest"));
|
|
3700
|
+
}
|
|
3701
|
+
// Handle the native 'close' event (fired by Escape key)
|
|
3702
|
+
handleDialogNativeClose(s) {
|
|
3703
|
+
s.preventDefault(), this.requestClose();
|
|
3704
|
+
}
|
|
3705
|
+
handleTimerExpired() {
|
|
3706
|
+
this.status = "error", this.error = {
|
|
3707
|
+
code: X.payment_timeout,
|
|
3708
|
+
message: y.t.errors.timeout
|
|
3709
|
+
}, this.changeStep(g.RESULT), this.dispatchEvent(new CustomEvent("expired", { detail: { error: this.error } }));
|
|
3710
|
+
}
|
|
3711
|
+
// Emit event when a asset is selected
|
|
3712
|
+
selectAsset(s) {
|
|
3713
|
+
this.dispatchEvent(new CustomEvent("assetSelect", { detail: { assetId: s } }));
|
|
3714
|
+
}
|
|
3715
|
+
// Emit event when a network is selected
|
|
3716
|
+
selectNetwork(s) {
|
|
3717
|
+
this.dispatchEvent(new CustomEvent("networkSelect", { detail: { networkId: s } }));
|
|
3718
|
+
}
|
|
3719
|
+
// Emit event to request changing step (for "Back" buttons)
|
|
3720
|
+
changeStep(s, e) {
|
|
3721
|
+
e?.stopPropagation(), this.dispatchEvent(new CustomEvent("changeStep", { detail: s }));
|
|
3722
|
+
}
|
|
3723
|
+
copyAddress(s) {
|
|
3724
|
+
this.paymentAddress && (s.stopPropagation(), navigator.clipboard.writeText(this.paymentAddress), this.isAddressCopied = !0, setTimeout(() => this.isAddressCopied = !1, 2e3));
|
|
3725
|
+
}
|
|
3726
|
+
handlePayFromDevice() {
|
|
3727
|
+
this.paymentUrl && window.open(this.paymentUrl, "_blank");
|
|
3728
|
+
}
|
|
3729
|
+
get currentAsset() {
|
|
3730
|
+
return this.assets.find((s) => s.id === this.selectedAsset);
|
|
3731
|
+
}
|
|
3732
|
+
get currentNetwork() {
|
|
3733
|
+
return this.currentAsset?.networks.find((s) => s.id === this.selectedNetwork);
|
|
3734
|
+
}
|
|
3735
|
+
getFormattedTimeWindow() {
|
|
3736
|
+
if (!this.qrCodeExpiresAt || isNaN(this.qrCodeExpiresAt)) return "30 min";
|
|
3737
|
+
const s = this.qrCodeExpiresAt, e = Date.now(), t = s - e;
|
|
3738
|
+
return t <= 0 ? "0 min" : `${Math.ceil(t / (1e3 * 60))} min`;
|
|
3739
|
+
}
|
|
3740
|
+
// --- RENDERIZADO DEL QR (Lógica bifurcada) ---
|
|
3741
|
+
renderQRStep(s) {
|
|
3742
|
+
const e = this.getFormattedTimeWindow(), t = y.interpolate(s.modal.warnings.onlyToken, {
|
|
3743
|
+
symbol: this.currentAsset?.symbol || ""
|
|
3744
|
+
}), r = y.interpolate(s.modal.warnings.timer, {
|
|
3745
|
+
time: e
|
|
3746
|
+
}), i = this.currentNetwork, n = this.currentAsset?.symbol || "", o = this.amount - (this.amountPaid || 0);
|
|
3747
|
+
return i?.network === "apolopay" ? f`
|
|
3748
|
+
<payment-timer class="timer" .expiresAt=${this.qrCodeExpiresAt} @expired=${this.handleTimerExpired}></payment-timer>
|
|
3749
|
+
|
|
3750
|
+
${this.amountPaid && this.amountPaid > 0 ? f`
|
|
3751
|
+
<div class="balance-card">
|
|
3752
|
+
<div class="balance-row">
|
|
3753
|
+
<span class="balance-label">${y.t.modal.labels.paid}:</span>
|
|
3754
|
+
<span class="balance-value">${this.amountPaid} ${n}</span>
|
|
3755
|
+
</div>
|
|
3756
|
+
<div class="balance-row">
|
|
3757
|
+
<span class="balance-label">${y.t.modal.labels.remainingToPay}:</span>
|
|
3758
|
+
<span class="balance-value highlight">${this.amount} ${n}</span>
|
|
3759
|
+
</div>
|
|
3760
|
+
</div>
|
|
3761
|
+
` : ""}
|
|
3762
|
+
|
|
3763
|
+
<div class="qr-frame">
|
|
3764
|
+
<div class="qr-wrapper">
|
|
3765
|
+
<img src="${this.qrCodeUrl}" class="qr-code-img" alt="QR Apolo Pay" />
|
|
3766
|
+
<img src="${Be}" class="qr-overlay-icon" style="padding: 4px;" />
|
|
3767
|
+
</div>
|
|
3768
|
+
<span class="qr-badge">${o} ${n}</span>
|
|
3769
|
+
</div>
|
|
3770
|
+
|
|
3771
|
+
<div class="btn-dark">
|
|
3772
|
+
<h4 style="margin-top: 0; margin-bottom: .1rem;">${J(s.modal.info.noReloadPageTitle)}</h4>
|
|
3773
|
+
<span style="font-size: .8rem;">${s.modal.info.noReloadPageSubTitle}</span>
|
|
3774
|
+
</div>
|
|
3775
|
+
|
|
3776
|
+
<div class="warning-text">
|
|
3777
|
+
<p>${J(r)}</p>
|
|
3778
|
+
</div>
|
|
3779
|
+
|
|
3780
|
+
<button class="btn-dark">${J(s.modal.actions.scanApp)}</button>
|
|
3781
|
+
${this.paymentUrl ? f`
|
|
3782
|
+
<button class="btn-primary" style="width: 100%; margin-top: 0.5rem;" @click=${this.handlePayFromDevice}>
|
|
3783
|
+
${s.modal.actions.payFromDevice}
|
|
3784
|
+
</button>
|
|
3785
|
+
` : ""}
|
|
3786
|
+
` : f`
|
|
3787
|
+
<payment-timer class="timer" .expiresAt=${this.qrCodeExpiresAt} @expired=${this.handleTimerExpired}></payment-timer>
|
|
3788
|
+
|
|
3789
|
+
${this.amountPaid && this.amountPaid > 0 ? f`
|
|
3790
|
+
<div class="balance-card">
|
|
3791
|
+
<div class="balance-row">
|
|
3792
|
+
<span class="balance-label">${y.t.modal.labels.paid}:</span>
|
|
3793
|
+
<span class="balance-value">${this.amountPaid} ${n}</span>
|
|
3794
|
+
</div>
|
|
3795
|
+
<div class="balance-row">
|
|
3796
|
+
<span class="balance-label">${y.t.modal.labels.remainingToPay}:</span>
|
|
3797
|
+
<span class="balance-value highlight">${this.amount} ${n}</span>
|
|
3798
|
+
</div>
|
|
3799
|
+
</div>
|
|
3800
|
+
` : ""}
|
|
3801
|
+
|
|
3802
|
+
<div class="qr-frame">
|
|
3803
|
+
<div class="qr-wrapper">
|
|
3804
|
+
<img src="${this.qrCodeUrl}" class="qr-code-img" alt="QR Wallet" @error=${ne} />
|
|
3805
|
+
|
|
3806
|
+
${i ? f`<img src="${i.image}" class="qr-overlay-icon" alt="Network Icon" @error=${ne} />` : ""}
|
|
3807
|
+
</div>
|
|
3808
|
+
<span class="qr-badge">${o} ${this.currentAsset?.symbol}</span>
|
|
3809
|
+
</div>
|
|
3810
|
+
|
|
3811
|
+
<div class="btn-dark">
|
|
3812
|
+
<h4 style="margin-top: 0; margin-bottom: .1rem;">${J(s.modal.info.noReloadPageTitle)}</h4>
|
|
3813
|
+
<span style="font-size: .8rem;">${s.modal.info.noReloadPageSubTitle}</span>
|
|
3814
|
+
</div>
|
|
3815
|
+
|
|
3816
|
+
<div class="text-field">
|
|
3817
|
+
<label class="text-field-label">${s.modal.labels.network}</label>
|
|
3818
|
+
<input class="text-field-input" readonly value="${this.currentNetwork?.name}" />
|
|
3819
|
+
</div>
|
|
3820
|
+
|
|
3821
|
+
<div class="text-field">
|
|
3822
|
+
<label class="text-field-label">${s.modal.labels.address}</label>
|
|
3823
|
+
<input class="text-field-input" readonly value="${this.paymentAddress}" @click=${this.copyAddress} />
|
|
3824
|
+
${this.paymentAddress ? f`
|
|
3825
|
+
<button class="btn-secondary" @click=${this.copyAddress}>${this.isAddressCopied ? s.modal.actions.copied : s.modal.actions.copy}</button>
|
|
3826
|
+
` : ""}
|
|
3827
|
+
</div>
|
|
3828
|
+
|
|
3829
|
+
<div class="warning-text">
|
|
3830
|
+
<ul>
|
|
3831
|
+
<li>${J(s.modal.warnings.networkMatch)}</li>
|
|
3832
|
+
<li>${J(s.modal.warnings.noNFT)}</li>
|
|
3833
|
+
<li>${J(t)}</li>
|
|
3834
|
+
</ul>
|
|
3835
|
+
<p>${J(r)}</p>
|
|
3836
|
+
</div>
|
|
3837
|
+
${this.paymentUrl ? f`
|
|
3838
|
+
<button class="btn-primary" style="width: 100%; margin-top: 1rem;" @click=${this.handlePayFromDevice}>
|
|
3839
|
+
${s.modal.actions.payFromDevice}
|
|
3840
|
+
</button>
|
|
3841
|
+
` : ""}
|
|
3842
|
+
`;
|
|
3843
|
+
}
|
|
3844
|
+
// --- Render Method ---
|
|
3845
|
+
render() {
|
|
3846
|
+
const s = y.t;
|
|
3847
|
+
let e;
|
|
3848
|
+
const t = f`
|
|
3849
|
+
<div class="modal-header">
|
|
3850
|
+
${this.currentStep > g.SELECT_ASSET && this.currentStep < g.RESULT ? f`<button class="back-button" @click=${() => this.changeStep(this.currentStep - 1)} >←</button>` : ""}
|
|
3851
|
+
<button class="close-button" @click=${this.requestClose}>×</button>
|
|
3852
|
+
</div>
|
|
3853
|
+
`;
|
|
3854
|
+
this.currentStep === g.SELECT_ASSET ? e = f`
|
|
3855
|
+
<h2>${J(s.modal.titles.selectAsset)}</h2>
|
|
3856
|
+
<p class="subtitle">${s.modal.subtitles.selectAsset}</p>
|
|
3857
|
+
|
|
3858
|
+
<div class="selection-list">
|
|
3859
|
+
${this.assets.map((i) => f`
|
|
3860
|
+
<div class="selection-card" @click=${() => this.selectAsset(i.id)}>
|
|
3861
|
+
<img src="${i.image}" class="coin-icon" @error=${ne} />
|
|
3862
|
+
<div class="card-text">
|
|
3863
|
+
<span class="card-title">${i.symbol}</span>
|
|
3864
|
+
<span class="card-sub">${i.name}</span>
|
|
3865
|
+
</div>
|
|
3866
|
+
</div>
|
|
3867
|
+
`)}
|
|
3868
|
+
</div>
|
|
3869
|
+
<p class="warning-text" style="font-size: 0.9rem; text-align: center; margin-top: 1.5rem">
|
|
3870
|
+
${s.modal.info.selectNetworkLater}
|
|
3871
|
+
</p>
|
|
3872
|
+
` : this.currentStep === g.SELECT_NETWORK ? e = f`
|
|
3873
|
+
<h2>${J(s.modal.titles.selectNetwork)}</h2>
|
|
3874
|
+
<p class="subtitle">${s.modal.subtitles.selectNetwork}</p>
|
|
3875
|
+
|
|
3876
|
+
<div class="selection-list">
|
|
3877
|
+
${this.currentAsset?.networks.map((i) => f`
|
|
3878
|
+
<div class="selection-card" @click=${() => this.selectNetwork(i.id)}>
|
|
3879
|
+
<img src="${i.network === "apolopay" ? Be : i.image}" class="coin-icon" @error=${ne} />
|
|
3880
|
+
<div class="card-text">
|
|
3881
|
+
<span class="card-title">${i.name}</span>
|
|
3882
|
+
</div>
|
|
3883
|
+
</div>
|
|
3884
|
+
`)}
|
|
3885
|
+
</div>
|
|
3886
|
+
` : this.currentStep === g.SHOW_QR ? e = f`
|
|
3887
|
+
<h2>${J(y.interpolate(s.modal.titles.scanQr, { symbol: this.currentAsset?.symbol || "" }))}</h2>
|
|
3888
|
+
${this.productTitle ? f`<p class="subtitle">${this.productTitle}</p>` : ""}
|
|
3889
|
+
${this.renderQRStep(s)}
|
|
3890
|
+
` : this.currentStep === g.RESULT && (this.status === "success" ? e = f`
|
|
3891
|
+
<div class="result-container">
|
|
3892
|
+
<div class="success-icon">
|
|
3893
|
+
<svg viewBox="0 0 52 52">
|
|
3894
|
+
<circle class="checkmark-circle" cx="26" cy="26" r="25" fill="none"/>
|
|
3895
|
+
<path class="checkmark-check" fill="none" d="M14.1 27.2l7.1 7.2 16.7-16.8"/>
|
|
3896
|
+
</svg>
|
|
3897
|
+
</div>
|
|
3898
|
+
|
|
3899
|
+
<h2 class="result-title">${J(s.modal.titles.success)}</h2>
|
|
3900
|
+
|
|
3901
|
+
<p class="result-desc">
|
|
3902
|
+
${s.modal.success.message} ${this.email ? f`<span class="highlight">${this.email}</span>` : ""} ${s.modal.success.message2}
|
|
3903
|
+
</p>
|
|
3904
|
+
|
|
3905
|
+
<div class="purchase-details">
|
|
3906
|
+
<h3 class="details-title">${s.modal.success.details}</h3>
|
|
3907
|
+
|
|
3908
|
+
${this.productTitle ? f`
|
|
3909
|
+
<div class="text-field">
|
|
3910
|
+
<label class="text-field-label">${s.modal.labels.product}</label>
|
|
3911
|
+
<input class="text-field-input" readonly value=${this.productTitle} />
|
|
3912
|
+
</div>
|
|
3913
|
+
` : ""}
|
|
3914
|
+
|
|
3915
|
+
<div class="text-field">
|
|
3916
|
+
<label class="text-field-label">${s.modal.labels.amount}</label>
|
|
3917
|
+
<input class="text-field-input" readonly value="${this.amount} ${this.currentAsset?.symbol || ""}" />
|
|
3918
|
+
</div>
|
|
3919
|
+
</div>
|
|
3920
|
+
</div>
|
|
3921
|
+
` : this.status === "error" ? e = f`
|
|
3922
|
+
<div class="result-container">
|
|
3923
|
+
<div class="error-icon">❌</div>
|
|
3924
|
+
<h2 class="result-title">${s.modal.titles.error}</h2>
|
|
3925
|
+
<p class="result-desc">${this.error?.message || s.errors.generic}</p>
|
|
3926
|
+
<button class="btn-primary" @click=${this.requestClose}>${s.modal.actions.close}</button>
|
|
3927
|
+
</div>
|
|
3928
|
+
` : this.status === "processing" ? e = f`
|
|
3929
|
+
<div class="processing-container">
|
|
3930
|
+
<div class="dots-loader">
|
|
3931
|
+
<div class="dot"></div>
|
|
3932
|
+
<div class="dot"></div>
|
|
3933
|
+
<div class="dot"></div>
|
|
3934
|
+
<div class="dot"></div>
|
|
3935
|
+
<div class="dot"></div>
|
|
3936
|
+
</div>
|
|
3937
|
+
|
|
3938
|
+
<h2 class="processing-title">${J(s.modal.titles.processing)}</h2>
|
|
3939
|
+
|
|
3940
|
+
<div class="btn-dark" style="margin-bottom: 0">
|
|
3941
|
+
<h4 style="margin-top: 0; margin-bottom: .1rem;">${J(s.modal.info.noReloadPageTitle)}</h4>
|
|
3942
|
+
<span style="font-size: .8rem;">${s.modal.info.noReloadPageSubTitle}</span>
|
|
3943
|
+
</div>
|
|
3944
|
+
|
|
3945
|
+
<div class="text-field" style="width: 100%;">
|
|
3946
|
+
<label class="text-field-label">${s.modal.labels.amountSent} (${this.currentAsset?.symbol})</label>
|
|
3947
|
+
<input class="text-field-input" readonly value="${this.amount} ${this.currentAsset?.symbol}" />
|
|
3948
|
+
</div>
|
|
3949
|
+
</div>
|
|
3950
|
+
</div>
|
|
3951
|
+
` : e = f`
|
|
3952
|
+
<div class="result-container">
|
|
3953
|
+
<div class="error-icon">⏳</div>
|
|
3954
|
+
<h2 class="result-title">${s.modal.titles.idle}</h2>
|
|
3955
|
+
<p class="result-desc">${s.modal.subtitles.idle}</p>
|
|
3956
|
+
<button class="btn-primary" @click=${this.requestClose}>${s.modal.actions.close}</button>
|
|
3957
|
+
</div>
|
|
3958
|
+
`);
|
|
3959
|
+
const r = this.isLoadingData || this.currentStep === g.SHOW_QR && !this.qrCodeUrl;
|
|
3960
|
+
return f`
|
|
3961
|
+
<dialog @close=${this.handleDialogNativeClose}>
|
|
3962
|
+
${r ? f`
|
|
3963
|
+
<div class="spinner-overlay">
|
|
3964
|
+
<div class="spinner"></div>
|
|
3965
|
+
</div>` : ""}
|
|
3966
|
+
${t}
|
|
3967
|
+
<div class="modal-body">
|
|
3968
|
+
${e}
|
|
3969
|
+
</div>
|
|
3970
|
+
</dialog>
|
|
3971
|
+
`;
|
|
3972
|
+
}
|
|
3973
|
+
// End render
|
|
3974
|
+
};
|
|
3975
|
+
k.styles = [
|
|
3976
|
+
Bt,
|
|
3977
|
+
cr,
|
|
3978
|
+
hr,
|
|
3979
|
+
Ar,
|
|
3980
|
+
mr,
|
|
3981
|
+
B`
|
|
3982
|
+
/* --- HEADER --- */
|
|
3983
|
+
.modal-header {
|
|
3984
|
+
position: relative; /* Para posicionar el botón de cerrar */
|
|
3985
|
+
padding: 1.5rem 1.5rem 0.5rem;
|
|
3986
|
+
display: flex;
|
|
3987
|
+
justify-content: center; /* Título centrado si lo hubiera */
|
|
3988
|
+
align-items: center;
|
|
3989
|
+
}
|
|
3990
|
+
|
|
3991
|
+
.close-button, .back-button {
|
|
3992
|
+
position: absolute;
|
|
3993
|
+
top: 1.5rem;
|
|
3994
|
+
background: none;
|
|
3995
|
+
border: none;
|
|
3996
|
+
cursor: pointer;
|
|
3997
|
+
color: #9ca3af;
|
|
3998
|
+
transition: color 0.2s;
|
|
3999
|
+
padding: 5px;
|
|
4000
|
+
}
|
|
4001
|
+
.close-button { right: 1.5rem; font-size: 1.5rem; }
|
|
4002
|
+
.back-button { left: 1.5rem; font-size: 1.2rem; }
|
|
4003
|
+
.close-button:hover, .back-button:hover { color: #374151; }
|
|
4004
|
+
|
|
4005
|
+
/* --- BODY --- */
|
|
4006
|
+
.modal-body {
|
|
4007
|
+
padding: 1rem 2rem 2.5rem; /* Padding generoso abajo */
|
|
4008
|
+
text-align: center;
|
|
4009
|
+
}
|
|
4010
|
+
|
|
4011
|
+
/* Títulos */
|
|
4012
|
+
h2 {
|
|
4013
|
+
font-size: 1.25rem;
|
|
4014
|
+
font-weight: 700;
|
|
4015
|
+
margin: 0 0 0.5rem;
|
|
4016
|
+
}
|
|
4017
|
+
.highlight { color: var(--apolo-accent); } /* Naranja de tus imágenes */
|
|
4018
|
+
|
|
4019
|
+
p.subtitle {
|
|
4020
|
+
font-size: 0.9rem;
|
|
4021
|
+
color: #6b7280;
|
|
4022
|
+
margin: 0 0 1rem;
|
|
4023
|
+
line-height: 1.4;
|
|
4024
|
+
}
|
|
4025
|
+
|
|
4026
|
+
/* --- LISTAS DE SELECCIÓN (Botones grandes blancos) --- */
|
|
4027
|
+
.selection-list {
|
|
4028
|
+
display: flex;
|
|
4029
|
+
flex-direction: column;
|
|
4030
|
+
gap: 1rem;
|
|
4031
|
+
}
|
|
4032
|
+
|
|
4033
|
+
.selection-card {
|
|
4034
|
+
display: flex;
|
|
4035
|
+
align-items: center;
|
|
4036
|
+
background: white;
|
|
4037
|
+
border: 1px solid #f3f4f6; /* Borde muy sutil */
|
|
4038
|
+
border-radius: 16px;
|
|
4039
|
+
padding: 1rem;
|
|
4040
|
+
cursor: pointer;
|
|
4041
|
+
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03);
|
|
4042
|
+
transition: transform 0.2s, box-shadow 0.2s, border-color 0.2s;
|
|
4043
|
+
}
|
|
4044
|
+
|
|
4045
|
+
.selection-card:hover {
|
|
4046
|
+
transform: translateY(-2px);
|
|
4047
|
+
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.08);
|
|
4048
|
+
border-color: var(--apolo-accent); /* Hover naranja */
|
|
4049
|
+
}
|
|
4050
|
+
|
|
4051
|
+
.coin-icon {
|
|
4052
|
+
width: 40px;
|
|
4053
|
+
height: 40px;
|
|
4054
|
+
margin-right: 1rem;
|
|
4055
|
+
object-fit: cover;
|
|
4056
|
+
}
|
|
4057
|
+
|
|
4058
|
+
.card-text {
|
|
4059
|
+
text-align: left;
|
|
4060
|
+
display: flex;
|
|
4061
|
+
flex-direction: column;
|
|
4062
|
+
}
|
|
4063
|
+
.card-title { font-weight: 600; font-size: 1rem; color: var(--apolo-text); }
|
|
4064
|
+
.card-sub { font-size: 0.8rem; color: var(--apolo-text-muted); text-transform: uppercase;}
|
|
4065
|
+
|
|
4066
|
+
/* --- QR SCREENS --- */
|
|
4067
|
+
.timer {
|
|
4068
|
+
color: var(--apolo-accent);
|
|
4069
|
+
font-weight: 600;
|
|
4070
|
+
font-size: 0.9rem;
|
|
4071
|
+
margin-bottom: 1rem;
|
|
4072
|
+
display: block;
|
|
4073
|
+
}
|
|
4074
|
+
|
|
4075
|
+
/* Botón Naranja Grande */
|
|
4076
|
+
.btn-primary {
|
|
4077
|
+
background-color: var(--apolo-accent); /* Naranja Apolo */
|
|
4078
|
+
color: white;
|
|
4079
|
+
padding: 0.5rem 1.5rem;
|
|
4080
|
+
border-radius: var(--apolo-radius-lg); /* Pill shape */
|
|
4081
|
+
border: none;
|
|
4082
|
+
font-weight: 400;
|
|
4083
|
+
font-size: .9rem;
|
|
4084
|
+
cursor: pointer;
|
|
4085
|
+
box-shadow: 0 4px 10px rgba(234, 88, 12, 0.3);
|
|
4086
|
+
transition: transform 0.1s, box-shadow 0.1s;
|
|
4087
|
+
}
|
|
4088
|
+
.btn-primary:hover { transform: translateY(-1px); box-shadow: 0 6px 15px rgba(234, 88, 12, 0.4); }
|
|
4089
|
+
|
|
4090
|
+
/* Botón Azul Oscuro (Apolo Pay QR) */
|
|
4091
|
+
.btn-dark {
|
|
4092
|
+
background-color: var(--apolo-primary-darkest);
|
|
4093
|
+
color: white;
|
|
4094
|
+
width: 100%;
|
|
4095
|
+
padding: 1rem;
|
|
4096
|
+
border-radius: var(--apolo-radius);
|
|
4097
|
+
border: none;
|
|
4098
|
+
font-weight: 600;
|
|
4099
|
+
cursor: pointer;
|
|
4100
|
+
margin-block: 0.25rem 1.25rem;
|
|
4101
|
+
}
|
|
4102
|
+
|
|
4103
|
+
.warning-text {
|
|
4104
|
+
font-size: 0.75rem;
|
|
4105
|
+
text-align: left;
|
|
4106
|
+
margin-top: 1.5rem;
|
|
4107
|
+
line-height: 1.5;
|
|
4108
|
+
}
|
|
4109
|
+
.warning-text strong { color: var(--apolo-accent); }
|
|
4110
|
+
|
|
4111
|
+
.warning-text ul {
|
|
4112
|
+
padding-left: 1.5rem;
|
|
4113
|
+
}
|
|
4114
|
+
|
|
4115
|
+
|
|
4116
|
+
/* --- PANTALLA DE RESULTADO --- */
|
|
4117
|
+
.result-container {
|
|
4118
|
+
text-align: center;
|
|
4119
|
+
animation: fadeIn 0.5s ease-out;
|
|
4120
|
+
}
|
|
4121
|
+
|
|
4122
|
+
/* Animación simple de entrada */
|
|
4123
|
+
@keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }
|
|
4124
|
+
|
|
4125
|
+
.success-icon {
|
|
4126
|
+
width: 80px;
|
|
4127
|
+
height: 80px;
|
|
4128
|
+
margin: 0 auto 1.5rem;
|
|
4129
|
+
}
|
|
4130
|
+
|
|
4131
|
+
/* Animación del Check SVG */
|
|
4132
|
+
.checkmark-circle {
|
|
4133
|
+
stroke-dasharray: 166;
|
|
4134
|
+
stroke-dashoffset: 166;
|
|
4135
|
+
stroke-width: 2;
|
|
4136
|
+
stroke: #22c55e; /* Verde éxito */
|
|
4137
|
+
fill: none;
|
|
4138
|
+
animation: stroke 0.6s cubic-bezier(0.65, 0, 0.45, 1) forwards;
|
|
4139
|
+
}
|
|
4140
|
+
.checkmark-check {
|
|
4141
|
+
transform-origin: 50% 50%;
|
|
4142
|
+
stroke-dasharray: 48;
|
|
4143
|
+
stroke-dashoffset: 48;
|
|
4144
|
+
stroke: #22c55e;
|
|
4145
|
+
stroke-width: 4;
|
|
4146
|
+
animation: stroke 0.3s cubic-bezier(0.65, 0, 0.45, 1) 0.6s forwards;
|
|
4147
|
+
}
|
|
4148
|
+
@keyframes stroke { 100% { stroke-dashoffset: 0; } }
|
|
4149
|
+
|
|
4150
|
+
.result-title {
|
|
4151
|
+
font-size: 1.5rem;
|
|
4152
|
+
margin-bottom: 1rem;
|
|
4153
|
+
}
|
|
4154
|
+
|
|
4155
|
+
.result-desc {
|
|
4156
|
+
font-size: 0.95rem;
|
|
4157
|
+
margin-bottom: 1.5rem;
|
|
4158
|
+
line-height: 1.5;
|
|
4159
|
+
}
|
|
4160
|
+
|
|
4161
|
+
.purchase-details {
|
|
4162
|
+
text-align: left;
|
|
4163
|
+
margin-bottom: 1.5rem;
|
|
4164
|
+
}
|
|
4165
|
+
|
|
4166
|
+
.details-title {
|
|
4167
|
+
font-size: 1rem;
|
|
4168
|
+
font-weight: 700;
|
|
4169
|
+
text-decoration: underline;
|
|
4170
|
+
text-decoration-color: var(--apolo-text);
|
|
4171
|
+
text-underline-offset: 4px;
|
|
4172
|
+
text-align: center;
|
|
4173
|
+
margin-bottom: 1.5rem;
|
|
4174
|
+
}
|
|
4175
|
+
|
|
4176
|
+
/* Estilo Error */
|
|
4177
|
+
.error-icon { font-size: 4rem; margin-bottom: 1rem; }
|
|
4178
|
+
|
|
4179
|
+
/* Estilo Processing */
|
|
4180
|
+
.processing-container {
|
|
4181
|
+
display: flex;
|
|
4182
|
+
flex-direction: column;
|
|
4183
|
+
align-items: center;
|
|
4184
|
+
gap: 1.5rem;
|
|
4185
|
+
padding-top: 1rem;
|
|
4186
|
+
}
|
|
4187
|
+
|
|
4188
|
+
/* Animación de puntos */
|
|
4189
|
+
.dots-loader {
|
|
4190
|
+
display: flex;
|
|
4191
|
+
justify-content: center;
|
|
4192
|
+
align-items: center;
|
|
4193
|
+
gap: 8px;
|
|
4194
|
+
height: 40px;
|
|
4195
|
+
}
|
|
4196
|
+
|
|
4197
|
+
.dot {
|
|
4198
|
+
width: 12px;
|
|
4199
|
+
height: 12px;
|
|
4200
|
+
background-color: var(--apolo-accent);
|
|
4201
|
+
border-radius: 50%;
|
|
4202
|
+
display: inline-block;
|
|
4203
|
+
animation: dot-pulse 1.5s infinite ease-in-out;
|
|
4204
|
+
}
|
|
4205
|
+
|
|
4206
|
+
.dot:nth-child(2) { animation-delay: 0.2s; width: 16px; height: 16px; }
|
|
4207
|
+
.dot:nth-child(3) { animation-delay: 0.4s; width: 20px; height: 20px; }
|
|
4208
|
+
.dot:nth-child(4) { animation-delay: 0.6s; width: 16px; height: 16px; }
|
|
4209
|
+
.dot:nth-child(5) { animation-delay: 0.8s; }
|
|
4210
|
+
|
|
4211
|
+
@keyframes dot-pulse {
|
|
4212
|
+
0%, 100% { transform: scale(0.7); opacity: 0.5; }
|
|
4213
|
+
50% { transform: scale(1.1); opacity: 1; }
|
|
4214
|
+
}
|
|
4215
|
+
|
|
4216
|
+
.processing-title {
|
|
4217
|
+
font-size: 1.5rem;
|
|
4218
|
+
font-weight: 800;
|
|
4219
|
+
color: var(--apolo-primary-darkest);
|
|
4220
|
+
margin: 0;
|
|
4221
|
+
}
|
|
4222
|
+
|
|
4223
|
+
/* Balance Card */
|
|
4224
|
+
.balance-card {
|
|
4225
|
+
background-color: #fff7ed; /* Un naranja muy claro de fondo */
|
|
4226
|
+
border: 1px dashed var(--apolo-accent);
|
|
4227
|
+
border-radius: 12px;
|
|
4228
|
+
padding: 0.8rem;
|
|
4229
|
+
margin-bottom: 1.5rem;
|
|
4230
|
+
animation: slideDown 0.4s ease-out;
|
|
4231
|
+
}
|
|
4232
|
+
|
|
4233
|
+
.balance-row {
|
|
4234
|
+
display: flex;
|
|
4235
|
+
justify-content: space-between;
|
|
4236
|
+
align-items: center;
|
|
4237
|
+
font-size: 0.85rem;
|
|
4238
|
+
margin-bottom: 0.25rem;
|
|
4239
|
+
}
|
|
4240
|
+
|
|
4241
|
+
.balance-row:last-child { margin-bottom: 0; }
|
|
4242
|
+
|
|
4243
|
+
.balance-label { color: #6b7280; }
|
|
4244
|
+
.balance-value { font-weight: 700; color: var(--apolo-primary-darkest); }
|
|
4245
|
+
|
|
4246
|
+
@keyframes slideDown {
|
|
4247
|
+
from { opacity: 0; transform: translateY(-10px); }
|
|
4248
|
+
to { opacity: 1; transform: translateY(0); }
|
|
4249
|
+
}
|
|
4250
|
+
`
|
|
4251
|
+
];
|
|
4252
|
+
v([
|
|
4253
|
+
d({ type: Boolean })
|
|
4254
|
+
], k.prototype, "isOpen", 2);
|
|
4255
|
+
v([
|
|
4256
|
+
d({ type: Boolean })
|
|
4257
|
+
], k.prototype, "barrierDismissible", 2);
|
|
4258
|
+
v([
|
|
4259
|
+
d({ type: String })
|
|
4260
|
+
], k.prototype, "lang", 2);
|
|
4261
|
+
v([
|
|
4262
|
+
d({ type: String })
|
|
4263
|
+
], k.prototype, "productTitle", 2);
|
|
4264
|
+
v([
|
|
4265
|
+
d({ type: Number })
|
|
4266
|
+
], k.prototype, "currentStep", 2);
|
|
4267
|
+
v([
|
|
4268
|
+
d({ type: String })
|
|
4269
|
+
], k.prototype, "status", 2);
|
|
4270
|
+
v([
|
|
4271
|
+
d({ type: Object })
|
|
4272
|
+
], k.prototype, "error", 2);
|
|
4273
|
+
v([
|
|
4274
|
+
d({ type: Boolean })
|
|
4275
|
+
], k.prototype, "isLoadingData", 2);
|
|
4276
|
+
v([
|
|
4277
|
+
d({ type: Array })
|
|
4278
|
+
], k.prototype, "assets", 2);
|
|
4279
|
+
v([
|
|
4280
|
+
d({ type: String })
|
|
4281
|
+
], k.prototype, "selectedAsset", 2);
|
|
4282
|
+
v([
|
|
4283
|
+
d({ type: String })
|
|
4284
|
+
], k.prototype, "selectedNetwork", 2);
|
|
4285
|
+
v([
|
|
4286
|
+
d({ type: String })
|
|
4287
|
+
], k.prototype, "qrCodeUrl", 2);
|
|
4288
|
+
v([
|
|
4289
|
+
d({ type: String })
|
|
4290
|
+
], k.prototype, "paymentAddress", 2);
|
|
4291
|
+
v([
|
|
4292
|
+
d({ type: Number })
|
|
4293
|
+
], k.prototype, "amount", 2);
|
|
4294
|
+
v([
|
|
4295
|
+
d({ type: Number })
|
|
4296
|
+
], k.prototype, "amountPaid", 2);
|
|
4297
|
+
v([
|
|
4298
|
+
d({ type: String })
|
|
4299
|
+
], k.prototype, "email", 2);
|
|
4300
|
+
v([
|
|
4301
|
+
d({ type: Number })
|
|
4302
|
+
], k.prototype, "qrCodeExpiresAt", 2);
|
|
4303
|
+
v([
|
|
4304
|
+
d({ type: String })
|
|
4305
|
+
], k.prototype, "paymentUrl", 2);
|
|
4306
|
+
v([
|
|
4307
|
+
C()
|
|
4308
|
+
], k.prototype, "isAddressCopied", 2);
|
|
4309
|
+
v([
|
|
4310
|
+
is("dialog")
|
|
4311
|
+
], k.prototype, "dialogElement", 2);
|
|
4312
|
+
k = v([
|
|
4313
|
+
me("payment-modal")
|
|
4314
|
+
], k);
|
|
4315
|
+
var br = Object.defineProperty, Sr = Object.getOwnPropertyDescriptor, m = (s, e, t, r) => {
|
|
4316
|
+
for (var i = r > 1 ? void 0 : r ? Sr(e, t) : e, n = s.length - 1, o; n >= 0; n--)
|
|
4317
|
+
(o = s[n]) && (i = (r ? o(e, t, i) : o(i)) || i);
|
|
4318
|
+
return r && i && br(e, t, i), i;
|
|
4319
|
+
};
|
|
4320
|
+
let A = class extends I {
|
|
4321
|
+
constructor() {
|
|
4322
|
+
super(...arguments), this.client = void 0, this.processId = void 0, this.productTitle = void 0, this.lang = "es", this.label = void 0, this.loading = !1, this.disabled = !1, this.barrierDismissible = !1, this.isOpen = !1, this.status = "idle", this.currentStep = g.SELECT_ASSET, this.selectedAsset = null, this.selectedNetwork = null, this.qrCodeUrl = null, this.qrCodeExpiresAt = null, this.paymentAddress = null, this.paymentUrl = null, this.assets = [], this.successResult = null, this.error = null, this.isLoadingData = !0, this.amount = 0, this.amountPaid = void 0, this.hasConfigError = !1, this.email = null, this._service = null;
|
|
4323
|
+
}
|
|
4324
|
+
// Detectar cambios en propiedades
|
|
4325
|
+
willUpdate(s) {
|
|
4326
|
+
s.has("lang") && y.setLocale(this.lang), (s.has("client") || s.has("processId")) && (this.validateConfig(), this.client && this._service === null && this.initService(), this.client && this.processId && this.loadInitialData()), super.willUpdate(s);
|
|
4327
|
+
}
|
|
4328
|
+
// Internal business logic manager
|
|
4329
|
+
// --- API Client Instance ---
|
|
4330
|
+
// If the 'client' property is not provided, the component might fail.
|
|
4331
|
+
// We no longer manage the client instance internally.
|
|
4332
|
+
// --- Lifecycle Methods ---
|
|
4333
|
+
// Called when the component is added to the DOM
|
|
4334
|
+
connectedCallback() {
|
|
4335
|
+
super.connectedCallback(), this.validateConfig(), this.client && (this.initService(), this.processId && this.loadInitialData());
|
|
4336
|
+
}
|
|
4337
|
+
initService() {
|
|
4338
|
+
!this.client || this.hasConfigError || (this._service = new or(this.client));
|
|
4339
|
+
}
|
|
4340
|
+
get isValidProcessId() {
|
|
4341
|
+
return this.processId ? /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/.test(this.processId) : !1;
|
|
4342
|
+
}
|
|
4343
|
+
validateConfig() {
|
|
4344
|
+
const s = this.client?.getPublicKey(), e = !!(s && s.startsWith("pk_") && s.length === 35);
|
|
4345
|
+
this.client && !e && console.error(
|
|
4346
|
+
`PaymentButton Error: Invalid publicKey "${s}". Must start with "pk_" and be 35 characters long.`
|
|
4347
|
+
), this.hasConfigError = !this.client || !e;
|
|
4348
|
+
}
|
|
4349
|
+
// Called when the component is removed from the DOM
|
|
4350
|
+
disconnectedCallback() {
|
|
4351
|
+
super.disconnectedCallback(), this._service?.disconnectWebSocket();
|
|
4352
|
+
}
|
|
4353
|
+
// Replaced by external client initialization
|
|
4354
|
+
// --- Data Loading ---
|
|
4355
|
+
async loadInitialData() {
|
|
4356
|
+
if (this._service && (this.isLoadingData = !0, this.error = null, !!this.processId))
|
|
4357
|
+
try {
|
|
4358
|
+
this.assets = await this._service.getAssets();
|
|
4359
|
+
} catch (s) {
|
|
4360
|
+
console.error("Error loading initial payment options:", s), this.error = { code: X.data_load_error, message: y.t.errors.dataLoadError };
|
|
4361
|
+
} finally {
|
|
4362
|
+
this.isLoadingData = !1;
|
|
4363
|
+
}
|
|
4364
|
+
}
|
|
4365
|
+
resetState() {
|
|
4366
|
+
this.currentStep = g.SELECT_ASSET, this.status = "idle", this.error = null, this.successResult = null, this.selectedAsset = null, this.selectedNetwork = null, this.qrCodeUrl = null, this.paymentAddress = null, this.paymentUrl = null, this.qrCodeExpiresAt = null;
|
|
4367
|
+
}
|
|
4368
|
+
// --- Event Handlers (Triggered by Child Components) ---
|
|
4369
|
+
// Triggered by <trigger-button> when clicked
|
|
4370
|
+
handleOpen() {
|
|
4371
|
+
if (this.resetState(), this.hasConfigError || !this.client || !this.processId) {
|
|
4372
|
+
console.error("PaymentButton Error: client and process-id are required and must be valid");
|
|
4373
|
+
return;
|
|
4374
|
+
}
|
|
4375
|
+
this.loading || (this.isOpen = !0);
|
|
4376
|
+
}
|
|
4377
|
+
// Triggered by <payment-modal> requesting to close (X, backdrop, Escape)
|
|
4378
|
+
handleCloseRequest() {
|
|
4379
|
+
this.isOpen = !1, this.currentStep === g.SHOW_QR && this.status !== "success" && this.status !== "error" && this._service?.disconnectWebSocket(), setTimeout(() => this.resetState(), 300), this.successResult ? this.successResult.code === X.payment_partial ? this.dispatchEvent(new CustomEvent("partialPayment", { detail: this.successResult })) : this.dispatchEvent(new CustomEvent("success", { detail: this.successResult })) : this.error && (this.error.code === X.payment_timeout ? this.dispatchEvent(new CustomEvent("expired", { detail: this.error })) : this.dispatchEvent(new CustomEvent("error", { detail: this.error })));
|
|
4380
|
+
}
|
|
4381
|
+
// Triggered by <payment-modal> when an asset is selected
|
|
4382
|
+
handleAssetSelect(s) {
|
|
4383
|
+
this.selectedAsset = s.detail.assetId, this.currentStep = g.SELECT_NETWORK, this.error = null;
|
|
4384
|
+
}
|
|
4385
|
+
handleExpired(s) {
|
|
4386
|
+
this.error = s.detail.error;
|
|
4387
|
+
}
|
|
4388
|
+
// Triggered by <payment-modal> when a network is selected
|
|
4389
|
+
async handleInitiatePayment(s) {
|
|
4390
|
+
if (!this.client || !this.processId || (this.selectedNetwork = s.detail.networkId, !this.selectedAsset || !this.selectedNetwork)) return;
|
|
4391
|
+
const e = {
|
|
4392
|
+
assetId: this.selectedAsset,
|
|
4393
|
+
networkId: this.selectedNetwork
|
|
4394
|
+
};
|
|
4395
|
+
this.status = "loading", this.currentStep = g.SHOW_QR, this.qrCodeUrl = null, this.paymentAddress = null, this.error = null;
|
|
4396
|
+
try {
|
|
4397
|
+
const t = await this._service.fetchQrCodeDetails(e, {
|
|
4398
|
+
processId: this.processId,
|
|
4399
|
+
onSuccess: (r) => {
|
|
4400
|
+
this.isOpen && (this.status = "processing", this.currentStep = g.RESULT, this.successResult = r, setTimeout(() => {
|
|
4401
|
+
this.status = "success";
|
|
4402
|
+
}, 2e3));
|
|
4403
|
+
},
|
|
4404
|
+
onPartialPayment: (r) => {
|
|
4405
|
+
this.isOpen && (this.status = "idle", this.currentStep = g.SHOW_QR, this.amount = Number(r.result?.amount || "0"), this.amountPaid = Number(r.result?.amountPaid || "0"), this.successResult = r);
|
|
4406
|
+
},
|
|
4407
|
+
onError: (r) => {
|
|
4408
|
+
this.isOpen && (this.status = "error", this.error = r, this.currentStep = g.RESULT, this.error = r);
|
|
4409
|
+
}
|
|
4410
|
+
});
|
|
4411
|
+
this.qrCodeUrl = t.qrCodeUrl, this.paymentAddress = t.address, this.paymentUrl = t.paymentUrl || null, this.qrCodeExpiresAt = t.expiresAtMs, this.amount = typeof t.amount == "string" ? parseFloat(t.amount) : t.amount, t.amountPaid && (this.amountPaid = typeof t.amountPaid == "string" ? parseFloat(t.amountPaid) : t.amountPaid), this.status = "idle";
|
|
4412
|
+
} catch (t) {
|
|
4413
|
+
const r = t;
|
|
4414
|
+
if (this.error = r, this.status = "error", r.code === X.paymentProcessNotAvailable) {
|
|
4415
|
+
this.currentStep = g.RESULT;
|
|
4416
|
+
return;
|
|
4417
|
+
}
|
|
4418
|
+
console.error("Error fetching QR code details:", r), this.currentStep = g.SELECT_NETWORK;
|
|
4419
|
+
}
|
|
4420
|
+
}
|
|
4421
|
+
// Triggered by <payment-modal> "Back" buttons
|
|
4422
|
+
handleChangeStep(s) {
|
|
4423
|
+
this.currentStep === g.SHOW_QR && s.detail !== g.RESULT && this._service?.disconnectWebSocket(), this.currentStep = s.detail, this.status = "idle", this.error = null, this.currentStep !== g.SHOW_QR && (this.qrCodeUrl = null, this.paymentAddress = null, this.paymentUrl = null);
|
|
4424
|
+
}
|
|
4425
|
+
// --- Render Method ---
|
|
4426
|
+
render() {
|
|
4427
|
+
return f`
|
|
4428
|
+
<div id="trigger-wrapper" @click=${this.handleOpen}>
|
|
4429
|
+
<slot>
|
|
4430
|
+
<trigger-button
|
|
4431
|
+
.lang=${this.lang}
|
|
4432
|
+
.label=${this.label}
|
|
4433
|
+
.loading=${this.loading || this.isLoadingData && !this.hasConfigError || !this.isValidProcessId}
|
|
4434
|
+
.hasError=${this.hasConfigError}
|
|
4435
|
+
?disabled=${this.disabled || this.hasConfigError || !this.isValidProcessId}
|
|
4436
|
+
></trigger-button>
|
|
4437
|
+
</slot>
|
|
4438
|
+
</div>
|
|
4439
|
+
|
|
4440
|
+
<payment-modal
|
|
4441
|
+
?isOpen=${this.isOpen}
|
|
4442
|
+
.barrierDismissible=${this.barrierDismissible}
|
|
4443
|
+
.lang=${this.lang}
|
|
4444
|
+
.currentStep=${this.currentStep}
|
|
4445
|
+
.status=${this.status}
|
|
4446
|
+
.productTitle=${this.productTitle}
|
|
4447
|
+
.error=${this.error}
|
|
4448
|
+
.isLoadingData=${this.isLoadingData}
|
|
4449
|
+
.assets=${this.assets}
|
|
4450
|
+
.selectedAsset=${this.selectedAsset}
|
|
4451
|
+
.selectedNetwork=${this.selectedNetwork}
|
|
4452
|
+
.qrCodeUrl=${this.qrCodeUrl}
|
|
4453
|
+
.paymentAddress=${this.paymentAddress}
|
|
4454
|
+
.amount=${this.amount}
|
|
4455
|
+
.amountPaid=${this.amountPaid}
|
|
4456
|
+
.email=${this.email}
|
|
4457
|
+
.qrCodeExpiresAt=${this.qrCodeExpiresAt}
|
|
4458
|
+
.paymentUrl=${this.paymentUrl}
|
|
4459
|
+
@closeRequest=${this.handleCloseRequest}
|
|
4460
|
+
@assetSelect=${this.handleAssetSelect}
|
|
4461
|
+
@networkSelect=${this.handleInitiatePayment}
|
|
4462
|
+
@changeStep=${this.handleChangeStep}
|
|
4463
|
+
@expired=${this.handleExpired}
|
|
4464
|
+
></payment-modal>
|
|
4465
|
+
`;
|
|
4466
|
+
}
|
|
4467
|
+
};
|
|
4468
|
+
A.styles = B`
|
|
4469
|
+
:host {
|
|
4470
|
+
display: inline-block;
|
|
4471
|
+
}
|
|
4472
|
+
|
|
4473
|
+
#trigger-wrapper {
|
|
4474
|
+
position: relative;
|
|
4475
|
+
display: inline-block;
|
|
4476
|
+
cursor: pointer;
|
|
4477
|
+
}
|
|
4478
|
+
`;
|
|
4479
|
+
m([
|
|
4480
|
+
d({ type: Object })
|
|
4481
|
+
], A.prototype, "client", 2);
|
|
4482
|
+
m([
|
|
4483
|
+
d({ type: String, attribute: "process-id" })
|
|
4484
|
+
], A.prototype, "processId", 2);
|
|
4485
|
+
m([
|
|
4486
|
+
d({ type: String, attribute: "product-title" })
|
|
4487
|
+
], A.prototype, "productTitle", 2);
|
|
4488
|
+
m([
|
|
4489
|
+
d({ type: String })
|
|
4490
|
+
], A.prototype, "lang", 2);
|
|
4491
|
+
m([
|
|
4492
|
+
d({ type: String })
|
|
4493
|
+
], A.prototype, "label", 2);
|
|
4494
|
+
m([
|
|
4495
|
+
d({ type: Boolean })
|
|
4496
|
+
], A.prototype, "loading", 2);
|
|
4497
|
+
m([
|
|
4498
|
+
d({ type: Boolean })
|
|
4499
|
+
], A.prototype, "disabled", 2);
|
|
4500
|
+
m([
|
|
4501
|
+
d({
|
|
4502
|
+
type: Boolean,
|
|
4503
|
+
attribute: "barrier-dismissible",
|
|
4504
|
+
converter: {
|
|
4505
|
+
fromAttribute: (s) => s === null ? !1 : s !== "false",
|
|
4506
|
+
toAttribute: (s) => s ? "" : null
|
|
4507
|
+
}
|
|
4508
|
+
})
|
|
4509
|
+
], A.prototype, "barrierDismissible", 2);
|
|
4510
|
+
m([
|
|
4511
|
+
C()
|
|
4512
|
+
], A.prototype, "isOpen", 2);
|
|
4513
|
+
m([
|
|
4514
|
+
C()
|
|
4515
|
+
], A.prototype, "status", 2);
|
|
4516
|
+
m([
|
|
4517
|
+
C()
|
|
4518
|
+
], A.prototype, "currentStep", 2);
|
|
4519
|
+
m([
|
|
4520
|
+
C()
|
|
4521
|
+
], A.prototype, "selectedAsset", 2);
|
|
4522
|
+
m([
|
|
4523
|
+
C()
|
|
4524
|
+
], A.prototype, "selectedNetwork", 2);
|
|
4525
|
+
m([
|
|
4526
|
+
C()
|
|
4527
|
+
], A.prototype, "qrCodeUrl", 2);
|
|
4528
|
+
m([
|
|
4529
|
+
C()
|
|
4530
|
+
], A.prototype, "qrCodeExpiresAt", 2);
|
|
4531
|
+
m([
|
|
4532
|
+
C()
|
|
4533
|
+
], A.prototype, "paymentAddress", 2);
|
|
4534
|
+
m([
|
|
4535
|
+
C()
|
|
4536
|
+
], A.prototype, "paymentUrl", 2);
|
|
4537
|
+
m([
|
|
4538
|
+
C()
|
|
4539
|
+
], A.prototype, "assets", 2);
|
|
4540
|
+
m([
|
|
4541
|
+
C()
|
|
4542
|
+
], A.prototype, "successResult", 2);
|
|
4543
|
+
m([
|
|
4544
|
+
C()
|
|
4545
|
+
], A.prototype, "error", 2);
|
|
4546
|
+
m([
|
|
4547
|
+
C()
|
|
4548
|
+
], A.prototype, "isLoadingData", 2);
|
|
4549
|
+
m([
|
|
4550
|
+
C()
|
|
4551
|
+
], A.prototype, "amount", 2);
|
|
4552
|
+
m([
|
|
4553
|
+
C()
|
|
4554
|
+
], A.prototype, "amountPaid", 2);
|
|
4555
|
+
m([
|
|
4556
|
+
C()
|
|
4557
|
+
], A.prototype, "hasConfigError", 2);
|
|
4558
|
+
m([
|
|
4559
|
+
C()
|
|
4560
|
+
], A.prototype, "email", 2);
|
|
4561
|
+
m([
|
|
4562
|
+
C()
|
|
4563
|
+
], A.prototype, "_service", 2);
|
|
4564
|
+
A = m([
|
|
4565
|
+
me("apolopay-button")
|
|
4566
|
+
], A);
|
|
4567
|
+
export {
|
|
4568
|
+
A as ApoloPayButton,
|
|
4569
|
+
Kr as ApoloPayClient,
|
|
4570
|
+
X as ClientCode,
|
|
4571
|
+
Ce as ClientError,
|
|
4572
|
+
lt as ClientResponse,
|
|
4573
|
+
xt as ClientResponseBase,
|
|
4574
|
+
y as I18n,
|
|
4575
|
+
g as ModalStep,
|
|
4576
|
+
or as PaymentService
|
|
4577
|
+
};
|