@alipay/ams-checkout 0.0.1762138227-dev.1 → 0.0.1762138227-dev.10

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.
@@ -20,6 +20,7 @@ import { supportsDefineProperty, supportsProxy } from "./utils/common";
20
20
  import { setDebugContext } from "./utils/debugger";
21
21
  import { loadSdk, newActualInstance } from "./utils/loadSDK";
22
22
  import { consoleLogger, logger } from "./utils/logger";
23
+ import { setProxyEndTime, setProxyStartTime } from "./utils/proxyPerformance";
23
24
 
24
25
  // eslint-disable-next-line
25
26
 
@@ -29,7 +30,6 @@ import { consoleLogger, logger } from "./utils/logger";
29
30
 
30
31
  // eslint-disable-next-line
31
32
  export function createBaseProxy(constructorName) {
32
- var _this = this;
33
33
  var _newProxyInstance = function _newProxyInstance(self) {
34
34
  return new Proxy(self, {
35
35
  get: function get(target, prop) {
@@ -126,98 +126,66 @@ export function createBaseProxy(constructorName) {
126
126
  });
127
127
  return instanceForError;
128
128
  };
129
-
130
- // 使用Promise.then来抛出错误对象 构造一个虚拟错误对象来模拟产品实例,其中所有的API都会在.then中返回错误对象
131
- var throwErrorWithPromise = function throwErrorWithPromise(errorObj) {
132
- var message = errorObj.error.message;
133
- var instanceForError = _newInstanceForError(errorObj);
134
- _this.actualInstance = instanceForError;
135
- _this.hasActualInstance = true;
136
- _this.executePendingCalls();
137
- logger.logError({
138
- title: message
139
- }, {
140
- errorMessage: message,
141
- constructorName: constructorName
142
- });
143
- consoleLogger.error(message);
144
- };
145
-
146
- // 使用onEventCallback向外抛出SDK内部错误
147
- var throwErrorWithOnEventCallback = function throwErrorWithOnEventCallback(errorObj, newProps) {
148
- var onEventCallbackFn = newProps === null || newProps === void 0 ? void 0 : newProps.onEventCallback;
149
- var message = errorObj.message;
150
- if (typeof onEventCallbackFn === 'function') {
151
- onEventCallbackFn === null || onEventCallbackFn === void 0 || onEventCallbackFn.call(null, errorObj);
152
- }
153
- logger.logError({
154
- title: message
155
- }, {
156
- errorMessage: message,
157
- constructorName: constructorName
158
- });
159
- consoleLogger.error(message);
160
- };
161
- var onCreateInstanceError = function onCreateInstanceError(newProps) {
162
- // 不同实例进行不同的错误处理方案
163
- if (constructorName === EConstructorName.AMSElement) {
164
- throwErrorWithPromise({
165
- error: {
166
- code: 'INTERNAL_ERROR',
167
- message: 'create_actual_instance_error'
168
- },
169
- status: 'FAIL'
170
- });
171
- } else if (constructorName === EConstructorName.AMSEasyPay) {
172
- throwErrorWithOnEventCallback({
173
- code: 'SDK_INTERNAL_ERROR',
174
- message: 'create_actual_instance_error'
175
- }, newProps);
176
- } else {
177
- throwErrorWithOnEventCallback({
178
- code: 'SDK_INTERNAL_ERROR',
179
- message: 'create_actual_instance_error'
180
- }, newProps);
181
- }
182
- };
183
- var onLoadSDKError = function onLoadSDKError(newProps) {
184
- if (constructorName === EConstructorName.AMSElement) {
185
- throwErrorWithPromise({
186
- error: {
187
- code: 'INITIALIZE_WEB_TIMEOUT',
188
- message: 'load_sdk_resource_error'
189
- },
190
- status: 'FAIL'
191
- });
192
- } else if (constructorName === EConstructorName.AMSEasyPay) {
193
- throwErrorWithOnEventCallback({
194
- code: 'SDK_INTERNAL_ERROR',
195
- message: 'load_sdk_resource_error'
196
- }, newProps);
197
- } else {
198
- throwErrorWithOnEventCallback({
199
- code: 'SDK_INTERNAL_ERROR',
200
- message: 'load_sdk_resource_error'
201
- }, newProps);
202
- }
203
- };
204
129
  var BaseProxy = /*#__PURE__*/function () {
205
130
  // 返回代理实例对象
206
- function BaseProxy(newProps, debugProps) {
131
+ function BaseProxy(_newProps, debugProps) {
132
+ var _this = this;
207
133
  _classCallCheck(this, BaseProxy);
208
134
  _defineProperty(this, "hasActualInstance", false);
209
135
  _defineProperty(this, "pendingCalls", []);
210
136
  _defineProperty(this, "actualInstance", null);
211
137
  _defineProperty(this, "proxyInstance", null);
212
138
  _defineProperty(this, "startTime", 0);
139
+ _defineProperty(this, "onCreateInstanceError", function (newProps) {
140
+ // 不同实例进行不同的错误处理方案
141
+ if (constructorName === EConstructorName.AMSElement) {
142
+ _this.throwErrorWithPromise({
143
+ error: {
144
+ code: 'UI_STATE_ERROR',
145
+ message: 'create_actual_instance_error'
146
+ }
147
+ });
148
+ } else if (constructorName === EConstructorName.AMSEasyPay) {
149
+ _this.throwErrorWithOnEventCallback({
150
+ code: 'SDK_INTERNAL_ERROR',
151
+ message: 'create_actual_instance_error'
152
+ }, newProps);
153
+ } else {
154
+ _this.throwErrorWithOnEventCallback({
155
+ code: 'SDK_INTERNAL_ERROR',
156
+ message: 'create_actual_instance_error'
157
+ }, newProps);
158
+ }
159
+ });
160
+ _defineProperty(this, "onLoadSDKError", function (newProps) {
161
+ if (constructorName === EConstructorName.AMSElement) {
162
+ _this.throwErrorWithPromise({
163
+ error: {
164
+ code: 'INITIALIZE_WEB_TIMEOUT',
165
+ message: 'load_sdk_resource_error'
166
+ }
167
+ });
168
+ } else if (constructorName === EConstructorName.AMSEasyPay) {
169
+ _this.throwErrorWithOnEventCallback({
170
+ code: 'SDK_INTERNAL_ERROR',
171
+ message: 'load_sdk_resource_error'
172
+ }, newProps);
173
+ } else {
174
+ _this.throwErrorWithOnEventCallback({
175
+ code: 'SDK_INTERNAL_ERROR',
176
+ message: 'load_sdk_resource_error'
177
+ }, newProps);
178
+ }
179
+ });
213
180
  this.startTime = Date.now();
214
-
215
181
  // 初始化debug参数
216
182
  setDebugContext(debugProps);
183
+ // 记录开始时间
184
+ setProxyStartTime(constructorName, this.startTime);
217
185
  // 创建代理实例
218
186
  this.proxyInstance = this.newProxyInstance();
219
187
  // 加载sdk并创建真实实例
220
- this.loadSDKAndCreateInstance(constructorName, newProps);
188
+ this.loadSDKAndCreateInstance(constructorName, _newProps);
221
189
  logger.logInfo({
222
190
  title: 'create_proxy_instance_success'
223
191
  });
@@ -229,29 +197,48 @@ export function createBaseProxy(constructorName) {
229
197
  key: "loadSDKAndCreateInstance",
230
198
  value: function loadSDKAndCreateInstance(constructorName, newProps) {
231
199
  var _this2 = this;
232
- loadSdk().then(function () {
200
+ loadSdk().then(function (_ref) {
201
+ var loadType = _ref.loadType;
233
202
  try {
234
203
  var actualInstance = newActualInstance(constructorName, newProps);
235
- // 从newProxy到初始化真实sdk实例花费时间
204
+ var newActualInstanceDuration = Date.now() - _this2.startTime;
205
+ // 记录结束时间
206
+ setProxyEndTime(constructorName, Date.now());
207
+ // 上报newProxy到初始化真实sdk实例花费时间,忽略SDK缓存场景
236
208
  logger.logInfo({
237
- title: 'report_customized_performance_m5'
209
+ title: 'loadSDK_and_create_actual_instance'
238
210
  }, {
239
- m5: Date.now() - _this2.startTime
211
+ constructorName: constructorName,
212
+ loadDuration: loadType === 'network' ? newActualInstanceDuration : undefined
240
213
  });
214
+ // 热更新全流程成功率监控
241
215
  logger.logInfo({
242
- title: 'create_actual_instance_success'
216
+ title: 'create_antom_instance'
243
217
  }, {
244
- constructorName: constructorName
218
+ constructorName: constructorName,
219
+ result: 'Y'
245
220
  });
246
221
  consoleLogger.log('create_actual_instance_success');
247
222
  _this2.actualInstance = actualInstance;
248
223
  _this2.hasActualInstance = true;
249
224
  _this2.executePendingCalls();
250
225
  } catch (error) {
251
- onCreateInstanceError(newProps);
226
+ logger.logInfo({
227
+ title: 'create_antom_instance'
228
+ }, {
229
+ constructorName: constructorName,
230
+ result: 'N'
231
+ });
232
+ _this2.onCreateInstanceError(newProps);
252
233
  }
253
234
  }).catch(function () {
254
- onLoadSDKError(newProps);
235
+ logger.logInfo({
236
+ title: 'create_antom_instance'
237
+ }, {
238
+ constructorName: constructorName,
239
+ result: 'N'
240
+ });
241
+ _this2.onLoadSDKError(newProps);
255
242
  });
256
243
  }
257
244
 
@@ -333,6 +320,43 @@ export function createBaseProxy(constructorName) {
333
320
  reject(error);
334
321
  }
335
322
  }
323
+ }, {
324
+ key: "throwErrorWithPromise",
325
+ value:
326
+ // 使用Promise.then来抛出错误对象 构造一个虚拟错误对象来模拟产品实例,其中所有的API都会在.then中返回错误对象
327
+ function throwErrorWithPromise(errorObj) {
328
+ var _errorObj$error;
329
+ var message = errorObj === null || errorObj === void 0 || (_errorObj$error = errorObj.error) === null || _errorObj$error === void 0 ? void 0 : _errorObj$error.message;
330
+ var instanceForError = _newInstanceForError(errorObj);
331
+ this.actualInstance = instanceForError;
332
+ this.hasActualInstance = true;
333
+ this.executePendingCalls();
334
+ logger.logError({
335
+ title: message
336
+ }, {
337
+ errorMessage: message,
338
+ constructorName: constructorName
339
+ });
340
+ consoleLogger.error(message);
341
+ }
342
+
343
+ // 使用onEventCallback向外抛出SDK内部错误
344
+ }, {
345
+ key: "throwErrorWithOnEventCallback",
346
+ value: function throwErrorWithOnEventCallback(errorObj, newProps) {
347
+ var onEventCallbackFn = newProps === null || newProps === void 0 ? void 0 : newProps.onEventCallback;
348
+ var message = errorObj.message;
349
+ if (typeof onEventCallbackFn === 'function') {
350
+ onEventCallbackFn === null || onEventCallbackFn === void 0 || onEventCallbackFn.call(null, errorObj);
351
+ }
352
+ logger.logError({
353
+ title: message
354
+ }, {
355
+ errorMessage: message,
356
+ constructorName: constructorName
357
+ });
358
+ consoleLogger.error(message);
359
+ }
336
360
  }]);
337
361
  return BaseProxy;
338
362
  }();
@@ -27,6 +27,9 @@ export declare const instanceApiMap: Record<EConstructorName, string[]>;
27
27
  * SDK 集成类型枚举
28
28
  */
29
29
  export type AntomWebSDKIntegrationType = 'CDN' | 'NPM';
30
+ /**
31
+ * SDK 地址
32
+ */
30
33
  export declare const SDK_URL: {
31
34
  DEV: string;
32
35
  PROD: string;
@@ -27,9 +27,10 @@ export var instanceApiMap = _defineProperty(_defineProperty(_defineProperty({},
27
27
  * SDK 集成类型枚举
28
28
  */
29
29
 
30
- // TODO SDK 地址
30
+ /**
31
+ * SDK 地址
32
+ */
31
33
  export var SDK_URL = {
32
- DEV: 'https://sdk-dev.marmot-cloud.com/package/ams-checkout/dev-1753362745/dist/umd/ams-checkout.min.js',
33
- // marmot测试用sdk地址 待正式上线前替换
34
- PROD: 'https://er-test.marmot-cloud.com/1.0.0/dist/umd/ams-checkout.min.js'
34
+ DEV: 'http://js-dev.antom.com/v2/ams-checkout.js',
35
+ PROD: 'https://js.antom.com/v2/ams-checkout.js'
35
36
  };
@@ -1,3 +1,8 @@
1
1
  import { EConstructorName, ProductType } from '../constant';
2
- export declare function loadSdk(): Promise<boolean>;
2
+ type SdkLoadResult = {
3
+ success: boolean;
4
+ loadType?: 'cached' | 'network';
5
+ };
6
+ export declare function loadSdk(): Promise<SdkLoadResult>;
3
7
  export declare function newActualInstance<T extends ProductType>(constructorName: EConstructorName, newProps: any): T | null;
8
+ export {};
@@ -12,10 +12,19 @@ export function loadSdk() {
12
12
  sdkSrc = (debugContext === null || debugContext === void 0 ? void 0 : debugContext.sdkUrl) || SDK_URL.PROD;
13
13
  }
14
14
 
15
+ // 校验URL合法性
16
+ try {
17
+ new URL(sdkSrc);
18
+ } catch (e) {
19
+ consoleLogger.error("Invalid SDK URL: ".concat(sdkSrc));
20
+ reject();
21
+ return;
22
+ }
23
+
15
24
  // 检查 SDK URL 是否存在
16
25
  if (!sdkSrc) {
17
26
  consoleLogger.error("SDK URL not found for: ".concat(sdkSrc));
18
- reject(false);
27
+ reject();
19
28
  return;
20
29
  }
21
30
 
@@ -23,7 +32,10 @@ export function loadSdk() {
23
32
  var existingScript = document.querySelector("script[src=\"".concat(sdkSrc, "\"]"));
24
33
  if (existingScript) {
25
34
  consoleLogger.log("SDK already loaded: ".concat(sdkSrc));
26
- resolve(true);
35
+ resolve({
36
+ success: true,
37
+ loadType: 'cached'
38
+ });
27
39
  return;
28
40
  }
29
41
 
@@ -35,7 +47,10 @@ export function loadSdk() {
35
47
  // 定义onload和onerror事件
36
48
  script.onload = function () {
37
49
  consoleLogger.log("Load SDK Success , SDK URL: ".concat(sdkSrc));
38
- resolve(true);
50
+ resolve({
51
+ success: true,
52
+ loadType: 'network'
53
+ });
39
54
  };
40
55
  script.onerror = function () {
41
56
  consoleLogger.log("Failed to load SDK: ".concat(sdkSrc));
@@ -44,7 +59,9 @@ export function loadSdk() {
44
59
  }, {
45
60
  sdkSrc: sdkSrc
46
61
  });
47
- reject(false);
62
+ // 失败时移除缓存脚本
63
+ script.remove();
64
+ reject();
48
65
  };
49
66
  });
50
67
  }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * 在window对象上记录商户初始化SDK的StartTime,加载结束时间
3
+ * 后续传递给Web应用,用于进行端到端渲染总耗时计算
4
+ * ***/
5
+ import { ProductSceneEnum } from "../../types";
6
+ import { EConstructorName } from '../constant';
7
+ type TimeObject = {
8
+ startTime: number;
9
+ endTime: number;
10
+ };
11
+ /*** 扩展 Window 接口,添加 _ANTOM_SDK_PROXY_TIME 属性*/
12
+ declare global {
13
+ interface Window {
14
+ _ANTOM_SDK_PROXY_TIME?: Partial<Record<EConstructorName, TimeObject>>;
15
+ }
16
+ }
17
+ export declare function setProxyStartTime(constructorName: EConstructorName, startTime: number): number;
18
+ export declare function setProxyEndTime(constructorName: EConstructorName, endTime: number): number;
19
+ export declare const getProxyCostTime: (productScene: ProductSceneEnum) => number;
20
+ export {};
@@ -0,0 +1,66 @@
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
+ /**
3
+ * 在window对象上记录商户初始化SDK的StartTime,加载结束时间
4
+ * 后续传递给Web应用,用于进行端到端渲染总耗时计算
5
+ * ***/
6
+
7
+ import { ProductSceneEnum } from "../../types";
8
+
9
+ /*** 扩展 Window 接口,添加 _ANTOM_SDK_PROXY_TIME 属性*/
10
+
11
+ /*** 往window对象上注入全局变量 _ANTOM_SDK_PROXY_TIME */
12
+ function injectAntomSDKProxyStartTime() {
13
+ if (typeof window === 'undefined') {
14
+ return;
15
+ }
16
+ if (_typeof(window._ANTOM_SDK_PROXY_TIME) !== 'object') {
17
+ window._ANTOM_SDK_PROXY_TIME = {};
18
+ }
19
+ return window._ANTOM_SDK_PROXY_TIME;
20
+ }
21
+ export function setProxyStartTime(constructorName, startTime) {
22
+ injectAntomSDKProxyStartTime();
23
+ if (_typeof(window._ANTOM_SDK_PROXY_TIME) !== 'object') return startTime;
24
+ var timeObject = window._ANTOM_SDK_PROXY_TIME[constructorName];
25
+ if (_typeof(timeObject) !== 'object') {
26
+ window._ANTOM_SDK_PROXY_TIME[constructorName] = {
27
+ startTime: startTime,
28
+ endTime: 0
29
+ };
30
+ } else {
31
+ timeObject.startTime = startTime;
32
+ }
33
+ return startTime;
34
+ }
35
+ export function setProxyEndTime(constructorName, endTime) {
36
+ if (_typeof(window._ANTOM_SDK_PROXY_TIME) !== 'object') return endTime;
37
+ var timeObject = window._ANTOM_SDK_PROXY_TIME[constructorName];
38
+ if (_typeof(timeObject) !== 'object') {
39
+ window._ANTOM_SDK_PROXY_TIME[constructorName] = {
40
+ startTime: 0,
41
+ endTime: endTime
42
+ };
43
+ } else {
44
+ timeObject.endTime = endTime;
45
+ }
46
+ return endTime;
47
+ }
48
+ export var getProxyCostTime = function getProxyCostTime(productScene) {
49
+ var _window, _window2, _timeObj, _timeObj2;
50
+ var timeObj;
51
+ switch (productScene) {
52
+ case ProductSceneEnum.ELEMENT_PAYMENT:
53
+ timeObj = (_window = window) === null || _window === void 0 || (_window = _window._ANTOM_SDK_PROXY_TIME) === null || _window === void 0 ? void 0 : _window['AMSElement'];
54
+ break;
55
+ case ProductSceneEnum.EASY_PAY:
56
+ timeObj = (_window2 = window) === null || _window2 === void 0 || (_window2 = _window2._ANTOM_SDK_PROXY_TIME) === null || _window2 === void 0 ? void 0 : _window2['AMSEasyPay'];
57
+ break;
58
+ default:
59
+ timeObj = {
60
+ startTime: 0,
61
+ endTime: 0
62
+ };
63
+ break;
64
+ }
65
+ return ((_timeObj = timeObj) === null || _timeObj === void 0 ? void 0 : _timeObj.endTime) - ((_timeObj2 = timeObj) === null || _timeObj2 === void 0 ? void 0 : _timeObj2.startTime) || 0;
66
+ };
@@ -15,6 +15,7 @@ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e
15
15
  * 1. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE; and
16
16
  * 2. If applicable, the use of the Software is also subject to the terms and conditions of any non-disclosure agreement signed by you and the relevant Ant Group entity.
17
17
  */
18
+ import { getProxyCostTime } from "../../loader/utils/proxyPerformance";
18
19
  import { marmotMap, sdkVersion, v2AppMarmotMap } from "../../config/index";
19
20
  import { ComponentSignEnum, ComponentSignEnumV2 } from "../../types";
20
21
  import { isDebugLog } from "../../util/debug";
@@ -184,6 +185,7 @@ export var getIframeUrl = function getIframeUrl(iframeParams) {
184
185
  sdkVersion: sdkVersion,
185
186
  refUrl: window.location.href,
186
187
  _componentStartTime: "".concat(Date.now()),
188
+ _proxyCostTime: "".concat(getProxyCostTime(productScene)),
187
189
  isPreload: isPreload || '',
188
190
  hostSign: hostSign || ''
189
191
  });
@@ -18,13 +18,11 @@ export function injectAntomSDKIntegrationType(integrationType) {
18
18
  // 参数验证
19
19
  var validTypes = ['CDN', 'NPM'];
20
20
  if (!validTypes.includes(integrationType)) {
21
- console.warn("Integration type must be one of: ".concat(validTypes.join(', ')));
22
21
  return;
23
22
  }
24
23
 
25
24
  // 检查是否在浏览器环境中
26
25
  if (typeof window === 'undefined') {
27
- console.warn('window object is not available');
28
26
  return;
29
27
  }
30
28
 
@@ -39,7 +37,6 @@ export function injectAntomSDKIntegrationType(integrationType) {
39
37
  logger.setMedta({
40
38
  integrationType: integrationType
41
39
  });
42
- console.log("Successfully injected window._ANTOM_SDK_INTEGRATION_TYPE: ".concat(integrationType));
43
40
  }
44
41
 
45
42
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alipay/ams-checkout",
3
- "version": "0.0.1762138227-dev.1",
3
+ "version": "0.0.1762138227-dev.10",
4
4
  "description": "",
5
5
  "author": "",
6
6
  "main": "esm/index.js",
@@ -9,6 +9,7 @@
9
9
  "files": [
10
10
  "dist",
11
11
  "esm",
12
+ "ams-checkout.js",
12
13
  "LEGAL.md",
13
14
  "LICENSE",
14
15
  "README.md"