@alipay/ams-checkout 2.0.20 → 2.0.22

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.
Files changed (51) hide show
  1. package/ams-checkout.js +3 -3
  2. package/dist/ams-checkout.min.js +1 -1
  3. package/esm/config/index.d.ts +7 -0
  4. package/esm/config/index.js +2 -2
  5. package/esm/constant/element.d.ts +2 -1
  6. package/esm/constant/element.js +1 -0
  7. package/esm/constant/index.d.ts +4 -21
  8. package/esm/core/component/element/elementController/index.d.ts +3 -3
  9. package/esm/core/component/element/elementController/index.js +66 -42
  10. package/esm/core/component/element/elementProcessor/paymentProcessor.js +13 -10
  11. package/esm/core/component/element/index.d.ts +4 -1
  12. package/esm/core/component/element/index.js +19 -4
  13. package/esm/core/component/element/mock.js +1 -1
  14. package/esm/core/component/element/modernElementController/adapter.d.ts +19 -0
  15. package/esm/core/component/element/modernElementController/adapter.js +79 -0
  16. package/esm/core/component/element/modernElementController/index.d.ts +155 -0
  17. package/esm/core/component/element/modernElementController/index.js +1818 -0
  18. package/esm/core/component/element/type.d.ts +16 -18
  19. package/esm/core/instance/index.d.ts +12 -4
  20. package/esm/core/instance/index.js +152 -26
  21. package/esm/foundation/service/event-center.js +1 -1
  22. package/esm/foundation/service/security/index.d.ts +9 -4
  23. package/esm/foundation/service/security/index.js +158 -35
  24. package/esm/foundation/service/security/security.d.ts +22 -1
  25. package/esm/foundation/service/security/security.js +150 -37
  26. package/esm/foundation/utils/preload_helper.d.ts +6 -3
  27. package/esm/foundation/utils/preload_helper.js +122 -32
  28. package/esm/main.js +4 -4
  29. package/esm/modern/global.d.ts +3 -0
  30. package/esm/modern/index.d.ts +5 -1
  31. package/esm/modern/index.js +1 -51
  32. package/esm/modern/tools.js +1 -0
  33. package/esm/plugin/component/channel.d.ts +3 -3
  34. package/esm/plugin/component/channel.js +28 -19
  35. package/esm/plugin/component/index.js +36 -29
  36. package/esm/tsdoc-metadata.json +1 -1
  37. package/esm/types/index.d.ts +1 -0
  38. package/esm/util/beforeConfirm.d.ts +4 -2
  39. package/esm/util/beforeConfirm.js +15 -14
  40. package/esm/util/jshield-apdid/apdid-loader.js +377 -0
  41. package/esm/util/jshield-apdid/index.js +21 -0
  42. package/esm/util/logger.js +1 -2
  43. package/esm/util/security-registry.d.ts +72 -0
  44. package/esm/util/security-registry.js +175 -0
  45. package/esm/util/security.d.ts +22 -1
  46. package/esm/util/security.js +150 -39
  47. package/package.json +15 -9
  48. package/types.d.ts +872 -1102
  49. package/types.untrimmed.d.ts +1024 -1121
  50. package/esm/modern/stageName.d.ts +0 -3
  51. package/esm/modern/stageName.js +0 -1
@@ -0,0 +1,377 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
3
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
4
+ function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
5
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
6
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
7
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
8
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
9
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
10
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
11
+ /**
12
+ * ApdidLoader - Async loader for apdid-core security SDK (ESM)
13
+ *
14
+ * Features:
15
+ * - Singleton pattern (ApdidLoader.getInstance())
16
+ * - URL whitelist validation (production/pre/dev)
17
+ * - Timeout control (10s)
18
+ * - Retry mechanism (max 1 retry, transparent to caller)
19
+ * - Concurrent call dedup (shared loadingPromise)
20
+ * - State management: idle -> loading -> ready/failed
21
+ * - Monitoring event hooks (onLoad callback)
22
+ * - Uses a module script for ESM modules to avoid dynamic import syntax in the UMD bundle
23
+ */
24
+
25
+ /** Environment type for CDN URL selection */
26
+
27
+ /** State of the ApdidLoader */
28
+
29
+ /** Callback for monitoring events */
30
+
31
+ /** Configuration for ApdidLoader */
32
+
33
+ /** CDN config for different environments */
34
+ var APDID_CONFIG = {
35
+ production: {
36
+ url: 'https://cdn.marmot-cloud.com/page/antom-js/apdid-core.umd.min.js'
37
+ },
38
+ pre: {
39
+ url: 'https://antom-js-pre-unio.page.alipay.net/apdid-core.umd.min.js'
40
+ },
41
+ dev: {
42
+ url: 'https://antom-js-dev-unio.page.alipay.net/apdid-core.umd.min.js'
43
+ }
44
+ };
45
+
46
+ /** All allowed URLs (whitelist) */
47
+ var ALLOWED_URLS = new Set(Object.values(APDID_CONFIG).map(function (c) {
48
+ return c.url;
49
+ }));
50
+
51
+ /** Timeout for script loading in milliseconds */
52
+ var LOAD_TIMEOUT_MS = 10000;
53
+
54
+ /** Maximum number of retries */
55
+ var MAX_RETRIES = 1;
56
+
57
+ /** Global variable name (fallback for UMD bundles) */
58
+ var APDID_GLOBAL_NAME = 'APDID';
59
+
60
+ /**
61
+ * ApdidLoader - Singleton class responsible for async loading the apdid-core ESM module.
62
+ *
63
+ * Key behaviors:
64
+ * - Uses a module script to load ESM modules
65
+ * - Concurrent calls share the same loading promise
66
+ * - On success, the APDID global exposed by the module is stored internally
67
+ * - On failure/timeout, the loader degrades gracefully and getApdidModule() returns undefined
68
+ */
69
+ export var ApdidLoader = /*#__PURE__*/function () {
70
+ function ApdidLoader() {
71
+ _classCallCheck(this, ApdidLoader);
72
+ _defineProperty(this, "state", 'idle');
73
+ _defineProperty(this, "loadingPromise", null);
74
+ _defineProperty(this, "apdidModule", null);
75
+ _defineProperty(this, "retryCount", 0);
76
+ _defineProperty(this, "config", null);
77
+ }
78
+
79
+ /** Get the singleton instance */
80
+ _createClass(ApdidLoader, [{
81
+ key: "getState",
82
+ value: /** Get current state */
83
+ function getState() {
84
+ return this.state;
85
+ }
86
+
87
+ /** Get the loaded APDID module (undefined if not loaded or failed) */
88
+ }, {
89
+ key: "getApdidModule",
90
+ value: function getApdidModule() {
91
+ return this.apdidModule;
92
+ }
93
+
94
+ /**
95
+ * 非阻塞调度 apdid 加载
96
+ * 利用 requestIdleCallback 在浏览器空闲时发起加载,2s 超时兜底
97
+ * 调用方无需 await,不阻塞主流程
98
+ */
99
+ }, {
100
+ key: "scheduleLoad",
101
+ value: function scheduleLoad(config) {
102
+ var _this = this;
103
+ if (this.state !== 'idle') return;
104
+ var trigger = function trigger() {
105
+ _this.load(config).catch(function () {
106
+ // 加载失败由 ApdidLoader 内部处理重试和状态更新
107
+ });
108
+ };
109
+ if (typeof requestIdleCallback !== 'undefined') {
110
+ var idleId = requestIdleCallback(trigger, {
111
+ timeout: 2000
112
+ });
113
+ // 兜底:2s 后若仍未触发,强制发起
114
+ setTimeout(function () {
115
+ cancelIdleCallback(idleId);
116
+ if (_this.state === 'idle') {
117
+ trigger();
118
+ }
119
+ }, 2000);
120
+ } else {
121
+ // 不支持 requestIdleCallback 的浏览器降级为 setTimeout(0)
122
+ setTimeout(trigger, 0);
123
+ }
124
+ }
125
+
126
+ /**
127
+ * Load the apdid-core script asynchronously.
128
+ * If already loaded or currently loading, returns the existing promise.
129
+ * Retries are transparent: the returned promise resolves only after the final
130
+ * attempt succeeds, or rejects after all retries are exhausted.
131
+ */
132
+ }, {
133
+ key: "load",
134
+ value: (function () {
135
+ var _load = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(config) {
136
+ var envConfig, _config$callbacks, _config$callbacks$onL, _error, url, _config$callbacks2, _config$callbacks2$on, _error2;
137
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
138
+ while (1) switch (_context.prev = _context.next) {
139
+ case 0:
140
+ if (!(this.state === 'ready')) {
141
+ _context.next = 2;
142
+ break;
143
+ }
144
+ return _context.abrupt("return", Promise.resolve());
145
+ case 2:
146
+ if (!(this.state === 'loading' && this.loadingPromise)) {
147
+ _context.next = 4;
148
+ break;
149
+ }
150
+ return _context.abrupt("return", this.loadingPromise);
151
+ case 4:
152
+ // Store config for potential retry
153
+ this.config = config;
154
+
155
+ // Validate environment and get config
156
+ envConfig = APDID_CONFIG[config.environment];
157
+ if (envConfig) {
158
+ _context.next = 11;
159
+ break;
160
+ }
161
+ _error = new Error("[ApdidLoader] Invalid environment: ".concat(config.environment, ". Must be one of: production, pre, dev"));
162
+ this.state = 'failed';
163
+ (_config$callbacks = config.callbacks) === null || _config$callbacks === void 0 || (_config$callbacks$onL = _config$callbacks.onLoadFailed) === null || _config$callbacks$onL === void 0 || _config$callbacks$onL.call(_config$callbacks, _error);
164
+ return _context.abrupt("return", Promise.reject(_error));
165
+ case 11:
166
+ url = envConfig.url; // Validate URL against whitelist
167
+ if (ALLOWED_URLS.has(url)) {
168
+ _context.next = 17;
169
+ break;
170
+ }
171
+ _error2 = new Error("[ApdidLoader] URL not in whitelist: ".concat(url));
172
+ this.state = 'failed';
173
+ (_config$callbacks2 = config.callbacks) === null || _config$callbacks2 === void 0 || (_config$callbacks2$on = _config$callbacks2.onLoadFailed) === null || _config$callbacks2$on === void 0 || _config$callbacks2$on.call(_config$callbacks2, _error2);
174
+ return _context.abrupt("return", Promise.reject(_error2));
175
+ case 17:
176
+ if (!(this.state === 'failed' && this.retryCount > MAX_RETRIES)) {
177
+ _context.next = 19;
178
+ break;
179
+ }
180
+ return _context.abrupt("return", Promise.reject(new Error('[ApdidLoader] Max retries exceeded')));
181
+ case 19:
182
+ // Start loading - use _loadWithRetry which handles retries transparently
183
+ this.state = 'loading';
184
+ this.loadingPromise = this._loadWithRetry(url, config);
185
+ return _context.abrupt("return", this.loadingPromise);
186
+ case 22:
187
+ case "end":
188
+ return _context.stop();
189
+ }
190
+ }, _callee, this);
191
+ }));
192
+ function load(_x) {
193
+ return _load.apply(this, arguments);
194
+ }
195
+ return load;
196
+ }()
197
+ /**
198
+ * Load module with transparent retry logic.
199
+ * The returned promise resolves/rejects based on the final retry outcome.
200
+ */
201
+ )
202
+ }, {
203
+ key: "_loadWithRetry",
204
+ value: (function () {
205
+ var _loadWithRetry2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(url, config) {
206
+ var _config$callbacks3, _config$callbacks3$on;
207
+ var lastError, attempt;
208
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
209
+ while (1) switch (_context2.prev = _context2.next) {
210
+ case 0:
211
+ attempt = 0;
212
+ case 1:
213
+ if (!(attempt <= MAX_RETRIES)) {
214
+ _context2.next = 16;
215
+ break;
216
+ }
217
+ _context2.prev = 2;
218
+ _context2.next = 5;
219
+ return this._loadModuleOnce(url, config);
220
+ case 5:
221
+ // Success - reset retry count
222
+ this.retryCount = 0;
223
+ return _context2.abrupt("return");
224
+ case 9:
225
+ _context2.prev = 9;
226
+ _context2.t0 = _context2["catch"](2);
227
+ lastError = _context2.t0;
228
+ if (attempt < MAX_RETRIES) {
229
+ this.retryCount++;
230
+ // Reset state for retry
231
+ this.state = 'idle';
232
+ }
233
+ case 13:
234
+ attempt++;
235
+ _context2.next = 1;
236
+ break;
237
+ case 16:
238
+ // All attempts failed
239
+ this.state = 'failed';
240
+ this.loadingPromise = null;
241
+ (_config$callbacks3 = config.callbacks) === null || _config$callbacks3 === void 0 || (_config$callbacks3$on = _config$callbacks3.onLoadFailed) === null || _config$callbacks3$on === void 0 || _config$callbacks3$on.call(_config$callbacks3, lastError);
242
+ throw lastError;
243
+ case 20:
244
+ case "end":
245
+ return _context2.stop();
246
+ }
247
+ }, _callee2, this, [[2, 9]]);
248
+ }));
249
+ function _loadWithRetry(_x2, _x3) {
250
+ return _loadWithRetry2.apply(this, arguments);
251
+ }
252
+ return _loadWithRetry;
253
+ }()
254
+ /**
255
+ * Internal method: attempt to load the ESM module once via a module script (no retry)
256
+ */
257
+ )
258
+ }, {
259
+ key: "_loadModuleOnce",
260
+ value: function _loadModuleOnce(url, config) {
261
+ var _this2 = this;
262
+ var startTime = Date.now();
263
+
264
+ // Older WebViews ignore module scripts without firing load/error events.
265
+ // Fail fast so the existing retry/degradation flow does not wait for two 10s timeouts.
266
+ if (!('noModule' in document.createElement('script'))) {
267
+ return Promise.reject(new Error('[ApdidLoader] Module scripts are not supported'));
268
+ }
269
+ return new Promise(function (resolve, reject) {
270
+ var globalWindow = window;
271
+ var loadedApdid = globalWindow.APDID;
272
+ if (loadedApdid) {
273
+ _this2._onLoadSuccess(loadedApdid, startTime, config);
274
+ resolve();
275
+ return;
276
+ }
277
+ var existingScript = Array.from(document.querySelectorAll('script[type="module"]')).find(function (candidate) {
278
+ return candidate.src === url;
279
+ });
280
+ var script = existingScript || document.createElement('script');
281
+ var settled = false;
282
+ var cleanup = function cleanup() {
283
+ clearTimeout(timeoutId);
284
+ script.removeEventListener('load', handleLoad);
285
+ script.removeEventListener('error', handleError);
286
+ };
287
+ var rejectLoad = function rejectLoad(error) {
288
+ if (settled) return;
289
+ settled = true;
290
+ cleanup();
291
+
292
+ // Remove failed scripts so the transparent retry can append a fresh one.
293
+ if (script.parentNode) {
294
+ script.parentNode.removeChild(script);
295
+ }
296
+ reject(error);
297
+ };
298
+ var handleLoad = function handleLoad() {
299
+ if (settled) return;
300
+ var apdidCore = globalWindow.APDID;
301
+ if (!apdidCore) {
302
+ rejectLoad(new Error("[ApdidLoader] Module loaded but window.".concat(APDID_GLOBAL_NAME, " not found")));
303
+ return;
304
+ }
305
+ settled = true;
306
+ cleanup();
307
+ _this2._onLoadSuccess(apdidCore, startTime, config);
308
+ resolve();
309
+ };
310
+ var handleError = function handleError() {
311
+ rejectLoad(new Error("[ApdidLoader] Failed to load module script: ".concat(url)));
312
+ };
313
+ var timeoutId = setTimeout(function () {
314
+ var _config$callbacks4, _config$callbacks4$on;
315
+ if (settled) return;
316
+ (_config$callbacks4 = config.callbacks) === null || _config$callbacks4 === void 0 || (_config$callbacks4$on = _config$callbacks4.onLoadTimeout) === null || _config$callbacks4$on === void 0 || _config$callbacks4$on.call(_config$callbacks4);
317
+ rejectLoad(new Error("[ApdidLoader] Module load timeout after ".concat(LOAD_TIMEOUT_MS, "ms: ").concat(url)));
318
+ }, LOAD_TIMEOUT_MS);
319
+ script.addEventListener('load', handleLoad);
320
+ script.addEventListener('error', handleError);
321
+ if (!existingScript) {
322
+ script.type = 'module';
323
+ script.src = url;
324
+ script.async = true;
325
+ script.crossOrigin = 'anonymous';
326
+ (document.head || document.getElementsByTagName('head')[0]).appendChild(script);
327
+ }
328
+ });
329
+ }
330
+
331
+ /**
332
+ * Handle successful module load
333
+ */
334
+ }, {
335
+ key: "_onLoadSuccess",
336
+ value: function _onLoadSuccess(apdidCore, startTime, config) {
337
+ var _config$callbacks5, _config$callbacks5$on;
338
+ this.state = 'ready';
339
+ this.apdidModule = apdidCore;
340
+ var duration = Date.now() - startTime;
341
+ (_config$callbacks5 = config.callbacks) === null || _config$callbacks5 === void 0 || (_config$callbacks5$on = _config$callbacks5.onLoad) === null || _config$callbacks5$on === void 0 || _config$callbacks5$on.call(_config$callbacks5, duration);
342
+ }
343
+
344
+ /**
345
+ * Destroy the loader state and clean up
346
+ */
347
+ }, {
348
+ key: "destroy",
349
+ value: function destroy() {
350
+ this.state = 'idle';
351
+ this.apdidModule = null;
352
+ this.loadingPromise = null;
353
+ this.retryCount = 0;
354
+ this.config = null;
355
+ }
356
+ }], [{
357
+ key: "getInstance",
358
+ value: function getInstance() {
359
+ if (!ApdidLoader.instance) {
360
+ ApdidLoader.instance = new ApdidLoader();
361
+ }
362
+ return ApdidLoader.instance;
363
+ }
364
+
365
+ /** Reset the singleton (for testing purposes only) */
366
+ }, {
367
+ key: "resetInstance",
368
+ value: function resetInstance() {
369
+ if (ApdidLoader.instance) {
370
+ ApdidLoader.instance.destroy();
371
+ }
372
+ ApdidLoader.instance = null;
373
+ }
374
+ }]);
375
+ return ApdidLoader;
376
+ }();
377
+ _defineProperty(ApdidLoader, "instance", null);
@@ -0,0 +1,21 @@
1
+ /**
2
+ * jshield-apdid module - Async loading wrapper for apdid-core security SDK
3
+ *
4
+ * This module exports:
5
+ * - ApdidLoader: Singleton async script loader
6
+ * - Type definitions for configuration and callbacks
7
+ *
8
+ * Usage:
9
+ * ```typescript
10
+ * import { ApdidLoader } from './jshield-apdid';
11
+ *
12
+ * const loader = ApdidLoader.getInstance();
13
+ * await loader.load({ environment: 'production' });
14
+ * const APDID = loader.getApdidModule();
15
+ * if (APDID) {
16
+ * APDID.initToken(scene, options, callback);
17
+ * }
18
+ * ```
19
+ */
20
+
21
+ export { ApdidLoader } from "./apdid-loader";
@@ -7,7 +7,6 @@ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _d
7
7
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
8
8
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
9
9
  function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
10
- import json from "../../package.json";
11
10
  import { LogComplianceProcessor } from "../foundation/service/log/processor";
12
11
  import { SPM_MAP } from "./spm-map";
13
12
  export var Logger = /*#__PURE__*/function () {
@@ -297,6 +296,6 @@ export var LogConfig = {
297
296
  version: 'iteration/20231021',
298
297
  mdata: {
299
298
  firstLogTime: Date.now(),
300
- sdkVersion: json === null || json === void 0 ? void 0 : json.version
299
+ sdkVersion: "2.0.22"
301
300
  }
302
301
  };
@@ -0,0 +1,72 @@
1
+ /**
2
+ * SecuritySdkRegistry - Shared registry for Security SDK instances
3
+ *
4
+ * Unifies the securitySdkMap management across SecurityService, PreloadHelper, and AMSSDK.
5
+ * Supports three states: loading, ready, failed to handle async script loading.
6
+ *
7
+ * Key behaviors:
8
+ * - scene-based key (same as the original securitySdkMap key)
9
+ * - 'loading' state holds a shared loadingPromise so concurrent callers can await the same promise
10
+ * - 'ready' state holds the Security instance
11
+ * - 'failed' state holds the error
12
+ *
13
+ * Uses a generic interface to avoid tight coupling to a specific Security class
14
+ * (there are two Security class implementations in the codebase).
15
+ */
16
+ /**
17
+ * Minimal interface for Security SDK instances stored in the registry.
18
+ * Both Security class implementations (util/security and foundation/service/security/security) satisfy this.
19
+ */
20
+ export interface ISecurity {
21
+ getApdidToken(): Promise<string>;
22
+ pollingGetApdidToken(config?: any): Promise<string>;
23
+ initSecurity(successCallback: any, failCallback: any): void;
24
+ }
25
+ /**
26
+ * Security SDK entry states:
27
+ * - loading: Security instance is being created and initialized (holds shared promise)
28
+ * - ready: Security instance is available
29
+ * - failed: Security initialization failed (holds error)
30
+ */
31
+ export type SecuritySdkEntry = {
32
+ status: 'loading';
33
+ loadingPromise: Promise<ISecurity>;
34
+ } | {
35
+ status: 'ready';
36
+ instance: ISecurity;
37
+ } | {
38
+ status: 'failed';
39
+ error: Error;
40
+ };
41
+ /**
42
+ * SecuritySdkRegistry - Singleton registry for Security SDK instances
43
+ */
44
+ declare class SecuritySdkRegistryClass {
45
+ private registry;
46
+ /** Get the registry entry for a scene */
47
+ get(scene: string): SecuritySdkEntry | undefined;
48
+ /** Set a loading entry with its promise */
49
+ setLoading(scene: string, loadingPromise: Promise<ISecurity>): void;
50
+ /** Set a ready entry with the Security instance */
51
+ setReady(scene: string, instance: ISecurity): void;
52
+ /** Set a failed entry with the error */
53
+ setFailed(scene: string, error: Error): void;
54
+ /** Get a ready Security instance, or undefined if not ready */
55
+ getReadyInstance(scene: string): ISecurity | undefined;
56
+ /**
57
+ * Get a Security instance, awaiting if currently loading.
58
+ * Returns undefined if not found, failed, or loading fails.
59
+ */
60
+ getInstance(scene: string): Promise<ISecurity | undefined>;
61
+ /** Check if a scene has a ready instance */
62
+ isReady(scene: string): boolean;
63
+ /** Check if a scene is currently loading */
64
+ isLoading(scene: string): boolean;
65
+ /** Delete a scene entry */
66
+ delete(scene: string): boolean;
67
+ /** Clear all entries */
68
+ clear(): void;
69
+ }
70
+ /** Singleton instance of SecuritySdkRegistry */
71
+ export declare const SecuritySdkRegistry: SecuritySdkRegistryClass;
72
+ export {};