@alipay/ams-checkout 0.0.1783663570-dev.0 → 0.0.1783663570-dev.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -156,24 +156,28 @@ var ComponentApp = /*#__PURE__*/function () {
156
156
  var securitySDK = this.AMSSDK._getSecuritySDKByProductScene({
157
157
  product: product
158
158
  });
159
- if (!securitySDK) {
160
- this.AMSSDK.logger.logInfo({
161
- title: 'sdk_event_securitySdkInit'
159
+ if (securitySDK) {
160
+ // Already ready
161
+ return;
162
+ }
163
+
164
+ // Use _newSecuritySDKByScene which handles loading/ready/failed states internally
165
+ this.AMSSDK.logger.logInfo({
166
+ title: 'sdk_event_securitySdkInit'
167
+ });
168
+ this.AMSSDK._newSecuritySDKByScene({
169
+ product: product
170
+ }, function () {
171
+ _this.AMSSDK.logger.logInfo({
172
+ title: 'sdk_event_securitySdkInitSuccess'
162
173
  });
163
- this.AMSSDK._newSecuritySDKByScene({
164
- product: product
165
- }, function () {
166
- _this.AMSSDK.logger.logInfo({
167
- title: 'sdk_event_securitySdkInitSuccess'
168
- });
169
- }, function () {
170
- _this.AMSSDK.logger.logError({
171
- title: 'sdk_error_securitySdkInitFailed'
172
- }, {
173
- sign: 'SDK internal initialization'
174
- });
174
+ }, function () {
175
+ _this.AMSSDK.logger.logError({
176
+ title: 'sdk_error_securitySdkInitFailed'
177
+ }, {
178
+ sign: 'SDK internal initialization'
175
179
  });
176
- }
180
+ });
177
181
  }
178
182
  }, {
179
183
  key: "logDeviceId",
@@ -208,36 +212,39 @@ var ComponentApp = /*#__PURE__*/function () {
208
212
  while (1) switch (_context.prev = _context.next) {
209
213
  case 0:
210
214
  productScene = (_this2$_renderParams = _this2._renderParams) === null || _this2$_renderParams === void 0 || (_this2$_renderParams = _this2$_renderParams.paymentSessionMetaData) === null || _this2$_renderParams === void 0 || (_this2$_renderParams = _this2$_renderParams.paymentSessionConfig) === null || _this2$_renderParams === void 0 ? void 0 : _this2$_renderParams.productScene;
211
- getDeviceIdStartTime = Date.now();
212
- securitySDK = _this2.AMSSDK._getSecuritySDKByProductScene({
215
+ getDeviceIdStartTime = Date.now(); // Use async version to handle loading state
216
+ _context.next = 4;
217
+ return _this2.AMSSDK._awaitSecuritySDKByProductScene({
213
218
  product: (deviceIdParameter === null || deviceIdParameter === void 0 ? void 0 : deviceIdParameter.productScene) || productScene
214
219
  });
220
+ case 4:
221
+ securitySDK = _context.sent;
215
222
  deviceId = '';
216
223
  if (!securitySDK) {
217
- _context.next = 16;
224
+ _context.next = 18;
218
225
  break;
219
226
  }
220
227
  if (!(isPolling && parseInt(deviceIdParameter === null || deviceIdParameter === void 0 ? void 0 : deviceIdParameter.tokenCollectTime) > 0)) {
221
- _context.next = 11;
228
+ _context.next = 13;
222
229
  break;
223
230
  }
224
- _context.next = 8;
231
+ _context.next = 10;
225
232
  return securitySDK.pollingGetApdidToken(deviceIdParameter);
226
- case 8:
233
+ case 10:
227
234
  _context.t0 = _context.sent;
228
- _context.next = 14;
235
+ _context.next = 16;
229
236
  break;
230
- case 11:
231
- _context.next = 13;
232
- return securitySDK.getApdidToken();
233
237
  case 13:
238
+ _context.next = 15;
239
+ return securitySDK.getApdidToken();
240
+ case 15:
234
241
  _context.t0 = _context.sent;
235
- case 14:
242
+ case 16:
236
243
  deviceId = _context.t0;
237
244
  _this2.logDeviceId(deviceId, getDeviceIdStartTime);
238
- case 16:
245
+ case 18:
239
246
  resolve(deviceId);
240
- case 17:
247
+ case 19:
241
248
  case "end":
242
249
  return _context.stop();
243
250
  }
@@ -0,0 +1,340 @@
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 dynamic import() for ESM modules
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 dynamic import() to load ESM modules
65
+ * - Concurrent calls share the same loading promise
66
+ * - On success, the module export 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 dynamic import() (no retry)
256
+ */
257
+ )
258
+ }, {
259
+ key: "_loadModuleOnce",
260
+ value: function _loadModuleOnce(url, config) {
261
+ var _this2 = this;
262
+ var startTime = Date.now();
263
+ var timeoutId;
264
+
265
+ // Race dynamic import() against timeout
266
+ var importPromise = import( /* webpackIgnore: true */url).then(function (module) {
267
+ clearTimeout(timeoutId);
268
+ // ESM default export or namespace
269
+ var apdidCore = module.default || module;
270
+ if (apdidCore) {
271
+ _this2._onLoadSuccess(apdidCore, startTime, config);
272
+ } else {
273
+ // Fallback: check window.APDID (UMD bundle loaded separately)
274
+ var globalApdid = window[APDID_GLOBAL_NAME];
275
+ if (globalApdid) {
276
+ _this2._onLoadSuccess(globalApdid, startTime, config);
277
+ } else {
278
+ throw new Error("[ApdidLoader] Module loaded but no export and window.".concat(APDID_GLOBAL_NAME, " not found"));
279
+ }
280
+ }
281
+ });
282
+ var timeoutPromise = new Promise(function (_resolve, reject) {
283
+ timeoutId = setTimeout(function () {
284
+ if (_this2.state === 'loading') {
285
+ var _config$callbacks4, _config$callbacks4$on;
286
+ (_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);
287
+ reject(new Error("[ApdidLoader] Module load timeout after ".concat(LOAD_TIMEOUT_MS, "ms: ").concat(url)));
288
+ }
289
+ }, LOAD_TIMEOUT_MS);
290
+ });
291
+ return Promise.race([importPromise, timeoutPromise]);
292
+ }
293
+
294
+ /**
295
+ * Handle successful module load
296
+ */
297
+ }, {
298
+ key: "_onLoadSuccess",
299
+ value: function _onLoadSuccess(apdidCore, startTime, config) {
300
+ var _config$callbacks5, _config$callbacks5$on;
301
+ this.state = 'ready';
302
+ this.apdidModule = apdidCore;
303
+ var duration = Date.now() - startTime;
304
+ (_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);
305
+ }
306
+
307
+ /**
308
+ * Destroy the loader state and clean up
309
+ */
310
+ }, {
311
+ key: "destroy",
312
+ value: function destroy() {
313
+ this.state = 'idle';
314
+ this.apdidModule = null;
315
+ this.loadingPromise = null;
316
+ this.retryCount = 0;
317
+ this.config = null;
318
+ }
319
+ }], [{
320
+ key: "getInstance",
321
+ value: function getInstance() {
322
+ if (!ApdidLoader.instance) {
323
+ ApdidLoader.instance = new ApdidLoader();
324
+ }
325
+ return ApdidLoader.instance;
326
+ }
327
+
328
+ /** Reset the singleton (for testing purposes only) */
329
+ }, {
330
+ key: "resetInstance",
331
+ value: function resetInstance() {
332
+ if (ApdidLoader.instance) {
333
+ ApdidLoader.instance.destroy();
334
+ }
335
+ ApdidLoader.instance = null;
336
+ }
337
+ }]);
338
+ return ApdidLoader;
339
+ }();
340
+ _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";
@@ -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 {};